blob: 3423bb01434435b3e5f2ec3a12df3c7505bdd4ca [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;
shaneb320ccd2009-10-21 03:42:58 +0000175typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
176static GETPROCTIMES getProcessTimesAddr = NULL;
177
shaneb320ccd2009-10-21 03:42:58 +0000178/*
179** Check to see if we have timer support. Return 1 if necessary
180** support found (or found previously).
181*/
182static int hasTimer(void){
183 if( getProcessTimesAddr ){
184 return 1;
185 } else {
186 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
187 ** See if the version we are running on has it, and if it does, save off
188 ** a pointer to it and the current process handle.
189 */
190 hProcess = GetCurrentProcess();
191 if( hProcess ){
192 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
193 if( NULL != hinstLib ){
194 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
195 if( NULL != getProcessTimesAddr ){
196 return 1;
197 }
198 FreeLibrary(hinstLib);
199 }
200 }
201 }
202 return 0;
203}
204
205/*
206** Begin timing an operation
207*/
208static void beginTimer(void){
209 if( enableTimer && getProcessTimesAddr ){
210 FILETIME ftCreation, ftExit;
211 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000212 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000213 }
214}
215
216/* Return the difference of two FILETIME structs in seconds */
217static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
218 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
219 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
220 return (double) ((i64End - i64Start) / 10000000.0);
221}
222
223/*
224** Print the timing results.
225*/
226static void endTimer(void){
227 if( enableTimer && getProcessTimesAddr){
228 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000229 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000230 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000231 printf("Run Time: real %.3f user %f sys %f\n",
232 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000233 timeDiff(&ftUserBegin, &ftUserEnd),
234 timeDiff(&ftKernelBegin, &ftKernelEnd));
235 }
236}
237
238#define BEGIN_TIMER beginTimer()
239#define END_TIMER endTimer()
240#define HAS_TIMER hasTimer()
241
drhda108222009-02-25 19:07:24 +0000242#else
243#define BEGIN_TIMER
244#define END_TIMER
245#define HAS_TIMER 0
246#endif
247
shanec0688ea2009-03-05 03:48:06 +0000248/*
249** Used to prevent warnings about unused parameters
250*/
251#define UNUSED_PARAMETER(x) (void)(x)
252
drhe91d16b2008-12-08 18:27:31 +0000253/*
drhc49f44e2006-10-26 18:15:42 +0000254** If the following flag is set, then command execution stops
255** at an error if we are not interactive.
256*/
257static int bail_on_error = 0;
258
259/*
drhc28490c2006-10-26 14:25:58 +0000260** Threat stdin as an interactive input if the following variable
261** is true. Otherwise, assume stdin is connected to a file or pipe.
262*/
263static int stdin_is_interactive = 1;
264
265/*
drh4c504392000-10-16 22:06:40 +0000266** The following is the open SQLite database. We make a pointer
267** to this database a static variable so that it can be accessed
268** by the SIGINT handler to interrupt database processing.
269*/
danielk197792f9a1b2004-06-19 09:08:16 +0000270static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000271
272/*
drh67505e72002-04-19 12:34:06 +0000273** True if an interrupt (Control-C) has been received.
274*/
drh43617e92006-03-06 20:55:46 +0000275static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000276
277/*
persicom7e2dfdd2002-04-18 02:46:52 +0000278** This is the name of our program. It is set in main(), used
279** in a number of other places, mostly for error messages.
280*/
281static char *Argv0;
282
283/*
284** Prompt strings. Initialized in main. Settable with
285** .prompt main continue
286*/
287static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
288static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
289
drhb0603412007-02-28 04:47:26 +0000290/*
291** Write I/O traces to the following stream.
292*/
rsebe0a9092007-07-30 18:24:38 +0000293#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000294static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000295#endif
drhb0603412007-02-28 04:47:26 +0000296
297/*
298** This routine works like printf in that its first argument is a
299** format string and subsequent arguments are values to be substituted
300** in place of % fields. The result of formatting this string
301** is written to iotrace.
302*/
rsebe0a9092007-07-30 18:24:38 +0000303#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000304static void iotracePrintf(const char *zFormat, ...){
305 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000306 char *z;
drhb0603412007-02-28 04:47:26 +0000307 if( iotrace==0 ) return;
308 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000309 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000310 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000311 fprintf(iotrace, "%s", z);
312 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000313}
rsebe0a9092007-07-30 18:24:38 +0000314#endif
drhb0603412007-02-28 04:47:26 +0000315
drh44c2eb12003-04-30 11:38:26 +0000316
persicom7e2dfdd2002-04-18 02:46:52 +0000317/*
drh83965662003-04-17 02:54:13 +0000318** Determines if a string is a number of not.
319*/
danielk19772e588c72005-12-09 14:25:08 +0000320static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000321 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000322 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000323 return 0;
324 }
325 z++;
326 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( *z=='.' ){
329 z++;
drhf0693c82011-10-11 20:41:54 +0000330 if( !IsDigit(*z) ) return 0;
331 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000332 if( realnum ) *realnum = 1;
333 }
334 if( *z=='e' || *z=='E' ){
335 z++;
336 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000337 if( !IsDigit(*z) ) return 0;
338 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000339 if( realnum ) *realnum = 1;
340 }
341 return *z==0;
342}
drh83965662003-04-17 02:54:13 +0000343
344/*
danielk1977bc6ada42004-06-30 08:20:16 +0000345** A global char* and an SQL function to access its current value
346** from within an SQL statement. This program used to use the
347** sqlite_exec_printf() API to substitue a string into an SQL statement.
348** The correct way to do this with sqlite3 is to use the bind API, but
349** since the shell is built around the callback paradigm it would be a lot
350** of work. Instead just use this hack, which is quite harmless.
351*/
352static const char *zShellStatic = 0;
353static void shellstaticFunc(
354 sqlite3_context *context,
355 int argc,
356 sqlite3_value **argv
357){
358 assert( 0==argc );
359 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000360 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000361 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000362 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
363}
364
365
366/*
drhfeac5f82004-08-01 00:10:45 +0000367** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000368** the text in memory obtained from malloc() and returns a pointer
369** to the text. NULL is returned at end of file, or if malloc()
370** fails.
371**
drh9f099fd2013-08-06 14:01:46 +0000372** If zLine is not NULL then it is a malloced buffer returned from
373** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000374*/
drh9f099fd2013-08-06 14:01:46 +0000375static char *local_getline(char *zLine, FILE *in){
376 int nLine = zLine==0 ? 0 : 100;
377 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000378
drhb07028f2011-10-14 21:49:18 +0000379 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000380 if( n+100>nLine ){
381 nLine = nLine*2 + 100;
382 zLine = realloc(zLine, nLine);
383 if( zLine==0 ) return 0;
384 }
drhdaffd0e2001-04-11 14:28:42 +0000385 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000386 if( n==0 ){
387 free(zLine);
388 return 0;
389 }
390 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000391 break;
392 }
drh9f099fd2013-08-06 14:01:46 +0000393 while( zLine[n] ) n++;
394 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000395 n--;
shaneh13b36022009-12-17 21:07:15 +0000396 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000397 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000398 break;
drh8e7e7a22000-05-30 18:45:23 +0000399 }
400 }
drh8e7e7a22000-05-30 18:45:23 +0000401 return zLine;
402}
403
404/*
drhc28490c2006-10-26 14:25:58 +0000405** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000406**
drh9f099fd2013-08-06 14:01:46 +0000407** If in==0 then read from standard input and prompt before each line.
408** If isContinuation is true, then a continuation prompt is appropriate.
409** If isContinuation is zero, then the main prompt should be used.
410**
411** If zPrior is not NULL then it is a buffer from a prior call to this
412** routine that can be reused.
413**
414** The result is stored in space obtained from malloc() and must either
415** be freed by the caller or else passed back into this routine via the
416** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000417*/
drh9f099fd2013-08-06 14:01:46 +0000418static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000419 char *zPrompt;
420 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000421 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000422 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000423 }else{
drh9f099fd2013-08-06 14:01:46 +0000424 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000425#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000426 free(zPrior);
427 zResult = readline(zPrompt);
428 if( zResult && *zResult ) add_history(zResult);
429#else
430 printf("%s", zPrompt);
431 fflush(stdout);
432 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000433#endif
drh9f099fd2013-08-06 14:01:46 +0000434 }
drh8e7e7a22000-05-30 18:45:23 +0000435 return zResult;
436}
437
drhdcd87a92014-08-18 13:45:42 +0000438/*
439** Shell output mode information from before ".explain on",
440** saved so that it can be restored by ".explain off"
441*/
442typedef struct SavedModeInfo SavedModeInfo;
443struct SavedModeInfo {
444 int valid; /* Is there legit data in here? */
445 int mode; /* Mode prior to ".explain on" */
446 int showHeader; /* The ".header" setting prior to ".explain on" */
447 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000448};
drh45e29d82006-11-20 16:21:10 +0000449
drh8e7e7a22000-05-30 18:45:23 +0000450/*
drhdcd87a92014-08-18 13:45:42 +0000451** State information about the database connection is contained in an
452** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000453*/
drhdcd87a92014-08-18 13:45:42 +0000454typedef struct ShellState ShellState;
455struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000456 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000457 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000458 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000459 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000460 int scanstatsOn; /* True to display scan stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +0000461 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000462 int cnt; /* Number of records displayed so far */
463 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000464 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000465 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000466 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000467 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000468 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000469 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000470 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000471 char separator[20]; /* Separator character for MODE_List */
drh6976c212014-07-24 12:09:47 +0000472 char newline[20]; /* Record separator in MODE_Csv */
drha0c66f52000-07-29 13:20:21 +0000473 int colWidth[100]; /* Requested width of each column when in column mode*/
474 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000475 char nullvalue[20]; /* The text to print when a NULL comes back from
476 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000477 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000478 char outfile[FILENAME_MAX]; /* Filename for *out */
479 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000480 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000481 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000482 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000483 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000484 int *aiIndent; /* Array of indents used in MODE_Explain */
485 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000486 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000487};
488
489/*
drh44dec872014-08-30 15:49:25 +0000490** These are the allowed shellFlgs values
491*/
492#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
493#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
494#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
495
496/*
drh75897232000-05-29 14:26:00 +0000497** These are the allowed modes.
498*/
drh967e8b72000-06-21 13:59:10 +0000499#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000500#define MODE_Column 1 /* One record per line in neat columns */
501#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000502#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
503#define MODE_Html 4 /* Generate an XHTML table */
504#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000505#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000506#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000507#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000508
drh66ce4d02008-02-15 17:38:06 +0000509static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000510 "line",
511 "column",
512 "list",
513 "semi",
514 "html",
drhfeac5f82004-08-01 00:10:45 +0000515 "insert",
516 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000517 "csv",
drh66ce4d02008-02-15 17:38:06 +0000518 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000519};
drh75897232000-05-29 14:26:00 +0000520
521/*
522** Number of elements in an array
523*/
drh902b9ee2008-12-05 17:17:07 +0000524#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000525
526/*
drhea678832008-12-10 19:26:22 +0000527** Compute a string length that is limited to what can be stored in
528** lower 30 bits of a 32-bit signed integer.
529*/
drh4f21c4a2008-12-10 22:15:00 +0000530static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000531 const char *z2 = z;
532 while( *z2 ){ z2++; }
533 return 0x3fffffff & (int)(z2 - z);
534}
535
536/*
drh127f9d72010-02-23 01:47:00 +0000537** A callback for the sqlite3_log() interface.
538*/
539static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000540 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000541 if( p->pLog==0 ) return;
542 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
543 fflush(p->pLog);
544}
545
546/*
shane626a6e42009-10-22 17:30:15 +0000547** Output the given string as a hex-encoded blob (eg. X'1234' )
548*/
549static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
550 int i;
551 char *zBlob = (char *)pBlob;
552 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000553 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000554 fprintf(out,"'");
555}
556
557/*
drh28bd4bc2000-06-15 15:57:22 +0000558** Output the given string as a quoted string using SQL quoting conventions.
559*/
560static void output_quoted_string(FILE *out, const char *z){
561 int i;
562 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000563 for(i=0; z[i]; i++){
564 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000565 }
566 if( nSingle==0 ){
567 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000568 }else{
569 fprintf(out,"'");
570 while( *z ){
571 for(i=0; z[i] && z[i]!='\''; i++){}
572 if( i==0 ){
573 fprintf(out,"''");
574 z++;
575 }else if( z[i]=='\'' ){
576 fprintf(out,"%.*s''",i,z);
577 z += i+1;
578 }else{
drhcd7d2732002-02-26 23:24:26 +0000579 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000580 break;
581 }
582 }
drhcd7d2732002-02-26 23:24:26 +0000583 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000584 }
585}
586
587/*
drhfeac5f82004-08-01 00:10:45 +0000588** Output the given string as a quoted according to C or TCL quoting rules.
589*/
590static void output_c_string(FILE *out, const char *z){
591 unsigned int c;
592 fputc('"', out);
593 while( (c = *(z++))!=0 ){
594 if( c=='\\' ){
595 fputc(c, out);
596 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000597 }else if( c=='"' ){
598 fputc('\\', out);
599 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000600 }else if( c=='\t' ){
601 fputc('\\', out);
602 fputc('t', out);
603 }else if( c=='\n' ){
604 fputc('\\', out);
605 fputc('n', out);
606 }else if( c=='\r' ){
607 fputc('\\', out);
608 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000609 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000610 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000611 }else{
612 fputc(c, out);
613 }
614 }
615 fputc('"', out);
616}
617
618/*
drhc08a4f12000-06-15 16:49:48 +0000619** Output the given string with characters that are special to
620** HTML escaped.
621*/
622static void output_html_string(FILE *out, const char *z){
623 int i;
drhc3d6ba42014-01-13 20:38:35 +0000624 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000625 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000626 for(i=0; z[i]
627 && z[i]!='<'
628 && z[i]!='&'
629 && z[i]!='>'
630 && z[i]!='\"'
631 && z[i]!='\'';
632 i++){}
drhc08a4f12000-06-15 16:49:48 +0000633 if( i>0 ){
634 fprintf(out,"%.*s",i,z);
635 }
636 if( z[i]=='<' ){
637 fprintf(out,"&lt;");
638 }else if( z[i]=='&' ){
639 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000640 }else if( z[i]=='>' ){
641 fprintf(out,"&gt;");
642 }else if( z[i]=='\"' ){
643 fprintf(out,"&quot;");
644 }else if( z[i]=='\'' ){
645 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000646 }else{
647 break;
648 }
649 z += i + 1;
650 }
651}
652
653/*
drhc49f44e2006-10-26 18:15:42 +0000654** If a field contains any character identified by a 1 in the following
655** array, then the string must be quoted for CSV.
656*/
657static const char needCsvQuote[] = {
658 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
659 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
660 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
661 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
662 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
663 0, 0, 0, 0, 0, 0, 0, 0, 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, 1,
666 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
667 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
668 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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};
675
676/*
drh8e64d1c2004-10-07 00:32:39 +0000677** Output a single term of CSV. Actually, p->separator is used for
678** the separator, which may or may not be a comma. p->nullvalue is
drh6976c212014-07-24 12:09:47 +0000679** the null value. Strings are quoted if necessary. The separator
680** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000681*/
drhdcd87a92014-08-18 13:45:42 +0000682static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000683 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000684 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000685 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000686 }else{
drhc49f44e2006-10-26 18:15:42 +0000687 int i;
drh4f21c4a2008-12-10 22:15:00 +0000688 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000689 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000690 if( needCsvQuote[((unsigned char*)z)[i]]
691 || (z[i]==p->separator[0] &&
692 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000693 i = 0;
694 break;
695 }
696 }
697 if( i==0 ){
698 putc('"', out);
699 for(i=0; z[i]; i++){
700 if( z[i]=='"' ) putc('"', out);
701 putc(z[i], out);
702 }
703 putc('"', out);
704 }else{
705 fprintf(out, "%s", z);
706 }
drh8e64d1c2004-10-07 00:32:39 +0000707 }
708 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000709 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000710 }
711}
712
danielk19774af00c62005-01-23 23:43:21 +0000713#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000714/*
drh4c504392000-10-16 22:06:40 +0000715** This routine runs when the user presses Ctrl-C
716*/
717static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000718 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000719 seenInterrupt++;
720 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000721 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000722}
danielk19774af00c62005-01-23 23:43:21 +0000723#endif
drh4c504392000-10-16 22:06:40 +0000724
725/*
shane626a6e42009-10-22 17:30:15 +0000726** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000727** invokes for each row of a query result.
728*/
shane626a6e42009-10-22 17:30:15 +0000729static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000730 int i;
drhdcd87a92014-08-18 13:45:42 +0000731 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000732
drh75897232000-05-29 14:26:00 +0000733 switch( p->mode ){
734 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000735 int w = 5;
drh6a535342001-10-19 16:44:56 +0000736 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000737 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000738 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000739 if( len>w ) w = len;
740 }
drh75897232000-05-29 14:26:00 +0000741 if( p->cnt++>0 ) fprintf(p->out,"\n");
742 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000743 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000744 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000745 }
746 break;
747 }
danielk19770d78bae2008-01-03 07:09:48 +0000748 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000749 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000750 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000751 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000752 int w, n;
753 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000754 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000755 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000756 w = 0;
drh75897232000-05-29 14:26:00 +0000757 }
drh078b1fd2012-09-21 13:40:02 +0000758 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000759 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000760 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000761 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000762 if( w<n ) w = n;
763 }
764 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000765 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000766 }
767 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000768 if( w<0 ){
769 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
770 }else{
771 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
772 }
drha0c66f52000-07-29 13:20:21 +0000773 }
774 }
775 if( p->showHeader ){
776 for(i=0; i<nArg; i++){
777 int w;
778 if( i<ArraySize(p->actualWidth) ){
779 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000780 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000781 }else{
782 w = 10;
783 }
784 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
785 "----------------------------------------------------------",
786 i==nArg-1 ? "\n": " ");
787 }
drh75897232000-05-29 14:26:00 +0000788 }
789 }
drh6a535342001-10-19 16:44:56 +0000790 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000791 for(i=0; i<nArg; i++){
792 int w;
drha0c66f52000-07-29 13:20:21 +0000793 if( i<ArraySize(p->actualWidth) ){
794 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000795 }else{
796 w = 10;
797 }
dana98bf362013-11-13 18:35:01 +0000798 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000799 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000800 }
dana98bf362013-11-13 18:35:01 +0000801 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000802 if( p->iIndent<p->nIndent ){
803 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000804 }
danc4650bb2013-11-18 08:41:06 +0000805 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000806 }
drh078b1fd2012-09-21 13:40:02 +0000807 if( w<0 ){
808 fprintf(p->out,"%*.*s%s",-w,-w,
809 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
810 }else{
811 fprintf(p->out,"%-*.*s%s",w,w,
812 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
813 }
drh75897232000-05-29 14:26:00 +0000814 }
815 break;
816 }
drhe3710332000-09-29 13:30:53 +0000817 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000818 case MODE_List: {
819 if( p->cnt++==0 && p->showHeader ){
820 for(i=0; i<nArg; i++){
821 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
822 }
823 }
drh6a535342001-10-19 16:44:56 +0000824 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000825 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000826 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000827 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000828 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000829 if( i<nArg-1 ){
830 fprintf(p->out, "%s", p->separator);
831 }else if( p->mode==MODE_Semi ){
832 fprintf(p->out, ";\n");
833 }else{
834 fprintf(p->out, "\n");
835 }
drh75897232000-05-29 14:26:00 +0000836 }
837 break;
838 }
drh1e5d0e92000-05-31 23:33:17 +0000839 case MODE_Html: {
840 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000841 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000842 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000843 fprintf(p->out,"<TH>");
844 output_html_string(p->out, azCol[i]);
845 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000846 }
mihailim57c591a2008-06-23 21:26:05 +0000847 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000848 }
drh6a535342001-10-19 16:44:56 +0000849 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000850 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000851 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000852 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000853 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000854 fprintf(p->out,"</TD>\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 break;
858 }
drhfeac5f82004-08-01 00:10:45 +0000859 case MODE_Tcl: {
860 if( p->cnt++==0 && p->showHeader ){
861 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000862 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000863 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000864 }
865 fprintf(p->out,"\n");
866 }
867 if( azArg==0 ) break;
868 for(i=0; i<nArg; i++){
869 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000870 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000871 }
872 fprintf(p->out,"\n");
873 break;
874 }
drh8e64d1c2004-10-07 00:32:39 +0000875 case MODE_Csv: {
drh6976c212014-07-24 12:09:47 +0000876#if defined(WIN32) || defined(_WIN32)
877 fflush(p->out);
878 _setmode(_fileno(p->out), _O_BINARY);
879#endif
drh8e64d1c2004-10-07 00:32:39 +0000880 if( p->cnt++==0 && p->showHeader ){
881 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000882 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000883 }
drh6976c212014-07-24 12:09:47 +0000884 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000885 }
drh40253262014-10-17 21:35:05 +0000886 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +0000887 for(i=0; i<nArg; i++){
888 output_csv(p, azArg[i], i<nArg-1);
889 }
890 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000891 }
drh6976c212014-07-24 12:09:47 +0000892#if defined(WIN32) || defined(_WIN32)
893 fflush(p->out);
894 _setmode(_fileno(p->out), _O_TEXT);
895#endif
drh8e64d1c2004-10-07 00:32:39 +0000896 break;
897 }
drh28bd4bc2000-06-15 15:57:22 +0000898 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000899 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000900 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000901 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000902 for(i=0; i<nArg; i++){
903 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000904 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000905 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000906 }else if( aiType && aiType[i]==SQLITE_TEXT ){
907 if( zSep[0] ) fprintf(p->out,"%s",zSep);
908 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +0000909 }else if( aiType && (aiType[i]==SQLITE_INTEGER
910 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +0000911 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000912 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
913 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
914 int nBlob = sqlite3_column_bytes(p->pStmt, i);
915 if( zSep[0] ) fprintf(p->out,"%s",zSep);
916 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000917 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000918 fprintf(p->out,"%s%s",zSep, azArg[i]);
919 }else{
920 if( zSep[0] ) fprintf(p->out,"%s",zSep);
921 output_quoted_string(p->out, azArg[i]);
922 }
923 }
924 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000925 break;
drh28bd4bc2000-06-15 15:57:22 +0000926 }
persicom1d0b8722002-04-18 02:53:04 +0000927 }
drh75897232000-05-29 14:26:00 +0000928 return 0;
929}
930
931/*
shane626a6e42009-10-22 17:30:15 +0000932** This is the callback routine that the SQLite library
933** invokes for each row of a query result.
934*/
935static int callback(void *pArg, int nArg, char **azArg, char **azCol){
936 /* since we don't have type info, call the shell_callback with a NULL value */
937 return shell_callback(pArg, nArg, azArg, azCol, NULL);
938}
939
940/*
drhdcd87a92014-08-18 13:45:42 +0000941** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +0000942** the name of the table given. Escape any quote characters in the
943** table name.
944*/
drhdcd87a92014-08-18 13:45:42 +0000945static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +0000946 int i, n;
947 int needQuote;
948 char *z;
949
950 if( p->zDestTable ){
951 free(p->zDestTable);
952 p->zDestTable = 0;
953 }
954 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000955 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000956 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000957 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000958 needQuote = 1;
959 if( zName[i]=='\'' ) n++;
960 }
961 }
962 if( needQuote ) n += 2;
963 z = p->zDestTable = malloc( n+1 );
964 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000965 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000966 exit(1);
967 }
968 n = 0;
969 if( needQuote ) z[n++] = '\'';
970 for(i=0; zName[i]; i++){
971 z[n++] = zName[i];
972 if( zName[i]=='\'' ) z[n++] = '\'';
973 }
974 if( needQuote ) z[n++] = '\'';
975 z[n] = 0;
976}
977
danielk19772a02e332004-06-05 08:04:36 +0000978/* zIn is either a pointer to a NULL-terminated string in memory obtained
979** from malloc(), or a NULL pointer. The string pointed to by zAppend is
980** added to zIn, and the result returned in memory obtained from malloc().
981** zIn, if it was not NULL, is freed.
982**
983** If the third argument, quote, is not '\0', then it is used as a
984** quote character for zAppend.
985*/
drhc28490c2006-10-26 14:25:58 +0000986static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000987 int len;
988 int i;
drh4f21c4a2008-12-10 22:15:00 +0000989 int nAppend = strlen30(zAppend);
990 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000991
992 len = nAppend+nIn+1;
993 if( quote ){
994 len += 2;
995 for(i=0; i<nAppend; i++){
996 if( zAppend[i]==quote ) len++;
997 }
998 }
999
1000 zIn = (char *)realloc(zIn, len);
1001 if( !zIn ){
1002 return 0;
1003 }
1004
1005 if( quote ){
1006 char *zCsr = &zIn[nIn];
1007 *zCsr++ = quote;
1008 for(i=0; i<nAppend; i++){
1009 *zCsr++ = zAppend[i];
1010 if( zAppend[i]==quote ) *zCsr++ = quote;
1011 }
1012 *zCsr++ = quote;
1013 *zCsr++ = '\0';
1014 assert( (zCsr-zIn)==len );
1015 }else{
1016 memcpy(&zIn[nIn], zAppend, nAppend);
1017 zIn[len-1] = '\0';
1018 }
1019
1020 return zIn;
1021}
1022
drhdd3d4592004-08-30 01:54:05 +00001023
1024/*
drhb21a8e42012-01-28 21:08:51 +00001025** Execute a query statement that will generate SQL output. Print
1026** the result columns, comma-separated, on a line and then add a
1027** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001028**
drhb21a8e42012-01-28 21:08:51 +00001029** If the number of columns is 1 and that column contains text "--"
1030** then write the semicolon on a separate line. That way, if a
1031** "--" comment occurs at the end of the statement, the comment
1032** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001033*/
drh157e29a2009-05-21 15:15:00 +00001034static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001035 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001036 const char *zSelect, /* SELECT statement to extract content */
1037 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001038){
drhdd3d4592004-08-30 01:54:05 +00001039 sqlite3_stmt *pSelect;
1040 int rc;
drhb21a8e42012-01-28 21:08:51 +00001041 int nResult;
1042 int i;
1043 const char *z;
drhc7181902014-02-27 15:04:13 +00001044 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001045 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001046 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001047 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001048 return rc;
1049 }
1050 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001051 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001052 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001053 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001054 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001055 zFirstRow = 0;
1056 }
drhb21a8e42012-01-28 21:08:51 +00001057 z = (const char*)sqlite3_column_text(pSelect, 0);
1058 fprintf(p->out, "%s", z);
1059 for(i=1; i<nResult; i++){
1060 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1061 }
1062 if( z==0 ) z = "";
1063 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1064 if( z[0] ){
1065 fprintf(p->out, "\n;\n");
1066 }else{
1067 fprintf(p->out, ";\n");
1068 }
drhdd3d4592004-08-30 01:54:05 +00001069 rc = sqlite3_step(pSelect);
1070 }
drh2f464a02011-10-13 00:41:49 +00001071 rc = sqlite3_finalize(pSelect);
1072 if( rc!=SQLITE_OK ){
1073 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001074 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001075 }
1076 return rc;
drhdd3d4592004-08-30 01:54:05 +00001077}
1078
shane626a6e42009-10-22 17:30:15 +00001079/*
1080** Allocate space and save off current error string.
1081*/
1082static char *save_err_msg(
1083 sqlite3 *db /* Database to query */
1084){
1085 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1086 char *zErrMsg = sqlite3_malloc(nErrMsg);
1087 if( zErrMsg ){
1088 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1089 }
1090 return zErrMsg;
1091}
1092
1093/*
shaneh642d8b82010-07-28 16:05:34 +00001094** Display memory stats.
1095*/
1096static int display_stats(
1097 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001098 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001099 int bReset /* True to reset the stats */
1100){
1101 int iCur;
1102 int iHiwtr;
1103
1104 if( pArg && pArg->out ){
1105
1106 iHiwtr = iCur = -1;
1107 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001108 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001109 iHiwtr = iCur = -1;
1110 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001111 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001112 if( pArg->shellFlgs & SHFLG_Pagecache ){
1113 iHiwtr = iCur = -1;
1114 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1116 }
shaneh642d8b82010-07-28 16:05:34 +00001117 iHiwtr = iCur = -1;
1118 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001120 if( pArg->shellFlgs & SHFLG_Scratch ){
1121 iHiwtr = iCur = -1;
1122 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1123 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1124 }
shaneh642d8b82010-07-28 16:05:34 +00001125 iHiwtr = iCur = -1;
1126 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1127 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1128 iHiwtr = iCur = -1;
1129 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1130 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1131 iHiwtr = iCur = -1;
1132 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1133 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1134 iHiwtr = iCur = -1;
1135 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1137#ifdef YYTRACKMAXSTACKDEPTH
1138 iHiwtr = iCur = -1;
1139 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1140 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1141#endif
1142 }
1143
1144 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001145 if( pArg->shellFlgs & SHFLG_Lookaside ){
1146 iHiwtr = iCur = -1;
1147 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1148 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
1149 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1150 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1151 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1152 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1153 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1154 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1155 }
shaneh642d8b82010-07-28 16:05:34 +00001156 iHiwtr = iCur = -1;
1157 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001158 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1159 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1160 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1161 iHiwtr = iCur = -1;
1162 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1163 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001164 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001165 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1166 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1167 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001168 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1169 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1170 iHiwtr = iCur = -1;
1171 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1172 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1173 }
1174
1175 if( pArg && pArg->out && db && pArg->pStmt ){
1176 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1177 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1178 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1179 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1180 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1181 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001182 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1183 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001184 }
1185
1186 return 0;
1187}
1188
1189/*
dan8d1edb92014-11-05 09:07:28 +00001190** Display scan stats.
1191*/
1192static void display_scanstats(
1193 sqlite3 *db, /* Database to query */
1194 ShellState *pArg /* Pointer to ShellState */
1195){
1196#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
1197 int i;
1198 fprintf(pArg->out, "-------- scanstats --------\n");
1199 for(i=0; 1; i++){
1200 sqlite3_stmt *p = pArg->pStmt;
1201 sqlite3_int64 nEst, nLoop, nVisit;
1202 const char *zExplain;
1203 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1204 break;
1205 }
1206 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1207 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&nEst);
1208 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1209
1210 fprintf(pArg->out, "Loop %d: \"%s\"\n", i, zExplain);
1211 fprintf(pArg->out, " nLoop=%-8lld nVisit=%-8lld nEst=%-8lld\n",
1212 nLoop, nVisit, nEst
1213 );
1214 }
1215#else
1216 fprintf(pArg->out, "-------- scanstats --------\n");
1217 fprintf(pArg->out,
1218 "sqlite3_stmt_scanstatus() unavailable - "
1219 "rebuild with SQLITE_ENABLE_STMT_SCANSTATUS\n"
1220 );
1221#endif
1222 fprintf(pArg->out, "---------------------------\n");
1223}
1224
1225/*
dana98bf362013-11-13 18:35:01 +00001226** Parameter azArray points to a zero-terminated array of strings. zStr
1227** points to a single nul-terminated string. Return non-zero if zStr
1228** is equal, according to strcmp(), to any of the strings in the array.
1229** Otherwise, return zero.
1230*/
1231static int str_in_array(const char *zStr, const char **azArray){
1232 int i;
1233 for(i=0; azArray[i]; i++){
1234 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1235 }
1236 return 0;
1237}
1238
1239/*
1240** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001241** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001242** spaces each opcode should be indented before it is output.
1243**
1244** The indenting rules are:
1245**
1246** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1247** all opcodes that occur between the p2 jump destination and the opcode
1248** itself by 2 spaces.
1249**
drh01752bc2013-11-14 23:59:33 +00001250** * For each "Goto", if the jump destination is earlier in the program
1251** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001252** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001253** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001254** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001255** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001256*/
drhdcd87a92014-08-18 13:45:42 +00001257static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001258 const char *zSql; /* The text of the SQL statement */
1259 const char *z; /* Used to check if this is an EXPLAIN */
1260 int *abYield = 0; /* True if op is an OP_Yield */
1261 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001262 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001263
drh8ad0de32014-03-20 18:45:27 +00001264 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1265 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001266 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001267 const char *azGoto[] = { "Goto", 0 };
1268
1269 /* Try to figure out if this is really an EXPLAIN statement. If this
1270 ** cannot be verified, return early. */
1271 zSql = sqlite3_sql(pSql);
1272 if( zSql==0 ) return;
1273 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1274 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1275
1276 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1277 int i;
danc4650bb2013-11-18 08:41:06 +00001278 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001279 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001280
1281 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1282 ** p2 is an instruction address, set variable p2op to the index of that
1283 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1284 ** the current instruction is part of a sub-program generated by an
1285 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001286 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001287 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001288
1289 /* Grow the p->aiIndent array as required */
1290 if( iOp>=nAlloc ){
1291 nAlloc += 100;
1292 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1293 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1294 }
1295 abYield[iOp] = str_in_array(zOp, azYield);
1296 p->aiIndent[iOp] = 0;
1297 p->nIndent = iOp+1;
1298
1299 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001300 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001301 }
drhfe705102014-03-06 13:38:37 +00001302 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1303 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1304 ){
drhe73f0592014-01-21 22:25:45 +00001305 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001306 }
1307 }
1308
danc4650bb2013-11-18 08:41:06 +00001309 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001310 sqlite3_free(abYield);
1311 sqlite3_reset(pSql);
1312}
1313
1314/*
1315** Free the array allocated by explain_data_prepare().
1316*/
drhdcd87a92014-08-18 13:45:42 +00001317static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001318 sqlite3_free(p->aiIndent);
1319 p->aiIndent = 0;
1320 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001321 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001322}
1323
1324/*
shane626a6e42009-10-22 17:30:15 +00001325** Execute a statement or set of statements. Print
1326** any result rows/columns depending on the current mode
1327** set via the supplied callback.
1328**
1329** This is very similar to SQLite's built-in sqlite3_exec()
1330** function except it takes a slightly different callback
1331** and callback data argument.
1332*/
1333static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001334 sqlite3 *db, /* An open database */
1335 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001336 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001337 /* (not the same as sqlite3_exec) */
1338 ShellState *pArg, /* Pointer to ShellState */
1339 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001340){
dan4564ced2010-01-05 04:59:56 +00001341 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1342 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001343 int rc2;
dan4564ced2010-01-05 04:59:56 +00001344 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001345
1346 if( pzErrMsg ){
1347 *pzErrMsg = NULL;
1348 }
1349
shaneb9fc17d2009-10-22 21:23:35 +00001350 while( zSql[0] && (SQLITE_OK == rc) ){
1351 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1352 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001353 if( pzErrMsg ){
1354 *pzErrMsg = save_err_msg(db);
1355 }
1356 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001357 if( !pStmt ){
1358 /* this happens for a comment or white-space */
1359 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001360 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001361 continue;
1362 }
shane626a6e42009-10-22 17:30:15 +00001363
shaneh642d8b82010-07-28 16:05:34 +00001364 /* save off the prepared statment handle and reset row count */
1365 if( pArg ){
1366 pArg->pStmt = pStmt;
1367 pArg->cnt = 0;
1368 }
1369
shanehb7977c52010-01-18 18:17:10 +00001370 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001371 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001372 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001373 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001374 }
shanehb7977c52010-01-18 18:17:10 +00001375
drhefbf3b12014-02-28 20:47:24 +00001376 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1377 if( pArg && pArg->autoEQP ){
1378 sqlite3_stmt *pExplain;
1379 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1380 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1381 if( rc==SQLITE_OK ){
1382 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1383 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1384 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1385 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1386 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1387 }
1388 }
1389 sqlite3_finalize(pExplain);
1390 sqlite3_free(zEQP);
1391 }
1392
dana98bf362013-11-13 18:35:01 +00001393 /* If the shell is currently in ".explain" mode, gather the extra
1394 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001395 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001396 explain_data_prepare(pArg, pStmt);
1397 }
1398
shaneb9fc17d2009-10-22 21:23:35 +00001399 /* perform the first step. this will tell us if we
1400 ** have a result set or not and how wide it is.
1401 */
1402 rc = sqlite3_step(pStmt);
1403 /* if we have a result set... */
1404 if( SQLITE_ROW == rc ){
1405 /* if we have a callback... */
1406 if( xCallback ){
1407 /* allocate space for col name ptr, value ptr, and type */
1408 int nCol = sqlite3_column_count(pStmt);
1409 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1410 if( !pData ){
1411 rc = SQLITE_NOMEM;
1412 }else{
1413 char **azCols = (char **)pData; /* Names of result columns */
1414 char **azVals = &azCols[nCol]; /* Results */
1415 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001416 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001417 assert(sizeof(int) <= sizeof(char *));
1418 /* save off ptrs to column names */
1419 for(i=0; i<nCol; i++){
1420 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1421 }
shaneb9fc17d2009-10-22 21:23:35 +00001422 do{
1423 /* extract the data and data types */
1424 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001425 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001426 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001427 azVals[i] = "";
1428 }else{
1429 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1430 }
shaneb9fc17d2009-10-22 21:23:35 +00001431 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1432 rc = SQLITE_NOMEM;
1433 break; /* from for */
1434 }
1435 } /* end for */
1436
1437 /* if data and types extracted successfully... */
1438 if( SQLITE_ROW == rc ){
1439 /* call the supplied callback with the result row data */
1440 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1441 rc = SQLITE_ABORT;
1442 }else{
1443 rc = sqlite3_step(pStmt);
1444 }
1445 }
1446 } while( SQLITE_ROW == rc );
1447 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001448 }
1449 }else{
1450 do{
1451 rc = sqlite3_step(pStmt);
1452 } while( rc == SQLITE_ROW );
1453 }
1454 }
1455
dana98bf362013-11-13 18:35:01 +00001456 explain_data_delete(pArg);
1457
shaneh642d8b82010-07-28 16:05:34 +00001458 /* print usage stats if stats on */
1459 if( pArg && pArg->statsOn ){
1460 display_stats(db, pArg, 0);
1461 }
1462
dan8d1edb92014-11-05 09:07:28 +00001463 /* print loop-counters if required */
1464 if( pArg && pArg->scanstatsOn ){
1465 display_scanstats(db, pArg);
1466 }
1467
dan4564ced2010-01-05 04:59:56 +00001468 /* Finalize the statement just executed. If this fails, save a
1469 ** copy of the error message. Otherwise, set zSql to point to the
1470 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001471 rc2 = sqlite3_finalize(pStmt);
1472 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001473 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001474 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001475 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001476 }else if( pzErrMsg ){
1477 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001478 }
shaneh642d8b82010-07-28 16:05:34 +00001479
1480 /* clear saved stmt handle */
1481 if( pArg ){
1482 pArg->pStmt = NULL;
1483 }
shane626a6e42009-10-22 17:30:15 +00001484 }
shaneb9fc17d2009-10-22 21:23:35 +00001485 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001486
1487 return rc;
1488}
1489
drhdd3d4592004-08-30 01:54:05 +00001490
drh33048c02001-10-01 14:29:22 +00001491/*
drh4c653a02000-06-07 01:27:47 +00001492** This is a different callback routine used for dumping the database.
1493** Each row received by this callback consists of a table name,
1494** the table type ("index" or "table") and SQL to create the table.
1495** This routine should print text sufficient to recreate the table.
1496*/
1497static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001498 int rc;
1499 const char *zTable;
1500 const char *zType;
1501 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001502 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001503 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001504
drh902b9ee2008-12-05 17:17:07 +00001505 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001506 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001507 zTable = azArg[0];
1508 zType = azArg[1];
1509 zSql = azArg[2];
1510
drh00b950d2005-09-11 02:03:03 +00001511 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001512 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001513 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001514 fprintf(p->out, "ANALYZE sqlite_master;\n");
1515 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1516 return 0;
drh45e29d82006-11-20 16:21:10 +00001517 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1518 char *zIns;
1519 if( !p->writableSchema ){
1520 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1521 p->writableSchema = 1;
1522 }
1523 zIns = sqlite3_mprintf(
1524 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1525 "VALUES('table','%q','%q',0,'%q');",
1526 zTable, zTable, zSql);
1527 fprintf(p->out, "%s\n", zIns);
1528 sqlite3_free(zIns);
1529 return 0;
drh00b950d2005-09-11 02:03:03 +00001530 }else{
1531 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001532 }
danielk19772a02e332004-06-05 08:04:36 +00001533
1534 if( strcmp(zType, "table")==0 ){
1535 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001536 char *zSelect = 0;
1537 char *zTableInfo = 0;
1538 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001539 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001540
1541 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1542 zTableInfo = appendText(zTableInfo, zTable, '"');
1543 zTableInfo = appendText(zTableInfo, ");", 0);
1544
drhc7181902014-02-27 15:04:13 +00001545 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001546 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001547 if( rc!=SQLITE_OK || !pTableInfo ){
1548 return 1;
1549 }
1550
1551 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001552 /* Always quote the table name, even if it appears to be pure ascii,
1553 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1554 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001555 if( zTmp ){
1556 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001557 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001558 }
1559 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1560 rc = sqlite3_step(pTableInfo);
1561 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001562 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001563 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001564 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001565 rc = sqlite3_step(pTableInfo);
1566 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001567 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001568 }else{
1569 zSelect = appendText(zSelect, ") ", 0);
1570 }
drh157e29a2009-05-21 15:15:00 +00001571 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001572 }
1573 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001574 if( rc!=SQLITE_OK || nRow==0 ){
1575 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001576 return 1;
1577 }
1578 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1579 zSelect = appendText(zSelect, zTable, '"');
1580
drh2f464a02011-10-13 00:41:49 +00001581 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001582 if( rc==SQLITE_CORRUPT ){
1583 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001584 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001585 }
drh85e72432012-04-11 11:38:53 +00001586 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001587 }
drh4c653a02000-06-07 01:27:47 +00001588 return 0;
1589}
1590
1591/*
drh45e29d82006-11-20 16:21:10 +00001592** Run zQuery. Use dump_callback() as the callback routine so that
1593** the contents of the query are output as SQL statements.
1594**
drhdd3d4592004-08-30 01:54:05 +00001595** If we get a SQLITE_CORRUPT error, rerun the query after appending
1596** "ORDER BY rowid DESC" to the end.
1597*/
1598static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001599 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001600 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001601){
1602 int rc;
drh2f464a02011-10-13 00:41:49 +00001603 char *zErr = 0;
1604 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001605 if( rc==SQLITE_CORRUPT ){
1606 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001607 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001608 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1609 if( zErr ){
1610 fprintf(p->out, "/****** %s ******/\n", zErr);
1611 sqlite3_free(zErr);
1612 zErr = 0;
1613 }
drhdd3d4592004-08-30 01:54:05 +00001614 zQ2 = malloc( len+100 );
1615 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001616 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001617 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1618 if( rc ){
1619 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1620 }else{
1621 rc = SQLITE_CORRUPT;
1622 }
1623 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001624 free(zQ2);
1625 }
1626 return rc;
1627}
1628
1629/*
drh75897232000-05-29 14:26:00 +00001630** Text of a help message
1631*/
persicom1d0b8722002-04-18 02:53:04 +00001632static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001633 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001634 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001635 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001636 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001637 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001638 " If TABLE specified, only dump tables matching\n"
1639 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001640 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001641 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001642 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001643 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001644 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001645 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001646 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001647 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001648 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001649 ".indices ?TABLE? Show names of all indices\n"
1650 " If TABLE specified, only show indices for tables\n"
1651 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001652#ifdef SQLITE_ENABLE_IOTRACE
1653 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1654#endif
drh70df4fe2006-06-13 15:12:21 +00001655#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001656 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001657#endif
drh127f9d72010-02-23 01:47:00 +00001658 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001659 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001660 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001661 " column Left-aligned columns. (See .width)\n"
1662 " html HTML <table> code\n"
1663 " insert SQL insert statements for TABLE\n"
1664 " line One value per line\n"
1665 " list Values delimited by .separator string\n"
1666 " tabs Tab-separated values\n"
1667 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001668 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001669 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001670 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001671 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001672 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001673 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001674 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001675 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001676 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001677 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001678 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001679 " If TABLE specified, only show tables matching\n"
1680 " LIKE pattern TABLE.\n"
drh6976c212014-07-24 12:09:47 +00001681 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1682 " NL is the end-of-line mark for CSV\n"
drh62cdde52014-05-28 20:22:28 +00001683 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001684 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001685 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001686 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001687 ".tables ?TABLE? List names of tables\n"
1688 " If TABLE specified, only list tables matching\n"
1689 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001690 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001691 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001692 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001693 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001694 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001695 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001696;
1697
drhdaffd0e2001-04-11 14:28:42 +00001698/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001699static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001700/*
1701** Implementation of the "readfile(X)" SQL function. The entire content
1702** of the file named X is read and returned as a BLOB. NULL is returned
1703** if the file does not exist or is unreadable.
1704*/
1705static void readfileFunc(
1706 sqlite3_context *context,
1707 int argc,
1708 sqlite3_value **argv
1709){
1710 const char *zName;
1711 FILE *in;
1712 long nIn;
1713 void *pBuf;
1714
1715 zName = (const char*)sqlite3_value_text(argv[0]);
1716 if( zName==0 ) return;
1717 in = fopen(zName, "rb");
1718 if( in==0 ) return;
1719 fseek(in, 0, SEEK_END);
1720 nIn = ftell(in);
1721 rewind(in);
1722 pBuf = sqlite3_malloc( nIn );
1723 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1724 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1725 }else{
1726 sqlite3_free(pBuf);
1727 }
1728 fclose(in);
1729}
1730
1731/*
1732** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1733** is written into file X. The number of bytes written is returned. Or
1734** NULL is returned if something goes wrong, such as being unable to open
1735** file X for writing.
1736*/
1737static void writefileFunc(
1738 sqlite3_context *context,
1739 int argc,
1740 sqlite3_value **argv
1741){
1742 FILE *out;
1743 const char *z;
drhba5b0932014-07-24 12:39:59 +00001744 sqlite3_int64 rc;
1745 const char *zFile;
1746
1747 zFile = (const char*)sqlite3_value_text(argv[0]);
1748 if( zFile==0 ) return;
1749 out = fopen(zFile, "wb");
1750 if( out==0 ) return;
1751 z = (const char*)sqlite3_value_blob(argv[1]);
1752 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001753 rc = 0;
1754 }else{
drh490fe862014-08-11 14:21:32 +00001755 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001756 }
1757 fclose(out);
1758 sqlite3_result_int64(context, rc);
1759}
drhdaffd0e2001-04-11 14:28:42 +00001760
drh75897232000-05-29 14:26:00 +00001761/*
drh44c2eb12003-04-30 11:38:26 +00001762** Make sure the database is open. If it is not, then open it. If
1763** the database fails to open, print an error message and exit.
1764*/
drhdcd87a92014-08-18 13:45:42 +00001765static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001766 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001767 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001768 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001769 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001770 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1771 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1772 shellstaticFunc, 0, 0);
1773 }
1774 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001775 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001776 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001777 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001778 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001779 }
drhc2e87a32006-06-27 15:16:14 +00001780#ifndef SQLITE_OMIT_LOAD_EXTENSION
1781 sqlite3_enable_load_extension(p->db, 1);
1782#endif
drhba5b0932014-07-24 12:39:59 +00001783 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1784 readfileFunc, 0, 0);
1785 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1786 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001787 }
1788}
1789
1790/*
drhfeac5f82004-08-01 00:10:45 +00001791** Do C-language style dequoting.
1792**
1793** \t -> tab
1794** \n -> newline
1795** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001796** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001797** \NNN -> ascii character NNN in octal
1798** \\ -> backslash
1799*/
1800static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001801 int i, j;
1802 char c;
drhc2ce0be2014-05-29 12:36:14 +00001803 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001804 for(i=j=0; (c = z[i])!=0; i++, j++){
1805 if( c=='\\' ){
1806 c = z[++i];
1807 if( c=='n' ){
1808 c = '\n';
1809 }else if( c=='t' ){
1810 c = '\t';
1811 }else if( c=='r' ){
1812 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001813 }else if( c=='\\' ){
1814 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001815 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001816 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001817 if( z[i+1]>='0' && z[i+1]<='7' ){
1818 i++;
1819 c = (c<<3) + z[i] - '0';
1820 if( z[i+1]>='0' && z[i+1]<='7' ){
1821 i++;
1822 c = (c<<3) + z[i] - '0';
1823 }
1824 }
1825 }
1826 }
1827 z[j] = c;
1828 }
drhc2ce0be2014-05-29 12:36:14 +00001829 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001830}
1831
1832/*
drh348d19c2013-06-03 12:47:43 +00001833** Return the value of a hexadecimal digit. Return -1 if the input
1834** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001835*/
drh348d19c2013-06-03 12:47:43 +00001836static int hexDigitValue(char c){
1837 if( c>='0' && c<='9' ) return c - '0';
1838 if( c>='a' && c<='f' ) return c - 'a' + 10;
1839 if( c>='A' && c<='F' ) return c - 'A' + 10;
1840 return -1;
drhc28490c2006-10-26 14:25:58 +00001841}
1842
1843/*
drh7d9f3942013-04-03 01:26:54 +00001844** Interpret zArg as an integer value, possibly with suffixes.
1845*/
1846static sqlite3_int64 integerValue(const char *zArg){
1847 sqlite3_int64 v = 0;
1848 static const struct { char *zSuffix; int iMult; } aMult[] = {
1849 { "KiB", 1024 },
1850 { "MiB", 1024*1024 },
1851 { "GiB", 1024*1024*1024 },
1852 { "KB", 1000 },
1853 { "MB", 1000000 },
1854 { "GB", 1000000000 },
1855 { "K", 1000 },
1856 { "M", 1000000 },
1857 { "G", 1000000000 },
1858 };
1859 int i;
1860 int isNeg = 0;
1861 if( zArg[0]=='-' ){
1862 isNeg = 1;
1863 zArg++;
1864 }else if( zArg[0]=='+' ){
1865 zArg++;
1866 }
drh348d19c2013-06-03 12:47:43 +00001867 if( zArg[0]=='0' && zArg[1]=='x' ){
1868 int x;
1869 zArg += 2;
1870 while( (x = hexDigitValue(zArg[0]))>=0 ){
1871 v = (v<<4) + x;
1872 zArg++;
1873 }
1874 }else{
1875 while( IsDigit(zArg[0]) ){
1876 v = v*10 + zArg[0] - '0';
1877 zArg++;
1878 }
drh7d9f3942013-04-03 01:26:54 +00001879 }
drhc2bed0a2013-05-24 11:57:50 +00001880 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001881 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1882 v *= aMult[i].iMult;
1883 break;
1884 }
1885 }
1886 return isNeg? -v : v;
1887}
1888
1889/*
drh348d19c2013-06-03 12:47:43 +00001890** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1891** for TRUE and FALSE. Return the integer value if appropriate.
1892*/
1893static int booleanValue(char *zArg){
1894 int i;
1895 if( zArg[0]=='0' && zArg[1]=='x' ){
1896 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1897 }else{
1898 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1899 }
1900 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1901 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1902 return 1;
1903 }
1904 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1905 return 0;
1906 }
1907 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1908 zArg);
1909 return 0;
1910}
1911
1912/*
drh42f64e52012-04-04 16:56:23 +00001913** Close an output file, assuming it is not stderr or stdout
1914*/
1915static void output_file_close(FILE *f){
1916 if( f && f!=stdout && f!=stderr ) fclose(f);
1917}
1918
1919/*
1920** Try to open an output file. The names "stdout" and "stderr" are
1921** recognized and do the right thing. NULL is returned if the output
1922** filename is "off".
1923*/
1924static FILE *output_file_open(const char *zFile){
1925 FILE *f;
1926 if( strcmp(zFile,"stdout")==0 ){
1927 f = stdout;
1928 }else if( strcmp(zFile, "stderr")==0 ){
1929 f = stderr;
1930 }else if( strcmp(zFile, "off")==0 ){
1931 f = 0;
1932 }else{
1933 f = fopen(zFile, "wb");
1934 if( f==0 ){
1935 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1936 }
1937 }
1938 return f;
1939}
1940
1941/*
1942** A routine for handling output from sqlite3_trace().
1943*/
1944static void sql_trace_callback(void *pArg, const char *z){
1945 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00001946 if( f ){
1947 int i = (int)strlen(z);
1948 while( i>0 && z[i-1]==';' ){ i--; }
1949 fprintf(f, "%.*s;\n", i, z);
1950 }
drh42f64e52012-04-04 16:56:23 +00001951}
1952
1953/*
drhd8621b92012-04-17 09:09:33 +00001954** A no-op routine that runs with the ".breakpoint" doc-command. This is
1955** a useful spot to set a debugger breakpoint.
1956*/
1957static void test_breakpoint(void){
1958 static int nCall = 0;
1959 nCall++;
1960}
1961
1962/*
drhdb95f682013-06-26 22:46:00 +00001963** An object used to read a CSV file
1964*/
1965typedef struct CSVReader CSVReader;
1966struct CSVReader {
1967 const char *zFile; /* Name of the input file */
1968 FILE *in; /* Read the CSV text from this input stream */
1969 char *z; /* Accumulated text for a field */
1970 int n; /* Number of bytes in z */
1971 int nAlloc; /* Space allocated for z[] */
1972 int nLine; /* Current line number */
1973 int cTerm; /* Character that terminated the most recent field */
1974 int cSeparator; /* The separator character. (Usually ",") */
1975};
1976
1977/* Append a single byte to z[] */
1978static void csv_append_char(CSVReader *p, int c){
1979 if( p->n+1>=p->nAlloc ){
1980 p->nAlloc += p->nAlloc + 100;
1981 p->z = sqlite3_realloc(p->z, p->nAlloc);
1982 if( p->z==0 ){
1983 fprintf(stderr, "out of memory\n");
1984 exit(1);
1985 }
1986 }
1987 p->z[p->n++] = (char)c;
1988}
1989
1990/* Read a single field of CSV text. Compatible with rfc4180 and extended
1991** with the option of having a separator other than ",".
1992**
1993** + Input comes from p->in.
1994** + Store results in p->z of length p->n. Space to hold p->z comes
1995** from sqlite3_malloc().
1996** + Use p->cSep as the separator. The default is ",".
1997** + Keep track of the line number in p->nLine.
1998** + Store the character that terminates the field in p->cTerm. Store
1999** EOF on end-of-file.
2000** + Report syntax errors on stderr
2001*/
2002static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00002003 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002004 int cSep = p->cSeparator;
2005 p->n = 0;
2006 c = fgetc(p->in);
2007 if( c==EOF || seenInterrupt ){
2008 p->cTerm = EOF;
2009 return 0;
2010 }
2011 if( c=='"' ){
2012 int startLine = p->nLine;
2013 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002014 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002015 while( 1 ){
2016 c = fgetc(p->in);
2017 if( c=='\n' ) p->nLine++;
2018 if( c==cQuote ){
2019 if( pc==cQuote ){
2020 pc = 0;
2021 continue;
2022 }
2023 }
2024 if( (c==cSep && pc==cQuote)
2025 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00002026 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002027 || (c==EOF && pc==cQuote)
2028 ){
2029 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002030 p->cTerm = c;
2031 break;
2032 }
2033 if( pc==cQuote && c!='\r' ){
2034 fprintf(stderr, "%s:%d: unescaped %c character\n",
2035 p->zFile, p->nLine, cQuote);
2036 }
2037 if( c==EOF ){
2038 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2039 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00002040 p->cTerm = EOF;
2041 break;
2042 }
2043 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002044 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002045 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002046 }
drhdb95f682013-06-26 22:46:00 +00002047 }else{
drhd0a64dc2013-06-30 20:24:26 +00002048 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00002049 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002050 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002051 }
2052 if( c=='\n' ){
2053 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002054 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002055 }
drhdb95f682013-06-26 22:46:00 +00002056 p->cTerm = c;
2057 }
drh8dd675e2013-07-12 21:09:24 +00002058 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002059 return p->z;
2060}
2061
2062/*
drh4bbcf102014-02-06 02:46:08 +00002063** Try to transfer data for table zTable. If an error is seen while
2064** moving forward, try to go backwards. The backwards movement won't
2065** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002066*/
mistachkine31ae902014-02-06 01:15:29 +00002067static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002068 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002069 sqlite3 *newDb,
2070 const char *zTable
2071){
2072 sqlite3_stmt *pQuery = 0;
2073 sqlite3_stmt *pInsert = 0;
2074 char *zQuery = 0;
2075 char *zInsert = 0;
2076 int rc;
2077 int i, j, n;
2078 int nTable = (int)strlen(zTable);
2079 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002080 int cnt = 0;
2081 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002082
2083 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2084 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2085 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002086 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002087 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2088 zQuery);
2089 goto end_data_xfer;
2090 }
2091 n = sqlite3_column_count(pQuery);
2092 zInsert = sqlite3_malloc(200 + nTable + n*3);
2093 if( zInsert==0 ){
2094 fprintf(stderr, "out of memory\n");
2095 goto end_data_xfer;
2096 }
2097 sqlite3_snprintf(200+nTable,zInsert,
2098 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2099 i = (int)strlen(zInsert);
2100 for(j=1; j<n; j++){
2101 memcpy(zInsert+i, ",?", 2);
2102 i += 2;
2103 }
2104 memcpy(zInsert+i, ");", 3);
2105 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2106 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002107 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002108 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2109 zQuery);
2110 goto end_data_xfer;
2111 }
2112 for(k=0; k<2; k++){
2113 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2114 for(i=0; i<n; i++){
2115 switch( sqlite3_column_type(pQuery, i) ){
2116 case SQLITE_NULL: {
2117 sqlite3_bind_null(pInsert, i+1);
2118 break;
2119 }
2120 case SQLITE_INTEGER: {
2121 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2122 break;
2123 }
2124 case SQLITE_FLOAT: {
2125 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2126 break;
2127 }
2128 case SQLITE_TEXT: {
2129 sqlite3_bind_text(pInsert, i+1,
2130 (const char*)sqlite3_column_text(pQuery,i),
2131 -1, SQLITE_STATIC);
2132 break;
2133 }
2134 case SQLITE_BLOB: {
2135 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2136 sqlite3_column_bytes(pQuery,i),
2137 SQLITE_STATIC);
2138 break;
2139 }
2140 }
2141 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002142 rc = sqlite3_step(pInsert);
2143 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2144 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2145 sqlite3_errmsg(newDb));
2146 }
drh3350ce92014-02-06 00:49:12 +00002147 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002148 cnt++;
2149 if( (cnt%spinRate)==0 ){
2150 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2151 fflush(stdout);
2152 }
drh3350ce92014-02-06 00:49:12 +00002153 } /* End while */
2154 if( rc==SQLITE_DONE ) break;
2155 sqlite3_finalize(pQuery);
2156 sqlite3_free(zQuery);
2157 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2158 zTable);
2159 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2160 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002161 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2162 break;
drh3350ce92014-02-06 00:49:12 +00002163 }
2164 } /* End for(k=0...) */
2165
2166end_data_xfer:
2167 sqlite3_finalize(pQuery);
2168 sqlite3_finalize(pInsert);
2169 sqlite3_free(zQuery);
2170 sqlite3_free(zInsert);
2171}
2172
2173
2174/*
2175** Try to transfer all rows of the schema that match zWhere. For
2176** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002177** If an error is encountered while moving forward through the
2178** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002179*/
mistachkine31ae902014-02-06 01:15:29 +00002180static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002181 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002182 sqlite3 *newDb,
2183 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002184 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002185){
2186 sqlite3_stmt *pQuery = 0;
2187 char *zQuery = 0;
2188 int rc;
2189 const unsigned char *zName;
2190 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002191 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002192
2193 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2194 " WHERE %s", zWhere);
2195 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2196 if( rc ){
2197 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2198 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2199 zQuery);
2200 goto end_schema_xfer;
2201 }
2202 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2203 zName = sqlite3_column_text(pQuery, 0);
2204 zSql = sqlite3_column_text(pQuery, 1);
2205 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002206 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2207 if( zErrMsg ){
2208 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2209 sqlite3_free(zErrMsg);
2210 zErrMsg = 0;
2211 }
drh3350ce92014-02-06 00:49:12 +00002212 if( xForEach ){
2213 xForEach(p, newDb, (const char*)zName);
2214 }
2215 printf("done\n");
2216 }
2217 if( rc!=SQLITE_DONE ){
2218 sqlite3_finalize(pQuery);
2219 sqlite3_free(zQuery);
2220 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2221 " WHERE %s ORDER BY rowid DESC", zWhere);
2222 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2223 if( rc ){
2224 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2225 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2226 zQuery);
2227 goto end_schema_xfer;
2228 }
2229 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2230 zName = sqlite3_column_text(pQuery, 0);
2231 zSql = sqlite3_column_text(pQuery, 1);
2232 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002233 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2234 if( zErrMsg ){
2235 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2236 sqlite3_free(zErrMsg);
2237 zErrMsg = 0;
2238 }
drh3350ce92014-02-06 00:49:12 +00002239 if( xForEach ){
2240 xForEach(p, newDb, (const char*)zName);
2241 }
2242 printf("done\n");
2243 }
2244 }
2245end_schema_xfer:
2246 sqlite3_finalize(pQuery);
2247 sqlite3_free(zQuery);
2248}
2249
2250/*
2251** Open a new database file named "zNewDb". Try to recover as much information
2252** as possible out of the main database (which might be corrupt) and write it
2253** into zNewDb.
2254*/
drhdcd87a92014-08-18 13:45:42 +00002255static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002256 int rc;
2257 sqlite3 *newDb = 0;
2258 if( access(zNewDb,0)==0 ){
2259 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2260 return;
2261 }
2262 rc = sqlite3_open(zNewDb, &newDb);
2263 if( rc ){
2264 fprintf(stderr, "Cannot create output database: %s\n",
2265 sqlite3_errmsg(newDb));
2266 }else{
drh54d0d2d2014-04-03 00:32:13 +00002267 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002268 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002269 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2270 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002271 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002272 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002273 }
2274 sqlite3_close(newDb);
2275}
2276
2277/*
drhc2ce0be2014-05-29 12:36:14 +00002278** Change the output file back to stdout
2279*/
drhdcd87a92014-08-18 13:45:42 +00002280static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002281 if( p->outfile[0]=='|' ){
2282 pclose(p->out);
2283 }else{
2284 output_file_close(p->out);
2285 }
2286 p->outfile[0] = 0;
2287 p->out = stdout;
2288}
2289
2290/*
drh75897232000-05-29 14:26:00 +00002291** If an input line begins with "." then invoke this routine to
2292** process that line.
drh67505e72002-04-19 12:34:06 +00002293**
drh47ad6842006-11-08 12:25:42 +00002294** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002295*/
drhdcd87a92014-08-18 13:45:42 +00002296static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002297 int i = 1;
2298 int nArg = 0;
2299 int n, c;
drh67505e72002-04-19 12:34:06 +00002300 int rc = 0;
drh75897232000-05-29 14:26:00 +00002301 char *azArg[50];
2302
2303 /* Parse the input line into tokens.
2304 */
2305 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002306 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002307 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002308 if( zLine[i]=='\'' || zLine[i]=='"' ){
2309 int delim = zLine[i++];
2310 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002311 while( zLine[i] && zLine[i]!=delim ){
2312 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2313 i++;
2314 }
drh75897232000-05-29 14:26:00 +00002315 if( zLine[i]==delim ){
2316 zLine[i++] = 0;
2317 }
drhfeac5f82004-08-01 00:10:45 +00002318 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002319 }else{
2320 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002321 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002322 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002323 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002324 }
2325 }
2326
2327 /* Process the input line.
2328 */
shane9bd1b442009-10-23 01:27:39 +00002329 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002330 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002331 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002332 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2333 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2334 ){
drhbc46f022013-01-23 18:53:23 +00002335 const char *zDestFile = 0;
2336 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002337 sqlite3 *pDest;
2338 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002339 int j;
2340 for(j=1; j<nArg; j++){
2341 const char *z = azArg[j];
2342 if( z[0]=='-' ){
2343 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002344 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002345 {
2346 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2347 return 1;
2348 }
2349 }else if( zDestFile==0 ){
2350 zDestFile = azArg[j];
2351 }else if( zDb==0 ){
2352 zDb = zDestFile;
2353 zDestFile = azArg[j];
2354 }else{
2355 fprintf(stderr, "too many arguments to .backup\n");
2356 return 1;
2357 }
drh9ff849f2009-02-04 20:55:57 +00002358 }
drhbc46f022013-01-23 18:53:23 +00002359 if( zDestFile==0 ){
2360 fprintf(stderr, "missing FILENAME argument on .backup\n");
2361 return 1;
2362 }
2363 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002364 rc = sqlite3_open(zDestFile, &pDest);
2365 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002366 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002367 sqlite3_close(pDest);
2368 return 1;
2369 }
drh05782482013-10-24 15:20:20 +00002370 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002371 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2372 if( pBackup==0 ){
2373 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2374 sqlite3_close(pDest);
2375 return 1;
2376 }
2377 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2378 sqlite3_backup_finish(pBackup);
2379 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002380 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002381 }else{
2382 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002383 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002384 }
2385 sqlite3_close(pDest);
2386 }else
2387
drhc2ce0be2014-05-29 12:36:14 +00002388 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2389 if( nArg==2 ){
2390 bail_on_error = booleanValue(azArg[1]);
2391 }else{
2392 fprintf(stderr, "Usage: .bail on|off\n");
2393 rc = 1;
2394 }
drhc49f44e2006-10-26 18:15:42 +00002395 }else
2396
drhd8621b92012-04-17 09:09:33 +00002397 /* The undocumented ".breakpoint" command causes a call to the no-op
2398 ** routine named test_breakpoint().
2399 */
2400 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2401 test_breakpoint();
2402 }else
2403
drhc2ce0be2014-05-29 12:36:14 +00002404 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2405 if( nArg==2 ){
2406 tryToClone(p, azArg[1]);
2407 }else{
2408 fprintf(stderr, "Usage: .clone FILENAME\n");
2409 rc = 1;
2410 }
mistachkine31ae902014-02-06 01:15:29 +00002411 }else
2412
drhc2ce0be2014-05-29 12:36:14 +00002413 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002414 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002415 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002416 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002417 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002418 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002419 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002420 data.colWidth[0] = 3;
2421 data.colWidth[1] = 15;
2422 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002423 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002424 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002425 if( zErrMsg ){
2426 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002427 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002428 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002429 }
2430 }else
2431
drhc2ce0be2014-05-29 12:36:14 +00002432 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002433 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002434 /* When playing back a "dump", the content might appear in an order
2435 ** which causes immediate foreign key constraints to be violated.
2436 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002437 if( nArg!=1 && nArg!=2 ){
2438 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2439 rc = 1;
2440 goto meta_command_exit;
2441 }
drhf1dfc4f2009-09-23 15:51:35 +00002442 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002443 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002444 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002445 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002446 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002447 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002448 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002449 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002450 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002451 );
2452 run_schema_dump_query(p,
2453 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002454 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002455 );
drh2f464a02011-10-13 00:41:49 +00002456 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002457 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002458 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002459 );
drh4c653a02000-06-07 01:27:47 +00002460 }else{
2461 int i;
drhdd3d4592004-08-30 01:54:05 +00002462 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002463 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002464 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002465 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002466 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002467 " AND sql NOT NULL");
2468 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002469 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002470 "WHERE sql NOT NULL"
2471 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002472 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002473 );
danielk1977bc6ada42004-06-30 08:20:16 +00002474 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002475 }
2476 }
drh45e29d82006-11-20 16:21:10 +00002477 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002478 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002479 p->writableSchema = 0;
2480 }
drh56197952011-10-13 16:30:13 +00002481 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2482 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002483 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002484 }else
drh75897232000-05-29 14:26:00 +00002485
drhc2ce0be2014-05-29 12:36:14 +00002486 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2487 if( nArg==2 ){
2488 p->echoOn = booleanValue(azArg[1]);
2489 }else{
2490 fprintf(stderr, "Usage: .echo on|off\n");
2491 rc = 1;
2492 }
drhdaffd0e2001-04-11 14:28:42 +00002493 }else
2494
drhc2ce0be2014-05-29 12:36:14 +00002495 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2496 if( nArg==2 ){
2497 p->autoEQP = booleanValue(azArg[1]);
2498 }else{
2499 fprintf(stderr, "Usage: .eqp on|off\n");
2500 rc = 1;
2501 }
drhefbf3b12014-02-28 20:47:24 +00002502 }else
2503
drhd3ac7d92013-01-25 18:33:43 +00002504 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002505 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002506 rc = 2;
drh75897232000-05-29 14:26:00 +00002507 }else
2508
drhc2ce0be2014-05-29 12:36:14 +00002509 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002510 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002511 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002512 if(!p->normalMode.valid) {
2513 p->normalMode.valid = 1;
2514 p->normalMode.mode = p->mode;
2515 p->normalMode.showHeader = p->showHeader;
2516 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002517 }
2518 /* We could put this code under the !p->explainValid
2519 ** condition so that it does not execute if we are already in
2520 ** explain mode. However, always executing it allows us an easy
2521 ** was to reset to explain mode in case the user previously
2522 ** did an .explain followed by a .width, .mode or .header
2523 ** command.
2524 */
danielk19770d78bae2008-01-03 07:09:48 +00002525 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002526 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002527 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002528 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002529 p->colWidth[1] = 13; /* opcode */
2530 p->colWidth[2] = 4; /* P1 */
2531 p->colWidth[3] = 4; /* P2 */
2532 p->colWidth[4] = 4; /* P3 */
2533 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002534 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002535 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002536 }else if (p->normalMode.valid) {
2537 p->normalMode.valid = 0;
2538 p->mode = p->normalMode.mode;
2539 p->showHeader = p->normalMode.showHeader;
2540 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002541 }
drh75897232000-05-29 14:26:00 +00002542 }else
2543
drhc1971542014-06-23 23:28:13 +00002544 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002545 ShellState data;
drhc1971542014-06-23 23:28:13 +00002546 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002547 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002548 if( nArg!=1 ){
2549 fprintf(stderr, "Usage: .fullschema\n");
2550 rc = 1;
2551 goto meta_command_exit;
2552 }
2553 open_db(p, 0);
2554 memcpy(&data, p, sizeof(data));
2555 data.showHeader = 0;
2556 data.mode = MODE_Semi;
2557 rc = sqlite3_exec(p->db,
2558 "SELECT sql FROM"
2559 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2560 " FROM sqlite_master UNION ALL"
2561 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002562 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002563 "ORDER BY rowid",
2564 callback, &data, &zErrMsg
2565 );
drh56f674c2014-07-18 14:43:29 +00002566 if( rc==SQLITE_OK ){
2567 sqlite3_stmt *pStmt;
2568 rc = sqlite3_prepare_v2(p->db,
2569 "SELECT rowid FROM sqlite_master"
2570 " WHERE name GLOB 'sqlite_stat[134]'",
2571 -1, &pStmt, 0);
2572 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2573 sqlite3_finalize(pStmt);
2574 }
2575 if( doStats==0 ){
2576 fprintf(p->out, "/* No STAT tables available */\n");
2577 }else{
2578 fprintf(p->out, "ANALYZE sqlite_master;\n");
2579 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2580 callback, &data, &zErrMsg);
2581 data.mode = MODE_Insert;
2582 data.zDestTable = "sqlite_stat1";
2583 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2584 shell_callback, &data,&zErrMsg);
2585 data.zDestTable = "sqlite_stat3";
2586 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2587 shell_callback, &data,&zErrMsg);
2588 data.zDestTable = "sqlite_stat4";
2589 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2590 shell_callback, &data, &zErrMsg);
2591 fprintf(p->out, "ANALYZE sqlite_master;\n");
2592 }
drhc1971542014-06-23 23:28:13 +00002593 }else
2594
drhc2ce0be2014-05-29 12:36:14 +00002595 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2596 if( nArg==2 ){
2597 p->showHeader = booleanValue(azArg[1]);
2598 }else{
2599 fprintf(stderr, "Usage: .headers on|off\n");
2600 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002601 }
drh75897232000-05-29 14:26:00 +00002602 }else
2603
drhc2ce0be2014-05-29 12:36:14 +00002604 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2605 fprintf(p->out, "%s", zHelp);
2606 }else
2607
2608 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002609 char *zTable; /* Insert data into this table */
2610 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002611 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002612 int nCol; /* Number of columns in the table */
2613 int nByte; /* Number of bytes in an SQL string */
2614 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002615 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002616 int nSep; /* Number of bytes in p->separator[] */
2617 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002618 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002619 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002620
drhc2ce0be2014-05-29 12:36:14 +00002621 if( nArg!=3 ){
2622 fprintf(stderr, "Usage: .import FILE TABLE\n");
2623 goto meta_command_exit;
2624 }
drh01f37542014-05-31 15:43:33 +00002625 zFile = azArg[1];
2626 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002627 seenInterrupt = 0;
2628 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002629 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002630 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002631 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002632 fprintf(stderr, "Error: non-null separator required for import\n");
2633 return 1;
drhfeac5f82004-08-01 00:10:45 +00002634 }
drhdb95f682013-06-26 22:46:00 +00002635 if( nSep>1 ){
2636 fprintf(stderr, "Error: multi-character separators not allowed"
2637 " for import\n");
2638 return 1;
2639 }
drh5bde8162013-06-27 14:07:53 +00002640 sCsv.zFile = zFile;
2641 sCsv.nLine = 1;
2642 if( sCsv.zFile[0]=='|' ){
2643 sCsv.in = popen(sCsv.zFile+1, "r");
2644 sCsv.zFile = "<pipe>";
2645 xCloser = pclose;
2646 }else{
2647 sCsv.in = fopen(sCsv.zFile, "rb");
2648 xCloser = fclose;
2649 }
drhdb95f682013-06-26 22:46:00 +00002650 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002651 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002652 return 1;
2653 }
2654 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002655 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002656 if( zSql==0 ){
2657 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002658 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002659 return 1;
2660 }
drh4f21c4a2008-12-10 22:15:00 +00002661 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002662 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002663 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002664 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2665 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2666 char cSep = '(';
2667 while( csv_read_one_field(&sCsv) ){
2668 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2669 cSep = ',';
2670 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2671 }
drh5bde8162013-06-27 14:07:53 +00002672 if( cSep=='(' ){
2673 sqlite3_free(zCreate);
2674 sqlite3_free(sCsv.z);
2675 xCloser(sCsv.in);
2676 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2677 return 1;
2678 }
drhdb95f682013-06-26 22:46:00 +00002679 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2680 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2681 sqlite3_free(zCreate);
2682 if( rc ){
2683 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2684 sqlite3_errmsg(db));
2685 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002686 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002687 return 1;
2688 }
drhc7181902014-02-27 15:04:13 +00002689 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002690 }
drhfeac5f82004-08-01 00:10:45 +00002691 sqlite3_free(zSql);
2692 if( rc ){
shane916f9612009-10-23 00:37:15 +00002693 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002694 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002695 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002696 return 1;
drhfeac5f82004-08-01 00:10:45 +00002697 }
shane916f9612009-10-23 00:37:15 +00002698 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002699 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002700 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002701 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002702 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002703 if( zSql==0 ){
2704 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002705 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002706 return 1;
2707 }
drhdb95f682013-06-26 22:46:00 +00002708 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002709 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002710 for(i=1; i<nCol; i++){
2711 zSql[j++] = ',';
2712 zSql[j++] = '?';
2713 }
2714 zSql[j++] = ')';
2715 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002716 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002717 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002718 if( rc ){
2719 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002720 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002721 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002722 return 1;
drhfeac5f82004-08-01 00:10:45 +00002723 }
drh2d463112013-08-06 14:36:36 +00002724 needCommit = sqlite3_get_autocommit(db);
2725 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002726 do{
2727 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002728 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002729 char *z = csv_read_one_field(&sCsv);
2730 if( z==0 && i==0 ) break;
2731 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2732 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2733 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2734 "filling the rest with NULL\n",
2735 sCsv.zFile, startLine, nCol, i+1);
2736 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002737 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002738 }
drhfeac5f82004-08-01 00:10:45 +00002739 }
drhdb95f682013-06-26 22:46:00 +00002740 if( sCsv.cTerm==sCsv.cSeparator ){
2741 do{
2742 csv_read_one_field(&sCsv);
2743 i++;
2744 }while( sCsv.cTerm==sCsv.cSeparator );
2745 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2746 "extras ignored\n",
2747 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002748 }
drhdb95f682013-06-26 22:46:00 +00002749 if( i>=nCol ){
2750 sqlite3_step(pStmt);
2751 rc = sqlite3_reset(pStmt);
2752 if( rc!=SQLITE_OK ){
2753 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2754 sqlite3_errmsg(db));
2755 }
2756 }
2757 }while( sCsv.cTerm!=EOF );
2758
drh5bde8162013-06-27 14:07:53 +00002759 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002760 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002761 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002762 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002763 }else
2764
drhc2ce0be2014-05-29 12:36:14 +00002765 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002766 ShellState data;
drh75897232000-05-29 14:26:00 +00002767 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002768 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002769 memcpy(&data, p, sizeof(data));
2770 data.showHeader = 0;
2771 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002772 if( nArg==1 ){
2773 rc = sqlite3_exec(p->db,
2774 "SELECT name FROM sqlite_master "
2775 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2776 "UNION ALL "
2777 "SELECT name FROM sqlite_temp_master "
2778 "WHERE type='index' "
2779 "ORDER BY 1",
2780 callback, &data, &zErrMsg
2781 );
drhc2ce0be2014-05-29 12:36:14 +00002782 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002783 zShellStatic = azArg[1];
2784 rc = sqlite3_exec(p->db,
2785 "SELECT name FROM sqlite_master "
2786 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2787 "UNION ALL "
2788 "SELECT name FROM sqlite_temp_master "
2789 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2790 "ORDER BY 1",
2791 callback, &data, &zErrMsg
2792 );
2793 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002794 }else{
2795 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2796 rc = 1;
2797 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002798 }
drh75897232000-05-29 14:26:00 +00002799 if( zErrMsg ){
2800 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002801 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002802 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002803 }else if( rc != SQLITE_OK ){
2804 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2805 rc = 1;
drh75897232000-05-29 14:26:00 +00002806 }
2807 }else
2808
drhae5e4452007-05-03 17:18:36 +00002809#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002810 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002811 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002812 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2813 iotrace = 0;
2814 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002815 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002816 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002817 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002818 iotrace = stdout;
2819 }else{
2820 iotrace = fopen(azArg[1], "w");
2821 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002822 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002823 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002824 rc = 1;
drhb0603412007-02-28 04:47:26 +00002825 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002826 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002827 }
2828 }
2829 }else
drhae5e4452007-05-03 17:18:36 +00002830#endif
drhb0603412007-02-28 04:47:26 +00002831
drh70df4fe2006-06-13 15:12:21 +00002832#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002833 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002834 const char *zFile, *zProc;
2835 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002836 if( nArg<2 ){
2837 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2838 rc = 1;
2839 goto meta_command_exit;
2840 }
drh1e397f82006-06-08 15:28:43 +00002841 zFile = azArg[1];
2842 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002843 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002844 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2845 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002846 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002847 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002848 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002849 }
2850 }else
drh70df4fe2006-06-13 15:12:21 +00002851#endif
drh1e397f82006-06-08 15:28:43 +00002852
drhc2ce0be2014-05-29 12:36:14 +00002853 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2854 if( nArg!=2 ){
2855 fprintf(stderr, "Usage: .log FILENAME\n");
2856 rc = 1;
2857 }else{
2858 const char *zFile = azArg[1];
2859 output_file_close(p->pLog);
2860 p->pLog = output_file_open(zFile);
2861 }
drh127f9d72010-02-23 01:47:00 +00002862 }else
2863
drhc2ce0be2014-05-29 12:36:14 +00002864 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2865 const char *zMode = nArg>=2 ? azArg[1] : "";
2866 int n2 = (int)strlen(zMode);
2867 int c2 = zMode[0];
2868 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002869 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002870 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002871 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002872 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002873 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002874 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002875 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002876 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002877 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002878 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002879 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002880 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002881 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drh6976c212014-07-24 12:09:47 +00002882 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
drhc2ce0be2014-05-29 12:36:14 +00002883 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002884 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002885 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002886 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002887 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002888 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002889 }else {
shane9bd1b442009-10-23 01:27:39 +00002890 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002891 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002892 rc = 1;
drh75897232000-05-29 14:26:00 +00002893 }
2894 }else
2895
drhc2ce0be2014-05-29 12:36:14 +00002896 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2897 if( nArg==2 ){
2898 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2899 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2900 }else{
2901 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002902 rc = 1;
2903 }
2904 }else
2905
drh05782482013-10-24 15:20:20 +00002906 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2907 sqlite3 *savedDb = p->db;
2908 const char *zSavedFilename = p->zDbFilename;
2909 char *zNewFilename = 0;
2910 p->db = 0;
2911 if( nArg>=2 ){
2912 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2913 }
2914 open_db(p, 1);
2915 if( p->db!=0 ){
2916 sqlite3_close(savedDb);
2917 sqlite3_free(p->zFreeOnClose);
2918 p->zFreeOnClose = zNewFilename;
2919 }else{
2920 sqlite3_free(zNewFilename);
2921 p->db = savedDb;
2922 p->zDbFilename = zSavedFilename;
2923 }
2924 }else
2925
drhc2ce0be2014-05-29 12:36:14 +00002926 if( c=='o'
2927 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2928 ){
2929 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2930 if( nArg>2 ){
2931 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2932 rc = 1;
2933 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002934 }
drhc2ce0be2014-05-29 12:36:14 +00002935 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2936 if( nArg<2 ){
2937 fprintf(stderr, "Usage: .once FILE\n");
2938 rc = 1;
2939 goto meta_command_exit;
2940 }
2941 p->outCount = 2;
2942 }else{
2943 p->outCount = 0;
2944 }
2945 output_reset(p);
2946 if( zFile[0]=='|' ){
2947 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002948 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002949 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002950 p->out = stdout;
2951 rc = 1;
2952 }else{
drhc2ce0be2014-05-29 12:36:14 +00002953 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002954 }
drh75897232000-05-29 14:26:00 +00002955 }else{
drhc2ce0be2014-05-29 12:36:14 +00002956 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002957 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002958 if( strcmp(zFile,"off")!=0 ){
2959 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002960 }
drh75897232000-05-29 14:26:00 +00002961 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002962 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002963 } else {
drhc2ce0be2014-05-29 12:36:14 +00002964 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002965 }
2966 }
2967 }else
2968
drh078b1fd2012-09-21 13:40:02 +00002969 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2970 int i;
2971 for(i=1; i<nArg; i++){
2972 if( i>1 ) fprintf(p->out, " ");
2973 fprintf(p->out, "%s", azArg[i]);
2974 }
2975 fprintf(p->out, "\n");
2976 }else
2977
drhc2ce0be2014-05-29 12:36:14 +00002978 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002979 if( nArg >= 2) {
2980 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2981 }
2982 if( nArg >= 3) {
2983 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2984 }
2985 }else
2986
drhc2ce0be2014-05-29 12:36:14 +00002987 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002988 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002989 }else
2990
drhc2ce0be2014-05-29 12:36:14 +00002991 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
2992 FILE *alt;
2993 if( nArg!=2 ){
2994 fprintf(stderr, "Usage: .read FILE\n");
2995 rc = 1;
2996 goto meta_command_exit;
2997 }
2998 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002999 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003000 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3001 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003002 }else{
shane9bd1b442009-10-23 01:27:39 +00003003 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003004 fclose(alt);
3005 }
3006 }else
3007
drhc2ce0be2014-05-29 12:36:14 +00003008 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003009 const char *zSrcFile;
3010 const char *zDb;
3011 sqlite3 *pSrc;
3012 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003013 int nTimeout = 0;
3014
drh9ff849f2009-02-04 20:55:57 +00003015 if( nArg==2 ){
3016 zSrcFile = azArg[1];
3017 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003018 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003019 zSrcFile = azArg[2];
3020 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003021 }else{
3022 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3023 rc = 1;
3024 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003025 }
3026 rc = sqlite3_open(zSrcFile, &pSrc);
3027 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003028 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003029 sqlite3_close(pSrc);
3030 return 1;
3031 }
drh05782482013-10-24 15:20:20 +00003032 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003033 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3034 if( pBackup==0 ){
3035 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3036 sqlite3_close(pSrc);
3037 return 1;
3038 }
drhdc2c4912009-02-04 22:46:47 +00003039 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3040 || rc==SQLITE_BUSY ){
3041 if( rc==SQLITE_BUSY ){
3042 if( nTimeout++ >= 3 ) break;
3043 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003044 }
3045 }
3046 sqlite3_backup_finish(pBackup);
3047 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003048 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003049 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003050 fprintf(stderr, "Error: source database is busy\n");
3051 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003052 }else{
3053 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003054 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003055 }
3056 sqlite3_close(pSrc);
3057 }else
3058
dan8d1edb92014-11-05 09:07:28 +00003059
3060 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3061 if( nArg==2 ){
3062 p->scanstatsOn = booleanValue(azArg[1]);
3063 }else{
3064 fprintf(stderr, "Usage: .scanstats on|off\n");
3065 rc = 1;
3066 }
3067 }else
3068
drhc2ce0be2014-05-29 12:36:14 +00003069 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003070 ShellState data;
drh75897232000-05-29 14:26:00 +00003071 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003072 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003073 memcpy(&data, p, sizeof(data));
3074 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003075 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003076 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003077 int i;
drhf0693c82011-10-11 20:41:54 +00003078 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003079 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003080 char *new_argv[2], *new_colv[2];
3081 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3082 " type text,\n"
3083 " name text,\n"
3084 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003085 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003086 " sql text\n"
3087 ")";
3088 new_argv[1] = 0;
3089 new_colv[0] = "sql";
3090 new_colv[1] = 0;
3091 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003092 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003093 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003094 char *new_argv[2], *new_colv[2];
3095 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3096 " type text,\n"
3097 " name text,\n"
3098 " tbl_name text,\n"
3099 " rootpage integer,\n"
3100 " sql text\n"
3101 ")";
3102 new_argv[1] = 0;
3103 new_colv[0] = "sql";
3104 new_colv[1] = 0;
3105 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003106 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003107 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003108 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003109 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003110 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003111 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003112 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003113 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003114 "WHERE lower(tbl_name) LIKE shellstatic()"
3115 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003116 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003117 callback, &data, &zErrMsg);
3118 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003119 }
drhc2ce0be2014-05-29 12:36:14 +00003120 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003121 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003122 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003123 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003124 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003125 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003126 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003127 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003128 callback, &data, &zErrMsg
3129 );
drhc2ce0be2014-05-29 12:36:14 +00003130 }else{
3131 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3132 rc = 1;
3133 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003134 }
drh75897232000-05-29 14:26:00 +00003135 if( zErrMsg ){
3136 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003137 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003138 rc = 1;
3139 }else if( rc != SQLITE_OK ){
3140 fprintf(stderr,"Error: querying schema information\n");
3141 rc = 1;
3142 }else{
3143 rc = 0;
drh75897232000-05-29 14:26:00 +00003144 }
3145 }else
3146
drhabd4c722014-09-20 18:18:33 +00003147
3148#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3149 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3150 extern int sqlite3SelectTrace;
3151 sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3152 }else
3153#endif
3154
3155
drh340f5822013-06-27 13:01:21 +00003156#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003157 /* Undocumented commands for internal testing. Subject to change
3158 ** without notice. */
3159 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3160 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3161 int i, v;
3162 for(i=1; i<nArg; i++){
3163 v = booleanValue(azArg[i]);
3164 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3165 }
3166 }
3167 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3168 int i; sqlite3_int64 v;
3169 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003170 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003171 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003172 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003173 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003174 }
3175 }
3176 }else
drh340f5822013-06-27 13:01:21 +00003177#endif
drh348d19c2013-06-03 12:47:43 +00003178
drhc2ce0be2014-05-29 12:36:14 +00003179 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003180 if( nArg<2 || nArg>3 ){
3181 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
drhc2ce0be2014-05-29 12:36:14 +00003182 rc = 1;
3183 }
drh6976c212014-07-24 12:09:47 +00003184 if( nArg>=2 ){
3185 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3186 }
3187 if( nArg>=3 ){
3188 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3189 }
drh75897232000-05-29 14:26:00 +00003190 }else
3191
drh62cdde52014-05-28 20:22:28 +00003192 if( c=='s'
3193 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003194 ){
3195 char *zCmd;
drh54027102014-08-06 14:36:53 +00003196 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003197 if( nArg<2 ){
3198 fprintf(stderr, "Usage: .system COMMAND\n");
3199 rc = 1;
3200 goto meta_command_exit;
3201 }
drhdcb3e3d2014-05-29 03:17:29 +00003202 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003203 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003204 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3205 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003206 }
drh54027102014-08-06 14:36:53 +00003207 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003208 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003209 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003210 }else
3211
drhc2ce0be2014-05-29 12:36:14 +00003212 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003213 int i;
drhc2ce0be2014-05-29 12:36:14 +00003214 if( nArg!=1 ){
3215 fprintf(stderr, "Usage: .show\n");
3216 rc = 1;
3217 goto meta_command_exit;
3218 }
persicom7e2dfdd2002-04-18 02:46:52 +00003219 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003220 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003221 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003222 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003223 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003224 fprintf(p->out,"%9.9s: ", "nullvalue");
3225 output_c_string(p->out, p->nullvalue);
3226 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003227 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003228 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003229 fprintf(p->out,"%9.9s: ", "separator");
3230 output_c_string(p->out, p->separator);
drh6976c212014-07-24 12:09:47 +00003231 fprintf(p->out," ");
3232 output_c_string(p->out, p->newline);
drhfeac5f82004-08-01 00:10:45 +00003233 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003234 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003235 fprintf(p->out,"%9.9s: ","width");
3236 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003237 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003238 }
drhfeac5f82004-08-01 00:10:45 +00003239 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003240 }else
3241
drhc2ce0be2014-05-29 12:36:14 +00003242 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3243 if( nArg==2 ){
3244 p->statsOn = booleanValue(azArg[1]);
3245 }else{
3246 fprintf(stderr, "Usage: .stats on|off\n");
3247 rc = 1;
3248 }
shaneh642d8b82010-07-28 16:05:34 +00003249 }else
3250
drhc2ce0be2014-05-29 12:36:14 +00003251 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003252 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003253 char **azResult;
drh98781232012-04-23 12:38:05 +00003254 int nRow, nAlloc;
3255 char *zSql = 0;
3256 int ii;
drh05782482013-10-24 15:20:20 +00003257 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003258 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3259 if( rc ) return rc;
3260 zSql = sqlite3_mprintf(
3261 "SELECT name FROM sqlite_master"
3262 " WHERE type IN ('table','view')"
3263 " AND name NOT LIKE 'sqlite_%%'"
3264 " AND name LIKE ?1");
3265 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3266 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3267 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3268 if( strcmp(zDbName,"temp")==0 ){
3269 zSql = sqlite3_mprintf(
3270 "%z UNION ALL "
3271 "SELECT 'temp.' || name FROM sqlite_temp_master"
3272 " WHERE type IN ('table','view')"
3273 " AND name NOT LIKE 'sqlite_%%'"
3274 " AND name LIKE ?1", zSql);
3275 }else{
3276 zSql = sqlite3_mprintf(
3277 "%z UNION ALL "
3278 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3279 " WHERE type IN ('table','view')"
3280 " AND name NOT LIKE 'sqlite_%%'"
3281 " AND name LIKE ?1", zSql, zDbName, zDbName);
3282 }
drha50da102000-08-08 20:19:09 +00003283 }
drh98781232012-04-23 12:38:05 +00003284 sqlite3_finalize(pStmt);
3285 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3286 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3287 sqlite3_free(zSql);
3288 if( rc ) return rc;
3289 nRow = nAlloc = 0;
3290 azResult = 0;
3291 if( nArg>1 ){
3292 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003293 }else{
drh98781232012-04-23 12:38:05 +00003294 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3295 }
3296 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3297 if( nRow>=nAlloc ){
3298 char **azNew;
3299 int n = nAlloc*2 + 10;
3300 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3301 if( azNew==0 ){
3302 fprintf(stderr, "Error: out of memory\n");
3303 break;
3304 }
3305 nAlloc = n;
3306 azResult = azNew;
3307 }
3308 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3309 if( azResult[nRow] ) nRow++;
3310 }
3311 sqlite3_finalize(pStmt);
3312 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003313 int len, maxlen = 0;
3314 int i, j;
3315 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003316 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003317 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003318 if( len>maxlen ) maxlen = len;
3319 }
3320 nPrintCol = 80/(maxlen+2);
3321 if( nPrintCol<1 ) nPrintCol = 1;
3322 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3323 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003324 for(j=i; j<nRow; j+=nPrintRow){
3325 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003326 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003327 }
drh151b7d52013-05-06 20:28:54 +00003328 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003329 }
3330 }
drh98781232012-04-23 12:38:05 +00003331 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3332 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003333 }else
3334
shaneh96887e12011-02-10 21:08:58 +00003335 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003336 static const struct {
3337 const char *zCtrlName; /* Name of a test-control option */
3338 int ctrlCode; /* Integer code for that option */
3339 } aCtrl[] = {
3340 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3341 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3342 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3343 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3344 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3345 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3346 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3347 { "assert", SQLITE_TESTCTRL_ASSERT },
3348 { "always", SQLITE_TESTCTRL_ALWAYS },
3349 { "reserve", SQLITE_TESTCTRL_RESERVE },
3350 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3351 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003352 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003353 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003354 };
shaneh96887e12011-02-10 21:08:58 +00003355 int testctrl = -1;
3356 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003357 int i, n;
drh05782482013-10-24 15:20:20 +00003358 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003359
drhd416fe72011-03-17 16:45:50 +00003360 /* convert testctrl text option to value. allow any unique prefix
3361 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003362 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003363 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003364 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3365 if( testctrl<0 ){
3366 testctrl = aCtrl[i].ctrlCode;
3367 }else{
drhb07028f2011-10-14 21:49:18 +00003368 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003369 testctrl = -1;
3370 break;
3371 }
3372 }
3373 }
drh348d19c2013-06-03 12:47:43 +00003374 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003375 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3376 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3377 }else{
3378 switch(testctrl){
3379
3380 /* sqlite3_test_control(int, db, int) */
3381 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3382 case SQLITE_TESTCTRL_RESERVE:
3383 if( nArg==3 ){
3384 int opt = (int)strtol(azArg[2], 0, 0);
3385 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003386 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003387 } else {
drhd416fe72011-03-17 16:45:50 +00003388 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3389 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003390 }
3391 break;
3392
3393 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003394 case SQLITE_TESTCTRL_PRNG_SAVE:
3395 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003396 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003397 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003398 if( nArg==2 ){
3399 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003400 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003401 } else {
3402 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3403 }
3404 break;
3405
3406 /* sqlite3_test_control(int, uint) */
3407 case SQLITE_TESTCTRL_PENDING_BYTE:
3408 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003409 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003410 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003411 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003412 } else {
drhd416fe72011-03-17 16:45:50 +00003413 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3414 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003415 }
3416 break;
3417
3418 /* sqlite3_test_control(int, int) */
3419 case SQLITE_TESTCTRL_ASSERT:
3420 case SQLITE_TESTCTRL_ALWAYS:
3421 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003422 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003423 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003424 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003425 } else {
drhd416fe72011-03-17 16:45:50 +00003426 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3427 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003428 }
3429 break;
3430
3431 /* sqlite3_test_control(int, char *) */
3432#ifdef SQLITE_N_KEYWORD
3433 case SQLITE_TESTCTRL_ISKEYWORD:
3434 if( nArg==3 ){
3435 const char *opt = azArg[2];
3436 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003437 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003438 } else {
drhd416fe72011-03-17 16:45:50 +00003439 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3440 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003441 }
3442 break;
3443#endif
3444
3445 case SQLITE_TESTCTRL_BITVEC_TEST:
3446 case SQLITE_TESTCTRL_FAULT_INSTALL:
3447 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3448 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3449 default:
drhd416fe72011-03-17 16:45:50 +00003450 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3451 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003452 break;
3453 }
3454 }
3455 }else
3456
drhc2ce0be2014-05-29 12:36:14 +00003457 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003458 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003459 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003460 }else
3461
drhc2ce0be2014-05-29 12:36:14 +00003462 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3463 if( nArg==2 ){
3464 enableTimer = booleanValue(azArg[1]);
3465 if( enableTimer && !HAS_TIMER ){
3466 fprintf(stderr, "Error: timer not available on this system.\n");
3467 enableTimer = 0;
3468 }
3469 }else{
3470 fprintf(stderr, "Usage: .timer on|off\n");
3471 rc = 1;
3472 }
shanehe2aa9d72009-11-06 17:20:17 +00003473 }else
3474
drhc2ce0be2014-05-29 12:36:14 +00003475 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003476 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003477 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003478 if( nArg!=2 ){
3479 fprintf(stderr, "Usage: .trace FILE|off\n");
3480 rc = 1;
3481 goto meta_command_exit;
3482 }
drh42f64e52012-04-04 16:56:23 +00003483 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003484#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003485 if( p->traceOut==0 ){
3486 sqlite3_trace(p->db, 0, 0);
3487 }else{
3488 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3489 }
3490#endif
3491 }else
3492
drhf442e332014-09-10 19:01:14 +00003493#if SQLITE_USER_AUTHENTICATION
3494 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3495 if( nArg<2 ){
3496 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3497 rc = 1;
3498 goto meta_command_exit;
3499 }
drh7883ecf2014-09-11 16:19:31 +00003500 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003501 if( strcmp(azArg[1],"login")==0 ){
3502 if( nArg!=4 ){
3503 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3504 rc = 1;
3505 goto meta_command_exit;
3506 }
drhd39c40f2014-09-11 00:27:53 +00003507 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3508 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003509 if( rc ){
3510 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3511 rc = 1;
3512 }
3513 }else if( strcmp(azArg[1],"add")==0 ){
3514 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003515 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003516 rc = 1;
3517 goto meta_command_exit;
3518 }
drhd39c40f2014-09-11 00:27:53 +00003519 rc = sqlite3_user_add(p->db, azArg[2],
3520 azArg[3], (int)strlen(azArg[3]),
3521 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003522 if( rc ){
3523 fprintf(stderr, "User-Add failed: %d\n", rc);
3524 rc = 1;
3525 }
3526 }else if( strcmp(azArg[1],"edit")==0 ){
3527 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003528 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003529 rc = 1;
3530 goto meta_command_exit;
3531 }
drhd39c40f2014-09-11 00:27:53 +00003532 rc = sqlite3_user_change(p->db, azArg[2],
3533 azArg[3], (int)strlen(azArg[3]),
3534 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003535 if( rc ){
3536 fprintf(stderr, "User-Edit failed: %d\n", rc);
3537 rc = 1;
3538 }
3539 }else if( strcmp(azArg[1],"delete")==0 ){
3540 if( nArg!=3 ){
3541 fprintf(stderr, "Usage: .user delete USER\n");
3542 rc = 1;
3543 goto meta_command_exit;
3544 }
3545 rc = sqlite3_user_delete(p->db, azArg[2]);
3546 if( rc ){
3547 fprintf(stderr, "User-Delete failed: %d\n", rc);
3548 rc = 1;
3549 }
3550 }else{
3551 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3552 rc = 1;
3553 goto meta_command_exit;
3554 }
3555 }else
3556#endif /* SQLITE_USER_AUTHENTICATION */
3557
drh9fd301b2011-06-03 13:28:22 +00003558 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003559 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003560 sqlite3_libversion(), sqlite3_sourceid());
3561 }else
3562
drhde60fc22011-12-14 17:53:36 +00003563 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3564 const char *zDbName = nArg==2 ? azArg[1] : "main";
3565 char *zVfsName = 0;
3566 if( p->db ){
3567 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3568 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003569 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003570 sqlite3_free(zVfsName);
3571 }
3572 }
3573 }else
3574
drhcef4fc82012-09-21 22:50:45 +00003575#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3576 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3577 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003578 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003579 }else
3580#endif
3581
drhc2ce0be2014-05-29 12:36:14 +00003582 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003583 int j;
drh43617e92006-03-06 20:55:46 +00003584 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003585 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003586 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003587 }
3588 }else
3589
3590 {
shane9bd1b442009-10-23 01:27:39 +00003591 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003592 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003593 rc = 1;
drh75897232000-05-29 14:26:00 +00003594 }
drh67505e72002-04-19 12:34:06 +00003595
drhc2ce0be2014-05-29 12:36:14 +00003596meta_command_exit:
3597 if( p->outCount ){
3598 p->outCount--;
3599 if( p->outCount==0 ) output_reset(p);
3600 }
drh67505e72002-04-19 12:34:06 +00003601 return rc;
drh75897232000-05-29 14:26:00 +00003602}
3603
drh67505e72002-04-19 12:34:06 +00003604/*
drh91a66392007-09-07 01:12:32 +00003605** Return TRUE if a semicolon occurs anywhere in the first N characters
3606** of string z[].
drh324ccef2003-02-05 14:06:20 +00003607*/
drh9f099fd2013-08-06 14:01:46 +00003608static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003609 int i;
3610 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3611 return 0;
drh324ccef2003-02-05 14:06:20 +00003612}
3613
3614/*
drh70c7a4b2003-04-26 03:03:06 +00003615** Test to see if a line consists entirely of whitespace.
3616*/
3617static int _all_whitespace(const char *z){
3618 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003619 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003620 if( *z=='/' && z[1]=='*' ){
3621 z += 2;
3622 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3623 if( *z==0 ) return 0;
3624 z++;
3625 continue;
3626 }
3627 if( *z=='-' && z[1]=='-' ){
3628 z += 2;
3629 while( *z && *z!='\n' ){ z++; }
3630 if( *z==0 ) return 1;
3631 continue;
3632 }
3633 return 0;
3634 }
3635 return 1;
3636}
3637
3638/*
drha9b17162003-04-29 18:01:28 +00003639** Return TRUE if the line typed in is an SQL command terminator other
3640** than a semi-colon. The SQL Server style "go" command is understood
3641** as is the Oracle "/".
3642*/
drh9f099fd2013-08-06 14:01:46 +00003643static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003644 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003645 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3646 return 1; /* Oracle */
3647 }
drhf0693c82011-10-11 20:41:54 +00003648 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003649 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003650 return 1; /* SQL Server */
3651 }
3652 return 0;
3653}
3654
3655/*
drh233a5312008-12-18 22:25:13 +00003656** Return true if zSql is a complete SQL statement. Return false if it
3657** ends in the middle of a string literal or C-style comment.
3658*/
drh9f099fd2013-08-06 14:01:46 +00003659static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003660 int rc;
3661 if( zSql==0 ) return 1;
3662 zSql[nSql] = ';';
3663 zSql[nSql+1] = 0;
3664 rc = sqlite3_complete(zSql);
3665 zSql[nSql] = 0;
3666 return rc;
3667}
3668
3669/*
drh67505e72002-04-19 12:34:06 +00003670** Read input from *in and process it. If *in==0 then input
3671** is interactive - the user is typing it it. Otherwise, input
3672** is coming from a file or device. A prompt is issued and history
3673** is saved only if input is interactive. An interrupt signal will
3674** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003675**
3676** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003677*/
drhdcd87a92014-08-18 13:45:42 +00003678static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003679 char *zLine = 0; /* A single input line */
3680 char *zSql = 0; /* Accumulated SQL text */
3681 int nLine; /* Length of current line */
3682 int nSql = 0; /* Bytes of zSql[] used */
3683 int nAlloc = 0; /* Allocated zSql[] space */
3684 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3685 char *zErrMsg; /* Error message returned */
3686 int rc; /* Error code */
3687 int errCnt = 0; /* Number of errors seen */
3688 int lineno = 0; /* Current line number */
3689 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003690
3691 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3692 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003693 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003694 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003695 /* End of input */
3696 if( stdin_is_interactive ) printf("\n");
3697 break;
drhc49f44e2006-10-26 18:15:42 +00003698 }
drh67505e72002-04-19 12:34:06 +00003699 if( seenInterrupt ){
3700 if( in!=0 ) break;
3701 seenInterrupt = 0;
3702 }
drhc28490c2006-10-26 14:25:58 +00003703 lineno++;
drh849a9d92013-12-21 15:46:06 +00003704 if( nSql==0 && _all_whitespace(zLine) ){
3705 if( p->echoOn ) printf("%s\n", zLine);
3706 continue;
3707 }
drh2af0b2d2002-02-21 02:25:02 +00003708 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003709 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003710 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003711 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003712 break;
3713 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003714 errCnt++;
3715 }
drhdaffd0e2001-04-11 14:28:42 +00003716 continue;
3717 }
drh9f099fd2013-08-06 14:01:46 +00003718 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003719 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003720 }
drh9f099fd2013-08-06 14:01:46 +00003721 nLine = strlen30(zLine);
3722 if( nSql+nLine+2>=nAlloc ){
3723 nAlloc = nSql+nLine+100;
3724 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003725 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003726 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003727 exit(1);
3728 }
drhdaffd0e2001-04-11 14:28:42 +00003729 }
drh9f099fd2013-08-06 14:01:46 +00003730 nSqlPrior = nSql;
3731 if( nSql==0 ){
3732 int i;
3733 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003734 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003735 memcpy(zSql, zLine+i, nLine+1-i);
3736 startline = lineno;
3737 nSql = nLine-i;
3738 }else{
3739 zSql[nSql++] = '\n';
3740 memcpy(zSql+nSql, zLine, nLine+1);
3741 nSql += nLine;
3742 }
3743 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003744 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003745 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003746 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003747 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003748 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003749 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003750 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003751 char zPrefix[100];
3752 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003753 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003754 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003755 }else{
shane9bd1b442009-10-23 01:27:39 +00003756 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003757 }
drh7f953e22002-07-13 17:33:45 +00003758 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003759 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003760 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003761 zErrMsg = 0;
3762 }else{
shaned2bed1c2009-10-21 03:56:54 +00003763 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003764 }
drhc49f44e2006-10-26 18:15:42 +00003765 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003766 }
drhdaffd0e2001-04-11 14:28:42 +00003767 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003768 if( p->outCount ){
3769 output_reset(p);
3770 p->outCount = 0;
3771 }
drh9f099fd2013-08-06 14:01:46 +00003772 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003773 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003774 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003775 }
3776 }
drh9f099fd2013-08-06 14:01:46 +00003777 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003778 if( !_all_whitespace(zSql) ){
3779 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00003780 errCnt++;
drhd416fe72011-03-17 16:45:50 +00003781 }
drhdaffd0e2001-04-11 14:28:42 +00003782 free(zSql);
3783 }
danielk19772ac27622007-07-03 05:31:16 +00003784 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003785 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003786}
3787
drh67505e72002-04-19 12:34:06 +00003788/*
3789** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003790** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003791*/
3792static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003793 static char *home_dir = NULL;
3794 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003795
drh83905c92012-06-21 13:00:37 +00003796#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003797 {
3798 struct passwd *pwent;
3799 uid_t uid = getuid();
3800 if( (pwent=getpwuid(uid)) != NULL) {
3801 home_dir = pwent->pw_dir;
3802 }
drh67505e72002-04-19 12:34:06 +00003803 }
3804#endif
3805
chw65d3c132007-11-12 21:09:10 +00003806#if defined(_WIN32_WCE)
3807 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3808 */
drh85e72432012-04-11 11:38:53 +00003809 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003810#else
3811
drh83905c92012-06-21 13:00:37 +00003812#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003813 if (!home_dir) {
3814 home_dir = getenv("USERPROFILE");
3815 }
3816#endif
3817
drh67505e72002-04-19 12:34:06 +00003818 if (!home_dir) {
3819 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003820 }
3821
drh83905c92012-06-21 13:00:37 +00003822#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003823 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003824 char *zDrive, *zPath;
3825 int n;
3826 zDrive = getenv("HOMEDRIVE");
3827 zPath = getenv("HOMEPATH");
3828 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003829 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003830 home_dir = malloc( n );
3831 if( home_dir==0 ) return 0;
3832 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3833 return home_dir;
3834 }
3835 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003836 }
3837#endif
3838
chw65d3c132007-11-12 21:09:10 +00003839#endif /* !_WIN32_WCE */
3840
drh67505e72002-04-19 12:34:06 +00003841 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003842 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003843 char *z = malloc( n );
3844 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003845 home_dir = z;
3846 }
drhe98d4fa2002-04-21 19:06:22 +00003847
drh67505e72002-04-19 12:34:06 +00003848 return home_dir;
3849}
3850
3851/*
3852** Read input from the file given by sqliterc_override. Or if that
3853** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003854**
3855** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003856*/
shane9bd1b442009-10-23 01:27:39 +00003857static int process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00003858 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00003859 const char *sqliterc_override /* Name of config file. NULL to use default */
3860){
persicom7e2dfdd2002-04-18 02:46:52 +00003861 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003862 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003863 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003864 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003865 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003866
3867 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003868 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003869 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003870#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003871 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003872#endif
shane9bd1b442009-10-23 01:27:39 +00003873 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003874 }
drh2f3de322012-06-27 16:41:31 +00003875 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003876 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3877 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003878 }
drha1f9b5e2004-02-14 16:31:02 +00003879 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003880 if( in ){
drhc28490c2006-10-26 14:25:58 +00003881 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003882 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003883 }
shane9bd1b442009-10-23 01:27:39 +00003884 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003885 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003886 }
drh85e72432012-04-11 11:38:53 +00003887 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003888 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003889}
3890
drh67505e72002-04-19 12:34:06 +00003891/*
drhe1e38c42003-05-04 18:30:59 +00003892** Show available command line options
3893*/
3894static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003895 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003896 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003897 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003898 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003899 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003900 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003901 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003902 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003903#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3904 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3905#endif
drhcc3b4f82012-02-07 14:13:50 +00003906 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003907 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003908 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003909 " -line set output mode to 'line'\n"
3910 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00003911 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00003912 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003913#ifdef SQLITE_ENABLE_MULTIPLEX
3914 " -multiplex enable the multiplexor VFS\n"
3915#endif
drh6976c212014-07-24 12:09:47 +00003916 " -newline SEP set newline character(s) for CSV\n"
drh98d312f2012-10-25 15:23:14 +00003917 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00003918 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
3919 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
drh98d312f2012-10-25 15:23:14 +00003920 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003921 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003922 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003923 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003924#ifdef SQLITE_ENABLE_VFSTRACE
3925 " -vfstrace enable tracing of all VFS calls\n"
3926#endif
drhe1e38c42003-05-04 18:30:59 +00003927;
3928static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003929 fprintf(stderr,
3930 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3931 "FILENAME is the name of an SQLite database. A new database is created\n"
3932 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003933 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003934 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003935 }else{
3936 fprintf(stderr, "Use the -help option for additional information\n");
3937 }
3938 exit(1);
3939}
3940
3941/*
drh67505e72002-04-19 12:34:06 +00003942** Initialize the state information in data
3943*/
drhdcd87a92014-08-18 13:45:42 +00003944static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003945 memset(data, 0, sizeof(*data));
3946 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003947 memcpy(data->separator,"|", 2);
drh6976c212014-07-24 12:09:47 +00003948 memcpy(data->newline,"\r\n", 3);
persicom7e2dfdd2002-04-18 02:46:52 +00003949 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00003950 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00003951 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003952 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00003953 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00003954 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3955 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00003956}
3957
drh98d312f2012-10-25 15:23:14 +00003958/*
drh5c7976f2014-02-10 19:59:27 +00003959** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003960*/
3961#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003962static void printBold(const char *zText){
3963 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3964 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3965 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3966 SetConsoleTextAttribute(out,
3967 FOREGROUND_RED|FOREGROUND_INTENSITY
3968 );
3969 printf("%s", zText);
3970 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003971}
3972#else
drh5c7976f2014-02-10 19:59:27 +00003973static void printBold(const char *zText){
3974 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003975}
3976#endif
3977
3978/*
drh98d312f2012-10-25 15:23:14 +00003979** Get the argument to an --option. Throw an error and die if no argument
3980** is available.
3981*/
3982static char *cmdline_option_value(int argc, char **argv, int i){
3983 if( i==argc ){
3984 fprintf(stderr, "%s: Error: missing argument to %s\n",
3985 argv[0], argv[argc-1]);
3986 exit(1);
3987 }
3988 return argv[i];
3989}
3990
drh75897232000-05-29 14:26:00 +00003991int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003992 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00003993 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00003994 const char *zInitFile = 0;
3995 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003996 int i;
drhc28490c2006-10-26 14:25:58 +00003997 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003998 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003999
drh69b30ab2014-02-27 15:11:52 +00004000#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004001 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4002 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4003 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4004 exit(1);
4005 }
drhc7181902014-02-27 15:04:13 +00004006#endif
drhdaffd0e2001-04-11 14:28:42 +00004007 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004008 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004009 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004010
drh44c2eb12003-04-30 11:38:26 +00004011 /* Make sure we have a valid signal handler early, before anything
4012 ** else is done.
4013 */
drh4c504392000-10-16 22:06:40 +00004014#ifdef SIGINT
4015 signal(SIGINT, interrupt_handler);
4016#endif
drh44c2eb12003-04-30 11:38:26 +00004017
drh22fbcb82004-02-01 01:22:50 +00004018 /* Do an initial pass through the command-line argument to locate
4019 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004020 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004021 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004022 */
drh98d312f2012-10-25 15:23:14 +00004023 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004024 char *z;
drhc28490c2006-10-26 14:25:58 +00004025 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004026 if( z[0]!='-' ){
4027 if( data.zDbFilename==0 ){
4028 data.zDbFilename = z;
4029 continue;
4030 }
4031 if( zFirstCmd==0 ){
4032 zFirstCmd = z;
4033 continue;
4034 }
4035 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
4036 fprintf(stderr,"Use -help for a list of options.\n");
4037 return 1;
4038 }
drhcc3b4f82012-02-07 14:13:50 +00004039 if( z[1]=='-' ) z++;
4040 if( strcmp(z,"-separator")==0
4041 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004042 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004043 || strcmp(z,"-cmd")==0
4044 ){
drh98d312f2012-10-25 15:23:14 +00004045 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004046 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004047 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004048 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004049 /* Need to check for batch mode here to so we can avoid printing
4050 ** informational messages (like from process_sqliterc) before
4051 ** we do the actual processing of arguments later in a second pass.
4052 */
shanef69573d2009-10-24 02:06:14 +00004053 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004054 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004055#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004056 const char *zSize;
4057 sqlite3_int64 szHeap;
4058
drh98d312f2012-10-25 15:23:14 +00004059 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004060 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004061 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004062 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4063#endif
drh44dec872014-08-30 15:49:25 +00004064 }else if( strcmp(z,"-scratch")==0 ){
4065 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004066 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004067 if( sz>400000 ) sz = 400000;
4068 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004069 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004070 if( n>10 ) n = 10;
4071 if( n<1 ) n = 1;
4072 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4073 data.shellFlgs |= SHFLG_Scratch;
4074 }else if( strcmp(z,"-pagecache")==0 ){
4075 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004076 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004077 if( sz>70000 ) sz = 70000;
4078 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004079 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004080 if( n<10 ) n = 10;
4081 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4082 data.shellFlgs |= SHFLG_Pagecache;
4083 }else if( strcmp(z,"-lookaside")==0 ){
4084 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004085 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004086 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004087 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004088 if( n<0 ) n = 0;
4089 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4090 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004091#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004092 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004093 extern int vfstrace_register(
4094 const char *zTraceName,
4095 const char *zOldVfsName,
4096 int (*xOut)(const char*,void*),
4097 void *pOutArg,
4098 int makeDefault
4099 );
drh2b625e22011-03-16 17:05:28 +00004100 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004101#endif
drh6f25e892011-07-08 17:02:57 +00004102#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004103 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004104 extern int sqlite3_multiple_initialize(const char*,int);
4105 sqlite3_multiplex_initialize(0, 1);
4106#endif
drh7d9f3942013-04-03 01:26:54 +00004107 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004108 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4109 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004110 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004111 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004112 if( pVfs ){
4113 sqlite3_vfs_register(pVfs, 1);
4114 }else{
4115 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4116 exit(1);
4117 }
drh44c2eb12003-04-30 11:38:26 +00004118 }
4119 }
drh98d312f2012-10-25 15:23:14 +00004120 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004121#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004122 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004123 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004124#else
shane86f5bdb2009-10-24 02:00:07 +00004125 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4126 return 1;
drh01b41712005-08-29 23:06:23 +00004127#endif
drhc7181902014-02-27 15:04:13 +00004128#ifdef SQLITE_SHELL_DBNAME_PROC
4129 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4130 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4131 warnInmemoryDb = 0; }
4132#endif
drh98d312f2012-10-25 15:23:14 +00004133 }
4134 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004135
drh44c2eb12003-04-30 11:38:26 +00004136 /* Go ahead and open the database file if it already exists. If the
4137 ** file does not exist, delay opening it. This prevents empty database
4138 ** files from being created if a user mistypes the database name argument
4139 ** to the sqlite command-line tool.
4140 */
drhc8d74412004-08-31 23:41:26 +00004141 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004142 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004143 }
4144
drh22fbcb82004-02-01 01:22:50 +00004145 /* Process the initialization file if there is one. If no -init option
4146 ** is given on the command line, look for a file named ~/.sqliterc and
4147 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004148 */
shane86f5bdb2009-10-24 02:00:07 +00004149 rc = process_sqliterc(&data,zInitFile);
4150 if( rc>0 ){
4151 return rc;
4152 }
drh44c2eb12003-04-30 11:38:26 +00004153
drh22fbcb82004-02-01 01:22:50 +00004154 /* Make a second pass through the command-line argument and set
4155 ** options. This second pass is delayed until after the initialization
4156 ** file is processed so that the command-line arguments will override
4157 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004158 */
drh98d312f2012-10-25 15:23:14 +00004159 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004160 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004161 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004162 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004163 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004164 i++;
4165 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004166 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004167 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004168 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004169 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004170 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004171 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004172 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004173 }else if( strcmp(z,"-csv")==0 ){
4174 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00004175 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00004176 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004177 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00004178 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004179 }else if( strcmp(z,"-newline")==0 ){
4180 sqlite3_snprintf(sizeof(data.newline), data.newline,
4181 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004182 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004183 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004184 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004185 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004186 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004187 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004188 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004189 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004190 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004191 }else if( strcmp(z,"-eqp")==0 ){
4192 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004193 }else if( strcmp(z,"-stats")==0 ){
4194 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004195 }else if( strcmp(z,"-scanstats")==0 ){
4196 data.scanstatsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004197 }else if( strcmp(z,"-bail")==0 ){
4198 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004199 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004200 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004201 return 0;
drhc28490c2006-10-26 14:25:58 +00004202 }else if( strcmp(z,"-interactive")==0 ){
4203 stdin_is_interactive = 1;
4204 }else if( strcmp(z,"-batch")==0 ){
4205 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004206 }else if( strcmp(z,"-heap")==0 ){
4207 i++;
drh44dec872014-08-30 15:49:25 +00004208 }else if( strcmp(z,"-scratch")==0 ){
4209 i+=2;
4210 }else if( strcmp(z,"-pagecache")==0 ){
4211 i+=2;
4212 }else if( strcmp(z,"-lookaside")==0 ){
4213 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004214 }else if( strcmp(z,"-mmap")==0 ){
4215 i++;
drha7e61d82011-03-12 17:02:57 +00004216 }else if( strcmp(z,"-vfs")==0 ){
4217 i++;
drh6f25e892011-07-08 17:02:57 +00004218#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004219 }else if( strcmp(z,"-vfstrace")==0 ){
4220 i++;
drh6f25e892011-07-08 17:02:57 +00004221#endif
4222#ifdef SQLITE_ENABLE_MULTIPLEX
4223 }else if( strcmp(z,"-multiplex")==0 ){
4224 i++;
4225#endif
drhcc3b4f82012-02-07 14:13:50 +00004226 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004227 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004228 }else if( strcmp(z,"-cmd")==0 ){
4229 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004230 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004231 if( z[0]=='.' ){
4232 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004233 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004234 }else{
drh05782482013-10-24 15:20:20 +00004235 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004236 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4237 if( zErrMsg!=0 ){
4238 fprintf(stderr,"Error: %s\n", zErrMsg);
4239 if( bail_on_error ) return rc!=0 ? rc : 1;
4240 }else if( rc!=0 ){
4241 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4242 if( bail_on_error ) return rc;
4243 }
4244 }
drh1e5d0e92000-05-31 23:33:17 +00004245 }else{
shane86f5bdb2009-10-24 02:00:07 +00004246 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004247 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004248 return 1;
4249 }
4250 }
drh44c2eb12003-04-30 11:38:26 +00004251
drh22fbcb82004-02-01 01:22:50 +00004252 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00004253 /* Run just the command that follows the database name
4254 */
drh22fbcb82004-02-01 01:22:50 +00004255 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00004256 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00004257 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00004258 }else{
drh05782482013-10-24 15:20:20 +00004259 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00004260 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00004261 if( zErrMsg!=0 ){
4262 fprintf(stderr,"Error: %s\n", zErrMsg);
4263 return rc!=0 ? rc : 1;
4264 }else if( rc!=0 ){
4265 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4266 return rc;
drh6ff13852001-11-25 13:18:23 +00004267 }
drh75897232000-05-29 14:26:00 +00004268 }
4269 }else{
drh44c2eb12003-04-30 11:38:26 +00004270 /* Run commands received from standard input
4271 */
drhc28490c2006-10-26 14:25:58 +00004272 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004273 char *zHome;
4274 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004275 int nHistory;
drh75897232000-05-29 14:26:00 +00004276 printf(
drh743e0032011-12-12 16:51:50 +00004277 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004278 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004279 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004280 );
drhb3735912014-02-10 16:13:42 +00004281 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004282 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004283 printBold("transient in-memory database");
4284 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004285 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004286 }
drh67505e72002-04-19 12:34:06 +00004287 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004288 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004289 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004290 if( (zHistory = malloc(nHistory))!=0 ){
4291 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4292 }
drh67505e72002-04-19 12:34:06 +00004293 }
drhaaa21b42014-02-11 14:37:51 +00004294#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004295 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004296#endif
drhc28490c2006-10-26 14:25:58 +00004297 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004298 if( zHistory ){
4299 stifle_history(100);
4300 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004301 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004302 }
drhdaffd0e2001-04-11 14:28:42 +00004303 }else{
drhc28490c2006-10-26 14:25:58 +00004304 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004305 }
4306 }
drh33048c02001-10-01 14:29:22 +00004307 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004308 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004309 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004310 }
drh05782482013-10-24 15:20:20 +00004311 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004312 return rc;
drh75897232000-05-29 14:26:00 +00004313}