blob: cfaa2a4cf6eebfaa0b6b5ebd71836d50c3fb3d81 [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*/
30#if defined(_WRS_KERNEL) && !SQLITE_OMIT_LOAD_EXTENSION
31# 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*/
danielk197792f9a1b2004-06-19 09:08:16 +0000339static sqlite3 *db = 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
drhb0603412007-02-28 04:47:26 +0000373static void iotracePrintf(const char *zFormat, ...){
374 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 */
drhc2ce0be2014-05-29 12:36:14 +0000530 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000531 int cnt; /* Number of records displayed so far */
532 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000533 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000534 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000535 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000536 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000537 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000538 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000539 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000540 char colSeparator[20]; /* Column separator character for several modes */
541 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000542 int colWidth[100]; /* Requested width of each column when in column mode*/
543 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +0000544 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +0000545 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000546 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000547 char outfile[FILENAME_MAX]; /* Filename for *out */
548 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000549 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000550 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000551 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000552 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000553 int *aiIndent; /* Array of indents used in MODE_Explain */
554 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000555 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000556};
557
558/*
drh44dec872014-08-30 15:49:25 +0000559** These are the allowed shellFlgs values
560*/
561#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
562#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
563#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
564
565/*
drh75897232000-05-29 14:26:00 +0000566** These are the allowed modes.
567*/
drh967e8b72000-06-21 13:59:10 +0000568#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000569#define MODE_Column 1 /* One record per line in neat columns */
570#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000571#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
572#define MODE_Html 4 /* Generate an XHTML table */
573#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000574#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000575#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000576#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000577#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000578
drh66ce4d02008-02-15 17:38:06 +0000579static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000580 "line",
581 "column",
582 "list",
583 "semi",
584 "html",
drhfeac5f82004-08-01 00:10:45 +0000585 "insert",
586 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000587 "csv",
drh66ce4d02008-02-15 17:38:06 +0000588 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000589 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000590};
drh75897232000-05-29 14:26:00 +0000591
592/*
mistachkinfad42082014-07-24 22:13:12 +0000593** These are the column/row/line separators used by the various
594** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +0000595*/
mistachkinfad42082014-07-24 22:13:12 +0000596#define SEP_Column "|"
597#define SEP_Row "\n"
598#define SEP_Tab "\t"
599#define SEP_Space " "
600#define SEP_Comma ","
601#define SEP_CrLf "\r\n"
602#define SEP_Unit "\x1F"
603#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +0000604
605/*
drh75897232000-05-29 14:26:00 +0000606** Number of elements in an array
607*/
drh902b9ee2008-12-05 17:17:07 +0000608#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000609
610/*
drhea678832008-12-10 19:26:22 +0000611** Compute a string length that is limited to what can be stored in
612** lower 30 bits of a 32-bit signed integer.
613*/
drh4f21c4a2008-12-10 22:15:00 +0000614static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000615 const char *z2 = z;
616 while( *z2 ){ z2++; }
617 return 0x3fffffff & (int)(z2 - z);
618}
619
620/*
drh127f9d72010-02-23 01:47:00 +0000621** A callback for the sqlite3_log() interface.
622*/
623static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000624 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000625 if( p->pLog==0 ) return;
626 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
627 fflush(p->pLog);
628}
629
630/*
shane626a6e42009-10-22 17:30:15 +0000631** Output the given string as a hex-encoded blob (eg. X'1234' )
632*/
633static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
634 int i;
635 char *zBlob = (char *)pBlob;
636 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000637 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000638 fprintf(out,"'");
639}
640
641/*
drh28bd4bc2000-06-15 15:57:22 +0000642** Output the given string as a quoted string using SQL quoting conventions.
643*/
644static void output_quoted_string(FILE *out, const char *z){
645 int i;
646 int nSingle = 0;
drh047d4532015-01-18 20:30:23 +0000647 setBinaryMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000648 for(i=0; z[i]; i++){
649 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000650 }
651 if( nSingle==0 ){
652 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000653 }else{
654 fprintf(out,"'");
655 while( *z ){
656 for(i=0; z[i] && z[i]!='\''; i++){}
657 if( i==0 ){
658 fprintf(out,"''");
659 z++;
660 }else if( z[i]=='\'' ){
661 fprintf(out,"%.*s''",i,z);
662 z += i+1;
663 }else{
drhcd7d2732002-02-26 23:24:26 +0000664 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000665 break;
666 }
667 }
drhcd7d2732002-02-26 23:24:26 +0000668 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000669 }
drh047d4532015-01-18 20:30:23 +0000670 setTextMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000671}
672
673/*
drhfeac5f82004-08-01 00:10:45 +0000674** Output the given string as a quoted according to C or TCL quoting rules.
675*/
676static void output_c_string(FILE *out, const char *z){
677 unsigned int c;
678 fputc('"', out);
679 while( (c = *(z++))!=0 ){
680 if( c=='\\' ){
681 fputc(c, out);
682 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000683 }else if( c=='"' ){
684 fputc('\\', out);
685 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000686 }else if( c=='\t' ){
687 fputc('\\', out);
688 fputc('t', out);
689 }else if( c=='\n' ){
690 fputc('\\', out);
691 fputc('n', out);
692 }else if( c=='\r' ){
693 fputc('\\', out);
694 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000695 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000696 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000697 }else{
698 fputc(c, out);
699 }
700 }
701 fputc('"', out);
702}
703
704/*
drhc08a4f12000-06-15 16:49:48 +0000705** Output the given string with characters that are special to
706** HTML escaped.
707*/
708static void output_html_string(FILE *out, const char *z){
709 int i;
drhc3d6ba42014-01-13 20:38:35 +0000710 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000711 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000712 for(i=0; z[i]
713 && z[i]!='<'
714 && z[i]!='&'
715 && z[i]!='>'
716 && z[i]!='\"'
717 && z[i]!='\'';
718 i++){}
drhc08a4f12000-06-15 16:49:48 +0000719 if( i>0 ){
720 fprintf(out,"%.*s",i,z);
721 }
722 if( z[i]=='<' ){
723 fprintf(out,"&lt;");
724 }else if( z[i]=='&' ){
725 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000726 }else if( z[i]=='>' ){
727 fprintf(out,"&gt;");
728 }else if( z[i]=='\"' ){
729 fprintf(out,"&quot;");
730 }else if( z[i]=='\'' ){
731 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000732 }else{
733 break;
734 }
735 z += i + 1;
736 }
737}
738
739/*
drhc49f44e2006-10-26 18:15:42 +0000740** If a field contains any character identified by a 1 in the following
741** array, then the string must be quoted for CSV.
742*/
743static const char needCsvQuote[] = {
744 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
745 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
746 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
747 0, 0, 0, 0, 0, 0, 0, 0, 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, 1,
752 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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};
761
762/*
mistachkindd11f2d2014-12-11 04:49:46 +0000763** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +0000764** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +0000765** the null value. Strings are quoted if necessary. The separator
766** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000767*/
drhdcd87a92014-08-18 13:45:42 +0000768static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000769 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000770 if( z==0 ){
mistachkin44b99f72014-12-11 03:29:14 +0000771 fprintf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +0000772 }else{
drhc49f44e2006-10-26 18:15:42 +0000773 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000774 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000775 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000776 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000777 || (z[i]==p->colSeparator[0] &&
778 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000779 i = 0;
780 break;
781 }
782 }
783 if( i==0 ){
784 putc('"', out);
785 for(i=0; z[i]; i++){
786 if( z[i]=='"' ) putc('"', out);
787 putc(z[i], out);
788 }
789 putc('"', out);
790 }else{
791 fprintf(out, "%s", z);
792 }
drh8e64d1c2004-10-07 00:32:39 +0000793 }
794 if( bSep ){
mistachkin636bf9f2014-07-19 20:15:16 +0000795 fprintf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000796 }
797}
798
danielk19774af00c62005-01-23 23:43:21 +0000799#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000800/*
drh4c504392000-10-16 22:06:40 +0000801** This routine runs when the user presses Ctrl-C
802*/
803static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000804 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000805 seenInterrupt++;
806 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000807 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000808}
danielk19774af00c62005-01-23 23:43:21 +0000809#endif
drh4c504392000-10-16 22:06:40 +0000810
811/*
shane626a6e42009-10-22 17:30:15 +0000812** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000813** invokes for each row of a query result.
814*/
drh4ace5362014-11-10 14:42:28 +0000815static int shell_callback(
816 void *pArg,
817 int nArg, /* Number of result columns */
818 char **azArg, /* Text of each result column */
819 char **azCol, /* Column names */
820 int *aiType /* Column types */
821){
drh75897232000-05-29 14:26:00 +0000822 int i;
drhdcd87a92014-08-18 13:45:42 +0000823 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000824
drh75897232000-05-29 14:26:00 +0000825 switch( p->mode ){
826 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000827 int w = 5;
drh6a535342001-10-19 16:44:56 +0000828 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000829 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000830 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000831 if( len>w ) w = len;
832 }
mistachkin636bf9f2014-07-19 20:15:16 +0000833 if( p->cnt++>0 ) fprintf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000834 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000835 fprintf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +0000836 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000837 }
838 break;
839 }
danielk19770d78bae2008-01-03 07:09:48 +0000840 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000841 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000842 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000843 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000844 int w, n;
845 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000846 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000847 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000848 w = 0;
drh75897232000-05-29 14:26:00 +0000849 }
drh078b1fd2012-09-21 13:40:02 +0000850 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000851 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000852 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +0000853 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +0000854 if( w<n ) w = n;
855 }
856 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000857 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000858 }
859 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000860 if( w<0 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000861 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i],
862 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000863 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000864 fprintf(p->out,"%-*.*s%s",w,w,azCol[i],
865 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000866 }
drha0c66f52000-07-29 13:20:21 +0000867 }
868 }
869 if( p->showHeader ){
870 for(i=0; i<nArg; i++){
871 int w;
872 if( i<ArraySize(p->actualWidth) ){
873 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000874 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000875 }else{
876 w = 10;
877 }
878 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
879 "----------------------------------------------------------",
mistachkin636bf9f2014-07-19 20:15:16 +0000880 i==nArg-1 ? p->rowSeparator : " ");
drha0c66f52000-07-29 13:20:21 +0000881 }
drh75897232000-05-29 14:26:00 +0000882 }
883 }
drh6a535342001-10-19 16:44:56 +0000884 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000885 for(i=0; i<nArg; i++){
886 int w;
drha0c66f52000-07-29 13:20:21 +0000887 if( i<ArraySize(p->actualWidth) ){
888 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000889 }else{
890 w = 10;
891 }
dana98bf362013-11-13 18:35:01 +0000892 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000893 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000894 }
dana98bf362013-11-13 18:35:01 +0000895 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000896 if( p->iIndent<p->nIndent ){
897 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000898 }
danc4650bb2013-11-18 08:41:06 +0000899 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000900 }
drh078b1fd2012-09-21 13:40:02 +0000901 if( w<0 ){
902 fprintf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +0000903 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000904 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000905 }else{
906 fprintf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +0000907 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000908 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000909 }
drh75897232000-05-29 14:26:00 +0000910 }
911 break;
912 }
drhe3710332000-09-29 13:30:53 +0000913 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000914 case MODE_List: {
915 if( p->cnt++==0 && p->showHeader ){
916 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000917 fprintf(p->out,"%s%s",azCol[i],
918 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +0000919 }
920 }
drh6a535342001-10-19 16:44:56 +0000921 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000922 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000923 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +0000924 if( z==0 ) z = p->nullValue;
drh71172c52002-01-24 00:00:21 +0000925 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000926 if( i<nArg-1 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000927 fprintf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +0000928 }else if( p->mode==MODE_Semi ){
mistachkin636bf9f2014-07-19 20:15:16 +0000929 fprintf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000930 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000931 fprintf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000932 }
drh75897232000-05-29 14:26:00 +0000933 }
934 break;
935 }
drh1e5d0e92000-05-31 23:33:17 +0000936 case MODE_Html: {
937 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000938 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000939 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000940 fprintf(p->out,"<TH>");
941 output_html_string(p->out, azCol[i]);
942 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000943 }
mihailim57c591a2008-06-23 21:26:05 +0000944 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000945 }
drh6a535342001-10-19 16:44:56 +0000946 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000947 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000948 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000949 fprintf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +0000950 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mihailim57c591a2008-06-23 21:26:05 +0000951 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000952 }
mihailim57c591a2008-06-23 21:26:05 +0000953 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000954 break;
955 }
drhfeac5f82004-08-01 00:10:45 +0000956 case MODE_Tcl: {
957 if( p->cnt++==0 && p->showHeader ){
958 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000959 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +0000960 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000961 }
mistachkin636bf9f2014-07-19 20:15:16 +0000962 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000963 }
964 if( azArg==0 ) break;
965 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +0000966 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +0000967 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000968 }
mistachkin636bf9f2014-07-19 20:15:16 +0000969 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000970 break;
971 }
drh8e64d1c2004-10-07 00:32:39 +0000972 case MODE_Csv: {
drh047d4532015-01-18 20:30:23 +0000973 setBinaryMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +0000974 if( p->cnt++==0 && p->showHeader ){
975 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000976 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000977 }
mistachkine0d68852014-12-11 03:12:33 +0000978 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000979 }
drh40253262014-10-17 21:35:05 +0000980 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +0000981 for(i=0; i<nArg; i++){
982 output_csv(p, azArg[i], i<nArg-1);
983 }
mistachkine0d68852014-12-11 03:12:33 +0000984 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000985 }
drh047d4532015-01-18 20:30:23 +0000986 setTextMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +0000987 break;
988 }
drh28bd4bc2000-06-15 15:57:22 +0000989 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000990 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000991 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000992 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000993 for(i=0; i<nArg; i++){
994 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000995 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000996 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000997 }else if( aiType && aiType[i]==SQLITE_TEXT ){
998 if( zSep[0] ) fprintf(p->out,"%s",zSep);
999 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001000 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1001 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +00001002 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00001003 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1004 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1005 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1006 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1007 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00001008 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +00001009 fprintf(p->out,"%s%s",zSep, azArg[i]);
1010 }else{
1011 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1012 output_quoted_string(p->out, azArg[i]);
1013 }
1014 }
1015 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001016 break;
drh28bd4bc2000-06-15 15:57:22 +00001017 }
mistachkin636bf9f2014-07-19 20:15:16 +00001018 case MODE_Ascii: {
1019 if( p->cnt++==0 && p->showHeader ){
1020 for(i=0; i<nArg; i++){
1021 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1022 fprintf(p->out,"%s",azCol[i] ? azCol[i] : "");
1023 }
1024 fprintf(p->out, "%s", p->rowSeparator);
1025 }
1026 if( azArg==0 ) break;
1027 for(i=0; i<nArg; i++){
1028 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
mistachkin44b99f72014-12-11 03:29:14 +00001029 fprintf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00001030 }
1031 fprintf(p->out, "%s", p->rowSeparator);
1032 break;
1033 }
persicom1d0b8722002-04-18 02:53:04 +00001034 }
drh75897232000-05-29 14:26:00 +00001035 return 0;
1036}
1037
1038/*
shane626a6e42009-10-22 17:30:15 +00001039** This is the callback routine that the SQLite library
1040** invokes for each row of a query result.
1041*/
1042static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1043 /* since we don't have type info, call the shell_callback with a NULL value */
1044 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1045}
1046
1047/*
drhdcd87a92014-08-18 13:45:42 +00001048** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00001049** the name of the table given. Escape any quote characters in the
1050** table name.
1051*/
drhdcd87a92014-08-18 13:45:42 +00001052static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00001053 int i, n;
1054 int needQuote;
1055 char *z;
1056
1057 if( p->zDestTable ){
1058 free(p->zDestTable);
1059 p->zDestTable = 0;
1060 }
1061 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001062 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001063 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001064 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001065 needQuote = 1;
1066 if( zName[i]=='\'' ) n++;
1067 }
1068 }
1069 if( needQuote ) n += 2;
1070 z = p->zDestTable = malloc( n+1 );
1071 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +00001072 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00001073 exit(1);
1074 }
1075 n = 0;
1076 if( needQuote ) z[n++] = '\'';
1077 for(i=0; zName[i]; i++){
1078 z[n++] = zName[i];
1079 if( zName[i]=='\'' ) z[n++] = '\'';
1080 }
1081 if( needQuote ) z[n++] = '\'';
1082 z[n] = 0;
1083}
1084
danielk19772a02e332004-06-05 08:04:36 +00001085/* zIn is either a pointer to a NULL-terminated string in memory obtained
1086** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1087** added to zIn, and the result returned in memory obtained from malloc().
1088** zIn, if it was not NULL, is freed.
1089**
1090** If the third argument, quote, is not '\0', then it is used as a
1091** quote character for zAppend.
1092*/
drhc28490c2006-10-26 14:25:58 +00001093static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001094 int len;
1095 int i;
drh4f21c4a2008-12-10 22:15:00 +00001096 int nAppend = strlen30(zAppend);
1097 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001098
1099 len = nAppend+nIn+1;
1100 if( quote ){
1101 len += 2;
1102 for(i=0; i<nAppend; i++){
1103 if( zAppend[i]==quote ) len++;
1104 }
1105 }
1106
1107 zIn = (char *)realloc(zIn, len);
1108 if( !zIn ){
1109 return 0;
1110 }
1111
1112 if( quote ){
1113 char *zCsr = &zIn[nIn];
1114 *zCsr++ = quote;
1115 for(i=0; i<nAppend; i++){
1116 *zCsr++ = zAppend[i];
1117 if( zAppend[i]==quote ) *zCsr++ = quote;
1118 }
1119 *zCsr++ = quote;
1120 *zCsr++ = '\0';
1121 assert( (zCsr-zIn)==len );
1122 }else{
1123 memcpy(&zIn[nIn], zAppend, nAppend);
1124 zIn[len-1] = '\0';
1125 }
1126
1127 return zIn;
1128}
1129
drhdd3d4592004-08-30 01:54:05 +00001130
1131/*
drhb21a8e42012-01-28 21:08:51 +00001132** Execute a query statement that will generate SQL output. Print
1133** the result columns, comma-separated, on a line and then add a
1134** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001135**
drhb21a8e42012-01-28 21:08:51 +00001136** If the number of columns is 1 and that column contains text "--"
1137** then write the semicolon on a separate line. That way, if a
1138** "--" comment occurs at the end of the statement, the comment
1139** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001140*/
drh157e29a2009-05-21 15:15:00 +00001141static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001142 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001143 const char *zSelect, /* SELECT statement to extract content */
1144 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001145){
drhdd3d4592004-08-30 01:54:05 +00001146 sqlite3_stmt *pSelect;
1147 int rc;
drhb21a8e42012-01-28 21:08:51 +00001148 int nResult;
1149 int i;
1150 const char *z;
drhc7181902014-02-27 15:04:13 +00001151 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001152 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001153 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001154 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001155 return rc;
1156 }
1157 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001158 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001159 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001160 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001161 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001162 zFirstRow = 0;
1163 }
drhb21a8e42012-01-28 21:08:51 +00001164 z = (const char*)sqlite3_column_text(pSelect, 0);
1165 fprintf(p->out, "%s", z);
1166 for(i=1; i<nResult; i++){
1167 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1168 }
1169 if( z==0 ) z = "";
1170 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1171 if( z[0] ){
1172 fprintf(p->out, "\n;\n");
1173 }else{
1174 fprintf(p->out, ";\n");
1175 }
drhdd3d4592004-08-30 01:54:05 +00001176 rc = sqlite3_step(pSelect);
1177 }
drh2f464a02011-10-13 00:41:49 +00001178 rc = sqlite3_finalize(pSelect);
1179 if( rc!=SQLITE_OK ){
1180 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001181 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001182 }
1183 return rc;
drhdd3d4592004-08-30 01:54:05 +00001184}
1185
shane626a6e42009-10-22 17:30:15 +00001186/*
1187** Allocate space and save off current error string.
1188*/
1189static char *save_err_msg(
1190 sqlite3 *db /* Database to query */
1191){
1192 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1193 char *zErrMsg = sqlite3_malloc(nErrMsg);
1194 if( zErrMsg ){
1195 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1196 }
1197 return zErrMsg;
1198}
1199
1200/*
shaneh642d8b82010-07-28 16:05:34 +00001201** Display memory stats.
1202*/
1203static int display_stats(
1204 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001205 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001206 int bReset /* True to reset the stats */
1207){
1208 int iCur;
1209 int iHiwtr;
1210
1211 if( pArg && pArg->out ){
1212
1213 iHiwtr = iCur = -1;
1214 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001215 fprintf(pArg->out,
1216 "Memory Used: %d (max %d) bytes\n",
1217 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001218 iHiwtr = iCur = -1;
1219 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001220 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
1221 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001222 if( pArg->shellFlgs & SHFLG_Pagecache ){
1223 iHiwtr = iCur = -1;
1224 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001225 fprintf(pArg->out,
1226 "Number of Pcache Pages Used: %d (max %d) pages\n",
1227 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001228 }
shaneh642d8b82010-07-28 16:05:34 +00001229 iHiwtr = iCur = -1;
1230 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001231 fprintf(pArg->out,
1232 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1233 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001234 if( pArg->shellFlgs & SHFLG_Scratch ){
1235 iHiwtr = iCur = -1;
1236 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001237 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n",
1238 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001239 }
shaneh642d8b82010-07-28 16:05:34 +00001240 iHiwtr = iCur = -1;
1241 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001242 fprintf(pArg->out,
1243 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1244 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001245 iHiwtr = iCur = -1;
1246 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001247 fprintf(pArg->out, "Largest Allocation: %d bytes\n",
1248 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001249 iHiwtr = iCur = -1;
1250 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001251 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
1252 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001253 iHiwtr = iCur = -1;
1254 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001255 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
1256 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001257#ifdef YYTRACKMAXSTACKDEPTH
1258 iHiwtr = iCur = -1;
1259 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001260 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
1261 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001262#endif
1263 }
1264
1265 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001266 if( pArg->shellFlgs & SHFLG_Lookaside ){
1267 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001268 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1269 &iCur, &iHiwtr, bReset);
1270 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n",
1271 iCur, iHiwtr);
1272 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1273 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001274 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001275 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1276 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001277 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001278 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1279 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001280 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1281 }
shaneh642d8b82010-07-28 16:05:34 +00001282 iHiwtr = iCur = -1;
1283 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001284 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n",iCur);
1285 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001286 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1287 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1288 iHiwtr = iCur = -1;
1289 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1290 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001291 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001292 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1293 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1294 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001295 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001296 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001297 iHiwtr = iCur = -1;
1298 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001299 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001300 }
1301
1302 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001303 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1304 bReset);
shaneh642d8b82010-07-28 16:05:34 +00001305 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1306 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1307 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001308 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
shaneh642d8b82010-07-28 16:05:34 +00001309 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001310 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1311 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001312 }
1313
1314 return 0;
1315}
1316
1317/*
dan8d1edb92014-11-05 09:07:28 +00001318** Display scan stats.
1319*/
1320static void display_scanstats(
1321 sqlite3 *db, /* Database to query */
1322 ShellState *pArg /* Pointer to ShellState */
1323){
1324#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
drh15f23c22014-11-06 12:46:16 +00001325 int i, k, n, mx;
dan8d1edb92014-11-05 09:07:28 +00001326 fprintf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001327 mx = 0;
1328 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001329 double rEstLoop = 1.0;
1330 for(i=n=0; 1; i++){
1331 sqlite3_stmt *p = pArg->pStmt;
1332 sqlite3_int64 nLoop, nVisit;
1333 double rEst;
1334 int iSid;
1335 const char *zExplain;
1336 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1337 break;
1338 }
1339 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001340 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001341 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001342 if( n==0 ){
1343 rEstLoop = (double)nLoop;
drh15f23c22014-11-06 12:46:16 +00001344 if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001345 }
drh42f30bc2014-11-06 12:08:21 +00001346 n++;
1347 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1348 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1349 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1350 fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1351 rEstLoop *= rEst;
drh4ace5362014-11-10 14:42:28 +00001352 fprintf(pArg->out,
1353 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001354 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001355 );
dan8d1edb92014-11-05 09:07:28 +00001356 }
dan8d1edb92014-11-05 09:07:28 +00001357 }
dan8d1edb92014-11-05 09:07:28 +00001358 fprintf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001359#endif
dan8d1edb92014-11-05 09:07:28 +00001360}
1361
1362/*
dana98bf362013-11-13 18:35:01 +00001363** Parameter azArray points to a zero-terminated array of strings. zStr
1364** points to a single nul-terminated string. Return non-zero if zStr
1365** is equal, according to strcmp(), to any of the strings in the array.
1366** Otherwise, return zero.
1367*/
1368static int str_in_array(const char *zStr, const char **azArray){
1369 int i;
1370 for(i=0; azArray[i]; i++){
1371 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1372 }
1373 return 0;
1374}
1375
1376/*
1377** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001378** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001379** spaces each opcode should be indented before it is output.
1380**
1381** The indenting rules are:
1382**
1383** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1384** all opcodes that occur between the p2 jump destination and the opcode
1385** itself by 2 spaces.
1386**
drh01752bc2013-11-14 23:59:33 +00001387** * For each "Goto", if the jump destination is earlier in the program
1388** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001389** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001390** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001391** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001392** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001393*/
drhdcd87a92014-08-18 13:45:42 +00001394static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001395 const char *zSql; /* The text of the SQL statement */
1396 const char *z; /* Used to check if this is an EXPLAIN */
1397 int *abYield = 0; /* True if op is an OP_Yield */
1398 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001399 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001400
drh8ad0de32014-03-20 18:45:27 +00001401 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1402 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001403 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1404 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001405 const char *azGoto[] = { "Goto", 0 };
1406
1407 /* Try to figure out if this is really an EXPLAIN statement. If this
1408 ** cannot be verified, return early. */
1409 zSql = sqlite3_sql(pSql);
1410 if( zSql==0 ) return;
1411 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1412 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1413
1414 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1415 int i;
danc4650bb2013-11-18 08:41:06 +00001416 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001417 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001418
1419 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1420 ** p2 is an instruction address, set variable p2op to the index of that
1421 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1422 ** the current instruction is part of a sub-program generated by an
1423 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001424 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001425 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001426
1427 /* Grow the p->aiIndent array as required */
1428 if( iOp>=nAlloc ){
1429 nAlloc += 100;
1430 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1431 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1432 }
1433 abYield[iOp] = str_in_array(zOp, azYield);
1434 p->aiIndent[iOp] = 0;
1435 p->nIndent = iOp+1;
1436
1437 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001438 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001439 }
drhfe705102014-03-06 13:38:37 +00001440 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1441 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1442 ){
drhe73f0592014-01-21 22:25:45 +00001443 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001444 }
1445 }
1446
danc4650bb2013-11-18 08:41:06 +00001447 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001448 sqlite3_free(abYield);
1449 sqlite3_reset(pSql);
1450}
1451
1452/*
1453** Free the array allocated by explain_data_prepare().
1454*/
drhdcd87a92014-08-18 13:45:42 +00001455static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001456 sqlite3_free(p->aiIndent);
1457 p->aiIndent = 0;
1458 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001459 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001460}
1461
1462/*
shane626a6e42009-10-22 17:30:15 +00001463** Execute a statement or set of statements. Print
1464** any result rows/columns depending on the current mode
1465** set via the supplied callback.
1466**
1467** This is very similar to SQLite's built-in sqlite3_exec()
1468** function except it takes a slightly different callback
1469** and callback data argument.
1470*/
1471static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001472 sqlite3 *db, /* An open database */
1473 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001474 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001475 /* (not the same as sqlite3_exec) */
1476 ShellState *pArg, /* Pointer to ShellState */
1477 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001478){
dan4564ced2010-01-05 04:59:56 +00001479 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1480 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001481 int rc2;
dan4564ced2010-01-05 04:59:56 +00001482 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001483
1484 if( pzErrMsg ){
1485 *pzErrMsg = NULL;
1486 }
1487
shaneb9fc17d2009-10-22 21:23:35 +00001488 while( zSql[0] && (SQLITE_OK == rc) ){
1489 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1490 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001491 if( pzErrMsg ){
1492 *pzErrMsg = save_err_msg(db);
1493 }
1494 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001495 if( !pStmt ){
1496 /* this happens for a comment or white-space */
1497 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001498 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001499 continue;
1500 }
shane626a6e42009-10-22 17:30:15 +00001501
shaneh642d8b82010-07-28 16:05:34 +00001502 /* save off the prepared statment handle and reset row count */
1503 if( pArg ){
1504 pArg->pStmt = pStmt;
1505 pArg->cnt = 0;
1506 }
1507
shanehb7977c52010-01-18 18:17:10 +00001508 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001509 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001510 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001511 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001512 }
shanehb7977c52010-01-18 18:17:10 +00001513
drhefbf3b12014-02-28 20:47:24 +00001514 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1515 if( pArg && pArg->autoEQP ){
1516 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001517 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1518 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001519 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1520 if( rc==SQLITE_OK ){
1521 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1522 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1523 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1524 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1525 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1526 }
1527 }
1528 sqlite3_finalize(pExplain);
1529 sqlite3_free(zEQP);
1530 }
1531
dana98bf362013-11-13 18:35:01 +00001532 /* If the shell is currently in ".explain" mode, gather the extra
1533 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001534 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001535 explain_data_prepare(pArg, pStmt);
1536 }
1537
shaneb9fc17d2009-10-22 21:23:35 +00001538 /* perform the first step. this will tell us if we
1539 ** have a result set or not and how wide it is.
1540 */
1541 rc = sqlite3_step(pStmt);
1542 /* if we have a result set... */
1543 if( SQLITE_ROW == rc ){
1544 /* if we have a callback... */
1545 if( xCallback ){
1546 /* allocate space for col name ptr, value ptr, and type */
1547 int nCol = sqlite3_column_count(pStmt);
1548 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1549 if( !pData ){
1550 rc = SQLITE_NOMEM;
1551 }else{
1552 char **azCols = (char **)pData; /* Names of result columns */
1553 char **azVals = &azCols[nCol]; /* Results */
1554 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001555 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001556 assert(sizeof(int) <= sizeof(char *));
1557 /* save off ptrs to column names */
1558 for(i=0; i<nCol; i++){
1559 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1560 }
shaneb9fc17d2009-10-22 21:23:35 +00001561 do{
1562 /* extract the data and data types */
1563 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001564 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001565 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001566 azVals[i] = "";
1567 }else{
1568 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1569 }
shaneb9fc17d2009-10-22 21:23:35 +00001570 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1571 rc = SQLITE_NOMEM;
1572 break; /* from for */
1573 }
1574 } /* end for */
1575
1576 /* if data and types extracted successfully... */
1577 if( SQLITE_ROW == rc ){
1578 /* call the supplied callback with the result row data */
1579 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1580 rc = SQLITE_ABORT;
1581 }else{
1582 rc = sqlite3_step(pStmt);
1583 }
1584 }
1585 } while( SQLITE_ROW == rc );
1586 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001587 }
1588 }else{
1589 do{
1590 rc = sqlite3_step(pStmt);
1591 } while( rc == SQLITE_ROW );
1592 }
1593 }
1594
dana98bf362013-11-13 18:35:01 +00001595 explain_data_delete(pArg);
1596
shaneh642d8b82010-07-28 16:05:34 +00001597 /* print usage stats if stats on */
1598 if( pArg && pArg->statsOn ){
1599 display_stats(db, pArg, 0);
1600 }
1601
dan8d1edb92014-11-05 09:07:28 +00001602 /* print loop-counters if required */
1603 if( pArg && pArg->scanstatsOn ){
1604 display_scanstats(db, pArg);
1605 }
1606
dan4564ced2010-01-05 04:59:56 +00001607 /* Finalize the statement just executed. If this fails, save a
1608 ** copy of the error message. Otherwise, set zSql to point to the
1609 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001610 rc2 = sqlite3_finalize(pStmt);
1611 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001612 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001613 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001614 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001615 }else if( pzErrMsg ){
1616 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001617 }
shaneh642d8b82010-07-28 16:05:34 +00001618
1619 /* clear saved stmt handle */
1620 if( pArg ){
1621 pArg->pStmt = NULL;
1622 }
shane626a6e42009-10-22 17:30:15 +00001623 }
shaneb9fc17d2009-10-22 21:23:35 +00001624 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001625
1626 return rc;
1627}
1628
drhdd3d4592004-08-30 01:54:05 +00001629
drh33048c02001-10-01 14:29:22 +00001630/*
drh4c653a02000-06-07 01:27:47 +00001631** This is a different callback routine used for dumping the database.
1632** Each row received by this callback consists of a table name,
1633** the table type ("index" or "table") and SQL to create the table.
1634** This routine should print text sufficient to recreate the table.
1635*/
1636static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001637 int rc;
1638 const char *zTable;
1639 const char *zType;
1640 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001641 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001642 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001643
drh902b9ee2008-12-05 17:17:07 +00001644 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001645 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001646 zTable = azArg[0];
1647 zType = azArg[1];
1648 zSql = azArg[2];
1649
drh00b950d2005-09-11 02:03:03 +00001650 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001651 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001652 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001653 fprintf(p->out, "ANALYZE sqlite_master;\n");
1654 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1655 return 0;
drh45e29d82006-11-20 16:21:10 +00001656 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1657 char *zIns;
1658 if( !p->writableSchema ){
1659 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1660 p->writableSchema = 1;
1661 }
1662 zIns = sqlite3_mprintf(
1663 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1664 "VALUES('table','%q','%q',0,'%q');",
1665 zTable, zTable, zSql);
1666 fprintf(p->out, "%s\n", zIns);
1667 sqlite3_free(zIns);
1668 return 0;
drh00b950d2005-09-11 02:03:03 +00001669 }else{
1670 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001671 }
danielk19772a02e332004-06-05 08:04:36 +00001672
1673 if( strcmp(zType, "table")==0 ){
1674 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001675 char *zSelect = 0;
1676 char *zTableInfo = 0;
1677 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001678 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001679
1680 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1681 zTableInfo = appendText(zTableInfo, zTable, '"');
1682 zTableInfo = appendText(zTableInfo, ");", 0);
1683
drhc7181902014-02-27 15:04:13 +00001684 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001685 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001686 if( rc!=SQLITE_OK || !pTableInfo ){
1687 return 1;
1688 }
1689
1690 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001691 /* Always quote the table name, even if it appears to be pure ascii,
1692 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1693 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001694 if( zTmp ){
1695 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001696 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001697 }
1698 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1699 rc = sqlite3_step(pTableInfo);
1700 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001701 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001702 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001703 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001704 rc = sqlite3_step(pTableInfo);
1705 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001706 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001707 }else{
1708 zSelect = appendText(zSelect, ") ", 0);
1709 }
drh157e29a2009-05-21 15:15:00 +00001710 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001711 }
1712 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001713 if( rc!=SQLITE_OK || nRow==0 ){
1714 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001715 return 1;
1716 }
1717 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1718 zSelect = appendText(zSelect, zTable, '"');
1719
drh2f464a02011-10-13 00:41:49 +00001720 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001721 if( rc==SQLITE_CORRUPT ){
1722 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001723 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001724 }
drh85e72432012-04-11 11:38:53 +00001725 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001726 }
drh4c653a02000-06-07 01:27:47 +00001727 return 0;
1728}
1729
1730/*
drh45e29d82006-11-20 16:21:10 +00001731** Run zQuery. Use dump_callback() as the callback routine so that
1732** the contents of the query are output as SQL statements.
1733**
drhdd3d4592004-08-30 01:54:05 +00001734** If we get a SQLITE_CORRUPT error, rerun the query after appending
1735** "ORDER BY rowid DESC" to the end.
1736*/
1737static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001738 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001739 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001740){
1741 int rc;
drh2f464a02011-10-13 00:41:49 +00001742 char *zErr = 0;
1743 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001744 if( rc==SQLITE_CORRUPT ){
1745 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001746 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001747 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1748 if( zErr ){
1749 fprintf(p->out, "/****** %s ******/\n", zErr);
1750 sqlite3_free(zErr);
1751 zErr = 0;
1752 }
drhdd3d4592004-08-30 01:54:05 +00001753 zQ2 = malloc( len+100 );
1754 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001755 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001756 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1757 if( rc ){
1758 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1759 }else{
1760 rc = SQLITE_CORRUPT;
1761 }
1762 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001763 free(zQ2);
1764 }
1765 return rc;
1766}
1767
1768/*
drh75897232000-05-29 14:26:00 +00001769** Text of a help message
1770*/
persicom1d0b8722002-04-18 02:53:04 +00001771static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001772 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001773 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00001774 ".binary on|off Turn binary output on or off. 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);
danielk197780290862004-05-22 09:21:21 +00001912 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001913 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1914 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1915 shellstaticFunc, 0, 0);
1916 }
1917 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001918 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001919 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001920 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001921 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001922 }
drhc2e87a32006-06-27 15:16:14 +00001923#ifndef SQLITE_OMIT_LOAD_EXTENSION
1924 sqlite3_enable_load_extension(p->db, 1);
1925#endif
drhba5b0932014-07-24 12:39:59 +00001926 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1927 readfileFunc, 0, 0);
1928 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1929 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001930 }
1931}
1932
1933/*
drhfeac5f82004-08-01 00:10:45 +00001934** Do C-language style dequoting.
1935**
mistachkinf21979d2015-01-18 05:35:01 +00001936** \a -> alarm
1937** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00001938** \t -> tab
1939** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00001940** \v -> vertical tab
1941** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00001942** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00001943** \s -> space
drh4c56b992013-06-27 13:26:55 +00001944** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00001945** \' -> '
drhfeac5f82004-08-01 00:10:45 +00001946** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00001947** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00001948*/
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++){
1954 if( c=='\\' ){
1955 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00001956 if( c=='a' ){
1957 c = '\a';
1958 }else if( c=='b' ){
1959 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00001960 }else if( c=='t' ){
1961 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00001962 }else if( c=='n' ){
1963 c = '\n';
1964 }else if( c=='v' ){
1965 c = '\v';
1966 }else if( c=='f' ){
1967 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00001968 }else if( c=='r' ){
1969 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00001970 }else if( c=='"' ){
1971 c = '"';
1972 }else if( c=='\'' ){
1973 c = '\'';
drh4c56b992013-06-27 13:26:55 +00001974 }else if( c=='\\' ){
1975 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001976 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001977 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001978 if( z[i+1]>='0' && z[i+1]<='7' ){
1979 i++;
1980 c = (c<<3) + z[i] - '0';
1981 if( z[i+1]>='0' && z[i+1]<='7' ){
1982 i++;
1983 c = (c<<3) + z[i] - '0';
1984 }
1985 }
1986 }
1987 }
1988 z[j] = c;
1989 }
drhc2ce0be2014-05-29 12:36:14 +00001990 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001991}
1992
1993/*
drh348d19c2013-06-03 12:47:43 +00001994** Return the value of a hexadecimal digit. Return -1 if the input
1995** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001996*/
drh348d19c2013-06-03 12:47:43 +00001997static int hexDigitValue(char c){
1998 if( c>='0' && c<='9' ) return c - '0';
1999 if( c>='a' && c<='f' ) return c - 'a' + 10;
2000 if( c>='A' && c<='F' ) return c - 'A' + 10;
2001 return -1;
drhc28490c2006-10-26 14:25:58 +00002002}
2003
2004/*
drh7d9f3942013-04-03 01:26:54 +00002005** Interpret zArg as an integer value, possibly with suffixes.
2006*/
2007static sqlite3_int64 integerValue(const char *zArg){
2008 sqlite3_int64 v = 0;
2009 static const struct { char *zSuffix; int iMult; } aMult[] = {
2010 { "KiB", 1024 },
2011 { "MiB", 1024*1024 },
2012 { "GiB", 1024*1024*1024 },
2013 { "KB", 1000 },
2014 { "MB", 1000000 },
2015 { "GB", 1000000000 },
2016 { "K", 1000 },
2017 { "M", 1000000 },
2018 { "G", 1000000000 },
2019 };
2020 int i;
2021 int isNeg = 0;
2022 if( zArg[0]=='-' ){
2023 isNeg = 1;
2024 zArg++;
2025 }else if( zArg[0]=='+' ){
2026 zArg++;
2027 }
drh348d19c2013-06-03 12:47:43 +00002028 if( zArg[0]=='0' && zArg[1]=='x' ){
2029 int x;
2030 zArg += 2;
2031 while( (x = hexDigitValue(zArg[0]))>=0 ){
2032 v = (v<<4) + x;
2033 zArg++;
2034 }
2035 }else{
2036 while( IsDigit(zArg[0]) ){
2037 v = v*10 + zArg[0] - '0';
2038 zArg++;
2039 }
drh7d9f3942013-04-03 01:26:54 +00002040 }
drhc2bed0a2013-05-24 11:57:50 +00002041 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002042 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2043 v *= aMult[i].iMult;
2044 break;
2045 }
2046 }
2047 return isNeg? -v : v;
2048}
2049
2050/*
drh348d19c2013-06-03 12:47:43 +00002051** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2052** for TRUE and FALSE. Return the integer value if appropriate.
2053*/
2054static int booleanValue(char *zArg){
2055 int i;
2056 if( zArg[0]=='0' && zArg[1]=='x' ){
2057 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2058 }else{
2059 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2060 }
2061 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2062 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2063 return 1;
2064 }
2065 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2066 return 0;
2067 }
2068 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2069 zArg);
2070 return 0;
2071}
2072
2073/*
drh42f64e52012-04-04 16:56:23 +00002074** Close an output file, assuming it is not stderr or stdout
2075*/
2076static void output_file_close(FILE *f){
2077 if( f && f!=stdout && f!=stderr ) fclose(f);
2078}
2079
2080/*
2081** Try to open an output file. The names "stdout" and "stderr" are
2082** recognized and do the right thing. NULL is returned if the output
2083** filename is "off".
2084*/
2085static FILE *output_file_open(const char *zFile){
2086 FILE *f;
2087 if( strcmp(zFile,"stdout")==0 ){
2088 f = stdout;
2089 }else if( strcmp(zFile, "stderr")==0 ){
2090 f = stderr;
2091 }else if( strcmp(zFile, "off")==0 ){
2092 f = 0;
2093 }else{
2094 f = fopen(zFile, "wb");
2095 if( f==0 ){
2096 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2097 }
2098 }
2099 return f;
2100}
2101
2102/*
2103** A routine for handling output from sqlite3_trace().
2104*/
2105static void sql_trace_callback(void *pArg, const char *z){
2106 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002107 if( f ){
2108 int i = (int)strlen(z);
2109 while( i>0 && z[i-1]==';' ){ i--; }
2110 fprintf(f, "%.*s;\n", i, z);
2111 }
drh42f64e52012-04-04 16:56:23 +00002112}
2113
2114/*
drhd8621b92012-04-17 09:09:33 +00002115** A no-op routine that runs with the ".breakpoint" doc-command. This is
2116** a useful spot to set a debugger breakpoint.
2117*/
2118static void test_breakpoint(void){
2119 static int nCall = 0;
2120 nCall++;
2121}
2122
2123/*
mistachkin636bf9f2014-07-19 20:15:16 +00002124** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002125*/
mistachkin636bf9f2014-07-19 20:15:16 +00002126typedef struct ImportCtx ImportCtx;
2127struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002128 const char *zFile; /* Name of the input file */
2129 FILE *in; /* Read the CSV text from this input stream */
2130 char *z; /* Accumulated text for a field */
2131 int n; /* Number of bytes in z */
2132 int nAlloc; /* Space allocated for z[] */
2133 int nLine; /* Current line number */
2134 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002135 int cColSep; /* The column separator character. (Usually ",") */
2136 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002137};
2138
2139/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002140static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002141 if( p->n+1>=p->nAlloc ){
2142 p->nAlloc += p->nAlloc + 100;
2143 p->z = sqlite3_realloc(p->z, p->nAlloc);
2144 if( p->z==0 ){
2145 fprintf(stderr, "out of memory\n");
2146 exit(1);
2147 }
2148 }
2149 p->z[p->n++] = (char)c;
2150}
2151
2152/* Read a single field of CSV text. Compatible with rfc4180 and extended
2153** with the option of having a separator other than ",".
2154**
2155** + Input comes from p->in.
2156** + Store results in p->z of length p->n. Space to hold p->z comes
2157** from sqlite3_malloc().
mistachkin636bf9f2014-07-19 20:15:16 +00002158** + Use p->cSep as the column separator. The default is ",".
2159** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002160** + Keep track of the line number in p->nLine.
2161** + Store the character that terminates the field in p->cTerm. Store
2162** EOF on end-of-file.
2163** + Report syntax errors on stderr
2164*/
mistachkin44723ce2015-03-21 02:22:37 +00002165static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002166 int c;
2167 int cSep = p->cColSep;
2168 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002169 p->n = 0;
2170 c = fgetc(p->in);
2171 if( c==EOF || seenInterrupt ){
2172 p->cTerm = EOF;
2173 return 0;
2174 }
2175 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002176 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002177 int startLine = p->nLine;
2178 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002179 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002180 while( 1 ){
2181 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002182 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002183 if( c==cQuote ){
2184 if( pc==cQuote ){
2185 pc = 0;
2186 continue;
2187 }
2188 }
2189 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002190 || (c==rSep && pc==cQuote)
2191 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002192 || (c==EOF && pc==cQuote)
2193 ){
2194 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002195 p->cTerm = c;
2196 break;
2197 }
2198 if( pc==cQuote && c!='\r' ){
2199 fprintf(stderr, "%s:%d: unescaped %c character\n",
2200 p->zFile, p->nLine, cQuote);
2201 }
2202 if( c==EOF ){
2203 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2204 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002205 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002206 break;
2207 }
mistachkin636bf9f2014-07-19 20:15:16 +00002208 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002209 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002210 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002211 }
drhdb95f682013-06-26 22:46:00 +00002212 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002213 while( c!=EOF && c!=cSep && c!=rSep ){
2214 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002215 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002216 }
mistachkin636bf9f2014-07-19 20:15:16 +00002217 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002218 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002219 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002220 }
drhdb95f682013-06-26 22:46:00 +00002221 p->cTerm = c;
2222 }
drh8dd675e2013-07-12 21:09:24 +00002223 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002224 return p->z;
2225}
2226
mistachkin636bf9f2014-07-19 20:15:16 +00002227/* Read a single field of ASCII delimited text.
2228**
2229** + Input comes from p->in.
2230** + Store results in p->z of length p->n. Space to hold p->z comes
2231** from sqlite3_malloc().
2232** + Use p->cSep as the column separator. The default is "\x1F".
2233** + Use p->rSep as the row separator. The default is "\x1E".
2234** + Keep track of the row number in p->nLine.
2235** + Store the character that terminates the field in p->cTerm. Store
2236** EOF on end-of-file.
2237** + Report syntax errors on stderr
2238*/
mistachkin44723ce2015-03-21 02:22:37 +00002239static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002240 int c;
2241 int cSep = p->cColSep;
2242 int rSep = p->cRowSep;
2243 p->n = 0;
2244 c = fgetc(p->in);
2245 if( c==EOF || seenInterrupt ){
2246 p->cTerm = EOF;
2247 return 0;
2248 }
2249 while( c!=EOF && c!=cSep && c!=rSep ){
2250 import_append_char(p, c);
2251 c = fgetc(p->in);
2252 }
2253 if( c==rSep ){
2254 p->nLine++;
2255 }
2256 p->cTerm = c;
2257 if( p->z ) p->z[p->n] = 0;
2258 return p->z;
2259}
2260
drhdb95f682013-06-26 22:46:00 +00002261/*
drh4bbcf102014-02-06 02:46:08 +00002262** Try to transfer data for table zTable. If an error is seen while
2263** moving forward, try to go backwards. The backwards movement won't
2264** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002265*/
mistachkine31ae902014-02-06 01:15:29 +00002266static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002267 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002268 sqlite3 *newDb,
2269 const char *zTable
2270){
2271 sqlite3_stmt *pQuery = 0;
2272 sqlite3_stmt *pInsert = 0;
2273 char *zQuery = 0;
2274 char *zInsert = 0;
2275 int rc;
2276 int i, j, n;
2277 int nTable = (int)strlen(zTable);
2278 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002279 int cnt = 0;
2280 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002281
2282 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2283 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2284 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002285 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002286 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2287 zQuery);
2288 goto end_data_xfer;
2289 }
2290 n = sqlite3_column_count(pQuery);
2291 zInsert = sqlite3_malloc(200 + nTable + n*3);
2292 if( zInsert==0 ){
2293 fprintf(stderr, "out of memory\n");
2294 goto end_data_xfer;
2295 }
2296 sqlite3_snprintf(200+nTable,zInsert,
2297 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2298 i = (int)strlen(zInsert);
2299 for(j=1; j<n; j++){
2300 memcpy(zInsert+i, ",?", 2);
2301 i += 2;
2302 }
2303 memcpy(zInsert+i, ");", 3);
2304 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2305 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002306 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002307 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2308 zQuery);
2309 goto end_data_xfer;
2310 }
2311 for(k=0; k<2; k++){
2312 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2313 for(i=0; i<n; i++){
2314 switch( sqlite3_column_type(pQuery, i) ){
2315 case SQLITE_NULL: {
2316 sqlite3_bind_null(pInsert, i+1);
2317 break;
2318 }
2319 case SQLITE_INTEGER: {
2320 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2321 break;
2322 }
2323 case SQLITE_FLOAT: {
2324 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2325 break;
2326 }
2327 case SQLITE_TEXT: {
2328 sqlite3_bind_text(pInsert, i+1,
2329 (const char*)sqlite3_column_text(pQuery,i),
2330 -1, SQLITE_STATIC);
2331 break;
2332 }
2333 case SQLITE_BLOB: {
2334 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2335 sqlite3_column_bytes(pQuery,i),
2336 SQLITE_STATIC);
2337 break;
2338 }
2339 }
2340 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002341 rc = sqlite3_step(pInsert);
2342 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2343 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2344 sqlite3_errmsg(newDb));
2345 }
drh3350ce92014-02-06 00:49:12 +00002346 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002347 cnt++;
2348 if( (cnt%spinRate)==0 ){
2349 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2350 fflush(stdout);
2351 }
drh3350ce92014-02-06 00:49:12 +00002352 } /* End while */
2353 if( rc==SQLITE_DONE ) break;
2354 sqlite3_finalize(pQuery);
2355 sqlite3_free(zQuery);
2356 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2357 zTable);
2358 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2359 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002360 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2361 break;
drh3350ce92014-02-06 00:49:12 +00002362 }
2363 } /* End for(k=0...) */
2364
2365end_data_xfer:
2366 sqlite3_finalize(pQuery);
2367 sqlite3_finalize(pInsert);
2368 sqlite3_free(zQuery);
2369 sqlite3_free(zInsert);
2370}
2371
2372
2373/*
2374** Try to transfer all rows of the schema that match zWhere. For
2375** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002376** If an error is encountered while moving forward through the
2377** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002378*/
mistachkine31ae902014-02-06 01:15:29 +00002379static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002380 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002381 sqlite3 *newDb,
2382 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002383 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002384){
2385 sqlite3_stmt *pQuery = 0;
2386 char *zQuery = 0;
2387 int rc;
2388 const unsigned char *zName;
2389 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002390 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002391
2392 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2393 " WHERE %s", zWhere);
2394 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2395 if( rc ){
2396 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2397 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2398 zQuery);
2399 goto end_schema_xfer;
2400 }
2401 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2402 zName = sqlite3_column_text(pQuery, 0);
2403 zSql = sqlite3_column_text(pQuery, 1);
2404 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002405 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2406 if( zErrMsg ){
2407 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2408 sqlite3_free(zErrMsg);
2409 zErrMsg = 0;
2410 }
drh3350ce92014-02-06 00:49:12 +00002411 if( xForEach ){
2412 xForEach(p, newDb, (const char*)zName);
2413 }
2414 printf("done\n");
2415 }
2416 if( rc!=SQLITE_DONE ){
2417 sqlite3_finalize(pQuery);
2418 sqlite3_free(zQuery);
2419 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2420 " WHERE %s ORDER BY rowid DESC", zWhere);
2421 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2422 if( rc ){
2423 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2424 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2425 zQuery);
2426 goto end_schema_xfer;
2427 }
2428 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2429 zName = sqlite3_column_text(pQuery, 0);
2430 zSql = sqlite3_column_text(pQuery, 1);
2431 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002432 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2433 if( zErrMsg ){
2434 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2435 sqlite3_free(zErrMsg);
2436 zErrMsg = 0;
2437 }
drh3350ce92014-02-06 00:49:12 +00002438 if( xForEach ){
2439 xForEach(p, newDb, (const char*)zName);
2440 }
2441 printf("done\n");
2442 }
2443 }
2444end_schema_xfer:
2445 sqlite3_finalize(pQuery);
2446 sqlite3_free(zQuery);
2447}
2448
2449/*
2450** Open a new database file named "zNewDb". Try to recover as much information
2451** as possible out of the main database (which might be corrupt) and write it
2452** into zNewDb.
2453*/
drhdcd87a92014-08-18 13:45:42 +00002454static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002455 int rc;
2456 sqlite3 *newDb = 0;
2457 if( access(zNewDb,0)==0 ){
2458 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2459 return;
2460 }
2461 rc = sqlite3_open(zNewDb, &newDb);
2462 if( rc ){
2463 fprintf(stderr, "Cannot create output database: %s\n",
2464 sqlite3_errmsg(newDb));
2465 }else{
drh54d0d2d2014-04-03 00:32:13 +00002466 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002467 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002468 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2469 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002470 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002471 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002472 }
2473 sqlite3_close(newDb);
2474}
2475
2476/*
drhc2ce0be2014-05-29 12:36:14 +00002477** Change the output file back to stdout
2478*/
drhdcd87a92014-08-18 13:45:42 +00002479static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002480 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002481#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002482 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002483#endif
drhc2ce0be2014-05-29 12:36:14 +00002484 }else{
2485 output_file_close(p->out);
2486 }
2487 p->outfile[0] = 0;
2488 p->out = stdout;
2489}
2490
2491/*
drhf7502f02015-02-06 14:19:44 +00002492** Run an SQL command and return the single integer result.
2493*/
2494static int db_int(ShellState *p, const char *zSql){
2495 sqlite3_stmt *pStmt;
2496 int res = 0;
2497 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2498 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2499 res = sqlite3_column_int(pStmt,0);
2500 }
2501 sqlite3_finalize(pStmt);
2502 return res;
2503}
2504
2505/*
2506** Convert a 2-byte or 4-byte big-endian integer into a native integer
2507*/
2508unsigned int get2byteInt(unsigned char *a){
2509 return (a[0]<<8) + a[1];
2510}
2511unsigned int get4byteInt(unsigned char *a){
2512 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2513}
2514
2515/*
2516** Implementation of the ".info" command.
2517**
2518** Return 1 on error, 2 to exit, and 0 otherwise.
2519*/
drh0e55db12015-02-06 14:51:13 +00002520static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002521 static const struct { const char *zName; int ofst; } aField[] = {
2522 { "file change counter:", 24 },
2523 { "database page count:", 28 },
2524 { "freelist page count:", 36 },
2525 { "schema cookie:", 40 },
2526 { "schema format:", 44 },
2527 { "default cache size:", 48 },
2528 { "autovacuum top root:", 52 },
2529 { "incremental vacuum:", 64 },
2530 { "text encoding:", 56 },
2531 { "user version:", 60 },
2532 { "application id:", 68 },
2533 { "software version:", 96 },
2534 };
drh0e55db12015-02-06 14:51:13 +00002535 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2536 { "number of tables:",
2537 "SELECT count(*) FROM %s WHERE type='table'" },
2538 { "number of indexes:",
2539 "SELECT count(*) FROM %s WHERE type='index'" },
2540 { "number of triggers:",
2541 "SELECT count(*) FROM %s WHERE type='trigger'" },
2542 { "number of views:",
2543 "SELECT count(*) FROM %s WHERE type='view'" },
2544 { "schema size:",
2545 "SELECT total(length(sql)) FROM %s" },
2546 };
2547 sqlite3_file *pFile;
2548 int i;
2549 char *zSchemaTab;
2550 char *zDb = nArg>=2 ? azArg[1] : "main";
2551 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002552 open_db(p, 0);
2553 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002554 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002555 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2556 return 1;
2557 }
2558 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2559 if( i!=SQLITE_OK ){
2560 fprintf(stderr, "unable to read database header\n");
2561 return 1;
2562 }
2563 i = get2byteInt(aHdr+16);
2564 if( i==1 ) i = 65536;
2565 fprintf(p->out, "%-20s %d\n", "database page size:", i);
2566 fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2567 fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2568 fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
2569 for(i=0; i<sizeof(aField)/sizeof(aField[0]); i++){
2570 int ofst = aField[i].ofst;
2571 unsigned int val = get4byteInt(aHdr + ofst);
2572 fprintf(p->out, "%-20s %u", aField[i].zName, val);
2573 switch( ofst ){
2574 case 56: {
2575 if( val==1 ) fprintf(p->out, " (utf8)");
2576 if( val==2 ) fprintf(p->out, " (utf16le)");
2577 if( val==3 ) fprintf(p->out, " (utf16be)");
2578 }
2579 }
2580 fprintf(p->out, "\n");
2581 }
drh0e55db12015-02-06 14:51:13 +00002582 if( zDb==0 ){
2583 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2584 }else if( strcmp(zDb,"temp")==0 ){
2585 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2586 }else{
2587 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2588 }
2589 for(i=0; i<sizeof(aQuery)/sizeof(aQuery[0]); i++){
2590 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2591 int val = db_int(p, zSql);
2592 sqlite3_free(zSql);
2593 fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
2594 }
2595 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002596 return 0;
2597}
2598
2599
2600/*
drh75897232000-05-29 14:26:00 +00002601** If an input line begins with "." then invoke this routine to
2602** process that line.
drh67505e72002-04-19 12:34:06 +00002603**
drh47ad6842006-11-08 12:25:42 +00002604** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002605*/
drhdcd87a92014-08-18 13:45:42 +00002606static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002607 int i = 1;
2608 int nArg = 0;
2609 int n, c;
drh67505e72002-04-19 12:34:06 +00002610 int rc = 0;
drh75897232000-05-29 14:26:00 +00002611 char *azArg[50];
2612
2613 /* Parse the input line into tokens.
2614 */
2615 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002616 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002617 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002618 if( zLine[i]=='\'' || zLine[i]=='"' ){
2619 int delim = zLine[i++];
2620 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002621 while( zLine[i] && zLine[i]!=delim ){
2622 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2623 i++;
2624 }
drh75897232000-05-29 14:26:00 +00002625 if( zLine[i]==delim ){
2626 zLine[i++] = 0;
2627 }
drhfeac5f82004-08-01 00:10:45 +00002628 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002629 }else{
2630 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002631 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002632 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002633 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002634 }
2635 }
2636
2637 /* Process the input line.
2638 */
shane9bd1b442009-10-23 01:27:39 +00002639 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002640 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002641 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002642 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2643 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2644 ){
drhbc46f022013-01-23 18:53:23 +00002645 const char *zDestFile = 0;
2646 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002647 sqlite3 *pDest;
2648 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002649 int j;
2650 for(j=1; j<nArg; j++){
2651 const char *z = azArg[j];
2652 if( z[0]=='-' ){
2653 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002654 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002655 {
2656 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2657 return 1;
2658 }
2659 }else if( zDestFile==0 ){
2660 zDestFile = azArg[j];
2661 }else if( zDb==0 ){
2662 zDb = zDestFile;
2663 zDestFile = azArg[j];
2664 }else{
2665 fprintf(stderr, "too many arguments to .backup\n");
2666 return 1;
2667 }
drh9ff849f2009-02-04 20:55:57 +00002668 }
drhbc46f022013-01-23 18:53:23 +00002669 if( zDestFile==0 ){
2670 fprintf(stderr, "missing FILENAME argument on .backup\n");
2671 return 1;
2672 }
2673 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002674 rc = sqlite3_open(zDestFile, &pDest);
2675 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002676 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002677 sqlite3_close(pDest);
2678 return 1;
2679 }
drh05782482013-10-24 15:20:20 +00002680 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002681 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2682 if( pBackup==0 ){
2683 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2684 sqlite3_close(pDest);
2685 return 1;
2686 }
2687 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2688 sqlite3_backup_finish(pBackup);
2689 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002690 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002691 }else{
2692 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002693 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002694 }
2695 sqlite3_close(pDest);
2696 }else
2697
drhc2ce0be2014-05-29 12:36:14 +00002698 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2699 if( nArg==2 ){
2700 bail_on_error = booleanValue(azArg[1]);
2701 }else{
2702 fprintf(stderr, "Usage: .bail on|off\n");
2703 rc = 1;
2704 }
drhc49f44e2006-10-26 18:15:42 +00002705 }else
2706
mistachkinf21979d2015-01-18 05:35:01 +00002707 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2708 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00002709 if( booleanValue(azArg[1]) ){
2710 setBinaryMode(p->out);
2711 }else{
2712 setTextMode(p->out);
2713 }
mistachkinf21979d2015-01-18 05:35:01 +00002714 }else{
2715 fprintf(stderr, "Usage: .binary on|off\n");
2716 rc = 1;
2717 }
2718 }else
2719
drhd8621b92012-04-17 09:09:33 +00002720 /* The undocumented ".breakpoint" command causes a call to the no-op
2721 ** routine named test_breakpoint().
2722 */
2723 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2724 test_breakpoint();
2725 }else
2726
drhc2ce0be2014-05-29 12:36:14 +00002727 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2728 if( nArg==2 ){
2729 tryToClone(p, azArg[1]);
2730 }else{
2731 fprintf(stderr, "Usage: .clone FILENAME\n");
2732 rc = 1;
2733 }
mistachkine31ae902014-02-06 01:15:29 +00002734 }else
2735
drhc2ce0be2014-05-29 12:36:14 +00002736 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002737 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002738 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002739 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002740 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002741 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002742 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002743 data.colWidth[0] = 3;
2744 data.colWidth[1] = 15;
2745 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002746 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002747 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002748 if( zErrMsg ){
2749 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002750 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002751 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002752 }
2753 }else
2754
drh0e55db12015-02-06 14:51:13 +00002755 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2756 rc = shell_dbinfo_command(p, nArg, azArg);
2757 }else
2758
drhc2ce0be2014-05-29 12:36:14 +00002759 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002760 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002761 /* When playing back a "dump", the content might appear in an order
2762 ** which causes immediate foreign key constraints to be violated.
2763 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002764 if( nArg!=1 && nArg!=2 ){
2765 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2766 rc = 1;
2767 goto meta_command_exit;
2768 }
drhf1dfc4f2009-09-23 15:51:35 +00002769 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002770 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002771 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002772 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002773 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002774 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002775 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002776 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002777 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002778 );
2779 run_schema_dump_query(p,
2780 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002781 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002782 );
drh2f464a02011-10-13 00:41:49 +00002783 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002784 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002785 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002786 );
drh4c653a02000-06-07 01:27:47 +00002787 }else{
2788 int i;
drhdd3d4592004-08-30 01:54:05 +00002789 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002790 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002791 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002792 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002793 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002794 " AND sql NOT NULL");
2795 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002796 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002797 "WHERE sql NOT NULL"
2798 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002799 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002800 );
danielk1977bc6ada42004-06-30 08:20:16 +00002801 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002802 }
2803 }
drh45e29d82006-11-20 16:21:10 +00002804 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002805 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002806 p->writableSchema = 0;
2807 }
drh56197952011-10-13 16:30:13 +00002808 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2809 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002810 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002811 }else
drh75897232000-05-29 14:26:00 +00002812
drhc2ce0be2014-05-29 12:36:14 +00002813 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2814 if( nArg==2 ){
2815 p->echoOn = booleanValue(azArg[1]);
2816 }else{
2817 fprintf(stderr, "Usage: .echo on|off\n");
2818 rc = 1;
2819 }
drhdaffd0e2001-04-11 14:28:42 +00002820 }else
2821
drhc2ce0be2014-05-29 12:36:14 +00002822 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2823 if( nArg==2 ){
2824 p->autoEQP = booleanValue(azArg[1]);
2825 }else{
2826 fprintf(stderr, "Usage: .eqp on|off\n");
2827 rc = 1;
2828 }
drhefbf3b12014-02-28 20:47:24 +00002829 }else
2830
drhd3ac7d92013-01-25 18:33:43 +00002831 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002832 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002833 rc = 2;
drh75897232000-05-29 14:26:00 +00002834 }else
2835
drhc2ce0be2014-05-29 12:36:14 +00002836 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002837 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002838 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002839 if(!p->normalMode.valid) {
2840 p->normalMode.valid = 1;
2841 p->normalMode.mode = p->mode;
2842 p->normalMode.showHeader = p->showHeader;
2843 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002844 }
2845 /* We could put this code under the !p->explainValid
2846 ** condition so that it does not execute if we are already in
2847 ** explain mode. However, always executing it allows us an easy
2848 ** was to reset to explain mode in case the user previously
2849 ** did an .explain followed by a .width, .mode or .header
2850 ** command.
2851 */
danielk19770d78bae2008-01-03 07:09:48 +00002852 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002853 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002854 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002855 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002856 p->colWidth[1] = 13; /* opcode */
2857 p->colWidth[2] = 4; /* P1 */
2858 p->colWidth[3] = 4; /* P2 */
2859 p->colWidth[4] = 4; /* P3 */
2860 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002861 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002862 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002863 }else if (p->normalMode.valid) {
2864 p->normalMode.valid = 0;
2865 p->mode = p->normalMode.mode;
2866 p->showHeader = p->normalMode.showHeader;
2867 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002868 }
drh75897232000-05-29 14:26:00 +00002869 }else
2870
drhc1971542014-06-23 23:28:13 +00002871 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002872 ShellState data;
drhc1971542014-06-23 23:28:13 +00002873 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002874 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002875 if( nArg!=1 ){
2876 fprintf(stderr, "Usage: .fullschema\n");
2877 rc = 1;
2878 goto meta_command_exit;
2879 }
2880 open_db(p, 0);
2881 memcpy(&data, p, sizeof(data));
2882 data.showHeader = 0;
2883 data.mode = MODE_Semi;
2884 rc = sqlite3_exec(p->db,
2885 "SELECT sql FROM"
2886 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2887 " FROM sqlite_master UNION ALL"
2888 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002889 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002890 "ORDER BY rowid",
2891 callback, &data, &zErrMsg
2892 );
drh56f674c2014-07-18 14:43:29 +00002893 if( rc==SQLITE_OK ){
2894 sqlite3_stmt *pStmt;
2895 rc = sqlite3_prepare_v2(p->db,
2896 "SELECT rowid FROM sqlite_master"
2897 " WHERE name GLOB 'sqlite_stat[134]'",
2898 -1, &pStmt, 0);
2899 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2900 sqlite3_finalize(pStmt);
2901 }
2902 if( doStats==0 ){
2903 fprintf(p->out, "/* No STAT tables available */\n");
2904 }else{
2905 fprintf(p->out, "ANALYZE sqlite_master;\n");
2906 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2907 callback, &data, &zErrMsg);
2908 data.mode = MODE_Insert;
2909 data.zDestTable = "sqlite_stat1";
2910 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2911 shell_callback, &data,&zErrMsg);
2912 data.zDestTable = "sqlite_stat3";
2913 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2914 shell_callback, &data,&zErrMsg);
2915 data.zDestTable = "sqlite_stat4";
2916 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2917 shell_callback, &data, &zErrMsg);
2918 fprintf(p->out, "ANALYZE sqlite_master;\n");
2919 }
drhc1971542014-06-23 23:28:13 +00002920 }else
2921
drhc2ce0be2014-05-29 12:36:14 +00002922 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2923 if( nArg==2 ){
2924 p->showHeader = booleanValue(azArg[1]);
2925 }else{
2926 fprintf(stderr, "Usage: .headers on|off\n");
2927 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002928 }
drh75897232000-05-29 14:26:00 +00002929 }else
2930
drhc2ce0be2014-05-29 12:36:14 +00002931 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2932 fprintf(p->out, "%s", zHelp);
2933 }else
2934
2935 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002936 char *zTable; /* Insert data into this table */
2937 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002938 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002939 int nCol; /* Number of columns in the table */
2940 int nByte; /* Number of bytes in an SQL string */
2941 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002942 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00002943 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00002944 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00002945 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00002946 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
2947 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00002948
drhc2ce0be2014-05-29 12:36:14 +00002949 if( nArg!=3 ){
2950 fprintf(stderr, "Usage: .import FILE TABLE\n");
2951 goto meta_command_exit;
2952 }
drh01f37542014-05-31 15:43:33 +00002953 zFile = azArg[1];
2954 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002955 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00002956 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00002957 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002958 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002959 if( nSep==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002960 fprintf(stderr, "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00002961 return 1;
drhfeac5f82004-08-01 00:10:45 +00002962 }
drhdb95f682013-06-26 22:46:00 +00002963 if( nSep>1 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002964 fprintf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00002965 " for import\n");
2966 return 1;
2967 }
mistachkin636bf9f2014-07-19 20:15:16 +00002968 nSep = strlen30(p->rowSeparator);
2969 if( nSep==0 ){
2970 fprintf(stderr, "Error: non-null row separator required for import\n");
2971 return 1;
2972 }
mistachkine0d68852014-12-11 03:12:33 +00002973 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
2974 /* When importing CSV (only), if the row separator is set to the
2975 ** default output row separator, change it to the default input
2976 ** row separator. This avoids having to maintain different input
2977 ** and output row separators. */
2978 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
2979 nSep = strlen30(p->rowSeparator);
2980 }
mistachkin636bf9f2014-07-19 20:15:16 +00002981 if( nSep>1 ){
2982 fprintf(stderr, "Error: multi-character row separators not allowed"
2983 " for import\n");
2984 return 1;
2985 }
2986 sCtx.zFile = zFile;
2987 sCtx.nLine = 1;
2988 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002989#ifdef SQLITE_OMIT_POPEN
mistachkinba132c72015-03-19 14:48:38 +00002990 fprintf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00002991 return 1;
2992#else
mistachkin636bf9f2014-07-19 20:15:16 +00002993 sCtx.in = popen(sCtx.zFile+1, "r");
2994 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00002995 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00002996#endif
drh5bde8162013-06-27 14:07:53 +00002997 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002998 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00002999 xCloser = fclose;
3000 }
mistachkin636bf9f2014-07-19 20:15:16 +00003001 if( p->mode==MODE_Ascii ){
3002 xRead = ascii_read_one_field;
3003 }else{
3004 xRead = csv_read_one_field;
3005 }
3006 if( sCtx.in==0 ){
drh5bde8162013-06-27 14:07:53 +00003007 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00003008 return 1;
3009 }
mistachkin636bf9f2014-07-19 20:15:16 +00003010 sCtx.cColSep = p->colSeparator[0];
3011 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00003012 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00003013 if( zSql==0 ){
3014 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003015 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003016 return 1;
3017 }
drh4f21c4a2008-12-10 22:15:00 +00003018 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00003019 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003020 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
drhdb95f682013-06-26 22:46:00 +00003021 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
3022 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3023 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00003024 while( xRead(&sCtx) ){
3025 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00003026 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00003027 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00003028 }
drh5bde8162013-06-27 14:07:53 +00003029 if( cSep=='(' ){
3030 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00003031 sqlite3_free(sCtx.z);
3032 xCloser(sCtx.in);
3033 fprintf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003034 return 1;
3035 }
drhdb95f682013-06-26 22:46:00 +00003036 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3037 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3038 sqlite3_free(zCreate);
3039 if( rc ){
3040 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
3041 sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00003042 sqlite3_free(sCtx.z);
3043 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003044 return 1;
3045 }
drhc7181902014-02-27 15:04:13 +00003046 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003047 }
drhfeac5f82004-08-01 00:10:45 +00003048 sqlite3_free(zSql);
3049 if( rc ){
shane916f9612009-10-23 00:37:15 +00003050 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003051 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00003052 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003053 return 1;
drhfeac5f82004-08-01 00:10:45 +00003054 }
shane916f9612009-10-23 00:37:15 +00003055 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003056 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003057 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003058 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00003059 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003060 if( zSql==0 ){
3061 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003062 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003063 return 1;
3064 }
drhdb95f682013-06-26 22:46:00 +00003065 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003066 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003067 for(i=1; i<nCol; i++){
3068 zSql[j++] = ',';
3069 zSql[j++] = '?';
3070 }
3071 zSql[j++] = ')';
3072 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003073 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003074 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003075 if( rc ){
3076 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00003077 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003078 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003079 return 1;
drhfeac5f82004-08-01 00:10:45 +00003080 }
drh2d463112013-08-06 14:36:36 +00003081 needCommit = sqlite3_get_autocommit(db);
3082 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003083 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003084 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003085 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003086 char *z = xRead(&sCtx);
3087 /*
3088 ** Did we reach end-of-file before finding any columns?
3089 ** If so, stop instead of NULL filling the remaining columns.
3090 */
drhdb95f682013-06-26 22:46:00 +00003091 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003092 /*
3093 ** Did we reach end-of-file OR end-of-line before finding any
3094 ** columns in ASCII mode? If so, stop instead of NULL filling
3095 ** the remaining columns.
3096 */
3097 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003098 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003099 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003100 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3101 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003102 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003103 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003104 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003105 }
drhfeac5f82004-08-01 00:10:45 +00003106 }
mistachkin636bf9f2014-07-19 20:15:16 +00003107 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003108 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003109 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003110 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003111 }while( sCtx.cTerm==sCtx.cColSep );
drhdb95f682013-06-26 22:46:00 +00003112 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3113 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003114 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003115 }
drhdb95f682013-06-26 22:46:00 +00003116 if( i>=nCol ){
3117 sqlite3_step(pStmt);
3118 rc = sqlite3_reset(pStmt);
3119 if( rc!=SQLITE_OK ){
mistachkin636bf9f2014-07-19 20:15:16 +00003120 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
drhdb95f682013-06-26 22:46:00 +00003121 sqlite3_errmsg(db));
3122 }
3123 }
mistachkin636bf9f2014-07-19 20:15:16 +00003124 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003125
mistachkin636bf9f2014-07-19 20:15:16 +00003126 xCloser(sCtx.in);
3127 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003128 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00003129 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003130 }else
3131
drh0e55db12015-02-06 14:51:13 +00003132 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3133 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003134 ShellState data;
drh75897232000-05-29 14:26:00 +00003135 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003136 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003137 memcpy(&data, p, sizeof(data));
3138 data.showHeader = 0;
3139 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003140 if( nArg==1 ){
3141 rc = sqlite3_exec(p->db,
3142 "SELECT name FROM sqlite_master "
3143 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3144 "UNION ALL "
3145 "SELECT name FROM sqlite_temp_master "
3146 "WHERE type='index' "
3147 "ORDER BY 1",
3148 callback, &data, &zErrMsg
3149 );
drhc2ce0be2014-05-29 12:36:14 +00003150 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003151 zShellStatic = azArg[1];
3152 rc = sqlite3_exec(p->db,
3153 "SELECT name FROM sqlite_master "
3154 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3155 "UNION ALL "
3156 "SELECT name FROM sqlite_temp_master "
3157 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3158 "ORDER BY 1",
3159 callback, &data, &zErrMsg
3160 );
3161 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003162 }else{
drh0e55db12015-02-06 14:51:13 +00003163 fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003164 rc = 1;
3165 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003166 }
drh75897232000-05-29 14:26:00 +00003167 if( zErrMsg ){
3168 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003169 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003170 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003171 }else if( rc != SQLITE_OK ){
3172 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3173 rc = 1;
drh75897232000-05-29 14:26:00 +00003174 }
3175 }else
3176
drhae5e4452007-05-03 17:18:36 +00003177#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003178 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003179 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003180 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3181 iotrace = 0;
3182 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003183 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003184 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003185 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003186 iotrace = stdout;
3187 }else{
3188 iotrace = fopen(azArg[1], "w");
3189 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00003190 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003191 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003192 rc = 1;
drhb0603412007-02-28 04:47:26 +00003193 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003194 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003195 }
3196 }
3197 }else
drhae5e4452007-05-03 17:18:36 +00003198#endif
drhb0603412007-02-28 04:47:26 +00003199
drh70df4fe2006-06-13 15:12:21 +00003200#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003201 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003202 const char *zFile, *zProc;
3203 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003204 if( nArg<2 ){
3205 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3206 rc = 1;
3207 goto meta_command_exit;
3208 }
drh1e397f82006-06-08 15:28:43 +00003209 zFile = azArg[1];
3210 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003211 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003212 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3213 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003214 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003215 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003216 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003217 }
3218 }else
drh70df4fe2006-06-13 15:12:21 +00003219#endif
drh1e397f82006-06-08 15:28:43 +00003220
drhc2ce0be2014-05-29 12:36:14 +00003221 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3222 if( nArg!=2 ){
3223 fprintf(stderr, "Usage: .log FILENAME\n");
3224 rc = 1;
3225 }else{
3226 const char *zFile = azArg[1];
3227 output_file_close(p->pLog);
3228 p->pLog = output_file_open(zFile);
3229 }
drh127f9d72010-02-23 01:47:00 +00003230 }else
3231
drhc2ce0be2014-05-29 12:36:14 +00003232 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3233 const char *zMode = nArg>=2 ? azArg[1] : "";
3234 int n2 = (int)strlen(zMode);
3235 int c2 = zMode[0];
3236 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003237 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003238 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003239 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003240 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003241 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003242 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003243 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003244 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003245 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003246 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003247 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003248 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003249 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003250 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003251 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003252 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003253 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003254 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003255 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003256 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003257 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3258 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003259 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3260 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003261 }else {
shane9bd1b442009-10-23 01:27:39 +00003262 fprintf(stderr,"Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003263 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003264 rc = 1;
drh75897232000-05-29 14:26:00 +00003265 }
3266 }else
3267
drhc2ce0be2014-05-29 12:36:14 +00003268 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3269 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003270 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3271 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003272 }else{
3273 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003274 rc = 1;
3275 }
3276 }else
3277
drh05782482013-10-24 15:20:20 +00003278 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3279 sqlite3 *savedDb = p->db;
3280 const char *zSavedFilename = p->zDbFilename;
3281 char *zNewFilename = 0;
3282 p->db = 0;
3283 if( nArg>=2 ){
3284 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3285 }
3286 open_db(p, 1);
3287 if( p->db!=0 ){
3288 sqlite3_close(savedDb);
3289 sqlite3_free(p->zFreeOnClose);
3290 p->zFreeOnClose = zNewFilename;
3291 }else{
3292 sqlite3_free(zNewFilename);
3293 p->db = savedDb;
3294 p->zDbFilename = zSavedFilename;
3295 }
3296 }else
3297
drhc2ce0be2014-05-29 12:36:14 +00003298 if( c=='o'
3299 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3300 ){
3301 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3302 if( nArg>2 ){
3303 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3304 rc = 1;
3305 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003306 }
drhc2ce0be2014-05-29 12:36:14 +00003307 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3308 if( nArg<2 ){
3309 fprintf(stderr, "Usage: .once FILE\n");
3310 rc = 1;
3311 goto meta_command_exit;
3312 }
3313 p->outCount = 2;
3314 }else{
3315 p->outCount = 0;
3316 }
3317 output_reset(p);
3318 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003319#ifdef SQLITE_OMIT_POPEN
3320 fprintf(stderr,"Error: pipes are not supported in this OS\n");
3321 rc = 1;
3322 p->out = stdout;
3323#else
drhc2ce0be2014-05-29 12:36:14 +00003324 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003325 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003326 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003327 p->out = stdout;
3328 rc = 1;
3329 }else{
drhc2ce0be2014-05-29 12:36:14 +00003330 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003331 }
drh8cd5b252015-03-02 22:06:43 +00003332#endif
drh75897232000-05-29 14:26:00 +00003333 }else{
drhc2ce0be2014-05-29 12:36:14 +00003334 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003335 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003336 if( strcmp(zFile,"off")!=0 ){
3337 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003338 }
drh75897232000-05-29 14:26:00 +00003339 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003340 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003341 } else {
drhc2ce0be2014-05-29 12:36:14 +00003342 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003343 }
3344 }
3345 }else
3346
drh078b1fd2012-09-21 13:40:02 +00003347 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3348 int i;
3349 for(i=1; i<nArg; i++){
3350 if( i>1 ) fprintf(p->out, " ");
3351 fprintf(p->out, "%s", azArg[i]);
3352 }
3353 fprintf(p->out, "\n");
3354 }else
3355
drhc2ce0be2014-05-29 12:36:14 +00003356 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003357 if( nArg >= 2) {
3358 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3359 }
3360 if( nArg >= 3) {
3361 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3362 }
3363 }else
3364
drhc2ce0be2014-05-29 12:36:14 +00003365 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003366 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003367 }else
3368
drhc2ce0be2014-05-29 12:36:14 +00003369 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3370 FILE *alt;
3371 if( nArg!=2 ){
3372 fprintf(stderr, "Usage: .read FILE\n");
3373 rc = 1;
3374 goto meta_command_exit;
3375 }
3376 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003377 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003378 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3379 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003380 }else{
shane9bd1b442009-10-23 01:27:39 +00003381 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003382 fclose(alt);
3383 }
3384 }else
3385
drhc2ce0be2014-05-29 12:36:14 +00003386 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003387 const char *zSrcFile;
3388 const char *zDb;
3389 sqlite3 *pSrc;
3390 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003391 int nTimeout = 0;
3392
drh9ff849f2009-02-04 20:55:57 +00003393 if( nArg==2 ){
3394 zSrcFile = azArg[1];
3395 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003396 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003397 zSrcFile = azArg[2];
3398 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003399 }else{
3400 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3401 rc = 1;
3402 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003403 }
3404 rc = sqlite3_open(zSrcFile, &pSrc);
3405 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003406 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003407 sqlite3_close(pSrc);
3408 return 1;
3409 }
drh05782482013-10-24 15:20:20 +00003410 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003411 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3412 if( pBackup==0 ){
3413 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3414 sqlite3_close(pSrc);
3415 return 1;
3416 }
drhdc2c4912009-02-04 22:46:47 +00003417 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3418 || rc==SQLITE_BUSY ){
3419 if( rc==SQLITE_BUSY ){
3420 if( nTimeout++ >= 3 ) break;
3421 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003422 }
3423 }
3424 sqlite3_backup_finish(pBackup);
3425 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003426 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003427 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003428 fprintf(stderr, "Error: source database is busy\n");
3429 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003430 }else{
3431 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003432 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003433 }
3434 sqlite3_close(pSrc);
3435 }else
3436
dan8d1edb92014-11-05 09:07:28 +00003437
3438 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3439 if( nArg==2 ){
3440 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003441#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3442 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3443#endif
dan8d1edb92014-11-05 09:07:28 +00003444 }else{
3445 fprintf(stderr, "Usage: .scanstats on|off\n");
3446 rc = 1;
3447 }
3448 }else
3449
drhc2ce0be2014-05-29 12:36:14 +00003450 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003451 ShellState data;
drh75897232000-05-29 14:26:00 +00003452 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003453 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003454 memcpy(&data, p, sizeof(data));
3455 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003456 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003457 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003458 int i;
drhf0693c82011-10-11 20:41:54 +00003459 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003460 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003461 char *new_argv[2], *new_colv[2];
3462 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3463 " type text,\n"
3464 " name text,\n"
3465 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003466 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003467 " sql text\n"
3468 ")";
3469 new_argv[1] = 0;
3470 new_colv[0] = "sql";
3471 new_colv[1] = 0;
3472 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003473 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003474 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003475 char *new_argv[2], *new_colv[2];
3476 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3477 " type text,\n"
3478 " name text,\n"
3479 " tbl_name text,\n"
3480 " rootpage integer,\n"
3481 " sql text\n"
3482 ")";
3483 new_argv[1] = 0;
3484 new_colv[0] = "sql";
3485 new_colv[1] = 0;
3486 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003487 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003488 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003489 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003490 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003491 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003492 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003493 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003494 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003495 "WHERE lower(tbl_name) LIKE shellstatic()"
3496 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003497 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003498 callback, &data, &zErrMsg);
3499 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003500 }
drhc2ce0be2014-05-29 12:36:14 +00003501 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003502 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003503 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003504 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003505 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003506 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003507 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003508 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003509 callback, &data, &zErrMsg
3510 );
drhc2ce0be2014-05-29 12:36:14 +00003511 }else{
3512 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3513 rc = 1;
3514 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003515 }
drh75897232000-05-29 14:26:00 +00003516 if( zErrMsg ){
3517 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003518 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003519 rc = 1;
3520 }else if( rc != SQLITE_OK ){
3521 fprintf(stderr,"Error: querying schema information\n");
3522 rc = 1;
3523 }else{
3524 rc = 0;
drh75897232000-05-29 14:26:00 +00003525 }
3526 }else
3527
drhabd4c722014-09-20 18:18:33 +00003528
3529#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3530 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3531 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003532 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003533 }else
3534#endif
3535
3536
drh340f5822013-06-27 13:01:21 +00003537#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003538 /* Undocumented commands for internal testing. Subject to change
3539 ** without notice. */
3540 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3541 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3542 int i, v;
3543 for(i=1; i<nArg; i++){
3544 v = booleanValue(azArg[i]);
3545 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3546 }
3547 }
3548 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3549 int i; sqlite3_int64 v;
3550 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003551 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003552 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003553 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003554 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003555 }
3556 }
3557 }else
drh340f5822013-06-27 13:01:21 +00003558#endif
drh348d19c2013-06-03 12:47:43 +00003559
drhc2ce0be2014-05-29 12:36:14 +00003560 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003561 if( nArg<2 || nArg>3 ){
mistachkine0d68852014-12-11 03:12:33 +00003562 fprintf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00003563 rc = 1;
3564 }
drh6976c212014-07-24 12:09:47 +00003565 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003566 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00003567 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00003568 }
3569 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00003570 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3571 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh5bb3eb92007-05-04 13:15:55 +00003572 }
drh75897232000-05-29 14:26:00 +00003573 }else
3574
drh62cdde52014-05-28 20:22:28 +00003575 if( c=='s'
3576 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003577 ){
3578 char *zCmd;
drh54027102014-08-06 14:36:53 +00003579 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003580 if( nArg<2 ){
3581 fprintf(stderr, "Usage: .system COMMAND\n");
3582 rc = 1;
3583 goto meta_command_exit;
3584 }
drhdcb3e3d2014-05-29 03:17:29 +00003585 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003586 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003587 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3588 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003589 }
drh54027102014-08-06 14:36:53 +00003590 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003591 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003592 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003593 }else
3594
drhc2ce0be2014-05-29 12:36:14 +00003595 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003596 int i;
drhc2ce0be2014-05-29 12:36:14 +00003597 if( nArg!=1 ){
3598 fprintf(stderr, "Usage: .show\n");
3599 rc = 1;
3600 goto meta_command_exit;
3601 }
mistachkin636bf9f2014-07-19 20:15:16 +00003602 fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3603 fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003604 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
mistachkin636bf9f2014-07-19 20:15:16 +00003605 fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3606 fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3607 fprintf(p->out,"%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00003608 output_c_string(p->out, p->nullValue);
drhfeac5f82004-08-01 00:10:45 +00003609 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003610 fprintf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003611 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkin636bf9f2014-07-19 20:15:16 +00003612 fprintf(p->out,"%12.12s: ", "colseparator");
3613 output_c_string(p->out, p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003614 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003615 fprintf(p->out,"%12.12s: ", "rowseparator");
3616 output_c_string(p->out, p->rowSeparator);
3617 fprintf(p->out, "\n");
3618 fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3619 fprintf(p->out,"%12.12s: ","width");
persicom7e2dfdd2002-04-18 02:46:52 +00003620 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003621 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003622 }
drhfeac5f82004-08-01 00:10:45 +00003623 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003624 }else
3625
drhc2ce0be2014-05-29 12:36:14 +00003626 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3627 if( nArg==2 ){
3628 p->statsOn = booleanValue(azArg[1]);
3629 }else{
3630 fprintf(stderr, "Usage: .stats on|off\n");
3631 rc = 1;
3632 }
shaneh642d8b82010-07-28 16:05:34 +00003633 }else
3634
drhc2ce0be2014-05-29 12:36:14 +00003635 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003636 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003637 char **azResult;
drh98781232012-04-23 12:38:05 +00003638 int nRow, nAlloc;
3639 char *zSql = 0;
3640 int ii;
drh05782482013-10-24 15:20:20 +00003641 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003642 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3643 if( rc ) return rc;
3644 zSql = sqlite3_mprintf(
3645 "SELECT name FROM sqlite_master"
3646 " WHERE type IN ('table','view')"
3647 " AND name NOT LIKE 'sqlite_%%'"
3648 " AND name LIKE ?1");
3649 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3650 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3651 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3652 if( strcmp(zDbName,"temp")==0 ){
3653 zSql = sqlite3_mprintf(
3654 "%z UNION ALL "
3655 "SELECT 'temp.' || name FROM sqlite_temp_master"
3656 " WHERE type IN ('table','view')"
3657 " AND name NOT LIKE 'sqlite_%%'"
3658 " AND name LIKE ?1", zSql);
3659 }else{
3660 zSql = sqlite3_mprintf(
3661 "%z UNION ALL "
3662 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3663 " WHERE type IN ('table','view')"
3664 " AND name NOT LIKE 'sqlite_%%'"
3665 " AND name LIKE ?1", zSql, zDbName, zDbName);
3666 }
drha50da102000-08-08 20:19:09 +00003667 }
drh98781232012-04-23 12:38:05 +00003668 sqlite3_finalize(pStmt);
3669 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3670 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3671 sqlite3_free(zSql);
3672 if( rc ) return rc;
3673 nRow = nAlloc = 0;
3674 azResult = 0;
3675 if( nArg>1 ){
3676 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003677 }else{
drh98781232012-04-23 12:38:05 +00003678 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3679 }
3680 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3681 if( nRow>=nAlloc ){
3682 char **azNew;
3683 int n = nAlloc*2 + 10;
3684 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3685 if( azNew==0 ){
3686 fprintf(stderr, "Error: out of memory\n");
3687 break;
3688 }
3689 nAlloc = n;
3690 azResult = azNew;
3691 }
3692 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3693 if( azResult[nRow] ) nRow++;
3694 }
3695 sqlite3_finalize(pStmt);
3696 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003697 int len, maxlen = 0;
3698 int i, j;
3699 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003700 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003701 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003702 if( len>maxlen ) maxlen = len;
3703 }
3704 nPrintCol = 80/(maxlen+2);
3705 if( nPrintCol<1 ) nPrintCol = 1;
3706 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3707 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003708 for(j=i; j<nRow; j+=nPrintRow){
3709 char *zSp = j<nPrintRow ? "" : " ";
drh4ace5362014-11-10 14:42:28 +00003710 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003711 }
drh151b7d52013-05-06 20:28:54 +00003712 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003713 }
3714 }
drh98781232012-04-23 12:38:05 +00003715 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3716 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003717 }else
3718
shaneh96887e12011-02-10 21:08:58 +00003719 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003720 static const struct {
3721 const char *zCtrlName; /* Name of a test-control option */
3722 int ctrlCode; /* Integer code for that option */
3723 } aCtrl[] = {
3724 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3725 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3726 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3727 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3728 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3729 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3730 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3731 { "assert", SQLITE_TESTCTRL_ASSERT },
3732 { "always", SQLITE_TESTCTRL_ALWAYS },
3733 { "reserve", SQLITE_TESTCTRL_RESERVE },
3734 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3735 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003736 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003737 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00003738 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00003739 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00003740 };
shaneh96887e12011-02-10 21:08:58 +00003741 int testctrl = -1;
3742 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003743 int i, n;
drh05782482013-10-24 15:20:20 +00003744 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003745
drhd416fe72011-03-17 16:45:50 +00003746 /* convert testctrl text option to value. allow any unique prefix
3747 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003748 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003749 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003750 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3751 if( testctrl<0 ){
3752 testctrl = aCtrl[i].ctrlCode;
3753 }else{
drhb07028f2011-10-14 21:49:18 +00003754 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003755 testctrl = -1;
3756 break;
3757 }
3758 }
3759 }
drh348d19c2013-06-03 12:47:43 +00003760 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003761 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3762 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3763 }else{
3764 switch(testctrl){
3765
3766 /* sqlite3_test_control(int, db, int) */
3767 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3768 case SQLITE_TESTCTRL_RESERVE:
3769 if( nArg==3 ){
3770 int opt = (int)strtol(azArg[2], 0, 0);
3771 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003772 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003773 } else {
drhd416fe72011-03-17 16:45:50 +00003774 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3775 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003776 }
3777 break;
3778
3779 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003780 case SQLITE_TESTCTRL_PRNG_SAVE:
3781 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003782 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003783 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003784 if( nArg==2 ){
3785 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003786 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003787 } else {
3788 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3789 }
3790 break;
3791
3792 /* sqlite3_test_control(int, uint) */
3793 case SQLITE_TESTCTRL_PENDING_BYTE:
3794 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003795 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003796 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003797 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003798 } else {
drhd416fe72011-03-17 16:45:50 +00003799 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3800 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003801 }
3802 break;
3803
3804 /* sqlite3_test_control(int, int) */
3805 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00003806 case SQLITE_TESTCTRL_ALWAYS:
3807 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00003808 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003809 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003810 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003811 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003812 } else {
drhd416fe72011-03-17 16:45:50 +00003813 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3814 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003815 }
3816 break;
3817
3818 /* sqlite3_test_control(int, char *) */
3819#ifdef SQLITE_N_KEYWORD
3820 case SQLITE_TESTCTRL_ISKEYWORD:
3821 if( nArg==3 ){
3822 const char *opt = azArg[2];
3823 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003824 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003825 } else {
drhd416fe72011-03-17 16:45:50 +00003826 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3827 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003828 }
3829 break;
3830#endif
3831
drh1ffede82015-01-30 20:59:27 +00003832 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00003833 if( nArg==5 ){
3834 rc = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00003835 azArg[2],
drh8964b342015-01-29 17:54:52 +00003836 integerValue(azArg[3]),
3837 integerValue(azArg[4]));
3838 }else{
drh1ffede82015-01-30 20:59:27 +00003839 fprintf(stderr,"Usage: .testctrl initmode dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00003840 rc = 1;
3841 }
3842 break;
3843
shaneh96887e12011-02-10 21:08:58 +00003844 case SQLITE_TESTCTRL_BITVEC_TEST:
3845 case SQLITE_TESTCTRL_FAULT_INSTALL:
3846 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3847 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3848 default:
drhd416fe72011-03-17 16:45:50 +00003849 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3850 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003851 break;
3852 }
3853 }
3854 }else
3855
drhc2ce0be2014-05-29 12:36:14 +00003856 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003857 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003858 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003859 }else
3860
drhc2ce0be2014-05-29 12:36:14 +00003861 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3862 if( nArg==2 ){
3863 enableTimer = booleanValue(azArg[1]);
3864 if( enableTimer && !HAS_TIMER ){
3865 fprintf(stderr, "Error: timer not available on this system.\n");
3866 enableTimer = 0;
3867 }
3868 }else{
3869 fprintf(stderr, "Usage: .timer on|off\n");
3870 rc = 1;
3871 }
shanehe2aa9d72009-11-06 17:20:17 +00003872 }else
3873
drhc2ce0be2014-05-29 12:36:14 +00003874 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003875 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003876 if( nArg!=2 ){
3877 fprintf(stderr, "Usage: .trace FILE|off\n");
3878 rc = 1;
3879 goto meta_command_exit;
3880 }
drh657b4a82015-03-19 13:30:41 +00003881 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00003882 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003883#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003884 if( p->traceOut==0 ){
3885 sqlite3_trace(p->db, 0, 0);
3886 }else{
3887 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3888 }
3889#endif
3890 }else
3891
drhf442e332014-09-10 19:01:14 +00003892#if SQLITE_USER_AUTHENTICATION
3893 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3894 if( nArg<2 ){
3895 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3896 rc = 1;
3897 goto meta_command_exit;
3898 }
drh7883ecf2014-09-11 16:19:31 +00003899 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003900 if( strcmp(azArg[1],"login")==0 ){
3901 if( nArg!=4 ){
3902 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3903 rc = 1;
3904 goto meta_command_exit;
3905 }
drhd39c40f2014-09-11 00:27:53 +00003906 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3907 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003908 if( rc ){
3909 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3910 rc = 1;
3911 }
3912 }else if( strcmp(azArg[1],"add")==0 ){
3913 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003914 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003915 rc = 1;
3916 goto meta_command_exit;
3917 }
drhd39c40f2014-09-11 00:27:53 +00003918 rc = sqlite3_user_add(p->db, azArg[2],
3919 azArg[3], (int)strlen(azArg[3]),
3920 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003921 if( rc ){
3922 fprintf(stderr, "User-Add failed: %d\n", rc);
3923 rc = 1;
3924 }
3925 }else if( strcmp(azArg[1],"edit")==0 ){
3926 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003927 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003928 rc = 1;
3929 goto meta_command_exit;
3930 }
drhd39c40f2014-09-11 00:27:53 +00003931 rc = sqlite3_user_change(p->db, azArg[2],
3932 azArg[3], (int)strlen(azArg[3]),
3933 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003934 if( rc ){
3935 fprintf(stderr, "User-Edit failed: %d\n", rc);
3936 rc = 1;
3937 }
3938 }else if( strcmp(azArg[1],"delete")==0 ){
3939 if( nArg!=3 ){
3940 fprintf(stderr, "Usage: .user delete USER\n");
3941 rc = 1;
3942 goto meta_command_exit;
3943 }
3944 rc = sqlite3_user_delete(p->db, azArg[2]);
3945 if( rc ){
3946 fprintf(stderr, "User-Delete failed: %d\n", rc);
3947 rc = 1;
3948 }
3949 }else{
3950 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3951 rc = 1;
3952 goto meta_command_exit;
3953 }
3954 }else
3955#endif /* SQLITE_USER_AUTHENTICATION */
3956
drh9fd301b2011-06-03 13:28:22 +00003957 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003958 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003959 sqlite3_libversion(), sqlite3_sourceid());
3960 }else
3961
drhde60fc22011-12-14 17:53:36 +00003962 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3963 const char *zDbName = nArg==2 ? azArg[1] : "main";
3964 char *zVfsName = 0;
3965 if( p->db ){
3966 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3967 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003968 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003969 sqlite3_free(zVfsName);
3970 }
3971 }
3972 }else
3973
drhcef4fc82012-09-21 22:50:45 +00003974#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3975 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3976 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003977 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003978 }else
3979#endif
3980
drhc2ce0be2014-05-29 12:36:14 +00003981 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003982 int j;
drh43617e92006-03-06 20:55:46 +00003983 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003984 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003985 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003986 }
3987 }else
3988
3989 {
shane9bd1b442009-10-23 01:27:39 +00003990 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003991 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003992 rc = 1;
drh75897232000-05-29 14:26:00 +00003993 }
drh67505e72002-04-19 12:34:06 +00003994
drhc2ce0be2014-05-29 12:36:14 +00003995meta_command_exit:
3996 if( p->outCount ){
3997 p->outCount--;
3998 if( p->outCount==0 ) output_reset(p);
3999 }
drh67505e72002-04-19 12:34:06 +00004000 return rc;
drh75897232000-05-29 14:26:00 +00004001}
4002
drh67505e72002-04-19 12:34:06 +00004003/*
drh91a66392007-09-07 01:12:32 +00004004** Return TRUE if a semicolon occurs anywhere in the first N characters
4005** of string z[].
drh324ccef2003-02-05 14:06:20 +00004006*/
drh9f099fd2013-08-06 14:01:46 +00004007static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00004008 int i;
4009 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
4010 return 0;
drh324ccef2003-02-05 14:06:20 +00004011}
4012
4013/*
drh70c7a4b2003-04-26 03:03:06 +00004014** Test to see if a line consists entirely of whitespace.
4015*/
4016static int _all_whitespace(const char *z){
4017 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00004018 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00004019 if( *z=='/' && z[1]=='*' ){
4020 z += 2;
4021 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4022 if( *z==0 ) return 0;
4023 z++;
4024 continue;
4025 }
4026 if( *z=='-' && z[1]=='-' ){
4027 z += 2;
4028 while( *z && *z!='\n' ){ z++; }
4029 if( *z==0 ) return 1;
4030 continue;
4031 }
4032 return 0;
4033 }
4034 return 1;
4035}
4036
4037/*
drha9b17162003-04-29 18:01:28 +00004038** Return TRUE if the line typed in is an SQL command terminator other
4039** than a semi-colon. The SQL Server style "go" command is understood
4040** as is the Oracle "/".
4041*/
drh9f099fd2013-08-06 14:01:46 +00004042static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004043 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004044 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4045 return 1; /* Oracle */
4046 }
drhf0693c82011-10-11 20:41:54 +00004047 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004048 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004049 return 1; /* SQL Server */
4050 }
4051 return 0;
4052}
4053
4054/*
drh233a5312008-12-18 22:25:13 +00004055** Return true if zSql is a complete SQL statement. Return false if it
4056** ends in the middle of a string literal or C-style comment.
4057*/
drh9f099fd2013-08-06 14:01:46 +00004058static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004059 int rc;
4060 if( zSql==0 ) return 1;
4061 zSql[nSql] = ';';
4062 zSql[nSql+1] = 0;
4063 rc = sqlite3_complete(zSql);
4064 zSql[nSql] = 0;
4065 return rc;
4066}
4067
4068/*
drh67505e72002-04-19 12:34:06 +00004069** Read input from *in and process it. If *in==0 then input
4070** is interactive - the user is typing it it. Otherwise, input
4071** is coming from a file or device. A prompt is issued and history
4072** is saved only if input is interactive. An interrupt signal will
4073** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004074**
4075** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004076*/
drhdcd87a92014-08-18 13:45:42 +00004077static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004078 char *zLine = 0; /* A single input line */
4079 char *zSql = 0; /* Accumulated SQL text */
4080 int nLine; /* Length of current line */
4081 int nSql = 0; /* Bytes of zSql[] used */
4082 int nAlloc = 0; /* Allocated zSql[] space */
4083 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4084 char *zErrMsg; /* Error message returned */
4085 int rc; /* Error code */
4086 int errCnt = 0; /* Number of errors seen */
4087 int lineno = 0; /* Current line number */
4088 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004089
4090 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4091 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004092 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004093 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004094 /* End of input */
4095 if( stdin_is_interactive ) printf("\n");
4096 break;
drhc49f44e2006-10-26 18:15:42 +00004097 }
drh67505e72002-04-19 12:34:06 +00004098 if( seenInterrupt ){
4099 if( in!=0 ) break;
4100 seenInterrupt = 0;
4101 }
drhc28490c2006-10-26 14:25:58 +00004102 lineno++;
drh849a9d92013-12-21 15:46:06 +00004103 if( nSql==0 && _all_whitespace(zLine) ){
4104 if( p->echoOn ) printf("%s\n", zLine);
4105 continue;
4106 }
drh2af0b2d2002-02-21 02:25:02 +00004107 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004108 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004109 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004110 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004111 break;
4112 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004113 errCnt++;
4114 }
drhdaffd0e2001-04-11 14:28:42 +00004115 continue;
4116 }
drh9f099fd2013-08-06 14:01:46 +00004117 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004118 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004119 }
drh9f099fd2013-08-06 14:01:46 +00004120 nLine = strlen30(zLine);
4121 if( nSql+nLine+2>=nAlloc ){
4122 nAlloc = nSql+nLine+100;
4123 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004124 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00004125 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004126 exit(1);
4127 }
drhdaffd0e2001-04-11 14:28:42 +00004128 }
drh9f099fd2013-08-06 14:01:46 +00004129 nSqlPrior = nSql;
4130 if( nSql==0 ){
4131 int i;
4132 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004133 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004134 memcpy(zSql, zLine+i, nLine+1-i);
4135 startline = lineno;
4136 nSql = nLine-i;
4137 }else{
4138 zSql[nSql++] = '\n';
4139 memcpy(zSql+nSql, zLine, nLine+1);
4140 nSql += nLine;
4141 }
4142 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004143 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004144 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004145 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00004146 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004147 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004148 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004149 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004150 char zPrefix[100];
4151 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004152 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004153 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004154 }else{
shane9bd1b442009-10-23 01:27:39 +00004155 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004156 }
drh7f953e22002-07-13 17:33:45 +00004157 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00004158 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004159 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004160 zErrMsg = 0;
4161 }else{
shaned2bed1c2009-10-21 03:56:54 +00004162 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004163 }
drhc49f44e2006-10-26 18:15:42 +00004164 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00004165 }
drhdaffd0e2001-04-11 14:28:42 +00004166 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004167 if( p->outCount ){
4168 output_reset(p);
4169 p->outCount = 0;
4170 }
drh9f099fd2013-08-06 14:01:46 +00004171 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004172 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004173 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004174 }
4175 }
drh9f099fd2013-08-06 14:01:46 +00004176 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004177 if( !_all_whitespace(zSql) ){
4178 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004179 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004180 }
drhdaffd0e2001-04-11 14:28:42 +00004181 free(zSql);
4182 }
danielk19772ac27622007-07-03 05:31:16 +00004183 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004184 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004185}
4186
drh67505e72002-04-19 12:34:06 +00004187/*
4188** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004189** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004190*/
4191static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004192 static char *home_dir = NULL;
4193 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004194
drh4ace5362014-11-10 14:42:28 +00004195#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4196 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004197 {
4198 struct passwd *pwent;
4199 uid_t uid = getuid();
4200 if( (pwent=getpwuid(uid)) != NULL) {
4201 home_dir = pwent->pw_dir;
4202 }
drh67505e72002-04-19 12:34:06 +00004203 }
4204#endif
4205
chw65d3c132007-11-12 21:09:10 +00004206#if defined(_WIN32_WCE)
4207 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4208 */
drh85e72432012-04-11 11:38:53 +00004209 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004210#else
4211
drh83905c92012-06-21 13:00:37 +00004212#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004213 if (!home_dir) {
4214 home_dir = getenv("USERPROFILE");
4215 }
4216#endif
4217
drh67505e72002-04-19 12:34:06 +00004218 if (!home_dir) {
4219 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004220 }
4221
drh83905c92012-06-21 13:00:37 +00004222#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004223 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004224 char *zDrive, *zPath;
4225 int n;
4226 zDrive = getenv("HOMEDRIVE");
4227 zPath = getenv("HOMEPATH");
4228 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004229 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004230 home_dir = malloc( n );
4231 if( home_dir==0 ) return 0;
4232 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4233 return home_dir;
4234 }
4235 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004236 }
4237#endif
4238
chw65d3c132007-11-12 21:09:10 +00004239#endif /* !_WIN32_WCE */
4240
drh67505e72002-04-19 12:34:06 +00004241 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004242 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004243 char *z = malloc( n );
4244 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004245 home_dir = z;
4246 }
drhe98d4fa2002-04-21 19:06:22 +00004247
drh67505e72002-04-19 12:34:06 +00004248 return home_dir;
4249}
4250
4251/*
4252** Read input from the file given by sqliterc_override. Or if that
4253** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004254**
4255** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004256*/
drh534f4df2015-02-28 14:03:35 +00004257static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004258 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004259 const char *sqliterc_override /* Name of config file. NULL to use default */
4260){
persicom7e2dfdd2002-04-18 02:46:52 +00004261 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004262 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004263 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004264 FILE *in = NULL;
4265
4266 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004267 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004268 if( home_dir==0 ){
drh534f4df2015-02-28 14:03:35 +00004269 fprintf(stderr, "-- warning: cannot find home directory;"
4270 " cannot read ~/.sqliterc\n");
4271 return;
drhe98d4fa2002-04-21 19:06:22 +00004272 }
drh2f3de322012-06-27 16:41:31 +00004273 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004274 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4275 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004276 }
drha1f9b5e2004-02-14 16:31:02 +00004277 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004278 if( in ){
drhc28490c2006-10-26 14:25:58 +00004279 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00004280 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004281 }
drh534f4df2015-02-28 14:03:35 +00004282 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004283 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004284 }
drh85e72432012-04-11 11:38:53 +00004285 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004286}
4287
drh67505e72002-04-19 12:34:06 +00004288/*
drhe1e38c42003-05-04 18:30:59 +00004289** Show available command line options
4290*/
4291static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004292 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004293 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004294 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004295 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004296 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004297 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004298 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004299 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004300 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004301#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4302 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4303#endif
drhcc3b4f82012-02-07 14:13:50 +00004304 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004305 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004306 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004307 " -line set output mode to 'line'\n"
4308 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004309 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004310 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004311#ifdef SQLITE_ENABLE_MULTIPLEX
4312 " -multiplex enable the multiplexor VFS\n"
4313#endif
mistachkine0d68852014-12-11 03:12:33 +00004314 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004315 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004316 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4317 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004318 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004319 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004320 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004321 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004322#ifdef SQLITE_ENABLE_VFSTRACE
4323 " -vfstrace enable tracing of all VFS calls\n"
4324#endif
drhe1e38c42003-05-04 18:30:59 +00004325;
4326static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00004327 fprintf(stderr,
4328 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4329 "FILENAME is the name of an SQLite database. A new database is created\n"
4330 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004331 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00004332 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004333 }else{
4334 fprintf(stderr, "Use the -help option for additional information\n");
4335 }
4336 exit(1);
4337}
4338
4339/*
drh67505e72002-04-19 12:34:06 +00004340** Initialize the state information in data
4341*/
drhdcd87a92014-08-18 13:45:42 +00004342static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004343 memset(data, 0, sizeof(*data));
4344 data->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00004345 memcpy(data->colSeparator,SEP_Column, 2);
4346 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004347 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004348 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004349 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004350 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004351 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004352 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4353 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004354}
4355
drh98d312f2012-10-25 15:23:14 +00004356/*
drh5c7976f2014-02-10 19:59:27 +00004357** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004358*/
4359#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004360static void printBold(const char *zText){
4361 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4362 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4363 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4364 SetConsoleTextAttribute(out,
4365 FOREGROUND_RED|FOREGROUND_INTENSITY
4366 );
4367 printf("%s", zText);
4368 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004369}
4370#else
drh5c7976f2014-02-10 19:59:27 +00004371static void printBold(const char *zText){
4372 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004373}
4374#endif
4375
4376/*
drh98d312f2012-10-25 15:23:14 +00004377** Get the argument to an --option. Throw an error and die if no argument
4378** is available.
4379*/
4380static char *cmdline_option_value(int argc, char **argv, int i){
4381 if( i==argc ){
4382 fprintf(stderr, "%s: Error: missing argument to %s\n",
4383 argv[0], argv[argc-1]);
4384 exit(1);
4385 }
4386 return argv[i];
4387}
4388
mistachkin44723ce2015-03-21 02:22:37 +00004389int SQLITE_CDECL main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004390 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004391 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004392 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004393 int i;
drhc28490c2006-10-26 14:25:58 +00004394 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004395 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004396 int readStdin = 1;
4397 int nCmd = 0;
4398 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004399
drh69b30ab2014-02-27 15:11:52 +00004400#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004401 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4402 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4403 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4404 exit(1);
4405 }
drhc7181902014-02-27 15:04:13 +00004406#endif
drh047d4532015-01-18 20:30:23 +00004407 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00004408 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00004409 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004410 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004411 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004412
drh44c2eb12003-04-30 11:38:26 +00004413 /* Make sure we have a valid signal handler early, before anything
4414 ** else is done.
4415 */
drh4c504392000-10-16 22:06:40 +00004416#ifdef SIGINT
4417 signal(SIGINT, interrupt_handler);
4418#endif
drh44c2eb12003-04-30 11:38:26 +00004419
drhac5649a2014-11-28 13:35:03 +00004420#ifdef SQLITE_SHELL_DBNAME_PROC
4421 {
4422 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4423 ** of a C-function that will provide the name of the database file. Use
4424 ** this compile-time option to embed this shell program in larger
4425 ** applications. */
4426 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4427 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4428 warnInmemoryDb = 0;
4429 }
4430#endif
4431
drh22fbcb82004-02-01 01:22:50 +00004432 /* Do an initial pass through the command-line argument to locate
4433 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004434 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004435 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004436 */
drh98d312f2012-10-25 15:23:14 +00004437 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004438 char *z;
drhc28490c2006-10-26 14:25:58 +00004439 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004440 if( z[0]!='-' ){
4441 if( data.zDbFilename==0 ){
4442 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004443 }else{
4444 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4445 ** mean that nothing is read from stdin */
4446 readStdin = 0;
4447 nCmd++;
4448 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4449 if( azCmd==0 ){
4450 fprintf(stderr, "out of memory\n");
4451 exit(1);
4452 }
4453 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004454 }
drh98d312f2012-10-25 15:23:14 +00004455 }
drhcc3b4f82012-02-07 14:13:50 +00004456 if( z[1]=='-' ) z++;
4457 if( strcmp(z,"-separator")==0
4458 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004459 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004460 || strcmp(z,"-cmd")==0
4461 ){
drh98d312f2012-10-25 15:23:14 +00004462 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004463 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004464 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004465 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004466 /* Need to check for batch mode here to so we can avoid printing
4467 ** informational messages (like from process_sqliterc) before
4468 ** we do the actual processing of arguments later in a second pass.
4469 */
shanef69573d2009-10-24 02:06:14 +00004470 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004471 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004472#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004473 const char *zSize;
4474 sqlite3_int64 szHeap;
4475
drh98d312f2012-10-25 15:23:14 +00004476 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004477 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004478 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004479 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4480#endif
drh44dec872014-08-30 15:49:25 +00004481 }else if( strcmp(z,"-scratch")==0 ){
4482 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004483 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004484 if( sz>400000 ) sz = 400000;
4485 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004486 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004487 if( n>10 ) n = 10;
4488 if( n<1 ) n = 1;
4489 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4490 data.shellFlgs |= SHFLG_Scratch;
4491 }else if( strcmp(z,"-pagecache")==0 ){
4492 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004493 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004494 if( sz>70000 ) sz = 70000;
4495 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004496 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004497 if( n<10 ) n = 10;
4498 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4499 data.shellFlgs |= SHFLG_Pagecache;
4500 }else if( strcmp(z,"-lookaside")==0 ){
4501 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004502 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004503 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004504 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004505 if( n<0 ) n = 0;
4506 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4507 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004508#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004509 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004510 extern int vfstrace_register(
4511 const char *zTraceName,
4512 const char *zOldVfsName,
4513 int (*xOut)(const char*,void*),
4514 void *pOutArg,
4515 int makeDefault
4516 );
drh2b625e22011-03-16 17:05:28 +00004517 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004518#endif
drh6f25e892011-07-08 17:02:57 +00004519#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004520 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004521 extern int sqlite3_multiple_initialize(const char*,int);
4522 sqlite3_multiplex_initialize(0, 1);
4523#endif
drh7d9f3942013-04-03 01:26:54 +00004524 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004525 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4526 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004527 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004528 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004529 if( pVfs ){
4530 sqlite3_vfs_register(pVfs, 1);
4531 }else{
4532 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4533 exit(1);
4534 }
drh44c2eb12003-04-30 11:38:26 +00004535 }
4536 }
drh98d312f2012-10-25 15:23:14 +00004537 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004538#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004539 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004540 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004541#else
shane86f5bdb2009-10-24 02:00:07 +00004542 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4543 return 1;
drh01b41712005-08-29 23:06:23 +00004544#endif
drh98d312f2012-10-25 15:23:14 +00004545 }
4546 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004547
drh44c2eb12003-04-30 11:38:26 +00004548 /* Go ahead and open the database file if it already exists. If the
4549 ** file does not exist, delay opening it. This prevents empty database
4550 ** files from being created if a user mistypes the database name argument
4551 ** to the sqlite command-line tool.
4552 */
drhc8d74412004-08-31 23:41:26 +00004553 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004554 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004555 }
4556
drh22fbcb82004-02-01 01:22:50 +00004557 /* Process the initialization file if there is one. If no -init option
4558 ** is given on the command line, look for a file named ~/.sqliterc and
4559 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004560 */
drh534f4df2015-02-28 14:03:35 +00004561 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00004562
drh22fbcb82004-02-01 01:22:50 +00004563 /* Make a second pass through the command-line argument and set
4564 ** options. This second pass is delayed until after the initialization
4565 ** file is processed so that the command-line arguments will override
4566 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004567 */
drh98d312f2012-10-25 15:23:14 +00004568 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004569 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004570 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004571 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004572 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004573 i++;
4574 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004575 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004576 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004577 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004578 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004579 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004580 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004581 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004582 }else if( strcmp(z,"-csv")==0 ){
4583 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004584 memcpy(data.colSeparator,",",2);
4585 }else if( strcmp(z,"-ascii")==0 ){
4586 data.mode = MODE_Ascii;
4587 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004588 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00004589 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004590 SEP_Record);
mistachkine0d68852014-12-11 03:12:33 +00004591 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004592 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4593 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004594 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00004595 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00004596 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004597 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00004598 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00004599 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004600 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004601 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004602 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004603 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004604 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004605 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004606 }else if( strcmp(z,"-eqp")==0 ){
4607 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004608 }else if( strcmp(z,"-stats")==0 ){
4609 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004610 }else if( strcmp(z,"-scanstats")==0 ){
4611 data.scanstatsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004612 }else if( strcmp(z,"-bail")==0 ){
4613 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004614 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004615 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004616 return 0;
drhc28490c2006-10-26 14:25:58 +00004617 }else if( strcmp(z,"-interactive")==0 ){
4618 stdin_is_interactive = 1;
4619 }else if( strcmp(z,"-batch")==0 ){
4620 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004621 }else if( strcmp(z,"-heap")==0 ){
4622 i++;
drh44dec872014-08-30 15:49:25 +00004623 }else if( strcmp(z,"-scratch")==0 ){
4624 i+=2;
4625 }else if( strcmp(z,"-pagecache")==0 ){
4626 i+=2;
4627 }else if( strcmp(z,"-lookaside")==0 ){
4628 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004629 }else if( strcmp(z,"-mmap")==0 ){
4630 i++;
drha7e61d82011-03-12 17:02:57 +00004631 }else if( strcmp(z,"-vfs")==0 ){
4632 i++;
drh6f25e892011-07-08 17:02:57 +00004633#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004634 }else if( strcmp(z,"-vfstrace")==0 ){
4635 i++;
drh6f25e892011-07-08 17:02:57 +00004636#endif
4637#ifdef SQLITE_ENABLE_MULTIPLEX
4638 }else if( strcmp(z,"-multiplex")==0 ){
4639 i++;
4640#endif
drhcc3b4f82012-02-07 14:13:50 +00004641 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004642 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004643 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004644 /* Run commands that follow -cmd first and separately from commands
4645 ** that simply appear on the command-line. This seems goofy. It would
4646 ** be better if all commands ran in the order that they appear. But
4647 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004648 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004649 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004650 if( z[0]=='.' ){
4651 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004652 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004653 }else{
drh05782482013-10-24 15:20:20 +00004654 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004655 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4656 if( zErrMsg!=0 ){
4657 fprintf(stderr,"Error: %s\n", zErrMsg);
4658 if( bail_on_error ) return rc!=0 ? rc : 1;
4659 }else if( rc!=0 ){
4660 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4661 if( bail_on_error ) return rc;
4662 }
4663 }
drh1e5d0e92000-05-31 23:33:17 +00004664 }else{
shane86f5bdb2009-10-24 02:00:07 +00004665 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004666 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004667 return 1;
4668 }
4669 }
drh44c2eb12003-04-30 11:38:26 +00004670
drhac5649a2014-11-28 13:35:03 +00004671 if( !readStdin ){
4672 /* Run all arguments that do not begin with '-' as if they were separate
4673 ** command-line inputs, except for the argToSkip argument which contains
4674 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004675 */
drhac5649a2014-11-28 13:35:03 +00004676 for(i=0; i<nCmd; i++){
4677 if( azCmd[i][0]=='.' ){
4678 rc = do_meta_command(azCmd[i], &data);
4679 if( rc ) return rc==2 ? 0 : rc;
4680 }else{
4681 open_db(&data, 0);
4682 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4683 if( zErrMsg!=0 ){
4684 fprintf(stderr,"Error: %s\n", zErrMsg);
4685 return rc!=0 ? rc : 1;
4686 }else if( rc!=0 ){
4687 fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4688 return rc;
4689 }
drh6ff13852001-11-25 13:18:23 +00004690 }
drh75897232000-05-29 14:26:00 +00004691 }
drhac5649a2014-11-28 13:35:03 +00004692 free(azCmd);
drh75897232000-05-29 14:26:00 +00004693 }else{
drh44c2eb12003-04-30 11:38:26 +00004694 /* Run commands received from standard input
4695 */
drhc28490c2006-10-26 14:25:58 +00004696 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004697 char *zHome;
4698 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004699 int nHistory;
drh75897232000-05-29 14:26:00 +00004700 printf(
drh743e0032011-12-12 16:51:50 +00004701 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004702 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004703 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004704 );
drhb3735912014-02-10 16:13:42 +00004705 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004706 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004707 printBold("transient in-memory database");
4708 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004709 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004710 }
drh67505e72002-04-19 12:34:06 +00004711 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004712 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004713 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004714 if( (zHistory = malloc(nHistory))!=0 ){
4715 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4716 }
drh67505e72002-04-19 12:34:06 +00004717 }
danfd34d6d2015-02-25 10:54:53 +00004718 if( zHistory ) shell_read_history(zHistory);
drhc28490c2006-10-26 14:25:58 +00004719 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004720 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00004721 shell_stifle_history(100);
4722 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004723 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004724 }
drhdaffd0e2001-04-11 14:28:42 +00004725 }else{
drhc28490c2006-10-26 14:25:58 +00004726 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004727 }
4728 }
drh33048c02001-10-01 14:29:22 +00004729 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004730 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004731 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004732 }
drh05782482013-10-24 15:20:20 +00004733 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004734 return rc;
drh75897232000-05-29 14:26:00 +00004735}