blob: 752106fcafb9c93ecd2d013768467a0bcff41663 [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"
drh4bbcf102014-02-06 02:46:08 +00001774 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001775 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00001776 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00001777 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001778 " If TABLE specified, only dump tables matching\n"
1779 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001780 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001781 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001782 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001783 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001784 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001785 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001786 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001787 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001788 ".import FILE TABLE Import data from FILE into TABLE\n"
drh0e55db12015-02-06 14:51:13 +00001789 ".indexes ?TABLE? Show names of all indexes\n"
1790 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00001791 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001792#ifdef SQLITE_ENABLE_IOTRACE
1793 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1794#endif
drh70df4fe2006-06-13 15:12:21 +00001795#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001796 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001797#endif
drh127f9d72010-02-23 01:47:00 +00001798 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001799 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00001800 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001801 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001802 " column Left-aligned columns. (See .width)\n"
1803 " html HTML <table> code\n"
1804 " insert SQL insert statements for TABLE\n"
1805 " line One value per line\n"
mistachkine0d68852014-12-11 03:12:33 +00001806 " list Values delimited by .separator strings\n"
drhb860bc92004-08-04 15:16:55 +00001807 " tabs Tab-separated values\n"
1808 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001809 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001810 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001811 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001812 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001813 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001814 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001815 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001816 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001817 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001818 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001819 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001820 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001821 " If TABLE specified, only show tables matching\n"
1822 " LIKE pattern TABLE.\n"
mistachkine0d68852014-12-11 03:12:33 +00001823 ".separator COL ?ROW? Change the column separator and optionally the row\n"
1824 " separator for both the output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001825 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001826 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001827 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001828 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001829 ".tables ?TABLE? List names of tables\n"
1830 " If TABLE specified, only list tables matching\n"
1831 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001832 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001833 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001834 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001835 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001836 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001837 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001838;
1839
drhdaffd0e2001-04-11 14:28:42 +00001840/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001841static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001842/*
1843** Implementation of the "readfile(X)" SQL function. The entire content
1844** of the file named X is read and returned as a BLOB. NULL is returned
1845** if the file does not exist or is unreadable.
1846*/
1847static void readfileFunc(
1848 sqlite3_context *context,
1849 int argc,
1850 sqlite3_value **argv
1851){
1852 const char *zName;
1853 FILE *in;
1854 long nIn;
1855 void *pBuf;
1856
1857 zName = (const char*)sqlite3_value_text(argv[0]);
1858 if( zName==0 ) return;
1859 in = fopen(zName, "rb");
1860 if( in==0 ) return;
1861 fseek(in, 0, SEEK_END);
1862 nIn = ftell(in);
1863 rewind(in);
1864 pBuf = sqlite3_malloc( nIn );
1865 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1866 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1867 }else{
1868 sqlite3_free(pBuf);
1869 }
1870 fclose(in);
1871}
1872
1873/*
1874** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1875** is written into file X. The number of bytes written is returned. Or
1876** NULL is returned if something goes wrong, such as being unable to open
1877** file X for writing.
1878*/
1879static void writefileFunc(
1880 sqlite3_context *context,
1881 int argc,
1882 sqlite3_value **argv
1883){
1884 FILE *out;
1885 const char *z;
drhba5b0932014-07-24 12:39:59 +00001886 sqlite3_int64 rc;
1887 const char *zFile;
1888
1889 zFile = (const char*)sqlite3_value_text(argv[0]);
1890 if( zFile==0 ) return;
1891 out = fopen(zFile, "wb");
1892 if( out==0 ) return;
1893 z = (const char*)sqlite3_value_blob(argv[1]);
1894 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001895 rc = 0;
1896 }else{
drh490fe862014-08-11 14:21:32 +00001897 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001898 }
1899 fclose(out);
1900 sqlite3_result_int64(context, rc);
1901}
drhdaffd0e2001-04-11 14:28:42 +00001902
drh75897232000-05-29 14:26:00 +00001903/*
drh44c2eb12003-04-30 11:38:26 +00001904** Make sure the database is open. If it is not, then open it. If
1905** the database fails to open, print an error message and exit.
1906*/
drhdcd87a92014-08-18 13:45:42 +00001907static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001908 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001909 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001910 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001911 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001912 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1913 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1914 shellstaticFunc, 0, 0);
1915 }
1916 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001917 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001918 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001919 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001920 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001921 }
drhc2e87a32006-06-27 15:16:14 +00001922#ifndef SQLITE_OMIT_LOAD_EXTENSION
1923 sqlite3_enable_load_extension(p->db, 1);
1924#endif
drhba5b0932014-07-24 12:39:59 +00001925 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1926 readfileFunc, 0, 0);
1927 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1928 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001929 }
1930}
1931
1932/*
drhfeac5f82004-08-01 00:10:45 +00001933** Do C-language style dequoting.
1934**
1935** \t -> tab
1936** \n -> newline
1937** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001938** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001939** \NNN -> ascii character NNN in octal
1940** \\ -> backslash
1941*/
1942static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001943 int i, j;
1944 char c;
drhc2ce0be2014-05-29 12:36:14 +00001945 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001946 for(i=j=0; (c = z[i])!=0; i++, j++){
1947 if( c=='\\' ){
1948 c = z[++i];
1949 if( c=='n' ){
1950 c = '\n';
1951 }else if( c=='t' ){
1952 c = '\t';
1953 }else if( c=='r' ){
1954 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001955 }else if( c=='\\' ){
1956 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001957 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001958 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001959 if( z[i+1]>='0' && z[i+1]<='7' ){
1960 i++;
1961 c = (c<<3) + z[i] - '0';
1962 if( z[i+1]>='0' && z[i+1]<='7' ){
1963 i++;
1964 c = (c<<3) + z[i] - '0';
1965 }
1966 }
1967 }
1968 }
1969 z[j] = c;
1970 }
drhc2ce0be2014-05-29 12:36:14 +00001971 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001972}
1973
1974/*
drh348d19c2013-06-03 12:47:43 +00001975** Return the value of a hexadecimal digit. Return -1 if the input
1976** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001977*/
drh348d19c2013-06-03 12:47:43 +00001978static int hexDigitValue(char c){
1979 if( c>='0' && c<='9' ) return c - '0';
1980 if( c>='a' && c<='f' ) return c - 'a' + 10;
1981 if( c>='A' && c<='F' ) return c - 'A' + 10;
1982 return -1;
drhc28490c2006-10-26 14:25:58 +00001983}
1984
1985/*
drh7d9f3942013-04-03 01:26:54 +00001986** Interpret zArg as an integer value, possibly with suffixes.
1987*/
1988static sqlite3_int64 integerValue(const char *zArg){
1989 sqlite3_int64 v = 0;
1990 static const struct { char *zSuffix; int iMult; } aMult[] = {
1991 { "KiB", 1024 },
1992 { "MiB", 1024*1024 },
1993 { "GiB", 1024*1024*1024 },
1994 { "KB", 1000 },
1995 { "MB", 1000000 },
1996 { "GB", 1000000000 },
1997 { "K", 1000 },
1998 { "M", 1000000 },
1999 { "G", 1000000000 },
2000 };
2001 int i;
2002 int isNeg = 0;
2003 if( zArg[0]=='-' ){
2004 isNeg = 1;
2005 zArg++;
2006 }else if( zArg[0]=='+' ){
2007 zArg++;
2008 }
drh348d19c2013-06-03 12:47:43 +00002009 if( zArg[0]=='0' && zArg[1]=='x' ){
2010 int x;
2011 zArg += 2;
2012 while( (x = hexDigitValue(zArg[0]))>=0 ){
2013 v = (v<<4) + x;
2014 zArg++;
2015 }
2016 }else{
2017 while( IsDigit(zArg[0]) ){
2018 v = v*10 + zArg[0] - '0';
2019 zArg++;
2020 }
drh7d9f3942013-04-03 01:26:54 +00002021 }
drhc2bed0a2013-05-24 11:57:50 +00002022 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002023 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2024 v *= aMult[i].iMult;
2025 break;
2026 }
2027 }
2028 return isNeg? -v : v;
2029}
2030
2031/*
drh348d19c2013-06-03 12:47:43 +00002032** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2033** for TRUE and FALSE. Return the integer value if appropriate.
2034*/
2035static int booleanValue(char *zArg){
2036 int i;
2037 if( zArg[0]=='0' && zArg[1]=='x' ){
2038 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2039 }else{
2040 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2041 }
2042 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2043 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2044 return 1;
2045 }
2046 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2047 return 0;
2048 }
2049 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2050 zArg);
2051 return 0;
2052}
2053
2054/*
drh42f64e52012-04-04 16:56:23 +00002055** Close an output file, assuming it is not stderr or stdout
2056*/
2057static void output_file_close(FILE *f){
2058 if( f && f!=stdout && f!=stderr ) fclose(f);
2059}
2060
2061/*
2062** Try to open an output file. The names "stdout" and "stderr" are
2063** recognized and do the right thing. NULL is returned if the output
2064** filename is "off".
2065*/
2066static FILE *output_file_open(const char *zFile){
2067 FILE *f;
2068 if( strcmp(zFile,"stdout")==0 ){
2069 f = stdout;
2070 }else if( strcmp(zFile, "stderr")==0 ){
2071 f = stderr;
2072 }else if( strcmp(zFile, "off")==0 ){
2073 f = 0;
2074 }else{
2075 f = fopen(zFile, "wb");
2076 if( f==0 ){
2077 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2078 }
2079 }
2080 return f;
2081}
2082
2083/*
2084** A routine for handling output from sqlite3_trace().
2085*/
2086static void sql_trace_callback(void *pArg, const char *z){
2087 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002088 if( f ){
2089 int i = (int)strlen(z);
2090 while( i>0 && z[i-1]==';' ){ i--; }
2091 fprintf(f, "%.*s;\n", i, z);
2092 }
drh42f64e52012-04-04 16:56:23 +00002093}
2094
2095/*
drhd8621b92012-04-17 09:09:33 +00002096** A no-op routine that runs with the ".breakpoint" doc-command. This is
2097** a useful spot to set a debugger breakpoint.
2098*/
2099static void test_breakpoint(void){
2100 static int nCall = 0;
2101 nCall++;
2102}
2103
2104/*
mistachkin636bf9f2014-07-19 20:15:16 +00002105** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002106*/
mistachkin636bf9f2014-07-19 20:15:16 +00002107typedef struct ImportCtx ImportCtx;
2108struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002109 const char *zFile; /* Name of the input file */
2110 FILE *in; /* Read the CSV text from this input stream */
2111 char *z; /* Accumulated text for a field */
2112 int n; /* Number of bytes in z */
2113 int nAlloc; /* Space allocated for z[] */
2114 int nLine; /* Current line number */
2115 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002116 int cColSep; /* The column separator character. (Usually ",") */
2117 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002118};
2119
2120/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002121static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002122 if( p->n+1>=p->nAlloc ){
2123 p->nAlloc += p->nAlloc + 100;
2124 p->z = sqlite3_realloc(p->z, p->nAlloc);
2125 if( p->z==0 ){
2126 fprintf(stderr, "out of memory\n");
2127 exit(1);
2128 }
2129 }
2130 p->z[p->n++] = (char)c;
2131}
2132
2133/* Read a single field of CSV text. Compatible with rfc4180 and extended
2134** with the option of having a separator other than ",".
2135**
2136** + Input comes from p->in.
2137** + Store results in p->z of length p->n. Space to hold p->z comes
2138** from sqlite3_malloc().
mistachkin636bf9f2014-07-19 20:15:16 +00002139** + Use p->cSep as the column separator. The default is ",".
2140** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002141** + Keep track of the line number in p->nLine.
2142** + Store the character that terminates the field in p->cTerm. Store
2143** EOF on end-of-file.
2144** + Report syntax errors on stderr
2145*/
mistachkin636bf9f2014-07-19 20:15:16 +00002146static char *csv_read_one_field(ImportCtx *p){
2147 int c;
2148 int cSep = p->cColSep;
2149 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002150 p->n = 0;
2151 c = fgetc(p->in);
2152 if( c==EOF || seenInterrupt ){
2153 p->cTerm = EOF;
2154 return 0;
2155 }
2156 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002157 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002158 int startLine = p->nLine;
2159 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002160 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002161 while( 1 ){
2162 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002163 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002164 if( c==cQuote ){
2165 if( pc==cQuote ){
2166 pc = 0;
2167 continue;
2168 }
2169 }
2170 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002171 || (c==rSep && pc==cQuote)
2172 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002173 || (c==EOF && pc==cQuote)
2174 ){
2175 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002176 p->cTerm = c;
2177 break;
2178 }
2179 if( pc==cQuote && c!='\r' ){
2180 fprintf(stderr, "%s:%d: unescaped %c character\n",
2181 p->zFile, p->nLine, cQuote);
2182 }
2183 if( c==EOF ){
2184 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2185 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002186 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002187 break;
2188 }
mistachkin636bf9f2014-07-19 20:15:16 +00002189 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002190 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002191 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002192 }
drhdb95f682013-06-26 22:46:00 +00002193 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002194 while( c!=EOF && c!=cSep && c!=rSep ){
2195 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002196 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002197 }
mistachkin636bf9f2014-07-19 20:15:16 +00002198 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002199 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002200 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002201 }
drhdb95f682013-06-26 22:46:00 +00002202 p->cTerm = c;
2203 }
drh8dd675e2013-07-12 21:09:24 +00002204 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002205 return p->z;
2206}
2207
mistachkin636bf9f2014-07-19 20:15:16 +00002208/* Read a single field of ASCII delimited text.
2209**
2210** + Input comes from p->in.
2211** + Store results in p->z of length p->n. Space to hold p->z comes
2212** from sqlite3_malloc().
2213** + Use p->cSep as the column separator. The default is "\x1F".
2214** + Use p->rSep as the row separator. The default is "\x1E".
2215** + Keep track of the row number in p->nLine.
2216** + Store the character that terminates the field in p->cTerm. Store
2217** EOF on end-of-file.
2218** + Report syntax errors on stderr
2219*/
2220static char *ascii_read_one_field(ImportCtx *p){
2221 int c;
2222 int cSep = p->cColSep;
2223 int rSep = p->cRowSep;
2224 p->n = 0;
2225 c = fgetc(p->in);
2226 if( c==EOF || seenInterrupt ){
2227 p->cTerm = EOF;
2228 return 0;
2229 }
2230 while( c!=EOF && c!=cSep && c!=rSep ){
2231 import_append_char(p, c);
2232 c = fgetc(p->in);
2233 }
2234 if( c==rSep ){
2235 p->nLine++;
2236 }
2237 p->cTerm = c;
2238 if( p->z ) p->z[p->n] = 0;
2239 return p->z;
2240}
2241
drhdb95f682013-06-26 22:46:00 +00002242/*
drh4bbcf102014-02-06 02:46:08 +00002243** Try to transfer data for table zTable. If an error is seen while
2244** moving forward, try to go backwards. The backwards movement won't
2245** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002246*/
mistachkine31ae902014-02-06 01:15:29 +00002247static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002248 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002249 sqlite3 *newDb,
2250 const char *zTable
2251){
2252 sqlite3_stmt *pQuery = 0;
2253 sqlite3_stmt *pInsert = 0;
2254 char *zQuery = 0;
2255 char *zInsert = 0;
2256 int rc;
2257 int i, j, n;
2258 int nTable = (int)strlen(zTable);
2259 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002260 int cnt = 0;
2261 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002262
2263 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2264 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2265 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002266 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002267 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2268 zQuery);
2269 goto end_data_xfer;
2270 }
2271 n = sqlite3_column_count(pQuery);
2272 zInsert = sqlite3_malloc(200 + nTable + n*3);
2273 if( zInsert==0 ){
2274 fprintf(stderr, "out of memory\n");
2275 goto end_data_xfer;
2276 }
2277 sqlite3_snprintf(200+nTable,zInsert,
2278 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2279 i = (int)strlen(zInsert);
2280 for(j=1; j<n; j++){
2281 memcpy(zInsert+i, ",?", 2);
2282 i += 2;
2283 }
2284 memcpy(zInsert+i, ");", 3);
2285 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2286 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002287 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002288 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2289 zQuery);
2290 goto end_data_xfer;
2291 }
2292 for(k=0; k<2; k++){
2293 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2294 for(i=0; i<n; i++){
2295 switch( sqlite3_column_type(pQuery, i) ){
2296 case SQLITE_NULL: {
2297 sqlite3_bind_null(pInsert, i+1);
2298 break;
2299 }
2300 case SQLITE_INTEGER: {
2301 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2302 break;
2303 }
2304 case SQLITE_FLOAT: {
2305 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2306 break;
2307 }
2308 case SQLITE_TEXT: {
2309 sqlite3_bind_text(pInsert, i+1,
2310 (const char*)sqlite3_column_text(pQuery,i),
2311 -1, SQLITE_STATIC);
2312 break;
2313 }
2314 case SQLITE_BLOB: {
2315 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2316 sqlite3_column_bytes(pQuery,i),
2317 SQLITE_STATIC);
2318 break;
2319 }
2320 }
2321 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002322 rc = sqlite3_step(pInsert);
2323 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2324 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2325 sqlite3_errmsg(newDb));
2326 }
drh3350ce92014-02-06 00:49:12 +00002327 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002328 cnt++;
2329 if( (cnt%spinRate)==0 ){
2330 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2331 fflush(stdout);
2332 }
drh3350ce92014-02-06 00:49:12 +00002333 } /* End while */
2334 if( rc==SQLITE_DONE ) break;
2335 sqlite3_finalize(pQuery);
2336 sqlite3_free(zQuery);
2337 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2338 zTable);
2339 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2340 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002341 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2342 break;
drh3350ce92014-02-06 00:49:12 +00002343 }
2344 } /* End for(k=0...) */
2345
2346end_data_xfer:
2347 sqlite3_finalize(pQuery);
2348 sqlite3_finalize(pInsert);
2349 sqlite3_free(zQuery);
2350 sqlite3_free(zInsert);
2351}
2352
2353
2354/*
2355** Try to transfer all rows of the schema that match zWhere. For
2356** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002357** If an error is encountered while moving forward through the
2358** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002359*/
mistachkine31ae902014-02-06 01:15:29 +00002360static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002361 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002362 sqlite3 *newDb,
2363 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002364 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002365){
2366 sqlite3_stmt *pQuery = 0;
2367 char *zQuery = 0;
2368 int rc;
2369 const unsigned char *zName;
2370 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002371 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002372
2373 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2374 " WHERE %s", zWhere);
2375 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2376 if( rc ){
2377 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2378 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2379 zQuery);
2380 goto end_schema_xfer;
2381 }
2382 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2383 zName = sqlite3_column_text(pQuery, 0);
2384 zSql = sqlite3_column_text(pQuery, 1);
2385 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002386 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2387 if( zErrMsg ){
2388 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2389 sqlite3_free(zErrMsg);
2390 zErrMsg = 0;
2391 }
drh3350ce92014-02-06 00:49:12 +00002392 if( xForEach ){
2393 xForEach(p, newDb, (const char*)zName);
2394 }
2395 printf("done\n");
2396 }
2397 if( rc!=SQLITE_DONE ){
2398 sqlite3_finalize(pQuery);
2399 sqlite3_free(zQuery);
2400 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2401 " WHERE %s ORDER BY rowid DESC", zWhere);
2402 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2403 if( rc ){
2404 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2405 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2406 zQuery);
2407 goto end_schema_xfer;
2408 }
2409 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2410 zName = sqlite3_column_text(pQuery, 0);
2411 zSql = sqlite3_column_text(pQuery, 1);
2412 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002413 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2414 if( zErrMsg ){
2415 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2416 sqlite3_free(zErrMsg);
2417 zErrMsg = 0;
2418 }
drh3350ce92014-02-06 00:49:12 +00002419 if( xForEach ){
2420 xForEach(p, newDb, (const char*)zName);
2421 }
2422 printf("done\n");
2423 }
2424 }
2425end_schema_xfer:
2426 sqlite3_finalize(pQuery);
2427 sqlite3_free(zQuery);
2428}
2429
2430/*
2431** Open a new database file named "zNewDb". Try to recover as much information
2432** as possible out of the main database (which might be corrupt) and write it
2433** into zNewDb.
2434*/
drhdcd87a92014-08-18 13:45:42 +00002435static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002436 int rc;
2437 sqlite3 *newDb = 0;
2438 if( access(zNewDb,0)==0 ){
2439 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2440 return;
2441 }
2442 rc = sqlite3_open(zNewDb, &newDb);
2443 if( rc ){
2444 fprintf(stderr, "Cannot create output database: %s\n",
2445 sqlite3_errmsg(newDb));
2446 }else{
drh54d0d2d2014-04-03 00:32:13 +00002447 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002448 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002449 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2450 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002451 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002452 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002453 }
2454 sqlite3_close(newDb);
2455}
2456
2457/*
drhc2ce0be2014-05-29 12:36:14 +00002458** Change the output file back to stdout
2459*/
drhdcd87a92014-08-18 13:45:42 +00002460static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002461 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002462#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002463 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002464#endif
drhc2ce0be2014-05-29 12:36:14 +00002465 }else{
2466 output_file_close(p->out);
2467 }
2468 p->outfile[0] = 0;
2469 p->out = stdout;
2470}
2471
2472/*
drhf7502f02015-02-06 14:19:44 +00002473** Run an SQL command and return the single integer result.
2474*/
2475static int db_int(ShellState *p, const char *zSql){
2476 sqlite3_stmt *pStmt;
2477 int res = 0;
2478 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2479 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2480 res = sqlite3_column_int(pStmt,0);
2481 }
2482 sqlite3_finalize(pStmt);
2483 return res;
2484}
2485
2486/*
2487** Convert a 2-byte or 4-byte big-endian integer into a native integer
2488*/
2489unsigned int get2byteInt(unsigned char *a){
2490 return (a[0]<<8) + a[1];
2491}
2492unsigned int get4byteInt(unsigned char *a){
2493 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2494}
2495
2496/*
2497** Implementation of the ".info" command.
2498**
2499** Return 1 on error, 2 to exit, and 0 otherwise.
2500*/
drh0e55db12015-02-06 14:51:13 +00002501static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002502 static const struct { const char *zName; int ofst; } aField[] = {
2503 { "file change counter:", 24 },
2504 { "database page count:", 28 },
2505 { "freelist page count:", 36 },
2506 { "schema cookie:", 40 },
2507 { "schema format:", 44 },
2508 { "default cache size:", 48 },
2509 { "autovacuum top root:", 52 },
2510 { "incremental vacuum:", 64 },
2511 { "text encoding:", 56 },
2512 { "user version:", 60 },
2513 { "application id:", 68 },
2514 { "software version:", 96 },
2515 };
drh0e55db12015-02-06 14:51:13 +00002516 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2517 { "number of tables:",
2518 "SELECT count(*) FROM %s WHERE type='table'" },
2519 { "number of indexes:",
2520 "SELECT count(*) FROM %s WHERE type='index'" },
2521 { "number of triggers:",
2522 "SELECT count(*) FROM %s WHERE type='trigger'" },
2523 { "number of views:",
2524 "SELECT count(*) FROM %s WHERE type='view'" },
2525 { "schema size:",
2526 "SELECT total(length(sql)) FROM %s" },
2527 };
2528 sqlite3_file *pFile;
2529 int i;
2530 char *zSchemaTab;
2531 char *zDb = nArg>=2 ? azArg[1] : "main";
2532 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002533 open_db(p, 0);
2534 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002535 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002536 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2537 return 1;
2538 }
2539 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2540 if( i!=SQLITE_OK ){
2541 fprintf(stderr, "unable to read database header\n");
2542 return 1;
2543 }
2544 i = get2byteInt(aHdr+16);
2545 if( i==1 ) i = 65536;
2546 fprintf(p->out, "%-20s %d\n", "database page size:", i);
2547 fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2548 fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2549 fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
2550 for(i=0; i<sizeof(aField)/sizeof(aField[0]); i++){
2551 int ofst = aField[i].ofst;
2552 unsigned int val = get4byteInt(aHdr + ofst);
2553 fprintf(p->out, "%-20s %u", aField[i].zName, val);
2554 switch( ofst ){
2555 case 56: {
2556 if( val==1 ) fprintf(p->out, " (utf8)");
2557 if( val==2 ) fprintf(p->out, " (utf16le)");
2558 if( val==3 ) fprintf(p->out, " (utf16be)");
2559 }
2560 }
2561 fprintf(p->out, "\n");
2562 }
drh0e55db12015-02-06 14:51:13 +00002563 if( zDb==0 ){
2564 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2565 }else if( strcmp(zDb,"temp")==0 ){
2566 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2567 }else{
2568 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2569 }
2570 for(i=0; i<sizeof(aQuery)/sizeof(aQuery[0]); i++){
2571 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2572 int val = db_int(p, zSql);
2573 sqlite3_free(zSql);
2574 fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
2575 }
2576 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002577 return 0;
2578}
2579
2580
2581/*
drh75897232000-05-29 14:26:00 +00002582** If an input line begins with "." then invoke this routine to
2583** process that line.
drh67505e72002-04-19 12:34:06 +00002584**
drh47ad6842006-11-08 12:25:42 +00002585** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002586*/
drhdcd87a92014-08-18 13:45:42 +00002587static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002588 int i = 1;
2589 int nArg = 0;
2590 int n, c;
drh67505e72002-04-19 12:34:06 +00002591 int rc = 0;
drh75897232000-05-29 14:26:00 +00002592 char *azArg[50];
2593
2594 /* Parse the input line into tokens.
2595 */
2596 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002597 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002598 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002599 if( zLine[i]=='\'' || zLine[i]=='"' ){
2600 int delim = zLine[i++];
2601 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002602 while( zLine[i] && zLine[i]!=delim ){
2603 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2604 i++;
2605 }
drh75897232000-05-29 14:26:00 +00002606 if( zLine[i]==delim ){
2607 zLine[i++] = 0;
2608 }
drhfeac5f82004-08-01 00:10:45 +00002609 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002610 }else{
2611 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002612 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002613 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002614 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002615 }
2616 }
2617
2618 /* Process the input line.
2619 */
shane9bd1b442009-10-23 01:27:39 +00002620 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002621 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002622 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002623 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2624 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2625 ){
drhbc46f022013-01-23 18:53:23 +00002626 const char *zDestFile = 0;
2627 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002628 sqlite3 *pDest;
2629 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002630 int j;
2631 for(j=1; j<nArg; j++){
2632 const char *z = azArg[j];
2633 if( z[0]=='-' ){
2634 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002635 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002636 {
2637 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2638 return 1;
2639 }
2640 }else if( zDestFile==0 ){
2641 zDestFile = azArg[j];
2642 }else if( zDb==0 ){
2643 zDb = zDestFile;
2644 zDestFile = azArg[j];
2645 }else{
2646 fprintf(stderr, "too many arguments to .backup\n");
2647 return 1;
2648 }
drh9ff849f2009-02-04 20:55:57 +00002649 }
drhbc46f022013-01-23 18:53:23 +00002650 if( zDestFile==0 ){
2651 fprintf(stderr, "missing FILENAME argument on .backup\n");
2652 return 1;
2653 }
2654 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002655 rc = sqlite3_open(zDestFile, &pDest);
2656 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002657 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002658 sqlite3_close(pDest);
2659 return 1;
2660 }
drh05782482013-10-24 15:20:20 +00002661 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002662 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2663 if( pBackup==0 ){
2664 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2665 sqlite3_close(pDest);
2666 return 1;
2667 }
2668 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2669 sqlite3_backup_finish(pBackup);
2670 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002671 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002672 }else{
2673 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002674 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002675 }
2676 sqlite3_close(pDest);
2677 }else
2678
drhc2ce0be2014-05-29 12:36:14 +00002679 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2680 if( nArg==2 ){
2681 bail_on_error = booleanValue(azArg[1]);
2682 }else{
2683 fprintf(stderr, "Usage: .bail on|off\n");
2684 rc = 1;
2685 }
drhc49f44e2006-10-26 18:15:42 +00002686 }else
2687
drhd8621b92012-04-17 09:09:33 +00002688 /* The undocumented ".breakpoint" command causes a call to the no-op
2689 ** routine named test_breakpoint().
2690 */
2691 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2692 test_breakpoint();
2693 }else
2694
drhc2ce0be2014-05-29 12:36:14 +00002695 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2696 if( nArg==2 ){
2697 tryToClone(p, azArg[1]);
2698 }else{
2699 fprintf(stderr, "Usage: .clone FILENAME\n");
2700 rc = 1;
2701 }
mistachkine31ae902014-02-06 01:15:29 +00002702 }else
2703
drhc2ce0be2014-05-29 12:36:14 +00002704 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002705 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002706 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002707 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002708 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002709 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002710 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002711 data.colWidth[0] = 3;
2712 data.colWidth[1] = 15;
2713 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002714 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002715 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002716 if( zErrMsg ){
2717 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002718 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002719 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002720 }
2721 }else
2722
drh0e55db12015-02-06 14:51:13 +00002723 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2724 rc = shell_dbinfo_command(p, nArg, azArg);
2725 }else
2726
drhc2ce0be2014-05-29 12:36:14 +00002727 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002728 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002729 /* When playing back a "dump", the content might appear in an order
2730 ** which causes immediate foreign key constraints to be violated.
2731 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002732 if( nArg!=1 && nArg!=2 ){
2733 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2734 rc = 1;
2735 goto meta_command_exit;
2736 }
drhf1dfc4f2009-09-23 15:51:35 +00002737 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002738 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002739 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002740 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002741 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002742 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002743 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002744 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002745 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002746 );
2747 run_schema_dump_query(p,
2748 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002749 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002750 );
drh2f464a02011-10-13 00:41:49 +00002751 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002752 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002753 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002754 );
drh4c653a02000-06-07 01:27:47 +00002755 }else{
2756 int i;
drhdd3d4592004-08-30 01:54:05 +00002757 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002758 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002759 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002760 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002761 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002762 " AND sql NOT NULL");
2763 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002764 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002765 "WHERE sql NOT NULL"
2766 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002767 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002768 );
danielk1977bc6ada42004-06-30 08:20:16 +00002769 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002770 }
2771 }
drh45e29d82006-11-20 16:21:10 +00002772 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002773 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002774 p->writableSchema = 0;
2775 }
drh56197952011-10-13 16:30:13 +00002776 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2777 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002778 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002779 }else
drh75897232000-05-29 14:26:00 +00002780
drhc2ce0be2014-05-29 12:36:14 +00002781 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2782 if( nArg==2 ){
2783 p->echoOn = booleanValue(azArg[1]);
2784 }else{
2785 fprintf(stderr, "Usage: .echo on|off\n");
2786 rc = 1;
2787 }
drhdaffd0e2001-04-11 14:28:42 +00002788 }else
2789
drhc2ce0be2014-05-29 12:36:14 +00002790 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2791 if( nArg==2 ){
2792 p->autoEQP = booleanValue(azArg[1]);
2793 }else{
2794 fprintf(stderr, "Usage: .eqp on|off\n");
2795 rc = 1;
2796 }
drhefbf3b12014-02-28 20:47:24 +00002797 }else
2798
drhd3ac7d92013-01-25 18:33:43 +00002799 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002800 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002801 rc = 2;
drh75897232000-05-29 14:26:00 +00002802 }else
2803
drhc2ce0be2014-05-29 12:36:14 +00002804 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002805 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002806 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002807 if(!p->normalMode.valid) {
2808 p->normalMode.valid = 1;
2809 p->normalMode.mode = p->mode;
2810 p->normalMode.showHeader = p->showHeader;
2811 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002812 }
2813 /* We could put this code under the !p->explainValid
2814 ** condition so that it does not execute if we are already in
2815 ** explain mode. However, always executing it allows us an easy
2816 ** was to reset to explain mode in case the user previously
2817 ** did an .explain followed by a .width, .mode or .header
2818 ** command.
2819 */
danielk19770d78bae2008-01-03 07:09:48 +00002820 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002821 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002822 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002823 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002824 p->colWidth[1] = 13; /* opcode */
2825 p->colWidth[2] = 4; /* P1 */
2826 p->colWidth[3] = 4; /* P2 */
2827 p->colWidth[4] = 4; /* P3 */
2828 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002829 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002830 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002831 }else if (p->normalMode.valid) {
2832 p->normalMode.valid = 0;
2833 p->mode = p->normalMode.mode;
2834 p->showHeader = p->normalMode.showHeader;
2835 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002836 }
drh75897232000-05-29 14:26:00 +00002837 }else
2838
drhc1971542014-06-23 23:28:13 +00002839 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002840 ShellState data;
drhc1971542014-06-23 23:28:13 +00002841 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002842 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002843 if( nArg!=1 ){
2844 fprintf(stderr, "Usage: .fullschema\n");
2845 rc = 1;
2846 goto meta_command_exit;
2847 }
2848 open_db(p, 0);
2849 memcpy(&data, p, sizeof(data));
2850 data.showHeader = 0;
2851 data.mode = MODE_Semi;
2852 rc = sqlite3_exec(p->db,
2853 "SELECT sql FROM"
2854 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2855 " FROM sqlite_master UNION ALL"
2856 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002857 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002858 "ORDER BY rowid",
2859 callback, &data, &zErrMsg
2860 );
drh56f674c2014-07-18 14:43:29 +00002861 if( rc==SQLITE_OK ){
2862 sqlite3_stmt *pStmt;
2863 rc = sqlite3_prepare_v2(p->db,
2864 "SELECT rowid FROM sqlite_master"
2865 " WHERE name GLOB 'sqlite_stat[134]'",
2866 -1, &pStmt, 0);
2867 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2868 sqlite3_finalize(pStmt);
2869 }
2870 if( doStats==0 ){
2871 fprintf(p->out, "/* No STAT tables available */\n");
2872 }else{
2873 fprintf(p->out, "ANALYZE sqlite_master;\n");
2874 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2875 callback, &data, &zErrMsg);
2876 data.mode = MODE_Insert;
2877 data.zDestTable = "sqlite_stat1";
2878 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2879 shell_callback, &data,&zErrMsg);
2880 data.zDestTable = "sqlite_stat3";
2881 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2882 shell_callback, &data,&zErrMsg);
2883 data.zDestTable = "sqlite_stat4";
2884 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2885 shell_callback, &data, &zErrMsg);
2886 fprintf(p->out, "ANALYZE sqlite_master;\n");
2887 }
drhc1971542014-06-23 23:28:13 +00002888 }else
2889
drhc2ce0be2014-05-29 12:36:14 +00002890 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2891 if( nArg==2 ){
2892 p->showHeader = booleanValue(azArg[1]);
2893 }else{
2894 fprintf(stderr, "Usage: .headers on|off\n");
2895 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002896 }
drh75897232000-05-29 14:26:00 +00002897 }else
2898
drhc2ce0be2014-05-29 12:36:14 +00002899 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2900 fprintf(p->out, "%s", zHelp);
2901 }else
2902
2903 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002904 char *zTable; /* Insert data into this table */
2905 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002906 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002907 int nCol; /* Number of columns in the table */
2908 int nByte; /* Number of bytes in an SQL string */
2909 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002910 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00002911 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00002912 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00002913 ImportCtx sCtx; /* Reader context */
mistachkin486fd432014-07-24 22:20:23 +00002914 char *(*xRead)(ImportCtx*); /* Procedure to read one value */
drh5bde8162013-06-27 14:07:53 +00002915 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002916
drhc2ce0be2014-05-29 12:36:14 +00002917 if( nArg!=3 ){
2918 fprintf(stderr, "Usage: .import FILE TABLE\n");
2919 goto meta_command_exit;
2920 }
drh01f37542014-05-31 15:43:33 +00002921 zFile = azArg[1];
2922 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002923 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00002924 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00002925 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002926 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002927 if( nSep==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002928 fprintf(stderr, "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00002929 return 1;
drhfeac5f82004-08-01 00:10:45 +00002930 }
drhdb95f682013-06-26 22:46:00 +00002931 if( nSep>1 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002932 fprintf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00002933 " for import\n");
2934 return 1;
2935 }
mistachkin636bf9f2014-07-19 20:15:16 +00002936 nSep = strlen30(p->rowSeparator);
2937 if( nSep==0 ){
2938 fprintf(stderr, "Error: non-null row separator required for import\n");
2939 return 1;
2940 }
mistachkine0d68852014-12-11 03:12:33 +00002941 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
2942 /* When importing CSV (only), if the row separator is set to the
2943 ** default output row separator, change it to the default input
2944 ** row separator. This avoids having to maintain different input
2945 ** and output row separators. */
2946 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
2947 nSep = strlen30(p->rowSeparator);
2948 }
mistachkin636bf9f2014-07-19 20:15:16 +00002949 if( nSep>1 ){
2950 fprintf(stderr, "Error: multi-character row separators not allowed"
2951 " for import\n");
2952 return 1;
2953 }
2954 sCtx.zFile = zFile;
2955 sCtx.nLine = 1;
2956 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002957#ifdef SQLITE_OMIT_POPEN
mistachkinba132c72015-03-19 14:48:38 +00002958 fprintf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00002959 return 1;
2960#else
mistachkin636bf9f2014-07-19 20:15:16 +00002961 sCtx.in = popen(sCtx.zFile+1, "r");
2962 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00002963 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00002964#endif
drh5bde8162013-06-27 14:07:53 +00002965 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002966 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00002967 xCloser = fclose;
2968 }
mistachkin636bf9f2014-07-19 20:15:16 +00002969 if( p->mode==MODE_Ascii ){
2970 xRead = ascii_read_one_field;
2971 }else{
2972 xRead = csv_read_one_field;
2973 }
2974 if( sCtx.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002975 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002976 return 1;
2977 }
mistachkin636bf9f2014-07-19 20:15:16 +00002978 sCtx.cColSep = p->colSeparator[0];
2979 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00002980 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002981 if( zSql==0 ){
2982 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00002983 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00002984 return 1;
2985 }
drh4f21c4a2008-12-10 22:15:00 +00002986 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002987 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002988 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002989 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2990 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2991 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00002992 while( xRead(&sCtx) ){
2993 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00002994 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00002995 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00002996 }
drh5bde8162013-06-27 14:07:53 +00002997 if( cSep=='(' ){
2998 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00002999 sqlite3_free(sCtx.z);
3000 xCloser(sCtx.in);
3001 fprintf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003002 return 1;
3003 }
drhdb95f682013-06-26 22:46:00 +00003004 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3005 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3006 sqlite3_free(zCreate);
3007 if( rc ){
3008 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
3009 sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00003010 sqlite3_free(sCtx.z);
3011 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003012 return 1;
3013 }
drhc7181902014-02-27 15:04:13 +00003014 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003015 }
drhfeac5f82004-08-01 00:10:45 +00003016 sqlite3_free(zSql);
3017 if( rc ){
shane916f9612009-10-23 00:37:15 +00003018 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003019 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00003020 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003021 return 1;
drhfeac5f82004-08-01 00:10:45 +00003022 }
shane916f9612009-10-23 00:37:15 +00003023 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003024 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003025 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003026 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00003027 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003028 if( zSql==0 ){
3029 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003030 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003031 return 1;
3032 }
drhdb95f682013-06-26 22:46:00 +00003033 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003034 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003035 for(i=1; i<nCol; i++){
3036 zSql[j++] = ',';
3037 zSql[j++] = '?';
3038 }
3039 zSql[j++] = ')';
3040 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003041 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003042 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003043 if( rc ){
3044 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00003045 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003046 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003047 return 1;
drhfeac5f82004-08-01 00:10:45 +00003048 }
drh2d463112013-08-06 14:36:36 +00003049 needCommit = sqlite3_get_autocommit(db);
3050 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003051 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003052 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003053 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003054 char *z = xRead(&sCtx);
3055 /*
3056 ** Did we reach end-of-file before finding any columns?
3057 ** If so, stop instead of NULL filling the remaining columns.
3058 */
drhdb95f682013-06-26 22:46:00 +00003059 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003060 /*
3061 ** Did we reach end-of-file OR end-of-line before finding any
3062 ** columns in ASCII mode? If so, stop instead of NULL filling
3063 ** the remaining columns.
3064 */
3065 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003066 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003067 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003068 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3069 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003070 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003071 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003072 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003073 }
drhfeac5f82004-08-01 00:10:45 +00003074 }
mistachkin636bf9f2014-07-19 20:15:16 +00003075 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003076 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003077 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003078 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003079 }while( sCtx.cTerm==sCtx.cColSep );
drhdb95f682013-06-26 22:46:00 +00003080 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3081 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003082 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003083 }
drhdb95f682013-06-26 22:46:00 +00003084 if( i>=nCol ){
3085 sqlite3_step(pStmt);
3086 rc = sqlite3_reset(pStmt);
3087 if( rc!=SQLITE_OK ){
mistachkin636bf9f2014-07-19 20:15:16 +00003088 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
drhdb95f682013-06-26 22:46:00 +00003089 sqlite3_errmsg(db));
3090 }
3091 }
mistachkin636bf9f2014-07-19 20:15:16 +00003092 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003093
mistachkin636bf9f2014-07-19 20:15:16 +00003094 xCloser(sCtx.in);
3095 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003096 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00003097 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003098 }else
3099
drh0e55db12015-02-06 14:51:13 +00003100 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3101 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003102 ShellState data;
drh75897232000-05-29 14:26:00 +00003103 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003104 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003105 memcpy(&data, p, sizeof(data));
3106 data.showHeader = 0;
3107 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003108 if( nArg==1 ){
3109 rc = sqlite3_exec(p->db,
3110 "SELECT name FROM sqlite_master "
3111 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3112 "UNION ALL "
3113 "SELECT name FROM sqlite_temp_master "
3114 "WHERE type='index' "
3115 "ORDER BY 1",
3116 callback, &data, &zErrMsg
3117 );
drhc2ce0be2014-05-29 12:36:14 +00003118 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003119 zShellStatic = azArg[1];
3120 rc = sqlite3_exec(p->db,
3121 "SELECT name FROM sqlite_master "
3122 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3123 "UNION ALL "
3124 "SELECT name FROM sqlite_temp_master "
3125 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3126 "ORDER BY 1",
3127 callback, &data, &zErrMsg
3128 );
3129 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003130 }else{
drh0e55db12015-02-06 14:51:13 +00003131 fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003132 rc = 1;
3133 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003134 }
drh75897232000-05-29 14:26:00 +00003135 if( zErrMsg ){
3136 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003137 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003138 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003139 }else if( rc != SQLITE_OK ){
3140 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3141 rc = 1;
drh75897232000-05-29 14:26:00 +00003142 }
3143 }else
3144
drhae5e4452007-05-03 17:18:36 +00003145#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003146 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003147 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003148 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3149 iotrace = 0;
3150 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003151 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003152 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003153 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003154 iotrace = stdout;
3155 }else{
3156 iotrace = fopen(azArg[1], "w");
3157 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00003158 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003159 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003160 rc = 1;
drhb0603412007-02-28 04:47:26 +00003161 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003162 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003163 }
3164 }
3165 }else
drhae5e4452007-05-03 17:18:36 +00003166#endif
drhb0603412007-02-28 04:47:26 +00003167
drh70df4fe2006-06-13 15:12:21 +00003168#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003169 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003170 const char *zFile, *zProc;
3171 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003172 if( nArg<2 ){
3173 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3174 rc = 1;
3175 goto meta_command_exit;
3176 }
drh1e397f82006-06-08 15:28:43 +00003177 zFile = azArg[1];
3178 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003179 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003180 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3181 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003182 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003183 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003184 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003185 }
3186 }else
drh70df4fe2006-06-13 15:12:21 +00003187#endif
drh1e397f82006-06-08 15:28:43 +00003188
drhc2ce0be2014-05-29 12:36:14 +00003189 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3190 if( nArg!=2 ){
3191 fprintf(stderr, "Usage: .log FILENAME\n");
3192 rc = 1;
3193 }else{
3194 const char *zFile = azArg[1];
3195 output_file_close(p->pLog);
3196 p->pLog = output_file_open(zFile);
3197 }
drh127f9d72010-02-23 01:47:00 +00003198 }else
3199
drhc2ce0be2014-05-29 12:36:14 +00003200 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3201 const char *zMode = nArg>=2 ? azArg[1] : "";
3202 int n2 = (int)strlen(zMode);
3203 int c2 = zMode[0];
3204 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003205 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003206 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003207 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003208 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003209 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003210 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003211 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003212 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003213 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003214 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003215 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003216 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003217 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003218 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003219 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003220 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003221 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003222 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003223 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003224 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003225 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3226 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003227 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3228 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003229 }else {
shane9bd1b442009-10-23 01:27:39 +00003230 fprintf(stderr,"Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003231 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003232 rc = 1;
drh75897232000-05-29 14:26:00 +00003233 }
3234 }else
3235
drhc2ce0be2014-05-29 12:36:14 +00003236 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3237 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003238 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3239 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003240 }else{
3241 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003242 rc = 1;
3243 }
3244 }else
3245
drh05782482013-10-24 15:20:20 +00003246 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3247 sqlite3 *savedDb = p->db;
3248 const char *zSavedFilename = p->zDbFilename;
3249 char *zNewFilename = 0;
3250 p->db = 0;
3251 if( nArg>=2 ){
3252 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3253 }
3254 open_db(p, 1);
3255 if( p->db!=0 ){
3256 sqlite3_close(savedDb);
3257 sqlite3_free(p->zFreeOnClose);
3258 p->zFreeOnClose = zNewFilename;
3259 }else{
3260 sqlite3_free(zNewFilename);
3261 p->db = savedDb;
3262 p->zDbFilename = zSavedFilename;
3263 }
3264 }else
3265
drhc2ce0be2014-05-29 12:36:14 +00003266 if( c=='o'
3267 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3268 ){
3269 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3270 if( nArg>2 ){
3271 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3272 rc = 1;
3273 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003274 }
drhc2ce0be2014-05-29 12:36:14 +00003275 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3276 if( nArg<2 ){
3277 fprintf(stderr, "Usage: .once FILE\n");
3278 rc = 1;
3279 goto meta_command_exit;
3280 }
3281 p->outCount = 2;
3282 }else{
3283 p->outCount = 0;
3284 }
3285 output_reset(p);
3286 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003287#ifdef SQLITE_OMIT_POPEN
3288 fprintf(stderr,"Error: pipes are not supported in this OS\n");
3289 rc = 1;
3290 p->out = stdout;
3291#else
drhc2ce0be2014-05-29 12:36:14 +00003292 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003293 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003294 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003295 p->out = stdout;
3296 rc = 1;
3297 }else{
drhc2ce0be2014-05-29 12:36:14 +00003298 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003299 }
drh8cd5b252015-03-02 22:06:43 +00003300#endif
drh75897232000-05-29 14:26:00 +00003301 }else{
drhc2ce0be2014-05-29 12:36:14 +00003302 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003303 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003304 if( strcmp(zFile,"off")!=0 ){
3305 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003306 }
drh75897232000-05-29 14:26:00 +00003307 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003308 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003309 } else {
drhc2ce0be2014-05-29 12:36:14 +00003310 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003311 }
3312 }
3313 }else
3314
drh078b1fd2012-09-21 13:40:02 +00003315 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3316 int i;
3317 for(i=1; i<nArg; i++){
3318 if( i>1 ) fprintf(p->out, " ");
3319 fprintf(p->out, "%s", azArg[i]);
3320 }
3321 fprintf(p->out, "\n");
3322 }else
3323
drhc2ce0be2014-05-29 12:36:14 +00003324 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003325 if( nArg >= 2) {
3326 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3327 }
3328 if( nArg >= 3) {
3329 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3330 }
3331 }else
3332
drhc2ce0be2014-05-29 12:36:14 +00003333 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003334 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003335 }else
3336
drhc2ce0be2014-05-29 12:36:14 +00003337 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3338 FILE *alt;
3339 if( nArg!=2 ){
3340 fprintf(stderr, "Usage: .read FILE\n");
3341 rc = 1;
3342 goto meta_command_exit;
3343 }
3344 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003345 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003346 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3347 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003348 }else{
shane9bd1b442009-10-23 01:27:39 +00003349 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003350 fclose(alt);
3351 }
3352 }else
3353
drhc2ce0be2014-05-29 12:36:14 +00003354 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003355 const char *zSrcFile;
3356 const char *zDb;
3357 sqlite3 *pSrc;
3358 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003359 int nTimeout = 0;
3360
drh9ff849f2009-02-04 20:55:57 +00003361 if( nArg==2 ){
3362 zSrcFile = azArg[1];
3363 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003364 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003365 zSrcFile = azArg[2];
3366 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003367 }else{
3368 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3369 rc = 1;
3370 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003371 }
3372 rc = sqlite3_open(zSrcFile, &pSrc);
3373 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003374 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003375 sqlite3_close(pSrc);
3376 return 1;
3377 }
drh05782482013-10-24 15:20:20 +00003378 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003379 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3380 if( pBackup==0 ){
3381 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3382 sqlite3_close(pSrc);
3383 return 1;
3384 }
drhdc2c4912009-02-04 22:46:47 +00003385 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3386 || rc==SQLITE_BUSY ){
3387 if( rc==SQLITE_BUSY ){
3388 if( nTimeout++ >= 3 ) break;
3389 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003390 }
3391 }
3392 sqlite3_backup_finish(pBackup);
3393 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003394 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003395 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003396 fprintf(stderr, "Error: source database is busy\n");
3397 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003398 }else{
3399 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003400 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003401 }
3402 sqlite3_close(pSrc);
3403 }else
3404
dan8d1edb92014-11-05 09:07:28 +00003405
3406 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3407 if( nArg==2 ){
3408 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003409#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3410 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3411#endif
dan8d1edb92014-11-05 09:07:28 +00003412 }else{
3413 fprintf(stderr, "Usage: .scanstats on|off\n");
3414 rc = 1;
3415 }
3416 }else
3417
drhc2ce0be2014-05-29 12:36:14 +00003418 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003419 ShellState data;
drh75897232000-05-29 14:26:00 +00003420 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003421 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003422 memcpy(&data, p, sizeof(data));
3423 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003424 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003425 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003426 int i;
drhf0693c82011-10-11 20:41:54 +00003427 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003428 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003429 char *new_argv[2], *new_colv[2];
3430 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3431 " type text,\n"
3432 " name text,\n"
3433 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003434 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003435 " sql text\n"
3436 ")";
3437 new_argv[1] = 0;
3438 new_colv[0] = "sql";
3439 new_colv[1] = 0;
3440 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003441 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003442 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003443 char *new_argv[2], *new_colv[2];
3444 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3445 " type text,\n"
3446 " name text,\n"
3447 " tbl_name text,\n"
3448 " rootpage integer,\n"
3449 " sql text\n"
3450 ")";
3451 new_argv[1] = 0;
3452 new_colv[0] = "sql";
3453 new_colv[1] = 0;
3454 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003455 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003456 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003457 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003458 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003459 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003460 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003461 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003462 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003463 "WHERE lower(tbl_name) LIKE shellstatic()"
3464 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003465 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003466 callback, &data, &zErrMsg);
3467 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003468 }
drhc2ce0be2014-05-29 12:36:14 +00003469 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003470 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003471 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003472 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003473 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003474 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003475 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003476 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003477 callback, &data, &zErrMsg
3478 );
drhc2ce0be2014-05-29 12:36:14 +00003479 }else{
3480 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3481 rc = 1;
3482 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003483 }
drh75897232000-05-29 14:26:00 +00003484 if( zErrMsg ){
3485 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003486 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003487 rc = 1;
3488 }else if( rc != SQLITE_OK ){
3489 fprintf(stderr,"Error: querying schema information\n");
3490 rc = 1;
3491 }else{
3492 rc = 0;
drh75897232000-05-29 14:26:00 +00003493 }
3494 }else
3495
drhabd4c722014-09-20 18:18:33 +00003496
3497#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3498 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3499 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003500 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003501 }else
3502#endif
3503
3504
drh340f5822013-06-27 13:01:21 +00003505#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003506 /* Undocumented commands for internal testing. Subject to change
3507 ** without notice. */
3508 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3509 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3510 int i, v;
3511 for(i=1; i<nArg; i++){
3512 v = booleanValue(azArg[i]);
3513 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3514 }
3515 }
3516 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3517 int i; sqlite3_int64 v;
3518 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003519 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003520 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003521 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003522 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003523 }
3524 }
3525 }else
drh340f5822013-06-27 13:01:21 +00003526#endif
drh348d19c2013-06-03 12:47:43 +00003527
drhc2ce0be2014-05-29 12:36:14 +00003528 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003529 if( nArg<2 || nArg>3 ){
mistachkine0d68852014-12-11 03:12:33 +00003530 fprintf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00003531 rc = 1;
3532 }
drh6976c212014-07-24 12:09:47 +00003533 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003534 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00003535 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00003536 }
3537 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00003538 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3539 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh5bb3eb92007-05-04 13:15:55 +00003540 }
drh75897232000-05-29 14:26:00 +00003541 }else
3542
drh62cdde52014-05-28 20:22:28 +00003543 if( c=='s'
3544 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003545 ){
3546 char *zCmd;
drh54027102014-08-06 14:36:53 +00003547 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003548 if( nArg<2 ){
3549 fprintf(stderr, "Usage: .system COMMAND\n");
3550 rc = 1;
3551 goto meta_command_exit;
3552 }
drhdcb3e3d2014-05-29 03:17:29 +00003553 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003554 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003555 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3556 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003557 }
drh54027102014-08-06 14:36:53 +00003558 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003559 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003560 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003561 }else
3562
drhc2ce0be2014-05-29 12:36:14 +00003563 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003564 int i;
drhc2ce0be2014-05-29 12:36:14 +00003565 if( nArg!=1 ){
3566 fprintf(stderr, "Usage: .show\n");
3567 rc = 1;
3568 goto meta_command_exit;
3569 }
mistachkin636bf9f2014-07-19 20:15:16 +00003570 fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3571 fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003572 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
mistachkin636bf9f2014-07-19 20:15:16 +00003573 fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3574 fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3575 fprintf(p->out,"%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00003576 output_c_string(p->out, p->nullValue);
drhfeac5f82004-08-01 00:10:45 +00003577 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003578 fprintf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003579 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkin636bf9f2014-07-19 20:15:16 +00003580 fprintf(p->out,"%12.12s: ", "colseparator");
3581 output_c_string(p->out, p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003582 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003583 fprintf(p->out,"%12.12s: ", "rowseparator");
3584 output_c_string(p->out, p->rowSeparator);
3585 fprintf(p->out, "\n");
3586 fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3587 fprintf(p->out,"%12.12s: ","width");
persicom7e2dfdd2002-04-18 02:46:52 +00003588 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003589 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003590 }
drhfeac5f82004-08-01 00:10:45 +00003591 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003592 }else
3593
drhc2ce0be2014-05-29 12:36:14 +00003594 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3595 if( nArg==2 ){
3596 p->statsOn = booleanValue(azArg[1]);
3597 }else{
3598 fprintf(stderr, "Usage: .stats on|off\n");
3599 rc = 1;
3600 }
shaneh642d8b82010-07-28 16:05:34 +00003601 }else
3602
drhc2ce0be2014-05-29 12:36:14 +00003603 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003604 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003605 char **azResult;
drh98781232012-04-23 12:38:05 +00003606 int nRow, nAlloc;
3607 char *zSql = 0;
3608 int ii;
drh05782482013-10-24 15:20:20 +00003609 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003610 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3611 if( rc ) return rc;
3612 zSql = sqlite3_mprintf(
3613 "SELECT name FROM sqlite_master"
3614 " WHERE type IN ('table','view')"
3615 " AND name NOT LIKE 'sqlite_%%'"
3616 " AND name LIKE ?1");
3617 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3618 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3619 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3620 if( strcmp(zDbName,"temp")==0 ){
3621 zSql = sqlite3_mprintf(
3622 "%z UNION ALL "
3623 "SELECT 'temp.' || name FROM sqlite_temp_master"
3624 " WHERE type IN ('table','view')"
3625 " AND name NOT LIKE 'sqlite_%%'"
3626 " AND name LIKE ?1", zSql);
3627 }else{
3628 zSql = sqlite3_mprintf(
3629 "%z UNION ALL "
3630 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3631 " WHERE type IN ('table','view')"
3632 " AND name NOT LIKE 'sqlite_%%'"
3633 " AND name LIKE ?1", zSql, zDbName, zDbName);
3634 }
drha50da102000-08-08 20:19:09 +00003635 }
drh98781232012-04-23 12:38:05 +00003636 sqlite3_finalize(pStmt);
3637 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3638 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3639 sqlite3_free(zSql);
3640 if( rc ) return rc;
3641 nRow = nAlloc = 0;
3642 azResult = 0;
3643 if( nArg>1 ){
3644 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003645 }else{
drh98781232012-04-23 12:38:05 +00003646 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3647 }
3648 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3649 if( nRow>=nAlloc ){
3650 char **azNew;
3651 int n = nAlloc*2 + 10;
3652 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3653 if( azNew==0 ){
3654 fprintf(stderr, "Error: out of memory\n");
3655 break;
3656 }
3657 nAlloc = n;
3658 azResult = azNew;
3659 }
3660 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3661 if( azResult[nRow] ) nRow++;
3662 }
3663 sqlite3_finalize(pStmt);
3664 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003665 int len, maxlen = 0;
3666 int i, j;
3667 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003668 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003669 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003670 if( len>maxlen ) maxlen = len;
3671 }
3672 nPrintCol = 80/(maxlen+2);
3673 if( nPrintCol<1 ) nPrintCol = 1;
3674 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3675 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003676 for(j=i; j<nRow; j+=nPrintRow){
3677 char *zSp = j<nPrintRow ? "" : " ";
drh4ace5362014-11-10 14:42:28 +00003678 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003679 }
drh151b7d52013-05-06 20:28:54 +00003680 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003681 }
3682 }
drh98781232012-04-23 12:38:05 +00003683 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3684 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003685 }else
3686
shaneh96887e12011-02-10 21:08:58 +00003687 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003688 static const struct {
3689 const char *zCtrlName; /* Name of a test-control option */
3690 int ctrlCode; /* Integer code for that option */
3691 } aCtrl[] = {
3692 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3693 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3694 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3695 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3696 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3697 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3698 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3699 { "assert", SQLITE_TESTCTRL_ASSERT },
3700 { "always", SQLITE_TESTCTRL_ALWAYS },
3701 { "reserve", SQLITE_TESTCTRL_RESERVE },
3702 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3703 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003704 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003705 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00003706 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00003707 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00003708 };
shaneh96887e12011-02-10 21:08:58 +00003709 int testctrl = -1;
3710 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003711 int i, n;
drh05782482013-10-24 15:20:20 +00003712 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003713
drhd416fe72011-03-17 16:45:50 +00003714 /* convert testctrl text option to value. allow any unique prefix
3715 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003716 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003717 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003718 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3719 if( testctrl<0 ){
3720 testctrl = aCtrl[i].ctrlCode;
3721 }else{
drhb07028f2011-10-14 21:49:18 +00003722 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003723 testctrl = -1;
3724 break;
3725 }
3726 }
3727 }
drh348d19c2013-06-03 12:47:43 +00003728 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003729 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3730 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3731 }else{
3732 switch(testctrl){
3733
3734 /* sqlite3_test_control(int, db, int) */
3735 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3736 case SQLITE_TESTCTRL_RESERVE:
3737 if( nArg==3 ){
3738 int opt = (int)strtol(azArg[2], 0, 0);
3739 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003740 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003741 } else {
drhd416fe72011-03-17 16:45:50 +00003742 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3743 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003744 }
3745 break;
3746
3747 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003748 case SQLITE_TESTCTRL_PRNG_SAVE:
3749 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003750 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003751 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003752 if( nArg==2 ){
3753 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003754 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003755 } else {
3756 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3757 }
3758 break;
3759
3760 /* sqlite3_test_control(int, uint) */
3761 case SQLITE_TESTCTRL_PENDING_BYTE:
3762 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003763 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003764 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003765 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003766 } else {
drhd416fe72011-03-17 16:45:50 +00003767 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3768 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003769 }
3770 break;
3771
3772 /* sqlite3_test_control(int, int) */
3773 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00003774 case SQLITE_TESTCTRL_ALWAYS:
3775 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00003776 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003777 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003778 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003779 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003780 } else {
drhd416fe72011-03-17 16:45:50 +00003781 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3782 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003783 }
3784 break;
3785
3786 /* sqlite3_test_control(int, char *) */
3787#ifdef SQLITE_N_KEYWORD
3788 case SQLITE_TESTCTRL_ISKEYWORD:
3789 if( nArg==3 ){
3790 const char *opt = azArg[2];
3791 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003792 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003793 } else {
drhd416fe72011-03-17 16:45:50 +00003794 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3795 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003796 }
3797 break;
3798#endif
3799
drh1ffede82015-01-30 20:59:27 +00003800 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00003801 if( nArg==5 ){
3802 rc = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00003803 azArg[2],
drh8964b342015-01-29 17:54:52 +00003804 integerValue(azArg[3]),
3805 integerValue(azArg[4]));
3806 }else{
drh1ffede82015-01-30 20:59:27 +00003807 fprintf(stderr,"Usage: .testctrl initmode dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00003808 rc = 1;
3809 }
3810 break;
3811
shaneh96887e12011-02-10 21:08:58 +00003812 case SQLITE_TESTCTRL_BITVEC_TEST:
3813 case SQLITE_TESTCTRL_FAULT_INSTALL:
3814 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3815 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3816 default:
drhd416fe72011-03-17 16:45:50 +00003817 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3818 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003819 break;
3820 }
3821 }
3822 }else
3823
drhc2ce0be2014-05-29 12:36:14 +00003824 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003825 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003826 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003827 }else
3828
drhc2ce0be2014-05-29 12:36:14 +00003829 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3830 if( nArg==2 ){
3831 enableTimer = booleanValue(azArg[1]);
3832 if( enableTimer && !HAS_TIMER ){
3833 fprintf(stderr, "Error: timer not available on this system.\n");
3834 enableTimer = 0;
3835 }
3836 }else{
3837 fprintf(stderr, "Usage: .timer on|off\n");
3838 rc = 1;
3839 }
shanehe2aa9d72009-11-06 17:20:17 +00003840 }else
3841
drhc2ce0be2014-05-29 12:36:14 +00003842 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003843 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003844 if( nArg!=2 ){
3845 fprintf(stderr, "Usage: .trace FILE|off\n");
3846 rc = 1;
3847 goto meta_command_exit;
3848 }
drh657b4a82015-03-19 13:30:41 +00003849 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00003850 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003851#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003852 if( p->traceOut==0 ){
3853 sqlite3_trace(p->db, 0, 0);
3854 }else{
3855 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3856 }
3857#endif
3858 }else
3859
drhf442e332014-09-10 19:01:14 +00003860#if SQLITE_USER_AUTHENTICATION
3861 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3862 if( nArg<2 ){
3863 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3864 rc = 1;
3865 goto meta_command_exit;
3866 }
drh7883ecf2014-09-11 16:19:31 +00003867 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003868 if( strcmp(azArg[1],"login")==0 ){
3869 if( nArg!=4 ){
3870 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3871 rc = 1;
3872 goto meta_command_exit;
3873 }
drhd39c40f2014-09-11 00:27:53 +00003874 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3875 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003876 if( rc ){
3877 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3878 rc = 1;
3879 }
3880 }else if( strcmp(azArg[1],"add")==0 ){
3881 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003882 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003883 rc = 1;
3884 goto meta_command_exit;
3885 }
drhd39c40f2014-09-11 00:27:53 +00003886 rc = sqlite3_user_add(p->db, azArg[2],
3887 azArg[3], (int)strlen(azArg[3]),
3888 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003889 if( rc ){
3890 fprintf(stderr, "User-Add failed: %d\n", rc);
3891 rc = 1;
3892 }
3893 }else if( strcmp(azArg[1],"edit")==0 ){
3894 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003895 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003896 rc = 1;
3897 goto meta_command_exit;
3898 }
drhd39c40f2014-09-11 00:27:53 +00003899 rc = sqlite3_user_change(p->db, azArg[2],
3900 azArg[3], (int)strlen(azArg[3]),
3901 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003902 if( rc ){
3903 fprintf(stderr, "User-Edit failed: %d\n", rc);
3904 rc = 1;
3905 }
3906 }else if( strcmp(azArg[1],"delete")==0 ){
3907 if( nArg!=3 ){
3908 fprintf(stderr, "Usage: .user delete USER\n");
3909 rc = 1;
3910 goto meta_command_exit;
3911 }
3912 rc = sqlite3_user_delete(p->db, azArg[2]);
3913 if( rc ){
3914 fprintf(stderr, "User-Delete failed: %d\n", rc);
3915 rc = 1;
3916 }
3917 }else{
3918 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3919 rc = 1;
3920 goto meta_command_exit;
3921 }
3922 }else
3923#endif /* SQLITE_USER_AUTHENTICATION */
3924
drh9fd301b2011-06-03 13:28:22 +00003925 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003926 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003927 sqlite3_libversion(), sqlite3_sourceid());
3928 }else
3929
drhde60fc22011-12-14 17:53:36 +00003930 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3931 const char *zDbName = nArg==2 ? azArg[1] : "main";
3932 char *zVfsName = 0;
3933 if( p->db ){
3934 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3935 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003936 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003937 sqlite3_free(zVfsName);
3938 }
3939 }
3940 }else
3941
drhcef4fc82012-09-21 22:50:45 +00003942#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3943 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3944 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003945 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003946 }else
3947#endif
3948
drhc2ce0be2014-05-29 12:36:14 +00003949 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003950 int j;
drh43617e92006-03-06 20:55:46 +00003951 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003952 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003953 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003954 }
3955 }else
3956
3957 {
shane9bd1b442009-10-23 01:27:39 +00003958 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003959 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003960 rc = 1;
drh75897232000-05-29 14:26:00 +00003961 }
drh67505e72002-04-19 12:34:06 +00003962
drhc2ce0be2014-05-29 12:36:14 +00003963meta_command_exit:
3964 if( p->outCount ){
3965 p->outCount--;
3966 if( p->outCount==0 ) output_reset(p);
3967 }
drh67505e72002-04-19 12:34:06 +00003968 return rc;
drh75897232000-05-29 14:26:00 +00003969}
3970
drh67505e72002-04-19 12:34:06 +00003971/*
drh91a66392007-09-07 01:12:32 +00003972** Return TRUE if a semicolon occurs anywhere in the first N characters
3973** of string z[].
drh324ccef2003-02-05 14:06:20 +00003974*/
drh9f099fd2013-08-06 14:01:46 +00003975static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003976 int i;
3977 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3978 return 0;
drh324ccef2003-02-05 14:06:20 +00003979}
3980
3981/*
drh70c7a4b2003-04-26 03:03:06 +00003982** Test to see if a line consists entirely of whitespace.
3983*/
3984static int _all_whitespace(const char *z){
3985 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003986 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003987 if( *z=='/' && z[1]=='*' ){
3988 z += 2;
3989 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3990 if( *z==0 ) return 0;
3991 z++;
3992 continue;
3993 }
3994 if( *z=='-' && z[1]=='-' ){
3995 z += 2;
3996 while( *z && *z!='\n' ){ z++; }
3997 if( *z==0 ) return 1;
3998 continue;
3999 }
4000 return 0;
4001 }
4002 return 1;
4003}
4004
4005/*
drha9b17162003-04-29 18:01:28 +00004006** Return TRUE if the line typed in is an SQL command terminator other
4007** than a semi-colon. The SQL Server style "go" command is understood
4008** as is the Oracle "/".
4009*/
drh9f099fd2013-08-06 14:01:46 +00004010static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004011 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004012 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4013 return 1; /* Oracle */
4014 }
drhf0693c82011-10-11 20:41:54 +00004015 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004016 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004017 return 1; /* SQL Server */
4018 }
4019 return 0;
4020}
4021
4022/*
drh233a5312008-12-18 22:25:13 +00004023** Return true if zSql is a complete SQL statement. Return false if it
4024** ends in the middle of a string literal or C-style comment.
4025*/
drh9f099fd2013-08-06 14:01:46 +00004026static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004027 int rc;
4028 if( zSql==0 ) return 1;
4029 zSql[nSql] = ';';
4030 zSql[nSql+1] = 0;
4031 rc = sqlite3_complete(zSql);
4032 zSql[nSql] = 0;
4033 return rc;
4034}
4035
4036/*
drh67505e72002-04-19 12:34:06 +00004037** Read input from *in and process it. If *in==0 then input
4038** is interactive - the user is typing it it. Otherwise, input
4039** is coming from a file or device. A prompt is issued and history
4040** is saved only if input is interactive. An interrupt signal will
4041** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004042**
4043** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004044*/
drhdcd87a92014-08-18 13:45:42 +00004045static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004046 char *zLine = 0; /* A single input line */
4047 char *zSql = 0; /* Accumulated SQL text */
4048 int nLine; /* Length of current line */
4049 int nSql = 0; /* Bytes of zSql[] used */
4050 int nAlloc = 0; /* Allocated zSql[] space */
4051 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4052 char *zErrMsg; /* Error message returned */
4053 int rc; /* Error code */
4054 int errCnt = 0; /* Number of errors seen */
4055 int lineno = 0; /* Current line number */
4056 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004057
4058 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4059 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004060 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004061 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004062 /* End of input */
4063 if( stdin_is_interactive ) printf("\n");
4064 break;
drhc49f44e2006-10-26 18:15:42 +00004065 }
drh67505e72002-04-19 12:34:06 +00004066 if( seenInterrupt ){
4067 if( in!=0 ) break;
4068 seenInterrupt = 0;
4069 }
drhc28490c2006-10-26 14:25:58 +00004070 lineno++;
drh849a9d92013-12-21 15:46:06 +00004071 if( nSql==0 && _all_whitespace(zLine) ){
4072 if( p->echoOn ) printf("%s\n", zLine);
4073 continue;
4074 }
drh2af0b2d2002-02-21 02:25:02 +00004075 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004076 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004077 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004078 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004079 break;
4080 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004081 errCnt++;
4082 }
drhdaffd0e2001-04-11 14:28:42 +00004083 continue;
4084 }
drh9f099fd2013-08-06 14:01:46 +00004085 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004086 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004087 }
drh9f099fd2013-08-06 14:01:46 +00004088 nLine = strlen30(zLine);
4089 if( nSql+nLine+2>=nAlloc ){
4090 nAlloc = nSql+nLine+100;
4091 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004092 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00004093 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004094 exit(1);
4095 }
drhdaffd0e2001-04-11 14:28:42 +00004096 }
drh9f099fd2013-08-06 14:01:46 +00004097 nSqlPrior = nSql;
4098 if( nSql==0 ){
4099 int i;
4100 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004101 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004102 memcpy(zSql, zLine+i, nLine+1-i);
4103 startline = lineno;
4104 nSql = nLine-i;
4105 }else{
4106 zSql[nSql++] = '\n';
4107 memcpy(zSql+nSql, zLine, nLine+1);
4108 nSql += nLine;
4109 }
4110 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004111 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004112 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004113 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00004114 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004115 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004116 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004117 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004118 char zPrefix[100];
4119 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004120 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004121 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004122 }else{
shane9bd1b442009-10-23 01:27:39 +00004123 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004124 }
drh7f953e22002-07-13 17:33:45 +00004125 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00004126 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004127 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004128 zErrMsg = 0;
4129 }else{
shaned2bed1c2009-10-21 03:56:54 +00004130 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004131 }
drhc49f44e2006-10-26 18:15:42 +00004132 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00004133 }
drhdaffd0e2001-04-11 14:28:42 +00004134 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004135 if( p->outCount ){
4136 output_reset(p);
4137 p->outCount = 0;
4138 }
drh9f099fd2013-08-06 14:01:46 +00004139 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004140 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004141 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004142 }
4143 }
drh9f099fd2013-08-06 14:01:46 +00004144 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004145 if( !_all_whitespace(zSql) ){
4146 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004147 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004148 }
drhdaffd0e2001-04-11 14:28:42 +00004149 free(zSql);
4150 }
danielk19772ac27622007-07-03 05:31:16 +00004151 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004152 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004153}
4154
drh67505e72002-04-19 12:34:06 +00004155/*
4156** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004157** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004158*/
4159static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004160 static char *home_dir = NULL;
4161 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004162
drh4ace5362014-11-10 14:42:28 +00004163#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4164 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004165 {
4166 struct passwd *pwent;
4167 uid_t uid = getuid();
4168 if( (pwent=getpwuid(uid)) != NULL) {
4169 home_dir = pwent->pw_dir;
4170 }
drh67505e72002-04-19 12:34:06 +00004171 }
4172#endif
4173
chw65d3c132007-11-12 21:09:10 +00004174#if defined(_WIN32_WCE)
4175 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4176 */
drh85e72432012-04-11 11:38:53 +00004177 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004178#else
4179
drh83905c92012-06-21 13:00:37 +00004180#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004181 if (!home_dir) {
4182 home_dir = getenv("USERPROFILE");
4183 }
4184#endif
4185
drh67505e72002-04-19 12:34:06 +00004186 if (!home_dir) {
4187 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004188 }
4189
drh83905c92012-06-21 13:00:37 +00004190#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004191 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004192 char *zDrive, *zPath;
4193 int n;
4194 zDrive = getenv("HOMEDRIVE");
4195 zPath = getenv("HOMEPATH");
4196 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004197 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004198 home_dir = malloc( n );
4199 if( home_dir==0 ) return 0;
4200 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4201 return home_dir;
4202 }
4203 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004204 }
4205#endif
4206
chw65d3c132007-11-12 21:09:10 +00004207#endif /* !_WIN32_WCE */
4208
drh67505e72002-04-19 12:34:06 +00004209 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004210 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004211 char *z = malloc( n );
4212 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004213 home_dir = z;
4214 }
drhe98d4fa2002-04-21 19:06:22 +00004215
drh67505e72002-04-19 12:34:06 +00004216 return home_dir;
4217}
4218
4219/*
4220** Read input from the file given by sqliterc_override. Or if that
4221** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004222**
4223** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004224*/
drh534f4df2015-02-28 14:03:35 +00004225static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004226 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004227 const char *sqliterc_override /* Name of config file. NULL to use default */
4228){
persicom7e2dfdd2002-04-18 02:46:52 +00004229 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004230 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004231 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004232 FILE *in = NULL;
4233
4234 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004235 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004236 if( home_dir==0 ){
drh534f4df2015-02-28 14:03:35 +00004237 fprintf(stderr, "-- warning: cannot find home directory;"
4238 " cannot read ~/.sqliterc\n");
4239 return;
drhe98d4fa2002-04-21 19:06:22 +00004240 }
drh2f3de322012-06-27 16:41:31 +00004241 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004242 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4243 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004244 }
drha1f9b5e2004-02-14 16:31:02 +00004245 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004246 if( in ){
drhc28490c2006-10-26 14:25:58 +00004247 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00004248 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004249 }
drh534f4df2015-02-28 14:03:35 +00004250 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004251 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004252 }
drh85e72432012-04-11 11:38:53 +00004253 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004254}
4255
drh67505e72002-04-19 12:34:06 +00004256/*
drhe1e38c42003-05-04 18:30:59 +00004257** Show available command line options
4258*/
4259static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004260 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004261 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004262 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004263 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004264 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004265 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004266 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004267 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004268 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004269#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4270 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4271#endif
drhcc3b4f82012-02-07 14:13:50 +00004272 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004273 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004274 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004275 " -line set output mode to 'line'\n"
4276 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004277 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004278 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004279#ifdef SQLITE_ENABLE_MULTIPLEX
4280 " -multiplex enable the multiplexor VFS\n"
4281#endif
mistachkine0d68852014-12-11 03:12:33 +00004282 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004283 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004284 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4285 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004286 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004287 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004288 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004289 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004290#ifdef SQLITE_ENABLE_VFSTRACE
4291 " -vfstrace enable tracing of all VFS calls\n"
4292#endif
drhe1e38c42003-05-04 18:30:59 +00004293;
4294static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00004295 fprintf(stderr,
4296 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4297 "FILENAME is the name of an SQLite database. A new database is created\n"
4298 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004299 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00004300 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004301 }else{
4302 fprintf(stderr, "Use the -help option for additional information\n");
4303 }
4304 exit(1);
4305}
4306
4307/*
drh67505e72002-04-19 12:34:06 +00004308** Initialize the state information in data
4309*/
drhdcd87a92014-08-18 13:45:42 +00004310static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004311 memset(data, 0, sizeof(*data));
4312 data->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00004313 memcpy(data->colSeparator,SEP_Column, 2);
4314 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004315 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004316 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004317 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004318 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004319 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004320 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4321 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004322}
4323
drh98d312f2012-10-25 15:23:14 +00004324/*
drh5c7976f2014-02-10 19:59:27 +00004325** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004326*/
4327#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004328static void printBold(const char *zText){
4329 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4330 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4331 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4332 SetConsoleTextAttribute(out,
4333 FOREGROUND_RED|FOREGROUND_INTENSITY
4334 );
4335 printf("%s", zText);
4336 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004337}
4338#else
drh5c7976f2014-02-10 19:59:27 +00004339static void printBold(const char *zText){
4340 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004341}
4342#endif
4343
4344/*
drh98d312f2012-10-25 15:23:14 +00004345** Get the argument to an --option. Throw an error and die if no argument
4346** is available.
4347*/
4348static char *cmdline_option_value(int argc, char **argv, int i){
4349 if( i==argc ){
4350 fprintf(stderr, "%s: Error: missing argument to %s\n",
4351 argv[0], argv[argc-1]);
4352 exit(1);
4353 }
4354 return argv[i];
4355}
4356
drh75897232000-05-29 14:26:00 +00004357int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004358 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004359 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004360 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004361 int i;
drhc28490c2006-10-26 14:25:58 +00004362 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004363 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004364 int readStdin = 1;
4365 int nCmd = 0;
4366 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004367
drh69b30ab2014-02-27 15:11:52 +00004368#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004369 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4370 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4371 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4372 exit(1);
4373 }
drhc7181902014-02-27 15:04:13 +00004374#endif
drh047d4532015-01-18 20:30:23 +00004375 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00004376 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00004377 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004378 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004379 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004380
drh44c2eb12003-04-30 11:38:26 +00004381 /* Make sure we have a valid signal handler early, before anything
4382 ** else is done.
4383 */
drh4c504392000-10-16 22:06:40 +00004384#ifdef SIGINT
4385 signal(SIGINT, interrupt_handler);
4386#endif
drh44c2eb12003-04-30 11:38:26 +00004387
drhac5649a2014-11-28 13:35:03 +00004388#ifdef SQLITE_SHELL_DBNAME_PROC
4389 {
4390 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4391 ** of a C-function that will provide the name of the database file. Use
4392 ** this compile-time option to embed this shell program in larger
4393 ** applications. */
4394 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4395 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4396 warnInmemoryDb = 0;
4397 }
4398#endif
4399
drh22fbcb82004-02-01 01:22:50 +00004400 /* Do an initial pass through the command-line argument to locate
4401 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004402 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004403 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004404 */
drh98d312f2012-10-25 15:23:14 +00004405 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004406 char *z;
drhc28490c2006-10-26 14:25:58 +00004407 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004408 if( z[0]!='-' ){
4409 if( data.zDbFilename==0 ){
4410 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004411 }else{
4412 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4413 ** mean that nothing is read from stdin */
4414 readStdin = 0;
4415 nCmd++;
4416 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4417 if( azCmd==0 ){
4418 fprintf(stderr, "out of memory\n");
4419 exit(1);
4420 }
4421 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004422 }
drh98d312f2012-10-25 15:23:14 +00004423 }
drhcc3b4f82012-02-07 14:13:50 +00004424 if( z[1]=='-' ) z++;
4425 if( strcmp(z,"-separator")==0
4426 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004427 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004428 || strcmp(z,"-cmd")==0
4429 ){
drh98d312f2012-10-25 15:23:14 +00004430 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004431 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004432 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004433 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004434 /* Need to check for batch mode here to so we can avoid printing
4435 ** informational messages (like from process_sqliterc) before
4436 ** we do the actual processing of arguments later in a second pass.
4437 */
shanef69573d2009-10-24 02:06:14 +00004438 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004439 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004440#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004441 const char *zSize;
4442 sqlite3_int64 szHeap;
4443
drh98d312f2012-10-25 15:23:14 +00004444 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004445 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004446 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004447 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4448#endif
drh44dec872014-08-30 15:49:25 +00004449 }else if( strcmp(z,"-scratch")==0 ){
4450 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004451 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004452 if( sz>400000 ) sz = 400000;
4453 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004454 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004455 if( n>10 ) n = 10;
4456 if( n<1 ) n = 1;
4457 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4458 data.shellFlgs |= SHFLG_Scratch;
4459 }else if( strcmp(z,"-pagecache")==0 ){
4460 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004461 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004462 if( sz>70000 ) sz = 70000;
4463 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004464 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004465 if( n<10 ) n = 10;
4466 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4467 data.shellFlgs |= SHFLG_Pagecache;
4468 }else if( strcmp(z,"-lookaside")==0 ){
4469 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004470 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004471 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004472 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004473 if( n<0 ) n = 0;
4474 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4475 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004476#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004477 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004478 extern int vfstrace_register(
4479 const char *zTraceName,
4480 const char *zOldVfsName,
4481 int (*xOut)(const char*,void*),
4482 void *pOutArg,
4483 int makeDefault
4484 );
drh2b625e22011-03-16 17:05:28 +00004485 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004486#endif
drh6f25e892011-07-08 17:02:57 +00004487#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004488 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004489 extern int sqlite3_multiple_initialize(const char*,int);
4490 sqlite3_multiplex_initialize(0, 1);
4491#endif
drh7d9f3942013-04-03 01:26:54 +00004492 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004493 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4494 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004495 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004496 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004497 if( pVfs ){
4498 sqlite3_vfs_register(pVfs, 1);
4499 }else{
4500 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4501 exit(1);
4502 }
drh44c2eb12003-04-30 11:38:26 +00004503 }
4504 }
drh98d312f2012-10-25 15:23:14 +00004505 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004506#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004507 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004508 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004509#else
shane86f5bdb2009-10-24 02:00:07 +00004510 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4511 return 1;
drh01b41712005-08-29 23:06:23 +00004512#endif
drh98d312f2012-10-25 15:23:14 +00004513 }
4514 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004515
drh44c2eb12003-04-30 11:38:26 +00004516 /* Go ahead and open the database file if it already exists. If the
4517 ** file does not exist, delay opening it. This prevents empty database
4518 ** files from being created if a user mistypes the database name argument
4519 ** to the sqlite command-line tool.
4520 */
drhc8d74412004-08-31 23:41:26 +00004521 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004522 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004523 }
4524
drh22fbcb82004-02-01 01:22:50 +00004525 /* Process the initialization file if there is one. If no -init option
4526 ** is given on the command line, look for a file named ~/.sqliterc and
4527 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004528 */
drh534f4df2015-02-28 14:03:35 +00004529 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00004530
drh22fbcb82004-02-01 01:22:50 +00004531 /* Make a second pass through the command-line argument and set
4532 ** options. This second pass is delayed until after the initialization
4533 ** file is processed so that the command-line arguments will override
4534 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004535 */
drh98d312f2012-10-25 15:23:14 +00004536 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004537 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004538 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004539 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004540 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004541 i++;
4542 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004543 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004544 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004545 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004546 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004547 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004548 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004549 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004550 }else if( strcmp(z,"-csv")==0 ){
4551 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004552 memcpy(data.colSeparator,",",2);
4553 }else if( strcmp(z,"-ascii")==0 ){
4554 data.mode = MODE_Ascii;
4555 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004556 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00004557 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004558 SEP_Record);
mistachkine0d68852014-12-11 03:12:33 +00004559 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004560 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4561 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004562 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00004563 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00004564 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004565 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00004566 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00004567 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004568 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004569 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004570 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004571 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004572 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004573 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004574 }else if( strcmp(z,"-eqp")==0 ){
4575 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004576 }else if( strcmp(z,"-stats")==0 ){
4577 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004578 }else if( strcmp(z,"-scanstats")==0 ){
4579 data.scanstatsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004580 }else if( strcmp(z,"-bail")==0 ){
4581 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004582 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004583 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004584 return 0;
drhc28490c2006-10-26 14:25:58 +00004585 }else if( strcmp(z,"-interactive")==0 ){
4586 stdin_is_interactive = 1;
4587 }else if( strcmp(z,"-batch")==0 ){
4588 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004589 }else if( strcmp(z,"-heap")==0 ){
4590 i++;
drh44dec872014-08-30 15:49:25 +00004591 }else if( strcmp(z,"-scratch")==0 ){
4592 i+=2;
4593 }else if( strcmp(z,"-pagecache")==0 ){
4594 i+=2;
4595 }else if( strcmp(z,"-lookaside")==0 ){
4596 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004597 }else if( strcmp(z,"-mmap")==0 ){
4598 i++;
drha7e61d82011-03-12 17:02:57 +00004599 }else if( strcmp(z,"-vfs")==0 ){
4600 i++;
drh6f25e892011-07-08 17:02:57 +00004601#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004602 }else if( strcmp(z,"-vfstrace")==0 ){
4603 i++;
drh6f25e892011-07-08 17:02:57 +00004604#endif
4605#ifdef SQLITE_ENABLE_MULTIPLEX
4606 }else if( strcmp(z,"-multiplex")==0 ){
4607 i++;
4608#endif
drhcc3b4f82012-02-07 14:13:50 +00004609 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004610 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004611 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004612 /* Run commands that follow -cmd first and separately from commands
4613 ** that simply appear on the command-line. This seems goofy. It would
4614 ** be better if all commands ran in the order that they appear. But
4615 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004616 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004617 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004618 if( z[0]=='.' ){
4619 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004620 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004621 }else{
drh05782482013-10-24 15:20:20 +00004622 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004623 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4624 if( zErrMsg!=0 ){
4625 fprintf(stderr,"Error: %s\n", zErrMsg);
4626 if( bail_on_error ) return rc!=0 ? rc : 1;
4627 }else if( rc!=0 ){
4628 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4629 if( bail_on_error ) return rc;
4630 }
4631 }
drh1e5d0e92000-05-31 23:33:17 +00004632 }else{
shane86f5bdb2009-10-24 02:00:07 +00004633 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004634 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004635 return 1;
4636 }
4637 }
drh44c2eb12003-04-30 11:38:26 +00004638
drhac5649a2014-11-28 13:35:03 +00004639 if( !readStdin ){
4640 /* Run all arguments that do not begin with '-' as if they were separate
4641 ** command-line inputs, except for the argToSkip argument which contains
4642 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004643 */
drhac5649a2014-11-28 13:35:03 +00004644 for(i=0; i<nCmd; i++){
4645 if( azCmd[i][0]=='.' ){
4646 rc = do_meta_command(azCmd[i], &data);
4647 if( rc ) return rc==2 ? 0 : rc;
4648 }else{
4649 open_db(&data, 0);
4650 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4651 if( zErrMsg!=0 ){
4652 fprintf(stderr,"Error: %s\n", zErrMsg);
4653 return rc!=0 ? rc : 1;
4654 }else if( rc!=0 ){
4655 fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4656 return rc;
4657 }
drh6ff13852001-11-25 13:18:23 +00004658 }
drh75897232000-05-29 14:26:00 +00004659 }
drhac5649a2014-11-28 13:35:03 +00004660 free(azCmd);
drh75897232000-05-29 14:26:00 +00004661 }else{
drh44c2eb12003-04-30 11:38:26 +00004662 /* Run commands received from standard input
4663 */
drhc28490c2006-10-26 14:25:58 +00004664 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004665 char *zHome;
4666 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004667 int nHistory;
drh75897232000-05-29 14:26:00 +00004668 printf(
drh743e0032011-12-12 16:51:50 +00004669 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004670 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004671 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004672 );
drhb3735912014-02-10 16:13:42 +00004673 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004674 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004675 printBold("transient in-memory database");
4676 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004677 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004678 }
drh67505e72002-04-19 12:34:06 +00004679 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004680 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004681 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004682 if( (zHistory = malloc(nHistory))!=0 ){
4683 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4684 }
drh67505e72002-04-19 12:34:06 +00004685 }
danfd34d6d2015-02-25 10:54:53 +00004686 if( zHistory ) shell_read_history(zHistory);
drhc28490c2006-10-26 14:25:58 +00004687 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004688 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00004689 shell_stifle_history(100);
4690 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004691 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004692 }
drhdaffd0e2001-04-11 14:28:42 +00004693 }else{
drhc28490c2006-10-26 14:25:58 +00004694 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004695 }
4696 }
drh33048c02001-10-01 14:29:22 +00004697 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004698 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004699 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004700 }
drh05782482013-10-24 15:20:20 +00004701 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004702 return rc;
drh75897232000-05-29 14:26:00 +00004703}