blob: 94d20d354929f2ba0776dcd030dcfed0687acaf2 [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/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000036#if SQLITE_USER_AUTHENTICATION
37# include "sqlite3userauth.h"
38#endif
drh75897232000-05-29 14:26:00 +000039#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000040#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000041
drh83905c92012-06-21 13:00:37 +000042#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000043# include <signal.h>
chw97185482008-11-17 08:05:31 +000044# if !defined(__RTP__) && !defined(_WRS_KERNEL)
45# include <pwd.h>
46# endif
drhdd45df82002-04-18 12:39:03 +000047# include <unistd.h>
48# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000049#endif
drh75897232000-05-29 14:26:00 +000050
drhaaa21b42014-02-11 14:37:51 +000051#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000052# include <readline/readline.h>
53# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000054#else
55# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000056#endif
drhaaa21b42014-02-11 14:37:51 +000057#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
58# define HAVE_READLINE 1
59# include <editline/readline.h>
60#endif
61#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000062# define add_history(X)
drh67505e72002-04-19 12:34:06 +000063# define read_history(X)
64# define write_history(X)
65# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000066#endif
67
adamd2e8464a2006-09-06 21:39:40 +000068#if defined(_WIN32) || defined(WIN32)
69# include <io.h>
drh6976c212014-07-24 12:09:47 +000070# include <fcntl.h>
shane18e526c2008-12-10 22:30:24 +000071#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000072#ifndef access
73# define access(f,m) _access((f),(m))
74#endif
drh67ceaa62012-08-27 21:19:03 +000075#undef popen
drh53371f92013-07-25 17:07:03 +000076#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000077#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000078#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000079#else
drh4328c8b2003-04-26 02:50:11 +000080/* Make sure isatty() has a prototype.
81*/
drhb2acc3b2011-10-13 16:36:29 +000082extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000083
drh53371f92013-07-25 17:07:03 +000084/* popen and pclose are not C89 functions and so are sometimes omitted from
85** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000086extern FILE *popen(const char*,const char*);
87extern int pclose(FILE*);
88#endif
drh53371f92013-07-25 17:07:03 +000089
chw65d3c132007-11-12 21:09:10 +000090#if defined(_WIN32_WCE)
91/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
92 * thus we always assume that we have a console. That can be
93 * overridden with the -batch command line option.
94 */
95#define isatty(x) 1
96#endif
97
drhf0693c82011-10-11 20:41:54 +000098/* ctype macros that work with signed characters */
99#define IsSpace(X) isspace((unsigned char)X)
100#define IsDigit(X) isdigit((unsigned char)X)
101#define ToLower(X) (char)tolower((unsigned char)X)
102
drh43408312013-10-30 12:43:36 +0000103
104/* True if the timer is enabled */
105static int enableTimer = 0;
106
107/* Return the current wall-clock time */
108static sqlite3_int64 timeOfDay(void){
109 static sqlite3_vfs *clockVfs = 0;
110 sqlite3_int64 t;
111 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
112 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
113 clockVfs->xCurrentTimeInt64(clockVfs, &t);
114 }else{
115 double r;
116 clockVfs->xCurrentTime(clockVfs, &r);
117 t = (sqlite3_int64)(r*86400000.0);
118 }
119 return t;
120}
121
drhd5d0f642013-02-20 00:54:21 +0000122#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
123 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000124#include <sys/time.h>
125#include <sys/resource.h>
126
drhda108222009-02-25 19:07:24 +0000127/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000128static struct rusage sBegin; /* CPU time at start */
129static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000130
drhda108222009-02-25 19:07:24 +0000131/*
132** Begin timing an operation
133*/
134static void beginTimer(void){
135 if( enableTimer ){
136 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000137 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000138 }
139}
140
141/* Return the difference of two time_structs in seconds */
142static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
143 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
144 (double)(pEnd->tv_sec - pStart->tv_sec);
145}
146
147/*
148** Print the timing results.
149*/
150static void endTimer(void){
151 if( enableTimer ){
152 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000153 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000154 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000155 printf("Run Time: real %.3f user %f sys %f\n",
156 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000157 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
158 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
159 }
160}
shaneb320ccd2009-10-21 03:42:58 +0000161
drhda108222009-02-25 19:07:24 +0000162#define BEGIN_TIMER beginTimer()
163#define END_TIMER endTimer()
164#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000165
166#elif (defined(_WIN32) || defined(WIN32))
167
168#include <windows.h>
169
170/* Saved resource information for the beginning of an operation */
171static HANDLE hProcess;
172static FILETIME ftKernelBegin;
173static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000174static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000175typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
176 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000177static GETPROCTIMES getProcessTimesAddr = NULL;
178
shaneb320ccd2009-10-21 03:42:58 +0000179/*
180** Check to see if we have timer support. Return 1 if necessary
181** support found (or found previously).
182*/
183static int hasTimer(void){
184 if( getProcessTimesAddr ){
185 return 1;
186 } else {
drh4ace5362014-11-10 14:42:28 +0000187 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
188 ** versions. See if the version we are running on has it, and if it
189 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000190 */
191 hProcess = GetCurrentProcess();
192 if( hProcess ){
193 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
194 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000195 getProcessTimesAddr =
196 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000197 if( NULL != getProcessTimesAddr ){
198 return 1;
199 }
200 FreeLibrary(hinstLib);
201 }
202 }
203 }
204 return 0;
205}
206
207/*
208** Begin timing an operation
209*/
210static void beginTimer(void){
211 if( enableTimer && getProcessTimesAddr ){
212 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000213 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
214 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000215 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000216 }
217}
218
219/* Return the difference of two FILETIME structs in seconds */
220static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
221 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
222 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
223 return (double) ((i64End - i64Start) / 10000000.0);
224}
225
226/*
227** Print the timing results.
228*/
229static void endTimer(void){
230 if( enableTimer && getProcessTimesAddr){
231 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000232 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000233 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000234 printf("Run Time: real %.3f user %f sys %f\n",
235 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000236 timeDiff(&ftUserBegin, &ftUserEnd),
237 timeDiff(&ftKernelBegin, &ftKernelEnd));
238 }
239}
240
241#define BEGIN_TIMER beginTimer()
242#define END_TIMER endTimer()
243#define HAS_TIMER hasTimer()
244
drhda108222009-02-25 19:07:24 +0000245#else
246#define BEGIN_TIMER
247#define END_TIMER
248#define HAS_TIMER 0
249#endif
250
shanec0688ea2009-03-05 03:48:06 +0000251/*
252** Used to prevent warnings about unused parameters
253*/
254#define UNUSED_PARAMETER(x) (void)(x)
255
drhe91d16b2008-12-08 18:27:31 +0000256/*
drhc49f44e2006-10-26 18:15:42 +0000257** If the following flag is set, then command execution stops
258** at an error if we are not interactive.
259*/
260static int bail_on_error = 0;
261
262/*
drhc28490c2006-10-26 14:25:58 +0000263** Threat stdin as an interactive input if the following variable
264** is true. Otherwise, assume stdin is connected to a file or pipe.
265*/
266static int stdin_is_interactive = 1;
267
268/*
drh4c504392000-10-16 22:06:40 +0000269** The following is the open SQLite database. We make a pointer
270** to this database a static variable so that it can be accessed
271** by the SIGINT handler to interrupt database processing.
272*/
danielk197792f9a1b2004-06-19 09:08:16 +0000273static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000274
275/*
drh67505e72002-04-19 12:34:06 +0000276** True if an interrupt (Control-C) has been received.
277*/
drh43617e92006-03-06 20:55:46 +0000278static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000279
280/*
persicom7e2dfdd2002-04-18 02:46:52 +0000281** This is the name of our program. It is set in main(), used
282** in a number of other places, mostly for error messages.
283*/
284static char *Argv0;
285
286/*
287** Prompt strings. Initialized in main. Settable with
288** .prompt main continue
289*/
290static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
291static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
292
drhb0603412007-02-28 04:47:26 +0000293/*
294** Write I/O traces to the following stream.
295*/
rsebe0a9092007-07-30 18:24:38 +0000296#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000297static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000298#endif
drhb0603412007-02-28 04:47:26 +0000299
300/*
301** This routine works like printf in that its first argument is a
302** format string and subsequent arguments are values to be substituted
303** in place of % fields. The result of formatting this string
304** is written to iotrace.
305*/
rsebe0a9092007-07-30 18:24:38 +0000306#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000307static void iotracePrintf(const char *zFormat, ...){
308 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000309 char *z;
drhb0603412007-02-28 04:47:26 +0000310 if( iotrace==0 ) return;
311 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000312 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000313 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000314 fprintf(iotrace, "%s", z);
315 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000316}
rsebe0a9092007-07-30 18:24:38 +0000317#endif
drhb0603412007-02-28 04:47:26 +0000318
drh44c2eb12003-04-30 11:38:26 +0000319
persicom7e2dfdd2002-04-18 02:46:52 +0000320/*
drh83965662003-04-17 02:54:13 +0000321** Determines if a string is a number of not.
322*/
danielk19772e588c72005-12-09 14:25:08 +0000323static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000325 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000326 return 0;
327 }
328 z++;
329 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000330 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000331 if( *z=='.' ){
332 z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 if( *z=='e' || *z=='E' ){
338 z++;
339 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000340 if( !IsDigit(*z) ) return 0;
341 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000342 if( realnum ) *realnum = 1;
343 }
344 return *z==0;
345}
drh83965662003-04-17 02:54:13 +0000346
347/*
danielk1977bc6ada42004-06-30 08:20:16 +0000348** A global char* and an SQL function to access its current value
349** from within an SQL statement. This program used to use the
350** sqlite_exec_printf() API to substitue a string into an SQL statement.
351** The correct way to do this with sqlite3 is to use the bind API, but
352** since the shell is built around the callback paradigm it would be a lot
353** of work. Instead just use this hack, which is quite harmless.
354*/
355static const char *zShellStatic = 0;
356static void shellstaticFunc(
357 sqlite3_context *context,
358 int argc,
359 sqlite3_value **argv
360){
361 assert( 0==argc );
362 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000363 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000364 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000365 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
366}
367
368
369/*
drhfeac5f82004-08-01 00:10:45 +0000370** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000371** the text in memory obtained from malloc() and returns a pointer
372** to the text. NULL is returned at end of file, or if malloc()
373** fails.
374**
drh9f099fd2013-08-06 14:01:46 +0000375** If zLine is not NULL then it is a malloced buffer returned from
376** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000377*/
drh9f099fd2013-08-06 14:01:46 +0000378static char *local_getline(char *zLine, FILE *in){
379 int nLine = zLine==0 ? 0 : 100;
380 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000381
drhb07028f2011-10-14 21:49:18 +0000382 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000383 if( n+100>nLine ){
384 nLine = nLine*2 + 100;
385 zLine = realloc(zLine, nLine);
386 if( zLine==0 ) return 0;
387 }
drhdaffd0e2001-04-11 14:28:42 +0000388 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000389 if( n==0 ){
390 free(zLine);
391 return 0;
392 }
393 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000394 break;
395 }
drh9f099fd2013-08-06 14:01:46 +0000396 while( zLine[n] ) n++;
397 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000398 n--;
shaneh13b36022009-12-17 21:07:15 +0000399 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000400 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000401 break;
drh8e7e7a22000-05-30 18:45:23 +0000402 }
403 }
drh8e7e7a22000-05-30 18:45:23 +0000404 return zLine;
405}
406
407/*
drhc28490c2006-10-26 14:25:58 +0000408** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000409**
drh9f099fd2013-08-06 14:01:46 +0000410** If in==0 then read from standard input and prompt before each line.
411** If isContinuation is true, then a continuation prompt is appropriate.
412** If isContinuation is zero, then the main prompt should be used.
413**
414** If zPrior is not NULL then it is a buffer from a prior call to this
415** routine that can be reused.
416**
417** The result is stored in space obtained from malloc() and must either
418** be freed by the caller or else passed back into this routine via the
419** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000420*/
drh9f099fd2013-08-06 14:01:46 +0000421static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000422 char *zPrompt;
423 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000424 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000425 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000426 }else{
drh9f099fd2013-08-06 14:01:46 +0000427 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000428#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000429 free(zPrior);
430 zResult = readline(zPrompt);
431 if( zResult && *zResult ) add_history(zResult);
432#else
433 printf("%s", zPrompt);
434 fflush(stdout);
435 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000436#endif
drh9f099fd2013-08-06 14:01:46 +0000437 }
drh8e7e7a22000-05-30 18:45:23 +0000438 return zResult;
439}
440
drhdcd87a92014-08-18 13:45:42 +0000441/*
442** Shell output mode information from before ".explain on",
443** saved so that it can be restored by ".explain off"
444*/
445typedef struct SavedModeInfo SavedModeInfo;
446struct SavedModeInfo {
447 int valid; /* Is there legit data in here? */
448 int mode; /* Mode prior to ".explain on" */
449 int showHeader; /* The ".header" setting prior to ".explain on" */
450 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000451};
drh45e29d82006-11-20 16:21:10 +0000452
drh8e7e7a22000-05-30 18:45:23 +0000453/*
drhdcd87a92014-08-18 13:45:42 +0000454** State information about the database connection is contained in an
455** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000456*/
drhdcd87a92014-08-18 13:45:42 +0000457typedef struct ShellState ShellState;
458struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000459 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000460 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000461 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000462 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000463 int scanstatsOn; /* True to display scan stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +0000464 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000465 int cnt; /* Number of records displayed so far */
466 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000467 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000468 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000469 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000470 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000471 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000472 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000473 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000474 char separator[20]; /* Separator character for MODE_List */
drh6976c212014-07-24 12:09:47 +0000475 char newline[20]; /* Record separator in MODE_Csv */
drha0c66f52000-07-29 13:20:21 +0000476 int colWidth[100]; /* Requested width of each column when in column mode*/
477 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000478 char nullvalue[20]; /* The text to print when a NULL comes back from
479 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000480 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000481 char outfile[FILENAME_MAX]; /* Filename for *out */
482 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000483 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000484 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000485 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000486 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000487 int *aiIndent; /* Array of indents used in MODE_Explain */
488 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000489 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000490};
491
492/*
drh44dec872014-08-30 15:49:25 +0000493** These are the allowed shellFlgs values
494*/
495#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
496#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
497#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
498
499/*
drh75897232000-05-29 14:26:00 +0000500** These are the allowed modes.
501*/
drh967e8b72000-06-21 13:59:10 +0000502#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000503#define MODE_Column 1 /* One record per line in neat columns */
504#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000505#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
506#define MODE_Html 4 /* Generate an XHTML table */
507#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000508#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000509#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000510#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000511
drh66ce4d02008-02-15 17:38:06 +0000512static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000513 "line",
514 "column",
515 "list",
516 "semi",
517 "html",
drhfeac5f82004-08-01 00:10:45 +0000518 "insert",
519 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000520 "csv",
drh66ce4d02008-02-15 17:38:06 +0000521 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000522};
drh75897232000-05-29 14:26:00 +0000523
524/*
525** Number of elements in an array
526*/
drh902b9ee2008-12-05 17:17:07 +0000527#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000528
529/*
drhea678832008-12-10 19:26:22 +0000530** Compute a string length that is limited to what can be stored in
531** lower 30 bits of a 32-bit signed integer.
532*/
drh4f21c4a2008-12-10 22:15:00 +0000533static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000534 const char *z2 = z;
535 while( *z2 ){ z2++; }
536 return 0x3fffffff & (int)(z2 - z);
537}
538
539/*
drh127f9d72010-02-23 01:47:00 +0000540** A callback for the sqlite3_log() interface.
541*/
542static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000543 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000544 if( p->pLog==0 ) return;
545 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
546 fflush(p->pLog);
547}
548
549/*
shane626a6e42009-10-22 17:30:15 +0000550** Output the given string as a hex-encoded blob (eg. X'1234' )
551*/
552static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
553 int i;
554 char *zBlob = (char *)pBlob;
555 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000556 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000557 fprintf(out,"'");
558}
559
560/*
drh28bd4bc2000-06-15 15:57:22 +0000561** Output the given string as a quoted string using SQL quoting conventions.
562*/
563static void output_quoted_string(FILE *out, const char *z){
564 int i;
565 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000566 for(i=0; z[i]; i++){
567 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000568 }
569 if( nSingle==0 ){
570 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000571 }else{
572 fprintf(out,"'");
573 while( *z ){
574 for(i=0; z[i] && z[i]!='\''; i++){}
575 if( i==0 ){
576 fprintf(out,"''");
577 z++;
578 }else if( z[i]=='\'' ){
579 fprintf(out,"%.*s''",i,z);
580 z += i+1;
581 }else{
drhcd7d2732002-02-26 23:24:26 +0000582 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000583 break;
584 }
585 }
drhcd7d2732002-02-26 23:24:26 +0000586 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000587 }
588}
589
590/*
drhfeac5f82004-08-01 00:10:45 +0000591** Output the given string as a quoted according to C or TCL quoting rules.
592*/
593static void output_c_string(FILE *out, const char *z){
594 unsigned int c;
595 fputc('"', out);
596 while( (c = *(z++))!=0 ){
597 if( c=='\\' ){
598 fputc(c, out);
599 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000600 }else if( c=='"' ){
601 fputc('\\', out);
602 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000603 }else if( c=='\t' ){
604 fputc('\\', out);
605 fputc('t', out);
606 }else if( c=='\n' ){
607 fputc('\\', out);
608 fputc('n', out);
609 }else if( c=='\r' ){
610 fputc('\\', out);
611 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000612 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000613 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000614 }else{
615 fputc(c, out);
616 }
617 }
618 fputc('"', out);
619}
620
621/*
drhc08a4f12000-06-15 16:49:48 +0000622** Output the given string with characters that are special to
623** HTML escaped.
624*/
625static void output_html_string(FILE *out, const char *z){
626 int i;
drhc3d6ba42014-01-13 20:38:35 +0000627 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000628 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000629 for(i=0; z[i]
630 && z[i]!='<'
631 && z[i]!='&'
632 && z[i]!='>'
633 && z[i]!='\"'
634 && z[i]!='\'';
635 i++){}
drhc08a4f12000-06-15 16:49:48 +0000636 if( i>0 ){
637 fprintf(out,"%.*s",i,z);
638 }
639 if( z[i]=='<' ){
640 fprintf(out,"&lt;");
641 }else if( z[i]=='&' ){
642 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000643 }else if( z[i]=='>' ){
644 fprintf(out,"&gt;");
645 }else if( z[i]=='\"' ){
646 fprintf(out,"&quot;");
647 }else if( z[i]=='\'' ){
648 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000649 }else{
650 break;
651 }
652 z += i + 1;
653 }
654}
655
656/*
drhc49f44e2006-10-26 18:15:42 +0000657** If a field contains any character identified by a 1 in the following
658** array, then the string must be quoted for CSV.
659*/
660static const char needCsvQuote[] = {
661 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
662 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
663 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
664 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
665 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
666 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
667 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
668 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
669 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
670 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
671 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
672 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
673 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
674 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
675 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
676 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
677};
678
679/*
drh8e64d1c2004-10-07 00:32:39 +0000680** Output a single term of CSV. Actually, p->separator is used for
681** the separator, which may or may not be a comma. p->nullvalue is
drh6976c212014-07-24 12:09:47 +0000682** the null value. Strings are quoted if necessary. The separator
683** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000684*/
drhdcd87a92014-08-18 13:45:42 +0000685static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000686 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000687 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000688 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000689 }else{
drhc49f44e2006-10-26 18:15:42 +0000690 int i;
drh4f21c4a2008-12-10 22:15:00 +0000691 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000692 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000693 if( needCsvQuote[((unsigned char*)z)[i]]
694 || (z[i]==p->separator[0] &&
695 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000696 i = 0;
697 break;
698 }
699 }
700 if( i==0 ){
701 putc('"', out);
702 for(i=0; z[i]; i++){
703 if( z[i]=='"' ) putc('"', out);
704 putc(z[i], out);
705 }
706 putc('"', out);
707 }else{
708 fprintf(out, "%s", z);
709 }
drh8e64d1c2004-10-07 00:32:39 +0000710 }
711 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000712 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000713 }
714}
715
danielk19774af00c62005-01-23 23:43:21 +0000716#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000717/*
drh4c504392000-10-16 22:06:40 +0000718** This routine runs when the user presses Ctrl-C
719*/
720static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000721 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000722 seenInterrupt++;
723 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000724 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000725}
danielk19774af00c62005-01-23 23:43:21 +0000726#endif
drh4c504392000-10-16 22:06:40 +0000727
728/*
shane626a6e42009-10-22 17:30:15 +0000729** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000730** invokes for each row of a query result.
731*/
drh4ace5362014-11-10 14:42:28 +0000732static int shell_callback(
733 void *pArg,
734 int nArg, /* Number of result columns */
735 char **azArg, /* Text of each result column */
736 char **azCol, /* Column names */
737 int *aiType /* Column types */
738){
drh75897232000-05-29 14:26:00 +0000739 int i;
drhdcd87a92014-08-18 13:45:42 +0000740 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000741
drh75897232000-05-29 14:26:00 +0000742 switch( p->mode ){
743 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000744 int w = 5;
drh6a535342001-10-19 16:44:56 +0000745 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000746 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000747 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000748 if( len>w ) w = len;
749 }
drh75897232000-05-29 14:26:00 +0000750 if( p->cnt++>0 ) fprintf(p->out,"\n");
751 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000752 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000753 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000754 }
755 break;
756 }
danielk19770d78bae2008-01-03 07:09:48 +0000757 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000758 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000759 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000760 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000761 int w, n;
762 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000763 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000764 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000765 w = 0;
drh75897232000-05-29 14:26:00 +0000766 }
drh078b1fd2012-09-21 13:40:02 +0000767 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000768 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000769 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000770 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000771 if( w<n ) w = n;
772 }
773 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000774 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000775 }
776 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000777 if( w<0 ){
778 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
779 }else{
780 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
781 }
drha0c66f52000-07-29 13:20:21 +0000782 }
783 }
784 if( p->showHeader ){
785 for(i=0; i<nArg; i++){
786 int w;
787 if( i<ArraySize(p->actualWidth) ){
788 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000789 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000790 }else{
791 w = 10;
792 }
793 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
794 "----------------------------------------------------------",
795 i==nArg-1 ? "\n": " ");
796 }
drh75897232000-05-29 14:26:00 +0000797 }
798 }
drh6a535342001-10-19 16:44:56 +0000799 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000800 for(i=0; i<nArg; i++){
801 int w;
drha0c66f52000-07-29 13:20:21 +0000802 if( i<ArraySize(p->actualWidth) ){
803 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000804 }else{
805 w = 10;
806 }
dana98bf362013-11-13 18:35:01 +0000807 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000808 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000809 }
dana98bf362013-11-13 18:35:01 +0000810 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000811 if( p->iIndent<p->nIndent ){
812 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000813 }
danc4650bb2013-11-18 08:41:06 +0000814 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000815 }
drh078b1fd2012-09-21 13:40:02 +0000816 if( w<0 ){
817 fprintf(p->out,"%*.*s%s",-w,-w,
818 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
819 }else{
820 fprintf(p->out,"%-*.*s%s",w,w,
821 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
822 }
drh75897232000-05-29 14:26:00 +0000823 }
824 break;
825 }
drhe3710332000-09-29 13:30:53 +0000826 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000827 case MODE_List: {
828 if( p->cnt++==0 && p->showHeader ){
829 for(i=0; i<nArg; i++){
830 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
831 }
832 }
drh6a535342001-10-19 16:44:56 +0000833 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000834 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000835 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000836 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000837 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000838 if( i<nArg-1 ){
839 fprintf(p->out, "%s", p->separator);
840 }else if( p->mode==MODE_Semi ){
841 fprintf(p->out, ";\n");
842 }else{
843 fprintf(p->out, "\n");
844 }
drh75897232000-05-29 14:26:00 +0000845 }
846 break;
847 }
drh1e5d0e92000-05-31 23:33:17 +0000848 case MODE_Html: {
849 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000850 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000851 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000852 fprintf(p->out,"<TH>");
853 output_html_string(p->out, azCol[i]);
854 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000855 }
mihailim57c591a2008-06-23 21:26:05 +0000856 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000857 }
drh6a535342001-10-19 16:44:56 +0000858 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000859 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000860 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000861 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000862 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000863 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000864 }
mihailim57c591a2008-06-23 21:26:05 +0000865 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000866 break;
867 }
drhfeac5f82004-08-01 00:10:45 +0000868 case MODE_Tcl: {
869 if( p->cnt++==0 && p->showHeader ){
870 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000871 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000872 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000873 }
874 fprintf(p->out,"\n");
875 }
876 if( azArg==0 ) break;
877 for(i=0; i<nArg; i++){
878 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000879 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000880 }
881 fprintf(p->out,"\n");
882 break;
883 }
drh8e64d1c2004-10-07 00:32:39 +0000884 case MODE_Csv: {
drh6976c212014-07-24 12:09:47 +0000885#if defined(WIN32) || defined(_WIN32)
886 fflush(p->out);
887 _setmode(_fileno(p->out), _O_BINARY);
888#endif
drh8e64d1c2004-10-07 00:32:39 +0000889 if( p->cnt++==0 && p->showHeader ){
890 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000891 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000892 }
drh6976c212014-07-24 12:09:47 +0000893 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000894 }
drh40253262014-10-17 21:35:05 +0000895 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +0000896 for(i=0; i<nArg; i++){
897 output_csv(p, azArg[i], i<nArg-1);
898 }
899 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000900 }
drh6976c212014-07-24 12:09:47 +0000901#if defined(WIN32) || defined(_WIN32)
902 fflush(p->out);
903 _setmode(_fileno(p->out), _O_TEXT);
904#endif
drh8e64d1c2004-10-07 00:32:39 +0000905 break;
906 }
drh28bd4bc2000-06-15 15:57:22 +0000907 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000908 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000909 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000910 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000911 for(i=0; i<nArg; i++){
912 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000913 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000914 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000915 }else if( aiType && aiType[i]==SQLITE_TEXT ){
916 if( zSep[0] ) fprintf(p->out,"%s",zSep);
917 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +0000918 }else if( aiType && (aiType[i]==SQLITE_INTEGER
919 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +0000920 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000921 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
922 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
923 int nBlob = sqlite3_column_bytes(p->pStmt, i);
924 if( zSep[0] ) fprintf(p->out,"%s",zSep);
925 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000926 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000927 fprintf(p->out,"%s%s",zSep, azArg[i]);
928 }else{
929 if( zSep[0] ) fprintf(p->out,"%s",zSep);
930 output_quoted_string(p->out, azArg[i]);
931 }
932 }
933 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000934 break;
drh28bd4bc2000-06-15 15:57:22 +0000935 }
persicom1d0b8722002-04-18 02:53:04 +0000936 }
drh75897232000-05-29 14:26:00 +0000937 return 0;
938}
939
940/*
shane626a6e42009-10-22 17:30:15 +0000941** This is the callback routine that the SQLite library
942** invokes for each row of a query result.
943*/
944static int callback(void *pArg, int nArg, char **azArg, char **azCol){
945 /* since we don't have type info, call the shell_callback with a NULL value */
946 return shell_callback(pArg, nArg, azArg, azCol, NULL);
947}
948
949/*
drhdcd87a92014-08-18 13:45:42 +0000950** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +0000951** the name of the table given. Escape any quote characters in the
952** table name.
953*/
drhdcd87a92014-08-18 13:45:42 +0000954static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +0000955 int i, n;
956 int needQuote;
957 char *z;
958
959 if( p->zDestTable ){
960 free(p->zDestTable);
961 p->zDestTable = 0;
962 }
963 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000964 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000965 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000966 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000967 needQuote = 1;
968 if( zName[i]=='\'' ) n++;
969 }
970 }
971 if( needQuote ) n += 2;
972 z = p->zDestTable = malloc( n+1 );
973 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000974 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000975 exit(1);
976 }
977 n = 0;
978 if( needQuote ) z[n++] = '\'';
979 for(i=0; zName[i]; i++){
980 z[n++] = zName[i];
981 if( zName[i]=='\'' ) z[n++] = '\'';
982 }
983 if( needQuote ) z[n++] = '\'';
984 z[n] = 0;
985}
986
danielk19772a02e332004-06-05 08:04:36 +0000987/* zIn is either a pointer to a NULL-terminated string in memory obtained
988** from malloc(), or a NULL pointer. The string pointed to by zAppend is
989** added to zIn, and the result returned in memory obtained from malloc().
990** zIn, if it was not NULL, is freed.
991**
992** If the third argument, quote, is not '\0', then it is used as a
993** quote character for zAppend.
994*/
drhc28490c2006-10-26 14:25:58 +0000995static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000996 int len;
997 int i;
drh4f21c4a2008-12-10 22:15:00 +0000998 int nAppend = strlen30(zAppend);
999 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001000
1001 len = nAppend+nIn+1;
1002 if( quote ){
1003 len += 2;
1004 for(i=0; i<nAppend; i++){
1005 if( zAppend[i]==quote ) len++;
1006 }
1007 }
1008
1009 zIn = (char *)realloc(zIn, len);
1010 if( !zIn ){
1011 return 0;
1012 }
1013
1014 if( quote ){
1015 char *zCsr = &zIn[nIn];
1016 *zCsr++ = quote;
1017 for(i=0; i<nAppend; i++){
1018 *zCsr++ = zAppend[i];
1019 if( zAppend[i]==quote ) *zCsr++ = quote;
1020 }
1021 *zCsr++ = quote;
1022 *zCsr++ = '\0';
1023 assert( (zCsr-zIn)==len );
1024 }else{
1025 memcpy(&zIn[nIn], zAppend, nAppend);
1026 zIn[len-1] = '\0';
1027 }
1028
1029 return zIn;
1030}
1031
drhdd3d4592004-08-30 01:54:05 +00001032
1033/*
drhb21a8e42012-01-28 21:08:51 +00001034** Execute a query statement that will generate SQL output. Print
1035** the result columns, comma-separated, on a line and then add a
1036** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001037**
drhb21a8e42012-01-28 21:08:51 +00001038** If the number of columns is 1 and that column contains text "--"
1039** then write the semicolon on a separate line. That way, if a
1040** "--" comment occurs at the end of the statement, the comment
1041** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001042*/
drh157e29a2009-05-21 15:15:00 +00001043static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001044 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001045 const char *zSelect, /* SELECT statement to extract content */
1046 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001047){
drhdd3d4592004-08-30 01:54:05 +00001048 sqlite3_stmt *pSelect;
1049 int rc;
drhb21a8e42012-01-28 21:08:51 +00001050 int nResult;
1051 int i;
1052 const char *z;
drhc7181902014-02-27 15:04:13 +00001053 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001054 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001055 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001056 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001057 return rc;
1058 }
1059 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001060 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001061 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001062 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001063 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001064 zFirstRow = 0;
1065 }
drhb21a8e42012-01-28 21:08:51 +00001066 z = (const char*)sqlite3_column_text(pSelect, 0);
1067 fprintf(p->out, "%s", z);
1068 for(i=1; i<nResult; i++){
1069 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1070 }
1071 if( z==0 ) z = "";
1072 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1073 if( z[0] ){
1074 fprintf(p->out, "\n;\n");
1075 }else{
1076 fprintf(p->out, ";\n");
1077 }
drhdd3d4592004-08-30 01:54:05 +00001078 rc = sqlite3_step(pSelect);
1079 }
drh2f464a02011-10-13 00:41:49 +00001080 rc = sqlite3_finalize(pSelect);
1081 if( rc!=SQLITE_OK ){
1082 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001083 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001084 }
1085 return rc;
drhdd3d4592004-08-30 01:54:05 +00001086}
1087
shane626a6e42009-10-22 17:30:15 +00001088/*
1089** Allocate space and save off current error string.
1090*/
1091static char *save_err_msg(
1092 sqlite3 *db /* Database to query */
1093){
1094 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1095 char *zErrMsg = sqlite3_malloc(nErrMsg);
1096 if( zErrMsg ){
1097 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1098 }
1099 return zErrMsg;
1100}
1101
1102/*
shaneh642d8b82010-07-28 16:05:34 +00001103** Display memory stats.
1104*/
1105static int display_stats(
1106 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001107 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001108 int bReset /* True to reset the stats */
1109){
1110 int iCur;
1111 int iHiwtr;
1112
1113 if( pArg && pArg->out ){
1114
1115 iHiwtr = iCur = -1;
1116 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001117 fprintf(pArg->out,
1118 "Memory Used: %d (max %d) bytes\n",
1119 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001120 iHiwtr = iCur = -1;
1121 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001122 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
1123 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001124 if( pArg->shellFlgs & SHFLG_Pagecache ){
1125 iHiwtr = iCur = -1;
1126 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001127 fprintf(pArg->out,
1128 "Number of Pcache Pages Used: %d (max %d) pages\n",
1129 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001130 }
shaneh642d8b82010-07-28 16:05:34 +00001131 iHiwtr = iCur = -1;
1132 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001133 fprintf(pArg->out,
1134 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1135 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001136 if( pArg->shellFlgs & SHFLG_Scratch ){
1137 iHiwtr = iCur = -1;
1138 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001139 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n",
1140 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001141 }
shaneh642d8b82010-07-28 16:05:34 +00001142 iHiwtr = iCur = -1;
1143 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001144 fprintf(pArg->out,
1145 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1146 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001147 iHiwtr = iCur = -1;
1148 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001149 fprintf(pArg->out, "Largest Allocation: %d bytes\n",
1150 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001151 iHiwtr = iCur = -1;
1152 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001153 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
1154 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001155 iHiwtr = iCur = -1;
1156 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001157 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
1158 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001159#ifdef YYTRACKMAXSTACKDEPTH
1160 iHiwtr = iCur = -1;
1161 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001162 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
1163 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001164#endif
1165 }
1166
1167 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001168 if( pArg->shellFlgs & SHFLG_Lookaside ){
1169 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001170 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1171 &iCur, &iHiwtr, bReset);
1172 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n",
1173 iCur, iHiwtr);
1174 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1175 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001176 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001177 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1178 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001179 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001180 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1181 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001182 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1183 }
shaneh642d8b82010-07-28 16:05:34 +00001184 iHiwtr = iCur = -1;
1185 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001186 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n",iCur);
1187 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001188 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1189 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1190 iHiwtr = iCur = -1;
1191 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1192 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001193 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001194 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1195 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1196 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001197 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001198 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001199 iHiwtr = iCur = -1;
1200 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001201 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001202 }
1203
1204 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001205 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1206 bReset);
shaneh642d8b82010-07-28 16:05:34 +00001207 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1208 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1209 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001210 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
shaneh642d8b82010-07-28 16:05:34 +00001211 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001212 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1213 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001214 }
1215
1216 return 0;
1217}
1218
1219/*
dan8d1edb92014-11-05 09:07:28 +00001220** Display scan stats.
1221*/
1222static void display_scanstats(
1223 sqlite3 *db, /* Database to query */
1224 ShellState *pArg /* Pointer to ShellState */
1225){
1226#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
drh15f23c22014-11-06 12:46:16 +00001227 int i, k, n, mx;
dan8d1edb92014-11-05 09:07:28 +00001228 fprintf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001229 mx = 0;
1230 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001231 double rEstLoop = 1.0;
1232 for(i=n=0; 1; i++){
1233 sqlite3_stmt *p = pArg->pStmt;
1234 sqlite3_int64 nLoop, nVisit;
1235 double rEst;
1236 int iSid;
1237 const char *zExplain;
1238 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1239 break;
1240 }
1241 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001242 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001243 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001244 if( n==0 ){
1245 rEstLoop = (double)nLoop;
drh15f23c22014-11-06 12:46:16 +00001246 if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001247 }
drh42f30bc2014-11-06 12:08:21 +00001248 n++;
1249 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1250 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1251 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1252 fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1253 rEstLoop *= rEst;
drh4ace5362014-11-10 14:42:28 +00001254 fprintf(pArg->out,
1255 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001256 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001257 );
dan8d1edb92014-11-05 09:07:28 +00001258 }
dan8d1edb92014-11-05 09:07:28 +00001259 }
dan8d1edb92014-11-05 09:07:28 +00001260 fprintf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001261#endif
dan8d1edb92014-11-05 09:07:28 +00001262}
1263
1264/*
dana98bf362013-11-13 18:35:01 +00001265** Parameter azArray points to a zero-terminated array of strings. zStr
1266** points to a single nul-terminated string. Return non-zero if zStr
1267** is equal, according to strcmp(), to any of the strings in the array.
1268** Otherwise, return zero.
1269*/
1270static int str_in_array(const char *zStr, const char **azArray){
1271 int i;
1272 for(i=0; azArray[i]; i++){
1273 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1274 }
1275 return 0;
1276}
1277
1278/*
1279** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001280** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001281** spaces each opcode should be indented before it is output.
1282**
1283** The indenting rules are:
1284**
1285** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1286** all opcodes that occur between the p2 jump destination and the opcode
1287** itself by 2 spaces.
1288**
drh01752bc2013-11-14 23:59:33 +00001289** * For each "Goto", if the jump destination is earlier in the program
1290** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001291** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001292** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001293** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001294** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001295*/
drhdcd87a92014-08-18 13:45:42 +00001296static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001297 const char *zSql; /* The text of the SQL statement */
1298 const char *z; /* Used to check if this is an EXPLAIN */
1299 int *abYield = 0; /* True if op is an OP_Yield */
1300 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001301 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001302
drh8ad0de32014-03-20 18:45:27 +00001303 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1304 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001305 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1306 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001307 const char *azGoto[] = { "Goto", 0 };
1308
1309 /* Try to figure out if this is really an EXPLAIN statement. If this
1310 ** cannot be verified, return early. */
1311 zSql = sqlite3_sql(pSql);
1312 if( zSql==0 ) return;
1313 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1314 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1315
1316 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1317 int i;
danc4650bb2013-11-18 08:41:06 +00001318 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001319 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001320
1321 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1322 ** p2 is an instruction address, set variable p2op to the index of that
1323 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1324 ** the current instruction is part of a sub-program generated by an
1325 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001326 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001327 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001328
1329 /* Grow the p->aiIndent array as required */
1330 if( iOp>=nAlloc ){
1331 nAlloc += 100;
1332 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1333 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1334 }
1335 abYield[iOp] = str_in_array(zOp, azYield);
1336 p->aiIndent[iOp] = 0;
1337 p->nIndent = iOp+1;
1338
1339 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001340 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001341 }
drhfe705102014-03-06 13:38:37 +00001342 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1343 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1344 ){
drhe73f0592014-01-21 22:25:45 +00001345 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001346 }
1347 }
1348
danc4650bb2013-11-18 08:41:06 +00001349 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001350 sqlite3_free(abYield);
1351 sqlite3_reset(pSql);
1352}
1353
1354/*
1355** Free the array allocated by explain_data_prepare().
1356*/
drhdcd87a92014-08-18 13:45:42 +00001357static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001358 sqlite3_free(p->aiIndent);
1359 p->aiIndent = 0;
1360 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001361 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001362}
1363
1364/*
shane626a6e42009-10-22 17:30:15 +00001365** Execute a statement or set of statements. Print
1366** any result rows/columns depending on the current mode
1367** set via the supplied callback.
1368**
1369** This is very similar to SQLite's built-in sqlite3_exec()
1370** function except it takes a slightly different callback
1371** and callback data argument.
1372*/
1373static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001374 sqlite3 *db, /* An open database */
1375 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001376 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001377 /* (not the same as sqlite3_exec) */
1378 ShellState *pArg, /* Pointer to ShellState */
1379 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001380){
dan4564ced2010-01-05 04:59:56 +00001381 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1382 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001383 int rc2;
dan4564ced2010-01-05 04:59:56 +00001384 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001385
1386 if( pzErrMsg ){
1387 *pzErrMsg = NULL;
1388 }
1389
shaneb9fc17d2009-10-22 21:23:35 +00001390 while( zSql[0] && (SQLITE_OK == rc) ){
1391 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1392 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001393 if( pzErrMsg ){
1394 *pzErrMsg = save_err_msg(db);
1395 }
1396 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001397 if( !pStmt ){
1398 /* this happens for a comment or white-space */
1399 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001400 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001401 continue;
1402 }
shane626a6e42009-10-22 17:30:15 +00001403
shaneh642d8b82010-07-28 16:05:34 +00001404 /* save off the prepared statment handle and reset row count */
1405 if( pArg ){
1406 pArg->pStmt = pStmt;
1407 pArg->cnt = 0;
1408 }
1409
shanehb7977c52010-01-18 18:17:10 +00001410 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001411 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001412 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001413 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001414 }
shanehb7977c52010-01-18 18:17:10 +00001415
drhefbf3b12014-02-28 20:47:24 +00001416 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1417 if( pArg && pArg->autoEQP ){
1418 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001419 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1420 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001421 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1422 if( rc==SQLITE_OK ){
1423 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1424 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1425 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1426 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1427 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1428 }
1429 }
1430 sqlite3_finalize(pExplain);
1431 sqlite3_free(zEQP);
1432 }
1433
dana98bf362013-11-13 18:35:01 +00001434 /* If the shell is currently in ".explain" mode, gather the extra
1435 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001436 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001437 explain_data_prepare(pArg, pStmt);
1438 }
1439
shaneb9fc17d2009-10-22 21:23:35 +00001440 /* perform the first step. this will tell us if we
1441 ** have a result set or not and how wide it is.
1442 */
1443 rc = sqlite3_step(pStmt);
1444 /* if we have a result set... */
1445 if( SQLITE_ROW == rc ){
1446 /* if we have a callback... */
1447 if( xCallback ){
1448 /* allocate space for col name ptr, value ptr, and type */
1449 int nCol = sqlite3_column_count(pStmt);
1450 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1451 if( !pData ){
1452 rc = SQLITE_NOMEM;
1453 }else{
1454 char **azCols = (char **)pData; /* Names of result columns */
1455 char **azVals = &azCols[nCol]; /* Results */
1456 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001457 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001458 assert(sizeof(int) <= sizeof(char *));
1459 /* save off ptrs to column names */
1460 for(i=0; i<nCol; i++){
1461 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1462 }
shaneb9fc17d2009-10-22 21:23:35 +00001463 do{
1464 /* extract the data and data types */
1465 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001466 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001467 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001468 azVals[i] = "";
1469 }else{
1470 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1471 }
shaneb9fc17d2009-10-22 21:23:35 +00001472 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1473 rc = SQLITE_NOMEM;
1474 break; /* from for */
1475 }
1476 } /* end for */
1477
1478 /* if data and types extracted successfully... */
1479 if( SQLITE_ROW == rc ){
1480 /* call the supplied callback with the result row data */
1481 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1482 rc = SQLITE_ABORT;
1483 }else{
1484 rc = sqlite3_step(pStmt);
1485 }
1486 }
1487 } while( SQLITE_ROW == rc );
1488 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001489 }
1490 }else{
1491 do{
1492 rc = sqlite3_step(pStmt);
1493 } while( rc == SQLITE_ROW );
1494 }
1495 }
1496
dana98bf362013-11-13 18:35:01 +00001497 explain_data_delete(pArg);
1498
shaneh642d8b82010-07-28 16:05:34 +00001499 /* print usage stats if stats on */
1500 if( pArg && pArg->statsOn ){
1501 display_stats(db, pArg, 0);
1502 }
1503
dan8d1edb92014-11-05 09:07:28 +00001504 /* print loop-counters if required */
1505 if( pArg && pArg->scanstatsOn ){
1506 display_scanstats(db, pArg);
1507 }
1508
dan4564ced2010-01-05 04:59:56 +00001509 /* Finalize the statement just executed. If this fails, save a
1510 ** copy of the error message. Otherwise, set zSql to point to the
1511 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001512 rc2 = sqlite3_finalize(pStmt);
1513 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001514 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001515 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001516 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001517 }else if( pzErrMsg ){
1518 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001519 }
shaneh642d8b82010-07-28 16:05:34 +00001520
1521 /* clear saved stmt handle */
1522 if( pArg ){
1523 pArg->pStmt = NULL;
1524 }
shane626a6e42009-10-22 17:30:15 +00001525 }
shaneb9fc17d2009-10-22 21:23:35 +00001526 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001527
1528 return rc;
1529}
1530
drhdd3d4592004-08-30 01:54:05 +00001531
drh33048c02001-10-01 14:29:22 +00001532/*
drh4c653a02000-06-07 01:27:47 +00001533** This is a different callback routine used for dumping the database.
1534** Each row received by this callback consists of a table name,
1535** the table type ("index" or "table") and SQL to create the table.
1536** This routine should print text sufficient to recreate the table.
1537*/
1538static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001539 int rc;
1540 const char *zTable;
1541 const char *zType;
1542 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001543 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001544 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001545
drh902b9ee2008-12-05 17:17:07 +00001546 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001547 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001548 zTable = azArg[0];
1549 zType = azArg[1];
1550 zSql = azArg[2];
1551
drh00b950d2005-09-11 02:03:03 +00001552 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001553 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001554 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001555 fprintf(p->out, "ANALYZE sqlite_master;\n");
1556 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1557 return 0;
drh45e29d82006-11-20 16:21:10 +00001558 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1559 char *zIns;
1560 if( !p->writableSchema ){
1561 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1562 p->writableSchema = 1;
1563 }
1564 zIns = sqlite3_mprintf(
1565 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1566 "VALUES('table','%q','%q',0,'%q');",
1567 zTable, zTable, zSql);
1568 fprintf(p->out, "%s\n", zIns);
1569 sqlite3_free(zIns);
1570 return 0;
drh00b950d2005-09-11 02:03:03 +00001571 }else{
1572 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001573 }
danielk19772a02e332004-06-05 08:04:36 +00001574
1575 if( strcmp(zType, "table")==0 ){
1576 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001577 char *zSelect = 0;
1578 char *zTableInfo = 0;
1579 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001580 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001581
1582 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1583 zTableInfo = appendText(zTableInfo, zTable, '"');
1584 zTableInfo = appendText(zTableInfo, ");", 0);
1585
drhc7181902014-02-27 15:04:13 +00001586 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001587 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001588 if( rc!=SQLITE_OK || !pTableInfo ){
1589 return 1;
1590 }
1591
1592 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001593 /* Always quote the table name, even if it appears to be pure ascii,
1594 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1595 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001596 if( zTmp ){
1597 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001598 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001599 }
1600 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1601 rc = sqlite3_step(pTableInfo);
1602 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001603 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001604 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001605 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001606 rc = sqlite3_step(pTableInfo);
1607 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001608 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001609 }else{
1610 zSelect = appendText(zSelect, ") ", 0);
1611 }
drh157e29a2009-05-21 15:15:00 +00001612 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001613 }
1614 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001615 if( rc!=SQLITE_OK || nRow==0 ){
1616 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001617 return 1;
1618 }
1619 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1620 zSelect = appendText(zSelect, zTable, '"');
1621
drh2f464a02011-10-13 00:41:49 +00001622 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001623 if( rc==SQLITE_CORRUPT ){
1624 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001625 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001626 }
drh85e72432012-04-11 11:38:53 +00001627 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001628 }
drh4c653a02000-06-07 01:27:47 +00001629 return 0;
1630}
1631
1632/*
drh45e29d82006-11-20 16:21:10 +00001633** Run zQuery. Use dump_callback() as the callback routine so that
1634** the contents of the query are output as SQL statements.
1635**
drhdd3d4592004-08-30 01:54:05 +00001636** If we get a SQLITE_CORRUPT error, rerun the query after appending
1637** "ORDER BY rowid DESC" to the end.
1638*/
1639static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001640 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001641 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001642){
1643 int rc;
drh2f464a02011-10-13 00:41:49 +00001644 char *zErr = 0;
1645 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001646 if( rc==SQLITE_CORRUPT ){
1647 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001648 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001649 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1650 if( zErr ){
1651 fprintf(p->out, "/****** %s ******/\n", zErr);
1652 sqlite3_free(zErr);
1653 zErr = 0;
1654 }
drhdd3d4592004-08-30 01:54:05 +00001655 zQ2 = malloc( len+100 );
1656 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001657 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001658 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1659 if( rc ){
1660 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1661 }else{
1662 rc = SQLITE_CORRUPT;
1663 }
1664 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001665 free(zQ2);
1666 }
1667 return rc;
1668}
1669
1670/*
drh75897232000-05-29 14:26:00 +00001671** Text of a help message
1672*/
persicom1d0b8722002-04-18 02:53:04 +00001673static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001674 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001675 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001676 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001677 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001678 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001679 " If TABLE specified, only dump tables matching\n"
1680 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001681 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001682 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001683 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001684 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001685 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001686 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001687 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001688 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001689 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001690 ".indices ?TABLE? Show names of all indices\n"
1691 " If TABLE specified, only show indices for tables\n"
1692 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001693#ifdef SQLITE_ENABLE_IOTRACE
1694 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1695#endif
drh70df4fe2006-06-13 15:12:21 +00001696#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001697 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001698#endif
drh127f9d72010-02-23 01:47:00 +00001699 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001700 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001701 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001702 " column Left-aligned columns. (See .width)\n"
1703 " html HTML <table> code\n"
1704 " insert SQL insert statements for TABLE\n"
1705 " line One value per line\n"
1706 " list Values delimited by .separator string\n"
1707 " tabs Tab-separated values\n"
1708 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001709 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001710 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001711 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001712 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001713 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001714 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001715 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001716 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001717 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001718 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001719 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001720 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001721 " If TABLE specified, only show tables matching\n"
1722 " LIKE pattern TABLE.\n"
drh6976c212014-07-24 12:09:47 +00001723 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1724 " NL is the end-of-line mark for CSV\n"
drh62cdde52014-05-28 20:22:28 +00001725 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001726 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001727 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001728 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001729 ".tables ?TABLE? List names of tables\n"
1730 " If TABLE specified, only list tables matching\n"
1731 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001732 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001733 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001734 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001735 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001736 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001737 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001738;
1739
drhdaffd0e2001-04-11 14:28:42 +00001740/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001741static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001742/*
1743** Implementation of the "readfile(X)" SQL function. The entire content
1744** of the file named X is read and returned as a BLOB. NULL is returned
1745** if the file does not exist or is unreadable.
1746*/
1747static void readfileFunc(
1748 sqlite3_context *context,
1749 int argc,
1750 sqlite3_value **argv
1751){
1752 const char *zName;
1753 FILE *in;
1754 long nIn;
1755 void *pBuf;
1756
1757 zName = (const char*)sqlite3_value_text(argv[0]);
1758 if( zName==0 ) return;
1759 in = fopen(zName, "rb");
1760 if( in==0 ) return;
1761 fseek(in, 0, SEEK_END);
1762 nIn = ftell(in);
1763 rewind(in);
1764 pBuf = sqlite3_malloc( nIn );
1765 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1766 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1767 }else{
1768 sqlite3_free(pBuf);
1769 }
1770 fclose(in);
1771}
1772
1773/*
1774** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1775** is written into file X. The number of bytes written is returned. Or
1776** NULL is returned if something goes wrong, such as being unable to open
1777** file X for writing.
1778*/
1779static void writefileFunc(
1780 sqlite3_context *context,
1781 int argc,
1782 sqlite3_value **argv
1783){
1784 FILE *out;
1785 const char *z;
drhba5b0932014-07-24 12:39:59 +00001786 sqlite3_int64 rc;
1787 const char *zFile;
1788
1789 zFile = (const char*)sqlite3_value_text(argv[0]);
1790 if( zFile==0 ) return;
1791 out = fopen(zFile, "wb");
1792 if( out==0 ) return;
1793 z = (const char*)sqlite3_value_blob(argv[1]);
1794 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001795 rc = 0;
1796 }else{
drh490fe862014-08-11 14:21:32 +00001797 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001798 }
1799 fclose(out);
1800 sqlite3_result_int64(context, rc);
1801}
drhdaffd0e2001-04-11 14:28:42 +00001802
drh75897232000-05-29 14:26:00 +00001803/*
drh44c2eb12003-04-30 11:38:26 +00001804** Make sure the database is open. If it is not, then open it. If
1805** the database fails to open, print an error message and exit.
1806*/
drhdcd87a92014-08-18 13:45:42 +00001807static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001808 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001809 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001810 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001811 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001812 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1813 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1814 shellstaticFunc, 0, 0);
1815 }
1816 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001817 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001818 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001819 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001820 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001821 }
drhc2e87a32006-06-27 15:16:14 +00001822#ifndef SQLITE_OMIT_LOAD_EXTENSION
1823 sqlite3_enable_load_extension(p->db, 1);
1824#endif
drhba5b0932014-07-24 12:39:59 +00001825 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1826 readfileFunc, 0, 0);
1827 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1828 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001829 }
1830}
1831
1832/*
drhfeac5f82004-08-01 00:10:45 +00001833** Do C-language style dequoting.
1834**
1835** \t -> tab
1836** \n -> newline
1837** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001838** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001839** \NNN -> ascii character NNN in octal
1840** \\ -> backslash
1841*/
1842static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001843 int i, j;
1844 char c;
drhc2ce0be2014-05-29 12:36:14 +00001845 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001846 for(i=j=0; (c = z[i])!=0; i++, j++){
1847 if( c=='\\' ){
1848 c = z[++i];
1849 if( c=='n' ){
1850 c = '\n';
1851 }else if( c=='t' ){
1852 c = '\t';
1853 }else if( c=='r' ){
1854 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001855 }else if( c=='\\' ){
1856 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001857 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001858 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001859 if( z[i+1]>='0' && z[i+1]<='7' ){
1860 i++;
1861 c = (c<<3) + z[i] - '0';
1862 if( z[i+1]>='0' && z[i+1]<='7' ){
1863 i++;
1864 c = (c<<3) + z[i] - '0';
1865 }
1866 }
1867 }
1868 }
1869 z[j] = c;
1870 }
drhc2ce0be2014-05-29 12:36:14 +00001871 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001872}
1873
1874/*
drh348d19c2013-06-03 12:47:43 +00001875** Return the value of a hexadecimal digit. Return -1 if the input
1876** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001877*/
drh348d19c2013-06-03 12:47:43 +00001878static int hexDigitValue(char c){
1879 if( c>='0' && c<='9' ) return c - '0';
1880 if( c>='a' && c<='f' ) return c - 'a' + 10;
1881 if( c>='A' && c<='F' ) return c - 'A' + 10;
1882 return -1;
drhc28490c2006-10-26 14:25:58 +00001883}
1884
1885/*
drh7d9f3942013-04-03 01:26:54 +00001886** Interpret zArg as an integer value, possibly with suffixes.
1887*/
1888static sqlite3_int64 integerValue(const char *zArg){
1889 sqlite3_int64 v = 0;
1890 static const struct { char *zSuffix; int iMult; } aMult[] = {
1891 { "KiB", 1024 },
1892 { "MiB", 1024*1024 },
1893 { "GiB", 1024*1024*1024 },
1894 { "KB", 1000 },
1895 { "MB", 1000000 },
1896 { "GB", 1000000000 },
1897 { "K", 1000 },
1898 { "M", 1000000 },
1899 { "G", 1000000000 },
1900 };
1901 int i;
1902 int isNeg = 0;
1903 if( zArg[0]=='-' ){
1904 isNeg = 1;
1905 zArg++;
1906 }else if( zArg[0]=='+' ){
1907 zArg++;
1908 }
drh348d19c2013-06-03 12:47:43 +00001909 if( zArg[0]=='0' && zArg[1]=='x' ){
1910 int x;
1911 zArg += 2;
1912 while( (x = hexDigitValue(zArg[0]))>=0 ){
1913 v = (v<<4) + x;
1914 zArg++;
1915 }
1916 }else{
1917 while( IsDigit(zArg[0]) ){
1918 v = v*10 + zArg[0] - '0';
1919 zArg++;
1920 }
drh7d9f3942013-04-03 01:26:54 +00001921 }
drhc2bed0a2013-05-24 11:57:50 +00001922 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001923 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1924 v *= aMult[i].iMult;
1925 break;
1926 }
1927 }
1928 return isNeg? -v : v;
1929}
1930
1931/*
drh348d19c2013-06-03 12:47:43 +00001932** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1933** for TRUE and FALSE. Return the integer value if appropriate.
1934*/
1935static int booleanValue(char *zArg){
1936 int i;
1937 if( zArg[0]=='0' && zArg[1]=='x' ){
1938 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1939 }else{
1940 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1941 }
1942 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1943 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1944 return 1;
1945 }
1946 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1947 return 0;
1948 }
1949 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1950 zArg);
1951 return 0;
1952}
1953
1954/*
drh42f64e52012-04-04 16:56:23 +00001955** Close an output file, assuming it is not stderr or stdout
1956*/
1957static void output_file_close(FILE *f){
1958 if( f && f!=stdout && f!=stderr ) fclose(f);
1959}
1960
1961/*
1962** Try to open an output file. The names "stdout" and "stderr" are
1963** recognized and do the right thing. NULL is returned if the output
1964** filename is "off".
1965*/
1966static FILE *output_file_open(const char *zFile){
1967 FILE *f;
1968 if( strcmp(zFile,"stdout")==0 ){
1969 f = stdout;
1970 }else if( strcmp(zFile, "stderr")==0 ){
1971 f = stderr;
1972 }else if( strcmp(zFile, "off")==0 ){
1973 f = 0;
1974 }else{
1975 f = fopen(zFile, "wb");
1976 if( f==0 ){
1977 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1978 }
1979 }
1980 return f;
1981}
1982
1983/*
1984** A routine for handling output from sqlite3_trace().
1985*/
1986static void sql_trace_callback(void *pArg, const char *z){
1987 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00001988 if( f ){
1989 int i = (int)strlen(z);
1990 while( i>0 && z[i-1]==';' ){ i--; }
1991 fprintf(f, "%.*s;\n", i, z);
1992 }
drh42f64e52012-04-04 16:56:23 +00001993}
1994
1995/*
drhd8621b92012-04-17 09:09:33 +00001996** A no-op routine that runs with the ".breakpoint" doc-command. This is
1997** a useful spot to set a debugger breakpoint.
1998*/
1999static void test_breakpoint(void){
2000 static int nCall = 0;
2001 nCall++;
2002}
2003
2004/*
drhdb95f682013-06-26 22:46:00 +00002005** An object used to read a CSV file
2006*/
2007typedef struct CSVReader CSVReader;
2008struct CSVReader {
2009 const char *zFile; /* Name of the input file */
2010 FILE *in; /* Read the CSV text from this input stream */
2011 char *z; /* Accumulated text for a field */
2012 int n; /* Number of bytes in z */
2013 int nAlloc; /* Space allocated for z[] */
2014 int nLine; /* Current line number */
2015 int cTerm; /* Character that terminated the most recent field */
2016 int cSeparator; /* The separator character. (Usually ",") */
2017};
2018
2019/* Append a single byte to z[] */
2020static void csv_append_char(CSVReader *p, int c){
2021 if( p->n+1>=p->nAlloc ){
2022 p->nAlloc += p->nAlloc + 100;
2023 p->z = sqlite3_realloc(p->z, p->nAlloc);
2024 if( p->z==0 ){
2025 fprintf(stderr, "out of memory\n");
2026 exit(1);
2027 }
2028 }
2029 p->z[p->n++] = (char)c;
2030}
2031
2032/* Read a single field of CSV text. Compatible with rfc4180 and extended
2033** with the option of having a separator other than ",".
2034**
2035** + Input comes from p->in.
2036** + Store results in p->z of length p->n. Space to hold p->z comes
2037** from sqlite3_malloc().
2038** + Use p->cSep as the separator. The default is ",".
2039** + Keep track of the line number in p->nLine.
2040** + Store the character that terminates the field in p->cTerm. Store
2041** EOF on end-of-file.
2042** + Report syntax errors on stderr
2043*/
2044static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00002045 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002046 int cSep = p->cSeparator;
2047 p->n = 0;
2048 c = fgetc(p->in);
2049 if( c==EOF || seenInterrupt ){
2050 p->cTerm = EOF;
2051 return 0;
2052 }
2053 if( c=='"' ){
2054 int startLine = p->nLine;
2055 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002056 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002057 while( 1 ){
2058 c = fgetc(p->in);
2059 if( c=='\n' ) p->nLine++;
2060 if( c==cQuote ){
2061 if( pc==cQuote ){
2062 pc = 0;
2063 continue;
2064 }
2065 }
2066 if( (c==cSep && pc==cQuote)
2067 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00002068 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002069 || (c==EOF && pc==cQuote)
2070 ){
2071 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002072 p->cTerm = c;
2073 break;
2074 }
2075 if( pc==cQuote && c!='\r' ){
2076 fprintf(stderr, "%s:%d: unescaped %c character\n",
2077 p->zFile, p->nLine, cQuote);
2078 }
2079 if( c==EOF ){
2080 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2081 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00002082 p->cTerm = EOF;
2083 break;
2084 }
2085 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002086 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002087 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002088 }
drhdb95f682013-06-26 22:46:00 +00002089 }else{
drhd0a64dc2013-06-30 20:24:26 +00002090 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00002091 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002092 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002093 }
2094 if( c=='\n' ){
2095 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002096 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002097 }
drhdb95f682013-06-26 22:46:00 +00002098 p->cTerm = c;
2099 }
drh8dd675e2013-07-12 21:09:24 +00002100 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002101 return p->z;
2102}
2103
2104/*
drh4bbcf102014-02-06 02:46:08 +00002105** Try to transfer data for table zTable. If an error is seen while
2106** moving forward, try to go backwards. The backwards movement won't
2107** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002108*/
mistachkine31ae902014-02-06 01:15:29 +00002109static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002110 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002111 sqlite3 *newDb,
2112 const char *zTable
2113){
2114 sqlite3_stmt *pQuery = 0;
2115 sqlite3_stmt *pInsert = 0;
2116 char *zQuery = 0;
2117 char *zInsert = 0;
2118 int rc;
2119 int i, j, n;
2120 int nTable = (int)strlen(zTable);
2121 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002122 int cnt = 0;
2123 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002124
2125 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2126 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2127 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002128 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002129 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2130 zQuery);
2131 goto end_data_xfer;
2132 }
2133 n = sqlite3_column_count(pQuery);
2134 zInsert = sqlite3_malloc(200 + nTable + n*3);
2135 if( zInsert==0 ){
2136 fprintf(stderr, "out of memory\n");
2137 goto end_data_xfer;
2138 }
2139 sqlite3_snprintf(200+nTable,zInsert,
2140 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2141 i = (int)strlen(zInsert);
2142 for(j=1; j<n; j++){
2143 memcpy(zInsert+i, ",?", 2);
2144 i += 2;
2145 }
2146 memcpy(zInsert+i, ");", 3);
2147 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2148 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002149 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002150 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2151 zQuery);
2152 goto end_data_xfer;
2153 }
2154 for(k=0; k<2; k++){
2155 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2156 for(i=0; i<n; i++){
2157 switch( sqlite3_column_type(pQuery, i) ){
2158 case SQLITE_NULL: {
2159 sqlite3_bind_null(pInsert, i+1);
2160 break;
2161 }
2162 case SQLITE_INTEGER: {
2163 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2164 break;
2165 }
2166 case SQLITE_FLOAT: {
2167 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2168 break;
2169 }
2170 case SQLITE_TEXT: {
2171 sqlite3_bind_text(pInsert, i+1,
2172 (const char*)sqlite3_column_text(pQuery,i),
2173 -1, SQLITE_STATIC);
2174 break;
2175 }
2176 case SQLITE_BLOB: {
2177 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2178 sqlite3_column_bytes(pQuery,i),
2179 SQLITE_STATIC);
2180 break;
2181 }
2182 }
2183 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002184 rc = sqlite3_step(pInsert);
2185 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2186 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2187 sqlite3_errmsg(newDb));
2188 }
drh3350ce92014-02-06 00:49:12 +00002189 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002190 cnt++;
2191 if( (cnt%spinRate)==0 ){
2192 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2193 fflush(stdout);
2194 }
drh3350ce92014-02-06 00:49:12 +00002195 } /* End while */
2196 if( rc==SQLITE_DONE ) break;
2197 sqlite3_finalize(pQuery);
2198 sqlite3_free(zQuery);
2199 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2200 zTable);
2201 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2202 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002203 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2204 break;
drh3350ce92014-02-06 00:49:12 +00002205 }
2206 } /* End for(k=0...) */
2207
2208end_data_xfer:
2209 sqlite3_finalize(pQuery);
2210 sqlite3_finalize(pInsert);
2211 sqlite3_free(zQuery);
2212 sqlite3_free(zInsert);
2213}
2214
2215
2216/*
2217** Try to transfer all rows of the schema that match zWhere. For
2218** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002219** If an error is encountered while moving forward through the
2220** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002221*/
mistachkine31ae902014-02-06 01:15:29 +00002222static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002223 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002224 sqlite3 *newDb,
2225 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002226 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002227){
2228 sqlite3_stmt *pQuery = 0;
2229 char *zQuery = 0;
2230 int rc;
2231 const unsigned char *zName;
2232 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002233 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002234
2235 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2236 " WHERE %s", zWhere);
2237 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2238 if( rc ){
2239 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2240 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2241 zQuery);
2242 goto end_schema_xfer;
2243 }
2244 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2245 zName = sqlite3_column_text(pQuery, 0);
2246 zSql = sqlite3_column_text(pQuery, 1);
2247 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002248 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2249 if( zErrMsg ){
2250 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2251 sqlite3_free(zErrMsg);
2252 zErrMsg = 0;
2253 }
drh3350ce92014-02-06 00:49:12 +00002254 if( xForEach ){
2255 xForEach(p, newDb, (const char*)zName);
2256 }
2257 printf("done\n");
2258 }
2259 if( rc!=SQLITE_DONE ){
2260 sqlite3_finalize(pQuery);
2261 sqlite3_free(zQuery);
2262 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2263 " WHERE %s ORDER BY rowid DESC", zWhere);
2264 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2265 if( rc ){
2266 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2267 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2268 zQuery);
2269 goto end_schema_xfer;
2270 }
2271 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2272 zName = sqlite3_column_text(pQuery, 0);
2273 zSql = sqlite3_column_text(pQuery, 1);
2274 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002275 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2276 if( zErrMsg ){
2277 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2278 sqlite3_free(zErrMsg);
2279 zErrMsg = 0;
2280 }
drh3350ce92014-02-06 00:49:12 +00002281 if( xForEach ){
2282 xForEach(p, newDb, (const char*)zName);
2283 }
2284 printf("done\n");
2285 }
2286 }
2287end_schema_xfer:
2288 sqlite3_finalize(pQuery);
2289 sqlite3_free(zQuery);
2290}
2291
2292/*
2293** Open a new database file named "zNewDb". Try to recover as much information
2294** as possible out of the main database (which might be corrupt) and write it
2295** into zNewDb.
2296*/
drhdcd87a92014-08-18 13:45:42 +00002297static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002298 int rc;
2299 sqlite3 *newDb = 0;
2300 if( access(zNewDb,0)==0 ){
2301 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2302 return;
2303 }
2304 rc = sqlite3_open(zNewDb, &newDb);
2305 if( rc ){
2306 fprintf(stderr, "Cannot create output database: %s\n",
2307 sqlite3_errmsg(newDb));
2308 }else{
drh54d0d2d2014-04-03 00:32:13 +00002309 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002310 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002311 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2312 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002313 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002314 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002315 }
2316 sqlite3_close(newDb);
2317}
2318
2319/*
drhc2ce0be2014-05-29 12:36:14 +00002320** Change the output file back to stdout
2321*/
drhdcd87a92014-08-18 13:45:42 +00002322static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002323 if( p->outfile[0]=='|' ){
2324 pclose(p->out);
2325 }else{
2326 output_file_close(p->out);
2327 }
2328 p->outfile[0] = 0;
2329 p->out = stdout;
2330}
2331
2332/*
drh75897232000-05-29 14:26:00 +00002333** If an input line begins with "." then invoke this routine to
2334** process that line.
drh67505e72002-04-19 12:34:06 +00002335**
drh47ad6842006-11-08 12:25:42 +00002336** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002337*/
drhdcd87a92014-08-18 13:45:42 +00002338static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002339 int i = 1;
2340 int nArg = 0;
2341 int n, c;
drh67505e72002-04-19 12:34:06 +00002342 int rc = 0;
drh75897232000-05-29 14:26:00 +00002343 char *azArg[50];
2344
2345 /* Parse the input line into tokens.
2346 */
2347 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002348 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002349 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002350 if( zLine[i]=='\'' || zLine[i]=='"' ){
2351 int delim = zLine[i++];
2352 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002353 while( zLine[i] && zLine[i]!=delim ){
2354 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2355 i++;
2356 }
drh75897232000-05-29 14:26:00 +00002357 if( zLine[i]==delim ){
2358 zLine[i++] = 0;
2359 }
drhfeac5f82004-08-01 00:10:45 +00002360 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002361 }else{
2362 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002363 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002364 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002365 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002366 }
2367 }
2368
2369 /* Process the input line.
2370 */
shane9bd1b442009-10-23 01:27:39 +00002371 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002372 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002373 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002374 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2375 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2376 ){
drhbc46f022013-01-23 18:53:23 +00002377 const char *zDestFile = 0;
2378 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002379 sqlite3 *pDest;
2380 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002381 int j;
2382 for(j=1; j<nArg; j++){
2383 const char *z = azArg[j];
2384 if( z[0]=='-' ){
2385 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002386 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002387 {
2388 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2389 return 1;
2390 }
2391 }else if( zDestFile==0 ){
2392 zDestFile = azArg[j];
2393 }else if( zDb==0 ){
2394 zDb = zDestFile;
2395 zDestFile = azArg[j];
2396 }else{
2397 fprintf(stderr, "too many arguments to .backup\n");
2398 return 1;
2399 }
drh9ff849f2009-02-04 20:55:57 +00002400 }
drhbc46f022013-01-23 18:53:23 +00002401 if( zDestFile==0 ){
2402 fprintf(stderr, "missing FILENAME argument on .backup\n");
2403 return 1;
2404 }
2405 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002406 rc = sqlite3_open(zDestFile, &pDest);
2407 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002408 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002409 sqlite3_close(pDest);
2410 return 1;
2411 }
drh05782482013-10-24 15:20:20 +00002412 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002413 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2414 if( pBackup==0 ){
2415 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2416 sqlite3_close(pDest);
2417 return 1;
2418 }
2419 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2420 sqlite3_backup_finish(pBackup);
2421 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002422 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002423 }else{
2424 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002425 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002426 }
2427 sqlite3_close(pDest);
2428 }else
2429
drhc2ce0be2014-05-29 12:36:14 +00002430 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2431 if( nArg==2 ){
2432 bail_on_error = booleanValue(azArg[1]);
2433 }else{
2434 fprintf(stderr, "Usage: .bail on|off\n");
2435 rc = 1;
2436 }
drhc49f44e2006-10-26 18:15:42 +00002437 }else
2438
drhd8621b92012-04-17 09:09:33 +00002439 /* The undocumented ".breakpoint" command causes a call to the no-op
2440 ** routine named test_breakpoint().
2441 */
2442 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2443 test_breakpoint();
2444 }else
2445
drhc2ce0be2014-05-29 12:36:14 +00002446 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2447 if( nArg==2 ){
2448 tryToClone(p, azArg[1]);
2449 }else{
2450 fprintf(stderr, "Usage: .clone FILENAME\n");
2451 rc = 1;
2452 }
mistachkine31ae902014-02-06 01:15:29 +00002453 }else
2454
drhc2ce0be2014-05-29 12:36:14 +00002455 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002456 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002457 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002458 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002459 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002460 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002461 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002462 data.colWidth[0] = 3;
2463 data.colWidth[1] = 15;
2464 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002465 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002466 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002467 if( zErrMsg ){
2468 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002469 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002470 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002471 }
2472 }else
2473
drhc2ce0be2014-05-29 12:36:14 +00002474 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002475 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002476 /* When playing back a "dump", the content might appear in an order
2477 ** which causes immediate foreign key constraints to be violated.
2478 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002479 if( nArg!=1 && nArg!=2 ){
2480 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2481 rc = 1;
2482 goto meta_command_exit;
2483 }
drhf1dfc4f2009-09-23 15:51:35 +00002484 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002485 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002486 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002487 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002488 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002489 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002490 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002491 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002492 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002493 );
2494 run_schema_dump_query(p,
2495 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002496 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002497 );
drh2f464a02011-10-13 00:41:49 +00002498 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002499 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002500 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002501 );
drh4c653a02000-06-07 01:27:47 +00002502 }else{
2503 int i;
drhdd3d4592004-08-30 01:54:05 +00002504 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002505 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002506 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002507 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002508 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002509 " AND sql NOT NULL");
2510 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002511 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002512 "WHERE sql NOT NULL"
2513 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002514 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002515 );
danielk1977bc6ada42004-06-30 08:20:16 +00002516 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002517 }
2518 }
drh45e29d82006-11-20 16:21:10 +00002519 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002520 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002521 p->writableSchema = 0;
2522 }
drh56197952011-10-13 16:30:13 +00002523 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2524 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002525 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002526 }else
drh75897232000-05-29 14:26:00 +00002527
drhc2ce0be2014-05-29 12:36:14 +00002528 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2529 if( nArg==2 ){
2530 p->echoOn = booleanValue(azArg[1]);
2531 }else{
2532 fprintf(stderr, "Usage: .echo on|off\n");
2533 rc = 1;
2534 }
drhdaffd0e2001-04-11 14:28:42 +00002535 }else
2536
drhc2ce0be2014-05-29 12:36:14 +00002537 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2538 if( nArg==2 ){
2539 p->autoEQP = booleanValue(azArg[1]);
2540 }else{
2541 fprintf(stderr, "Usage: .eqp on|off\n");
2542 rc = 1;
2543 }
drhefbf3b12014-02-28 20:47:24 +00002544 }else
2545
drhd3ac7d92013-01-25 18:33:43 +00002546 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002547 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002548 rc = 2;
drh75897232000-05-29 14:26:00 +00002549 }else
2550
drhc2ce0be2014-05-29 12:36:14 +00002551 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002552 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002553 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002554 if(!p->normalMode.valid) {
2555 p->normalMode.valid = 1;
2556 p->normalMode.mode = p->mode;
2557 p->normalMode.showHeader = p->showHeader;
2558 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002559 }
2560 /* We could put this code under the !p->explainValid
2561 ** condition so that it does not execute if we are already in
2562 ** explain mode. However, always executing it allows us an easy
2563 ** was to reset to explain mode in case the user previously
2564 ** did an .explain followed by a .width, .mode or .header
2565 ** command.
2566 */
danielk19770d78bae2008-01-03 07:09:48 +00002567 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002568 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002569 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002570 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002571 p->colWidth[1] = 13; /* opcode */
2572 p->colWidth[2] = 4; /* P1 */
2573 p->colWidth[3] = 4; /* P2 */
2574 p->colWidth[4] = 4; /* P3 */
2575 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002576 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002577 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002578 }else if (p->normalMode.valid) {
2579 p->normalMode.valid = 0;
2580 p->mode = p->normalMode.mode;
2581 p->showHeader = p->normalMode.showHeader;
2582 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002583 }
drh75897232000-05-29 14:26:00 +00002584 }else
2585
drhc1971542014-06-23 23:28:13 +00002586 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002587 ShellState data;
drhc1971542014-06-23 23:28:13 +00002588 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002589 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002590 if( nArg!=1 ){
2591 fprintf(stderr, "Usage: .fullschema\n");
2592 rc = 1;
2593 goto meta_command_exit;
2594 }
2595 open_db(p, 0);
2596 memcpy(&data, p, sizeof(data));
2597 data.showHeader = 0;
2598 data.mode = MODE_Semi;
2599 rc = sqlite3_exec(p->db,
2600 "SELECT sql FROM"
2601 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2602 " FROM sqlite_master UNION ALL"
2603 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002604 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002605 "ORDER BY rowid",
2606 callback, &data, &zErrMsg
2607 );
drh56f674c2014-07-18 14:43:29 +00002608 if( rc==SQLITE_OK ){
2609 sqlite3_stmt *pStmt;
2610 rc = sqlite3_prepare_v2(p->db,
2611 "SELECT rowid FROM sqlite_master"
2612 " WHERE name GLOB 'sqlite_stat[134]'",
2613 -1, &pStmt, 0);
2614 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2615 sqlite3_finalize(pStmt);
2616 }
2617 if( doStats==0 ){
2618 fprintf(p->out, "/* No STAT tables available */\n");
2619 }else{
2620 fprintf(p->out, "ANALYZE sqlite_master;\n");
2621 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2622 callback, &data, &zErrMsg);
2623 data.mode = MODE_Insert;
2624 data.zDestTable = "sqlite_stat1";
2625 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2626 shell_callback, &data,&zErrMsg);
2627 data.zDestTable = "sqlite_stat3";
2628 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2629 shell_callback, &data,&zErrMsg);
2630 data.zDestTable = "sqlite_stat4";
2631 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2632 shell_callback, &data, &zErrMsg);
2633 fprintf(p->out, "ANALYZE sqlite_master;\n");
2634 }
drhc1971542014-06-23 23:28:13 +00002635 }else
2636
drhc2ce0be2014-05-29 12:36:14 +00002637 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2638 if( nArg==2 ){
2639 p->showHeader = booleanValue(azArg[1]);
2640 }else{
2641 fprintf(stderr, "Usage: .headers on|off\n");
2642 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002643 }
drh75897232000-05-29 14:26:00 +00002644 }else
2645
drhc2ce0be2014-05-29 12:36:14 +00002646 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2647 fprintf(p->out, "%s", zHelp);
2648 }else
2649
2650 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002651 char *zTable; /* Insert data into this table */
2652 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002653 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002654 int nCol; /* Number of columns in the table */
2655 int nByte; /* Number of bytes in an SQL string */
2656 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002657 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002658 int nSep; /* Number of bytes in p->separator[] */
2659 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002660 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002661 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002662
drhc2ce0be2014-05-29 12:36:14 +00002663 if( nArg!=3 ){
2664 fprintf(stderr, "Usage: .import FILE TABLE\n");
2665 goto meta_command_exit;
2666 }
drh01f37542014-05-31 15:43:33 +00002667 zFile = azArg[1];
2668 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002669 seenInterrupt = 0;
2670 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002671 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002672 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002673 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002674 fprintf(stderr, "Error: non-null separator required for import\n");
2675 return 1;
drhfeac5f82004-08-01 00:10:45 +00002676 }
drhdb95f682013-06-26 22:46:00 +00002677 if( nSep>1 ){
2678 fprintf(stderr, "Error: multi-character separators not allowed"
2679 " for import\n");
2680 return 1;
2681 }
drh5bde8162013-06-27 14:07:53 +00002682 sCsv.zFile = zFile;
2683 sCsv.nLine = 1;
2684 if( sCsv.zFile[0]=='|' ){
2685 sCsv.in = popen(sCsv.zFile+1, "r");
2686 sCsv.zFile = "<pipe>";
2687 xCloser = pclose;
2688 }else{
2689 sCsv.in = fopen(sCsv.zFile, "rb");
2690 xCloser = fclose;
2691 }
drhdb95f682013-06-26 22:46:00 +00002692 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002693 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002694 return 1;
2695 }
2696 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002697 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002698 if( zSql==0 ){
2699 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002700 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002701 return 1;
2702 }
drh4f21c4a2008-12-10 22:15:00 +00002703 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002704 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002705 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002706 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2707 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2708 char cSep = '(';
2709 while( csv_read_one_field(&sCsv) ){
2710 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2711 cSep = ',';
2712 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2713 }
drh5bde8162013-06-27 14:07:53 +00002714 if( cSep=='(' ){
2715 sqlite3_free(zCreate);
2716 sqlite3_free(sCsv.z);
2717 xCloser(sCsv.in);
2718 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2719 return 1;
2720 }
drhdb95f682013-06-26 22:46:00 +00002721 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2722 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2723 sqlite3_free(zCreate);
2724 if( rc ){
2725 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2726 sqlite3_errmsg(db));
2727 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002728 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002729 return 1;
2730 }
drhc7181902014-02-27 15:04:13 +00002731 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002732 }
drhfeac5f82004-08-01 00:10:45 +00002733 sqlite3_free(zSql);
2734 if( rc ){
shane916f9612009-10-23 00:37:15 +00002735 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002736 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002737 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002738 return 1;
drhfeac5f82004-08-01 00:10:45 +00002739 }
shane916f9612009-10-23 00:37:15 +00002740 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002741 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002742 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002743 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002744 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002745 if( zSql==0 ){
2746 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002747 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002748 return 1;
2749 }
drhdb95f682013-06-26 22:46:00 +00002750 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002751 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002752 for(i=1; i<nCol; i++){
2753 zSql[j++] = ',';
2754 zSql[j++] = '?';
2755 }
2756 zSql[j++] = ')';
2757 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002758 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002759 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002760 if( rc ){
2761 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002762 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002763 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002764 return 1;
drhfeac5f82004-08-01 00:10:45 +00002765 }
drh2d463112013-08-06 14:36:36 +00002766 needCommit = sqlite3_get_autocommit(db);
2767 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002768 do{
2769 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002770 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002771 char *z = csv_read_one_field(&sCsv);
2772 if( z==0 && i==0 ) break;
2773 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2774 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2775 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2776 "filling the rest with NULL\n",
2777 sCsv.zFile, startLine, nCol, i+1);
2778 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002779 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002780 }
drhfeac5f82004-08-01 00:10:45 +00002781 }
drhdb95f682013-06-26 22:46:00 +00002782 if( sCsv.cTerm==sCsv.cSeparator ){
2783 do{
2784 csv_read_one_field(&sCsv);
2785 i++;
2786 }while( sCsv.cTerm==sCsv.cSeparator );
2787 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2788 "extras ignored\n",
2789 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002790 }
drhdb95f682013-06-26 22:46:00 +00002791 if( i>=nCol ){
2792 sqlite3_step(pStmt);
2793 rc = sqlite3_reset(pStmt);
2794 if( rc!=SQLITE_OK ){
2795 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2796 sqlite3_errmsg(db));
2797 }
2798 }
2799 }while( sCsv.cTerm!=EOF );
2800
drh5bde8162013-06-27 14:07:53 +00002801 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002802 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002803 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002804 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002805 }else
2806
drhc2ce0be2014-05-29 12:36:14 +00002807 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002808 ShellState data;
drh75897232000-05-29 14:26:00 +00002809 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002810 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002811 memcpy(&data, p, sizeof(data));
2812 data.showHeader = 0;
2813 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002814 if( nArg==1 ){
2815 rc = sqlite3_exec(p->db,
2816 "SELECT name FROM sqlite_master "
2817 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2818 "UNION ALL "
2819 "SELECT name FROM sqlite_temp_master "
2820 "WHERE type='index' "
2821 "ORDER BY 1",
2822 callback, &data, &zErrMsg
2823 );
drhc2ce0be2014-05-29 12:36:14 +00002824 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002825 zShellStatic = azArg[1];
2826 rc = sqlite3_exec(p->db,
2827 "SELECT name FROM sqlite_master "
2828 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2829 "UNION ALL "
2830 "SELECT name FROM sqlite_temp_master "
2831 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2832 "ORDER BY 1",
2833 callback, &data, &zErrMsg
2834 );
2835 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002836 }else{
2837 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2838 rc = 1;
2839 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002840 }
drh75897232000-05-29 14:26:00 +00002841 if( zErrMsg ){
2842 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002843 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002844 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002845 }else if( rc != SQLITE_OK ){
2846 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2847 rc = 1;
drh75897232000-05-29 14:26:00 +00002848 }
2849 }else
2850
drhae5e4452007-05-03 17:18:36 +00002851#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002852 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002853 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002854 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2855 iotrace = 0;
2856 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002857 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002858 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002859 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002860 iotrace = stdout;
2861 }else{
2862 iotrace = fopen(azArg[1], "w");
2863 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002864 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002865 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002866 rc = 1;
drhb0603412007-02-28 04:47:26 +00002867 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002868 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002869 }
2870 }
2871 }else
drhae5e4452007-05-03 17:18:36 +00002872#endif
drhb0603412007-02-28 04:47:26 +00002873
drh70df4fe2006-06-13 15:12:21 +00002874#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002875 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002876 const char *zFile, *zProc;
2877 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002878 if( nArg<2 ){
2879 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2880 rc = 1;
2881 goto meta_command_exit;
2882 }
drh1e397f82006-06-08 15:28:43 +00002883 zFile = azArg[1];
2884 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002885 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002886 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2887 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002888 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002889 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002890 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002891 }
2892 }else
drh70df4fe2006-06-13 15:12:21 +00002893#endif
drh1e397f82006-06-08 15:28:43 +00002894
drhc2ce0be2014-05-29 12:36:14 +00002895 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2896 if( nArg!=2 ){
2897 fprintf(stderr, "Usage: .log FILENAME\n");
2898 rc = 1;
2899 }else{
2900 const char *zFile = azArg[1];
2901 output_file_close(p->pLog);
2902 p->pLog = output_file_open(zFile);
2903 }
drh127f9d72010-02-23 01:47:00 +00002904 }else
2905
drhc2ce0be2014-05-29 12:36:14 +00002906 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2907 const char *zMode = nArg>=2 ? azArg[1] : "";
2908 int n2 = (int)strlen(zMode);
2909 int c2 = zMode[0];
2910 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002911 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002912 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002913 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002914 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002915 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002916 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002917 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002918 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002919 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002920 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002921 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002922 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002923 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drh6976c212014-07-24 12:09:47 +00002924 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
drhc2ce0be2014-05-29 12:36:14 +00002925 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002926 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002927 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002928 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002929 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002930 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002931 }else {
shane9bd1b442009-10-23 01:27:39 +00002932 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002933 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002934 rc = 1;
drh75897232000-05-29 14:26:00 +00002935 }
2936 }else
2937
drhc2ce0be2014-05-29 12:36:14 +00002938 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2939 if( nArg==2 ){
2940 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2941 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2942 }else{
2943 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002944 rc = 1;
2945 }
2946 }else
2947
drh05782482013-10-24 15:20:20 +00002948 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2949 sqlite3 *savedDb = p->db;
2950 const char *zSavedFilename = p->zDbFilename;
2951 char *zNewFilename = 0;
2952 p->db = 0;
2953 if( nArg>=2 ){
2954 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2955 }
2956 open_db(p, 1);
2957 if( p->db!=0 ){
2958 sqlite3_close(savedDb);
2959 sqlite3_free(p->zFreeOnClose);
2960 p->zFreeOnClose = zNewFilename;
2961 }else{
2962 sqlite3_free(zNewFilename);
2963 p->db = savedDb;
2964 p->zDbFilename = zSavedFilename;
2965 }
2966 }else
2967
drhc2ce0be2014-05-29 12:36:14 +00002968 if( c=='o'
2969 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2970 ){
2971 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2972 if( nArg>2 ){
2973 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2974 rc = 1;
2975 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002976 }
drhc2ce0be2014-05-29 12:36:14 +00002977 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2978 if( nArg<2 ){
2979 fprintf(stderr, "Usage: .once FILE\n");
2980 rc = 1;
2981 goto meta_command_exit;
2982 }
2983 p->outCount = 2;
2984 }else{
2985 p->outCount = 0;
2986 }
2987 output_reset(p);
2988 if( zFile[0]=='|' ){
2989 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002990 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002991 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002992 p->out = stdout;
2993 rc = 1;
2994 }else{
drhc2ce0be2014-05-29 12:36:14 +00002995 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002996 }
drh75897232000-05-29 14:26:00 +00002997 }else{
drhc2ce0be2014-05-29 12:36:14 +00002998 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002999 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003000 if( strcmp(zFile,"off")!=0 ){
3001 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003002 }
drh75897232000-05-29 14:26:00 +00003003 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003004 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003005 } else {
drhc2ce0be2014-05-29 12:36:14 +00003006 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003007 }
3008 }
3009 }else
3010
drh078b1fd2012-09-21 13:40:02 +00003011 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3012 int i;
3013 for(i=1; i<nArg; i++){
3014 if( i>1 ) fprintf(p->out, " ");
3015 fprintf(p->out, "%s", azArg[i]);
3016 }
3017 fprintf(p->out, "\n");
3018 }else
3019
drhc2ce0be2014-05-29 12:36:14 +00003020 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003021 if( nArg >= 2) {
3022 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3023 }
3024 if( nArg >= 3) {
3025 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3026 }
3027 }else
3028
drhc2ce0be2014-05-29 12:36:14 +00003029 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003030 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003031 }else
3032
drhc2ce0be2014-05-29 12:36:14 +00003033 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3034 FILE *alt;
3035 if( nArg!=2 ){
3036 fprintf(stderr, "Usage: .read FILE\n");
3037 rc = 1;
3038 goto meta_command_exit;
3039 }
3040 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003041 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003042 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3043 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003044 }else{
shane9bd1b442009-10-23 01:27:39 +00003045 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003046 fclose(alt);
3047 }
3048 }else
3049
drhc2ce0be2014-05-29 12:36:14 +00003050 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003051 const char *zSrcFile;
3052 const char *zDb;
3053 sqlite3 *pSrc;
3054 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003055 int nTimeout = 0;
3056
drh9ff849f2009-02-04 20:55:57 +00003057 if( nArg==2 ){
3058 zSrcFile = azArg[1];
3059 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003060 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003061 zSrcFile = azArg[2];
3062 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003063 }else{
3064 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3065 rc = 1;
3066 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003067 }
3068 rc = sqlite3_open(zSrcFile, &pSrc);
3069 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003070 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003071 sqlite3_close(pSrc);
3072 return 1;
3073 }
drh05782482013-10-24 15:20:20 +00003074 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003075 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3076 if( pBackup==0 ){
3077 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3078 sqlite3_close(pSrc);
3079 return 1;
3080 }
drhdc2c4912009-02-04 22:46:47 +00003081 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3082 || rc==SQLITE_BUSY ){
3083 if( rc==SQLITE_BUSY ){
3084 if( nTimeout++ >= 3 ) break;
3085 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003086 }
3087 }
3088 sqlite3_backup_finish(pBackup);
3089 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003090 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003091 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003092 fprintf(stderr, "Error: source database is busy\n");
3093 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003094 }else{
3095 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003096 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003097 }
3098 sqlite3_close(pSrc);
3099 }else
3100
dan8d1edb92014-11-05 09:07:28 +00003101
3102 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3103 if( nArg==2 ){
3104 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003105#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3106 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3107#endif
dan8d1edb92014-11-05 09:07:28 +00003108 }else{
3109 fprintf(stderr, "Usage: .scanstats on|off\n");
3110 rc = 1;
3111 }
3112 }else
3113
drhc2ce0be2014-05-29 12:36:14 +00003114 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003115 ShellState data;
drh75897232000-05-29 14:26:00 +00003116 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003117 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003118 memcpy(&data, p, sizeof(data));
3119 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003120 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003121 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003122 int i;
drhf0693c82011-10-11 20:41:54 +00003123 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003124 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003125 char *new_argv[2], *new_colv[2];
3126 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3127 " type text,\n"
3128 " name text,\n"
3129 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003130 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003131 " sql text\n"
3132 ")";
3133 new_argv[1] = 0;
3134 new_colv[0] = "sql";
3135 new_colv[1] = 0;
3136 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003137 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003138 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003139 char *new_argv[2], *new_colv[2];
3140 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3141 " type text,\n"
3142 " name text,\n"
3143 " tbl_name text,\n"
3144 " rootpage integer,\n"
3145 " sql text\n"
3146 ")";
3147 new_argv[1] = 0;
3148 new_colv[0] = "sql";
3149 new_colv[1] = 0;
3150 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003151 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003152 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003153 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003154 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003155 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003156 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003157 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003158 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003159 "WHERE lower(tbl_name) LIKE shellstatic()"
3160 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003161 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003162 callback, &data, &zErrMsg);
3163 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003164 }
drhc2ce0be2014-05-29 12:36:14 +00003165 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003166 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003167 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003168 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003169 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003170 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003171 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003172 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003173 callback, &data, &zErrMsg
3174 );
drhc2ce0be2014-05-29 12:36:14 +00003175 }else{
3176 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3177 rc = 1;
3178 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003179 }
drh75897232000-05-29 14:26:00 +00003180 if( zErrMsg ){
3181 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003182 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003183 rc = 1;
3184 }else if( rc != SQLITE_OK ){
3185 fprintf(stderr,"Error: querying schema information\n");
3186 rc = 1;
3187 }else{
3188 rc = 0;
drh75897232000-05-29 14:26:00 +00003189 }
3190 }else
3191
drhabd4c722014-09-20 18:18:33 +00003192
3193#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3194 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3195 extern int sqlite3SelectTrace;
3196 sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3197 }else
3198#endif
3199
3200
drh340f5822013-06-27 13:01:21 +00003201#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003202 /* Undocumented commands for internal testing. Subject to change
3203 ** without notice. */
3204 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3205 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3206 int i, v;
3207 for(i=1; i<nArg; i++){
3208 v = booleanValue(azArg[i]);
3209 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3210 }
3211 }
3212 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3213 int i; sqlite3_int64 v;
3214 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003215 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003216 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003217 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003218 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003219 }
3220 }
3221 }else
drh340f5822013-06-27 13:01:21 +00003222#endif
drh348d19c2013-06-03 12:47:43 +00003223
drhc2ce0be2014-05-29 12:36:14 +00003224 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003225 if( nArg<2 || nArg>3 ){
3226 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
drhc2ce0be2014-05-29 12:36:14 +00003227 rc = 1;
3228 }
drh6976c212014-07-24 12:09:47 +00003229 if( nArg>=2 ){
3230 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3231 }
3232 if( nArg>=3 ){
3233 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3234 }
drh75897232000-05-29 14:26:00 +00003235 }else
3236
drh62cdde52014-05-28 20:22:28 +00003237 if( c=='s'
3238 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003239 ){
3240 char *zCmd;
drh54027102014-08-06 14:36:53 +00003241 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003242 if( nArg<2 ){
3243 fprintf(stderr, "Usage: .system COMMAND\n");
3244 rc = 1;
3245 goto meta_command_exit;
3246 }
drhdcb3e3d2014-05-29 03:17:29 +00003247 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003248 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003249 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3250 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003251 }
drh54027102014-08-06 14:36:53 +00003252 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003253 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003254 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003255 }else
3256
drhc2ce0be2014-05-29 12:36:14 +00003257 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003258 int i;
drhc2ce0be2014-05-29 12:36:14 +00003259 if( nArg!=1 ){
3260 fprintf(stderr, "Usage: .show\n");
3261 rc = 1;
3262 goto meta_command_exit;
3263 }
persicom7e2dfdd2002-04-18 02:46:52 +00003264 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003265 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003266 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003267 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003268 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003269 fprintf(p->out,"%9.9s: ", "nullvalue");
3270 output_c_string(p->out, p->nullvalue);
3271 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003272 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003273 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003274 fprintf(p->out,"%9.9s: ", "separator");
3275 output_c_string(p->out, p->separator);
drh6976c212014-07-24 12:09:47 +00003276 fprintf(p->out," ");
3277 output_c_string(p->out, p->newline);
drhfeac5f82004-08-01 00:10:45 +00003278 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003279 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003280 fprintf(p->out,"%9.9s: ","width");
3281 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003282 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003283 }
drhfeac5f82004-08-01 00:10:45 +00003284 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003285 }else
3286
drhc2ce0be2014-05-29 12:36:14 +00003287 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3288 if( nArg==2 ){
3289 p->statsOn = booleanValue(azArg[1]);
3290 }else{
3291 fprintf(stderr, "Usage: .stats on|off\n");
3292 rc = 1;
3293 }
shaneh642d8b82010-07-28 16:05:34 +00003294 }else
3295
drhc2ce0be2014-05-29 12:36:14 +00003296 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003297 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003298 char **azResult;
drh98781232012-04-23 12:38:05 +00003299 int nRow, nAlloc;
3300 char *zSql = 0;
3301 int ii;
drh05782482013-10-24 15:20:20 +00003302 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003303 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3304 if( rc ) return rc;
3305 zSql = sqlite3_mprintf(
3306 "SELECT name FROM sqlite_master"
3307 " WHERE type IN ('table','view')"
3308 " AND name NOT LIKE 'sqlite_%%'"
3309 " AND name LIKE ?1");
3310 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3311 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3312 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3313 if( strcmp(zDbName,"temp")==0 ){
3314 zSql = sqlite3_mprintf(
3315 "%z UNION ALL "
3316 "SELECT 'temp.' || name FROM sqlite_temp_master"
3317 " WHERE type IN ('table','view')"
3318 " AND name NOT LIKE 'sqlite_%%'"
3319 " AND name LIKE ?1", zSql);
3320 }else{
3321 zSql = sqlite3_mprintf(
3322 "%z UNION ALL "
3323 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3324 " WHERE type IN ('table','view')"
3325 " AND name NOT LIKE 'sqlite_%%'"
3326 " AND name LIKE ?1", zSql, zDbName, zDbName);
3327 }
drha50da102000-08-08 20:19:09 +00003328 }
drh98781232012-04-23 12:38:05 +00003329 sqlite3_finalize(pStmt);
3330 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3331 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3332 sqlite3_free(zSql);
3333 if( rc ) return rc;
3334 nRow = nAlloc = 0;
3335 azResult = 0;
3336 if( nArg>1 ){
3337 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003338 }else{
drh98781232012-04-23 12:38:05 +00003339 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3340 }
3341 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3342 if( nRow>=nAlloc ){
3343 char **azNew;
3344 int n = nAlloc*2 + 10;
3345 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3346 if( azNew==0 ){
3347 fprintf(stderr, "Error: out of memory\n");
3348 break;
3349 }
3350 nAlloc = n;
3351 azResult = azNew;
3352 }
3353 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3354 if( azResult[nRow] ) nRow++;
3355 }
3356 sqlite3_finalize(pStmt);
3357 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003358 int len, maxlen = 0;
3359 int i, j;
3360 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003361 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003362 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003363 if( len>maxlen ) maxlen = len;
3364 }
3365 nPrintCol = 80/(maxlen+2);
3366 if( nPrintCol<1 ) nPrintCol = 1;
3367 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3368 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003369 for(j=i; j<nRow; j+=nPrintRow){
3370 char *zSp = j<nPrintRow ? "" : " ";
drh4ace5362014-11-10 14:42:28 +00003371 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003372 }
drh151b7d52013-05-06 20:28:54 +00003373 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003374 }
3375 }
drh98781232012-04-23 12:38:05 +00003376 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3377 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003378 }else
3379
shaneh96887e12011-02-10 21:08:58 +00003380 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003381 static const struct {
3382 const char *zCtrlName; /* Name of a test-control option */
3383 int ctrlCode; /* Integer code for that option */
3384 } aCtrl[] = {
3385 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3386 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3387 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3388 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3389 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3390 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3391 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3392 { "assert", SQLITE_TESTCTRL_ASSERT },
3393 { "always", SQLITE_TESTCTRL_ALWAYS },
3394 { "reserve", SQLITE_TESTCTRL_RESERVE },
3395 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3396 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003397 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003398 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003399 };
shaneh96887e12011-02-10 21:08:58 +00003400 int testctrl = -1;
3401 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003402 int i, n;
drh05782482013-10-24 15:20:20 +00003403 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003404
drhd416fe72011-03-17 16:45:50 +00003405 /* convert testctrl text option to value. allow any unique prefix
3406 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003407 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003408 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003409 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3410 if( testctrl<0 ){
3411 testctrl = aCtrl[i].ctrlCode;
3412 }else{
drhb07028f2011-10-14 21:49:18 +00003413 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003414 testctrl = -1;
3415 break;
3416 }
3417 }
3418 }
drh348d19c2013-06-03 12:47:43 +00003419 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003420 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3421 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3422 }else{
3423 switch(testctrl){
3424
3425 /* sqlite3_test_control(int, db, int) */
3426 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3427 case SQLITE_TESTCTRL_RESERVE:
3428 if( nArg==3 ){
3429 int opt = (int)strtol(azArg[2], 0, 0);
3430 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003431 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003432 } else {
drhd416fe72011-03-17 16:45:50 +00003433 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3434 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003435 }
3436 break;
3437
3438 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003439 case SQLITE_TESTCTRL_PRNG_SAVE:
3440 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003441 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003442 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003443 if( nArg==2 ){
3444 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003445 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003446 } else {
3447 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3448 }
3449 break;
3450
3451 /* sqlite3_test_control(int, uint) */
3452 case SQLITE_TESTCTRL_PENDING_BYTE:
3453 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003454 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003455 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003456 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003457 } else {
drhd416fe72011-03-17 16:45:50 +00003458 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3459 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003460 }
3461 break;
3462
3463 /* sqlite3_test_control(int, int) */
3464 case SQLITE_TESTCTRL_ASSERT:
3465 case SQLITE_TESTCTRL_ALWAYS:
3466 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003467 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003468 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003469 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003470 } else {
drhd416fe72011-03-17 16:45:50 +00003471 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3472 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003473 }
3474 break;
3475
3476 /* sqlite3_test_control(int, char *) */
3477#ifdef SQLITE_N_KEYWORD
3478 case SQLITE_TESTCTRL_ISKEYWORD:
3479 if( nArg==3 ){
3480 const char *opt = azArg[2];
3481 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003482 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003483 } else {
drhd416fe72011-03-17 16:45:50 +00003484 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3485 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003486 }
3487 break;
3488#endif
3489
3490 case SQLITE_TESTCTRL_BITVEC_TEST:
3491 case SQLITE_TESTCTRL_FAULT_INSTALL:
3492 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3493 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3494 default:
drhd416fe72011-03-17 16:45:50 +00003495 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3496 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003497 break;
3498 }
3499 }
3500 }else
3501
drhc2ce0be2014-05-29 12:36:14 +00003502 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003503 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003504 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003505 }else
3506
drhc2ce0be2014-05-29 12:36:14 +00003507 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3508 if( nArg==2 ){
3509 enableTimer = booleanValue(azArg[1]);
3510 if( enableTimer && !HAS_TIMER ){
3511 fprintf(stderr, "Error: timer not available on this system.\n");
3512 enableTimer = 0;
3513 }
3514 }else{
3515 fprintf(stderr, "Usage: .timer on|off\n");
3516 rc = 1;
3517 }
shanehe2aa9d72009-11-06 17:20:17 +00003518 }else
3519
drhc2ce0be2014-05-29 12:36:14 +00003520 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003521 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003522 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003523 if( nArg!=2 ){
3524 fprintf(stderr, "Usage: .trace FILE|off\n");
3525 rc = 1;
3526 goto meta_command_exit;
3527 }
drh42f64e52012-04-04 16:56:23 +00003528 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003529#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003530 if( p->traceOut==0 ){
3531 sqlite3_trace(p->db, 0, 0);
3532 }else{
3533 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3534 }
3535#endif
3536 }else
3537
drhf442e332014-09-10 19:01:14 +00003538#if SQLITE_USER_AUTHENTICATION
3539 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3540 if( nArg<2 ){
3541 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3542 rc = 1;
3543 goto meta_command_exit;
3544 }
drh7883ecf2014-09-11 16:19:31 +00003545 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003546 if( strcmp(azArg[1],"login")==0 ){
3547 if( nArg!=4 ){
3548 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3549 rc = 1;
3550 goto meta_command_exit;
3551 }
drhd39c40f2014-09-11 00:27:53 +00003552 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3553 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003554 if( rc ){
3555 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3556 rc = 1;
3557 }
3558 }else if( strcmp(azArg[1],"add")==0 ){
3559 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003560 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003561 rc = 1;
3562 goto meta_command_exit;
3563 }
drhd39c40f2014-09-11 00:27:53 +00003564 rc = sqlite3_user_add(p->db, azArg[2],
3565 azArg[3], (int)strlen(azArg[3]),
3566 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003567 if( rc ){
3568 fprintf(stderr, "User-Add failed: %d\n", rc);
3569 rc = 1;
3570 }
3571 }else if( strcmp(azArg[1],"edit")==0 ){
3572 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003573 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003574 rc = 1;
3575 goto meta_command_exit;
3576 }
drhd39c40f2014-09-11 00:27:53 +00003577 rc = sqlite3_user_change(p->db, azArg[2],
3578 azArg[3], (int)strlen(azArg[3]),
3579 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003580 if( rc ){
3581 fprintf(stderr, "User-Edit failed: %d\n", rc);
3582 rc = 1;
3583 }
3584 }else if( strcmp(azArg[1],"delete")==0 ){
3585 if( nArg!=3 ){
3586 fprintf(stderr, "Usage: .user delete USER\n");
3587 rc = 1;
3588 goto meta_command_exit;
3589 }
3590 rc = sqlite3_user_delete(p->db, azArg[2]);
3591 if( rc ){
3592 fprintf(stderr, "User-Delete failed: %d\n", rc);
3593 rc = 1;
3594 }
3595 }else{
3596 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3597 rc = 1;
3598 goto meta_command_exit;
3599 }
3600 }else
3601#endif /* SQLITE_USER_AUTHENTICATION */
3602
drh9fd301b2011-06-03 13:28:22 +00003603 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003604 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003605 sqlite3_libversion(), sqlite3_sourceid());
3606 }else
3607
drhde60fc22011-12-14 17:53:36 +00003608 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3609 const char *zDbName = nArg==2 ? azArg[1] : "main";
3610 char *zVfsName = 0;
3611 if( p->db ){
3612 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3613 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003614 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003615 sqlite3_free(zVfsName);
3616 }
3617 }
3618 }else
3619
drhcef4fc82012-09-21 22:50:45 +00003620#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3621 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3622 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003623 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003624 }else
3625#endif
3626
drhc2ce0be2014-05-29 12:36:14 +00003627 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003628 int j;
drh43617e92006-03-06 20:55:46 +00003629 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003630 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003631 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003632 }
3633 }else
3634
3635 {
shane9bd1b442009-10-23 01:27:39 +00003636 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003637 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003638 rc = 1;
drh75897232000-05-29 14:26:00 +00003639 }
drh67505e72002-04-19 12:34:06 +00003640
drhc2ce0be2014-05-29 12:36:14 +00003641meta_command_exit:
3642 if( p->outCount ){
3643 p->outCount--;
3644 if( p->outCount==0 ) output_reset(p);
3645 }
drh67505e72002-04-19 12:34:06 +00003646 return rc;
drh75897232000-05-29 14:26:00 +00003647}
3648
drh67505e72002-04-19 12:34:06 +00003649/*
drh91a66392007-09-07 01:12:32 +00003650** Return TRUE if a semicolon occurs anywhere in the first N characters
3651** of string z[].
drh324ccef2003-02-05 14:06:20 +00003652*/
drh9f099fd2013-08-06 14:01:46 +00003653static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003654 int i;
3655 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3656 return 0;
drh324ccef2003-02-05 14:06:20 +00003657}
3658
3659/*
drh70c7a4b2003-04-26 03:03:06 +00003660** Test to see if a line consists entirely of whitespace.
3661*/
3662static int _all_whitespace(const char *z){
3663 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003664 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003665 if( *z=='/' && z[1]=='*' ){
3666 z += 2;
3667 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3668 if( *z==0 ) return 0;
3669 z++;
3670 continue;
3671 }
3672 if( *z=='-' && z[1]=='-' ){
3673 z += 2;
3674 while( *z && *z!='\n' ){ z++; }
3675 if( *z==0 ) return 1;
3676 continue;
3677 }
3678 return 0;
3679 }
3680 return 1;
3681}
3682
3683/*
drha9b17162003-04-29 18:01:28 +00003684** Return TRUE if the line typed in is an SQL command terminator other
3685** than a semi-colon. The SQL Server style "go" command is understood
3686** as is the Oracle "/".
3687*/
drh9f099fd2013-08-06 14:01:46 +00003688static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003689 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003690 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3691 return 1; /* Oracle */
3692 }
drhf0693c82011-10-11 20:41:54 +00003693 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003694 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003695 return 1; /* SQL Server */
3696 }
3697 return 0;
3698}
3699
3700/*
drh233a5312008-12-18 22:25:13 +00003701** Return true if zSql is a complete SQL statement. Return false if it
3702** ends in the middle of a string literal or C-style comment.
3703*/
drh9f099fd2013-08-06 14:01:46 +00003704static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003705 int rc;
3706 if( zSql==0 ) return 1;
3707 zSql[nSql] = ';';
3708 zSql[nSql+1] = 0;
3709 rc = sqlite3_complete(zSql);
3710 zSql[nSql] = 0;
3711 return rc;
3712}
3713
3714/*
drh67505e72002-04-19 12:34:06 +00003715** Read input from *in and process it. If *in==0 then input
3716** is interactive - the user is typing it it. Otherwise, input
3717** is coming from a file or device. A prompt is issued and history
3718** is saved only if input is interactive. An interrupt signal will
3719** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003720**
3721** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003722*/
drhdcd87a92014-08-18 13:45:42 +00003723static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003724 char *zLine = 0; /* A single input line */
3725 char *zSql = 0; /* Accumulated SQL text */
3726 int nLine; /* Length of current line */
3727 int nSql = 0; /* Bytes of zSql[] used */
3728 int nAlloc = 0; /* Allocated zSql[] space */
3729 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3730 char *zErrMsg; /* Error message returned */
3731 int rc; /* Error code */
3732 int errCnt = 0; /* Number of errors seen */
3733 int lineno = 0; /* Current line number */
3734 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003735
3736 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3737 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003738 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003739 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003740 /* End of input */
3741 if( stdin_is_interactive ) printf("\n");
3742 break;
drhc49f44e2006-10-26 18:15:42 +00003743 }
drh67505e72002-04-19 12:34:06 +00003744 if( seenInterrupt ){
3745 if( in!=0 ) break;
3746 seenInterrupt = 0;
3747 }
drhc28490c2006-10-26 14:25:58 +00003748 lineno++;
drh849a9d92013-12-21 15:46:06 +00003749 if( nSql==0 && _all_whitespace(zLine) ){
3750 if( p->echoOn ) printf("%s\n", zLine);
3751 continue;
3752 }
drh2af0b2d2002-02-21 02:25:02 +00003753 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003754 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003755 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003756 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003757 break;
3758 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003759 errCnt++;
3760 }
drhdaffd0e2001-04-11 14:28:42 +00003761 continue;
3762 }
drh9f099fd2013-08-06 14:01:46 +00003763 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003764 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003765 }
drh9f099fd2013-08-06 14:01:46 +00003766 nLine = strlen30(zLine);
3767 if( nSql+nLine+2>=nAlloc ){
3768 nAlloc = nSql+nLine+100;
3769 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003770 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003771 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003772 exit(1);
3773 }
drhdaffd0e2001-04-11 14:28:42 +00003774 }
drh9f099fd2013-08-06 14:01:46 +00003775 nSqlPrior = nSql;
3776 if( nSql==0 ){
3777 int i;
3778 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003779 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003780 memcpy(zSql, zLine+i, nLine+1-i);
3781 startline = lineno;
3782 nSql = nLine-i;
3783 }else{
3784 zSql[nSql++] = '\n';
3785 memcpy(zSql+nSql, zLine, nLine+1);
3786 nSql += nLine;
3787 }
3788 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003789 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003790 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003791 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003792 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003793 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003794 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003795 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003796 char zPrefix[100];
3797 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003798 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003799 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003800 }else{
shane9bd1b442009-10-23 01:27:39 +00003801 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003802 }
drh7f953e22002-07-13 17:33:45 +00003803 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003804 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003805 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003806 zErrMsg = 0;
3807 }else{
shaned2bed1c2009-10-21 03:56:54 +00003808 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003809 }
drhc49f44e2006-10-26 18:15:42 +00003810 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003811 }
drhdaffd0e2001-04-11 14:28:42 +00003812 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003813 if( p->outCount ){
3814 output_reset(p);
3815 p->outCount = 0;
3816 }
drh9f099fd2013-08-06 14:01:46 +00003817 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003818 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003819 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003820 }
3821 }
drh9f099fd2013-08-06 14:01:46 +00003822 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003823 if( !_all_whitespace(zSql) ){
3824 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00003825 errCnt++;
drhd416fe72011-03-17 16:45:50 +00003826 }
drhdaffd0e2001-04-11 14:28:42 +00003827 free(zSql);
3828 }
danielk19772ac27622007-07-03 05:31:16 +00003829 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003830 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003831}
3832
drh67505e72002-04-19 12:34:06 +00003833/*
3834** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003835** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003836*/
3837static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003838 static char *home_dir = NULL;
3839 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003840
drh4ace5362014-11-10 14:42:28 +00003841#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
3842 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003843 {
3844 struct passwd *pwent;
3845 uid_t uid = getuid();
3846 if( (pwent=getpwuid(uid)) != NULL) {
3847 home_dir = pwent->pw_dir;
3848 }
drh67505e72002-04-19 12:34:06 +00003849 }
3850#endif
3851
chw65d3c132007-11-12 21:09:10 +00003852#if defined(_WIN32_WCE)
3853 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3854 */
drh85e72432012-04-11 11:38:53 +00003855 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003856#else
3857
drh83905c92012-06-21 13:00:37 +00003858#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003859 if (!home_dir) {
3860 home_dir = getenv("USERPROFILE");
3861 }
3862#endif
3863
drh67505e72002-04-19 12:34:06 +00003864 if (!home_dir) {
3865 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003866 }
3867
drh83905c92012-06-21 13:00:37 +00003868#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003869 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003870 char *zDrive, *zPath;
3871 int n;
3872 zDrive = getenv("HOMEDRIVE");
3873 zPath = getenv("HOMEPATH");
3874 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003875 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003876 home_dir = malloc( n );
3877 if( home_dir==0 ) return 0;
3878 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3879 return home_dir;
3880 }
3881 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003882 }
3883#endif
3884
chw65d3c132007-11-12 21:09:10 +00003885#endif /* !_WIN32_WCE */
3886
drh67505e72002-04-19 12:34:06 +00003887 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003888 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003889 char *z = malloc( n );
3890 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003891 home_dir = z;
3892 }
drhe98d4fa2002-04-21 19:06:22 +00003893
drh67505e72002-04-19 12:34:06 +00003894 return home_dir;
3895}
3896
3897/*
3898** Read input from the file given by sqliterc_override. Or if that
3899** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003900**
3901** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003902*/
shane9bd1b442009-10-23 01:27:39 +00003903static int process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00003904 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00003905 const char *sqliterc_override /* Name of config file. NULL to use default */
3906){
persicom7e2dfdd2002-04-18 02:46:52 +00003907 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003908 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003909 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003910 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003911 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003912
3913 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003914 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003915 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003916#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003917 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003918#endif
shane9bd1b442009-10-23 01:27:39 +00003919 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003920 }
drh2f3de322012-06-27 16:41:31 +00003921 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003922 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3923 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003924 }
drha1f9b5e2004-02-14 16:31:02 +00003925 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003926 if( in ){
drhc28490c2006-10-26 14:25:58 +00003927 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003928 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003929 }
shane9bd1b442009-10-23 01:27:39 +00003930 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003931 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003932 }
drh85e72432012-04-11 11:38:53 +00003933 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003934 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003935}
3936
drh67505e72002-04-19 12:34:06 +00003937/*
drhe1e38c42003-05-04 18:30:59 +00003938** Show available command line options
3939*/
3940static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003941 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003942 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003943 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003944 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003945 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003946 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003947 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003948 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003949#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3950 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3951#endif
drhcc3b4f82012-02-07 14:13:50 +00003952 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003953 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003954 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003955 " -line set output mode to 'line'\n"
3956 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00003957 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00003958 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003959#ifdef SQLITE_ENABLE_MULTIPLEX
3960 " -multiplex enable the multiplexor VFS\n"
3961#endif
drh6976c212014-07-24 12:09:47 +00003962 " -newline SEP set newline character(s) for CSV\n"
drh98d312f2012-10-25 15:23:14 +00003963 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00003964 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
3965 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
drh98d312f2012-10-25 15:23:14 +00003966 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003967 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003968 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003969 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003970#ifdef SQLITE_ENABLE_VFSTRACE
3971 " -vfstrace enable tracing of all VFS calls\n"
3972#endif
drhe1e38c42003-05-04 18:30:59 +00003973;
3974static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003975 fprintf(stderr,
3976 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3977 "FILENAME is the name of an SQLite database. A new database is created\n"
3978 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003979 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003980 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003981 }else{
3982 fprintf(stderr, "Use the -help option for additional information\n");
3983 }
3984 exit(1);
3985}
3986
3987/*
drh67505e72002-04-19 12:34:06 +00003988** Initialize the state information in data
3989*/
drhdcd87a92014-08-18 13:45:42 +00003990static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003991 memset(data, 0, sizeof(*data));
3992 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003993 memcpy(data->separator,"|", 2);
drh6976c212014-07-24 12:09:47 +00003994 memcpy(data->newline,"\r\n", 3);
persicom7e2dfdd2002-04-18 02:46:52 +00003995 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00003996 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00003997 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003998 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00003999 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004000 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4001 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004002}
4003
drh98d312f2012-10-25 15:23:14 +00004004/*
drh5c7976f2014-02-10 19:59:27 +00004005** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004006*/
4007#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004008static void printBold(const char *zText){
4009 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4010 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4011 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4012 SetConsoleTextAttribute(out,
4013 FOREGROUND_RED|FOREGROUND_INTENSITY
4014 );
4015 printf("%s", zText);
4016 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004017}
4018#else
drh5c7976f2014-02-10 19:59:27 +00004019static void printBold(const char *zText){
4020 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004021}
4022#endif
4023
4024/*
drh98d312f2012-10-25 15:23:14 +00004025** Get the argument to an --option. Throw an error and die if no argument
4026** is available.
4027*/
4028static char *cmdline_option_value(int argc, char **argv, int i){
4029 if( i==argc ){
4030 fprintf(stderr, "%s: Error: missing argument to %s\n",
4031 argv[0], argv[argc-1]);
4032 exit(1);
4033 }
4034 return argv[i];
4035}
4036
drh75897232000-05-29 14:26:00 +00004037int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004038 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004039 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004040 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004041 int i;
drhc28490c2006-10-26 14:25:58 +00004042 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004043 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004044 int readStdin = 1;
4045 int nCmd = 0;
4046 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004047
drh69b30ab2014-02-27 15:11:52 +00004048#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004049 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4050 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4051 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4052 exit(1);
4053 }
drhc7181902014-02-27 15:04:13 +00004054#endif
drhdaffd0e2001-04-11 14:28:42 +00004055 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004056 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004057 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004058
drh44c2eb12003-04-30 11:38:26 +00004059 /* Make sure we have a valid signal handler early, before anything
4060 ** else is done.
4061 */
drh4c504392000-10-16 22:06:40 +00004062#ifdef SIGINT
4063 signal(SIGINT, interrupt_handler);
4064#endif
drh44c2eb12003-04-30 11:38:26 +00004065
drhac5649a2014-11-28 13:35:03 +00004066#ifdef SQLITE_SHELL_DBNAME_PROC
4067 {
4068 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4069 ** of a C-function that will provide the name of the database file. Use
4070 ** this compile-time option to embed this shell program in larger
4071 ** applications. */
4072 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4073 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4074 warnInmemoryDb = 0;
4075 }
4076#endif
4077
drh22fbcb82004-02-01 01:22:50 +00004078 /* Do an initial pass through the command-line argument to locate
4079 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004080 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004081 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004082 */
drh98d312f2012-10-25 15:23:14 +00004083 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004084 char *z;
drhc28490c2006-10-26 14:25:58 +00004085 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004086 if( z[0]!='-' ){
4087 if( data.zDbFilename==0 ){
4088 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004089 }else{
4090 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4091 ** mean that nothing is read from stdin */
4092 readStdin = 0;
4093 nCmd++;
4094 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4095 if( azCmd==0 ){
4096 fprintf(stderr, "out of memory\n");
4097 exit(1);
4098 }
4099 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004100 }
drh98d312f2012-10-25 15:23:14 +00004101 }
drhcc3b4f82012-02-07 14:13:50 +00004102 if( z[1]=='-' ) z++;
4103 if( strcmp(z,"-separator")==0
4104 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004105 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004106 || strcmp(z,"-cmd")==0
4107 ){
drh98d312f2012-10-25 15:23:14 +00004108 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004109 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004110 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004111 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004112 /* Need to check for batch mode here to so we can avoid printing
4113 ** informational messages (like from process_sqliterc) before
4114 ** we do the actual processing of arguments later in a second pass.
4115 */
shanef69573d2009-10-24 02:06:14 +00004116 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004117 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004118#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004119 const char *zSize;
4120 sqlite3_int64 szHeap;
4121
drh98d312f2012-10-25 15:23:14 +00004122 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004123 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004124 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004125 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4126#endif
drh44dec872014-08-30 15:49:25 +00004127 }else if( strcmp(z,"-scratch")==0 ){
4128 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004129 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004130 if( sz>400000 ) sz = 400000;
4131 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004132 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004133 if( n>10 ) n = 10;
4134 if( n<1 ) n = 1;
4135 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4136 data.shellFlgs |= SHFLG_Scratch;
4137 }else if( strcmp(z,"-pagecache")==0 ){
4138 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004139 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004140 if( sz>70000 ) sz = 70000;
4141 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004142 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004143 if( n<10 ) n = 10;
4144 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4145 data.shellFlgs |= SHFLG_Pagecache;
4146 }else if( strcmp(z,"-lookaside")==0 ){
4147 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004148 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004149 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004150 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004151 if( n<0 ) n = 0;
4152 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4153 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004154#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004155 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004156 extern int vfstrace_register(
4157 const char *zTraceName,
4158 const char *zOldVfsName,
4159 int (*xOut)(const char*,void*),
4160 void *pOutArg,
4161 int makeDefault
4162 );
drh2b625e22011-03-16 17:05:28 +00004163 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004164#endif
drh6f25e892011-07-08 17:02:57 +00004165#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004166 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004167 extern int sqlite3_multiple_initialize(const char*,int);
4168 sqlite3_multiplex_initialize(0, 1);
4169#endif
drh7d9f3942013-04-03 01:26:54 +00004170 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004171 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4172 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004173 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004174 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004175 if( pVfs ){
4176 sqlite3_vfs_register(pVfs, 1);
4177 }else{
4178 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4179 exit(1);
4180 }
drh44c2eb12003-04-30 11:38:26 +00004181 }
4182 }
drh98d312f2012-10-25 15:23:14 +00004183 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004184#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004185 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004186 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004187#else
shane86f5bdb2009-10-24 02:00:07 +00004188 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4189 return 1;
drh01b41712005-08-29 23:06:23 +00004190#endif
drh98d312f2012-10-25 15:23:14 +00004191 }
4192 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004193
drh44c2eb12003-04-30 11:38:26 +00004194 /* Go ahead and open the database file if it already exists. If the
4195 ** file does not exist, delay opening it. This prevents empty database
4196 ** files from being created if a user mistypes the database name argument
4197 ** to the sqlite command-line tool.
4198 */
drhc8d74412004-08-31 23:41:26 +00004199 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004200 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004201 }
4202
drh22fbcb82004-02-01 01:22:50 +00004203 /* Process the initialization file if there is one. If no -init option
4204 ** is given on the command line, look for a file named ~/.sqliterc and
4205 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004206 */
shane86f5bdb2009-10-24 02:00:07 +00004207 rc = process_sqliterc(&data,zInitFile);
4208 if( rc>0 ){
4209 return rc;
4210 }
drh44c2eb12003-04-30 11:38:26 +00004211
drh22fbcb82004-02-01 01:22:50 +00004212 /* Make a second pass through the command-line argument and set
4213 ** options. This second pass is delayed until after the initialization
4214 ** file is processed so that the command-line arguments will override
4215 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004216 */
drh98d312f2012-10-25 15:23:14 +00004217 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004218 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004219 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004220 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004221 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004222 i++;
4223 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004224 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004225 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004226 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004227 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004228 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004229 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004230 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004231 }else if( strcmp(z,"-csv")==0 ){
4232 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00004233 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00004234 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004235 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00004236 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004237 }else if( strcmp(z,"-newline")==0 ){
4238 sqlite3_snprintf(sizeof(data.newline), data.newline,
4239 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004240 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004241 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004242 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004243 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004244 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004245 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004246 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004247 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004248 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004249 }else if( strcmp(z,"-eqp")==0 ){
4250 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004251 }else if( strcmp(z,"-stats")==0 ){
4252 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004253 }else if( strcmp(z,"-scanstats")==0 ){
4254 data.scanstatsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004255 }else if( strcmp(z,"-bail")==0 ){
4256 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004257 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004258 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004259 return 0;
drhc28490c2006-10-26 14:25:58 +00004260 }else if( strcmp(z,"-interactive")==0 ){
4261 stdin_is_interactive = 1;
4262 }else if( strcmp(z,"-batch")==0 ){
4263 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004264 }else if( strcmp(z,"-heap")==0 ){
4265 i++;
drh44dec872014-08-30 15:49:25 +00004266 }else if( strcmp(z,"-scratch")==0 ){
4267 i+=2;
4268 }else if( strcmp(z,"-pagecache")==0 ){
4269 i+=2;
4270 }else if( strcmp(z,"-lookaside")==0 ){
4271 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004272 }else if( strcmp(z,"-mmap")==0 ){
4273 i++;
drha7e61d82011-03-12 17:02:57 +00004274 }else if( strcmp(z,"-vfs")==0 ){
4275 i++;
drh6f25e892011-07-08 17:02:57 +00004276#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004277 }else if( strcmp(z,"-vfstrace")==0 ){
4278 i++;
drh6f25e892011-07-08 17:02:57 +00004279#endif
4280#ifdef SQLITE_ENABLE_MULTIPLEX
4281 }else if( strcmp(z,"-multiplex")==0 ){
4282 i++;
4283#endif
drhcc3b4f82012-02-07 14:13:50 +00004284 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004285 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004286 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004287 /* Run commands that follow -cmd first and separately from commands
4288 ** that simply appear on the command-line. This seems goofy. It would
4289 ** be better if all commands ran in the order that they appear. But
4290 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004291 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004292 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004293 if( z[0]=='.' ){
4294 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004295 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004296 }else{
drh05782482013-10-24 15:20:20 +00004297 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004298 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4299 if( zErrMsg!=0 ){
4300 fprintf(stderr,"Error: %s\n", zErrMsg);
4301 if( bail_on_error ) return rc!=0 ? rc : 1;
4302 }else if( rc!=0 ){
4303 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4304 if( bail_on_error ) return rc;
4305 }
4306 }
drh1e5d0e92000-05-31 23:33:17 +00004307 }else{
shane86f5bdb2009-10-24 02:00:07 +00004308 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004309 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004310 return 1;
4311 }
4312 }
drh44c2eb12003-04-30 11:38:26 +00004313
drhac5649a2014-11-28 13:35:03 +00004314 if( !readStdin ){
4315 /* Run all arguments that do not begin with '-' as if they were separate
4316 ** command-line inputs, except for the argToSkip argument which contains
4317 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004318 */
drhac5649a2014-11-28 13:35:03 +00004319 for(i=0; i<nCmd; i++){
4320 if( azCmd[i][0]=='.' ){
4321 rc = do_meta_command(azCmd[i], &data);
4322 if( rc ) return rc==2 ? 0 : rc;
4323 }else{
4324 open_db(&data, 0);
4325 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4326 if( zErrMsg!=0 ){
4327 fprintf(stderr,"Error: %s\n", zErrMsg);
4328 return rc!=0 ? rc : 1;
4329 }else if( rc!=0 ){
4330 fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4331 return rc;
4332 }
drh6ff13852001-11-25 13:18:23 +00004333 }
drh75897232000-05-29 14:26:00 +00004334 }
drhac5649a2014-11-28 13:35:03 +00004335 free(azCmd);
drh75897232000-05-29 14:26:00 +00004336 }else{
drh44c2eb12003-04-30 11:38:26 +00004337 /* Run commands received from standard input
4338 */
drhc28490c2006-10-26 14:25:58 +00004339 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004340 char *zHome;
4341 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004342 int nHistory;
drh75897232000-05-29 14:26:00 +00004343 printf(
drh743e0032011-12-12 16:51:50 +00004344 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004345 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004346 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004347 );
drhb3735912014-02-10 16:13:42 +00004348 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004349 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004350 printBold("transient in-memory database");
4351 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004352 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004353 }
drh67505e72002-04-19 12:34:06 +00004354 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004355 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004356 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004357 if( (zHistory = malloc(nHistory))!=0 ){
4358 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4359 }
drh67505e72002-04-19 12:34:06 +00004360 }
drhaaa21b42014-02-11 14:37:51 +00004361#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004362 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004363#endif
drhc28490c2006-10-26 14:25:58 +00004364 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004365 if( zHistory ){
4366 stifle_history(100);
4367 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004368 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004369 }
drhdaffd0e2001-04-11 14:28:42 +00004370 }else{
drhc28490c2006-10-26 14:25:58 +00004371 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004372 }
4373 }
drh33048c02001-10-01 14:29:22 +00004374 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004375 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004376 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004377 }
drh05782482013-10-24 15:20:20 +00004378 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004379 return rc;
drh75897232000-05-29 14:26:00 +00004380}