blob: a33e65b1f8e278487577b6f246568dde4bab58a6 [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
drh15f23c22014-11-06 12:46:16 +00001197 int i, k, n, mx;
dan8d1edb92014-11-05 09:07:28 +00001198 fprintf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001199 mx = 0;
1200 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001201 double rEstLoop = 1.0;
1202 for(i=n=0; 1; i++){
1203 sqlite3_stmt *p = pArg->pStmt;
1204 sqlite3_int64 nLoop, nVisit;
1205 double rEst;
1206 int iSid;
1207 const char *zExplain;
1208 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1209 break;
1210 }
1211 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001212 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001213 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001214 if( n==0 ){
1215 rEstLoop = (double)nLoop;
drh15f23c22014-11-06 12:46:16 +00001216 if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001217 }
drh42f30bc2014-11-06 12:08:21 +00001218 n++;
1219 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1220 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1221 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1222 fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1223 rEstLoop *= rEst;
1224 fprintf(pArg->out, " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001225 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001226 );
dan8d1edb92014-11-05 09:07:28 +00001227 }
dan8d1edb92014-11-05 09:07:28 +00001228 }
dan8d1edb92014-11-05 09:07:28 +00001229 fprintf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001230#endif
dan8d1edb92014-11-05 09:07:28 +00001231}
1232
1233/*
dana98bf362013-11-13 18:35:01 +00001234** Parameter azArray points to a zero-terminated array of strings. zStr
1235** points to a single nul-terminated string. Return non-zero if zStr
1236** is equal, according to strcmp(), to any of the strings in the array.
1237** Otherwise, return zero.
1238*/
1239static int str_in_array(const char *zStr, const char **azArray){
1240 int i;
1241 for(i=0; azArray[i]; i++){
1242 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1243 }
1244 return 0;
1245}
1246
1247/*
1248** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001249** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001250** spaces each opcode should be indented before it is output.
1251**
1252** The indenting rules are:
1253**
1254** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1255** all opcodes that occur between the p2 jump destination and the opcode
1256** itself by 2 spaces.
1257**
drh01752bc2013-11-14 23:59:33 +00001258** * For each "Goto", if the jump destination is earlier in the program
1259** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001260** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001261** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001262** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001263** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001264*/
drhdcd87a92014-08-18 13:45:42 +00001265static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001266 const char *zSql; /* The text of the SQL statement */
1267 const char *z; /* Used to check if this is an EXPLAIN */
1268 int *abYield = 0; /* True if op is an OP_Yield */
1269 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001270 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001271
drh8ad0de32014-03-20 18:45:27 +00001272 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1273 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001274 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001275 const char *azGoto[] = { "Goto", 0 };
1276
1277 /* Try to figure out if this is really an EXPLAIN statement. If this
1278 ** cannot be verified, return early. */
1279 zSql = sqlite3_sql(pSql);
1280 if( zSql==0 ) return;
1281 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1282 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1283
1284 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1285 int i;
danc4650bb2013-11-18 08:41:06 +00001286 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001287 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001288
1289 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1290 ** p2 is an instruction address, set variable p2op to the index of that
1291 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1292 ** the current instruction is part of a sub-program generated by an
1293 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001294 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001295 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001296
1297 /* Grow the p->aiIndent array as required */
1298 if( iOp>=nAlloc ){
1299 nAlloc += 100;
1300 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1301 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1302 }
1303 abYield[iOp] = str_in_array(zOp, azYield);
1304 p->aiIndent[iOp] = 0;
1305 p->nIndent = iOp+1;
1306
1307 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001308 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001309 }
drhfe705102014-03-06 13:38:37 +00001310 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1311 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1312 ){
drhe73f0592014-01-21 22:25:45 +00001313 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001314 }
1315 }
1316
danc4650bb2013-11-18 08:41:06 +00001317 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001318 sqlite3_free(abYield);
1319 sqlite3_reset(pSql);
1320}
1321
1322/*
1323** Free the array allocated by explain_data_prepare().
1324*/
drhdcd87a92014-08-18 13:45:42 +00001325static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001326 sqlite3_free(p->aiIndent);
1327 p->aiIndent = 0;
1328 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001329 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001330}
1331
1332/*
shane626a6e42009-10-22 17:30:15 +00001333** Execute a statement or set of statements. Print
1334** any result rows/columns depending on the current mode
1335** set via the supplied callback.
1336**
1337** This is very similar to SQLite's built-in sqlite3_exec()
1338** function except it takes a slightly different callback
1339** and callback data argument.
1340*/
1341static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001342 sqlite3 *db, /* An open database */
1343 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001344 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001345 /* (not the same as sqlite3_exec) */
1346 ShellState *pArg, /* Pointer to ShellState */
1347 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001348){
dan4564ced2010-01-05 04:59:56 +00001349 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1350 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001351 int rc2;
dan4564ced2010-01-05 04:59:56 +00001352 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001353
1354 if( pzErrMsg ){
1355 *pzErrMsg = NULL;
1356 }
1357
shaneb9fc17d2009-10-22 21:23:35 +00001358 while( zSql[0] && (SQLITE_OK == rc) ){
1359 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1360 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001361 if( pzErrMsg ){
1362 *pzErrMsg = save_err_msg(db);
1363 }
1364 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001365 if( !pStmt ){
1366 /* this happens for a comment or white-space */
1367 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001368 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001369 continue;
1370 }
shane626a6e42009-10-22 17:30:15 +00001371
shaneh642d8b82010-07-28 16:05:34 +00001372 /* save off the prepared statment handle and reset row count */
1373 if( pArg ){
1374 pArg->pStmt = pStmt;
1375 pArg->cnt = 0;
1376 }
1377
shanehb7977c52010-01-18 18:17:10 +00001378 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001379 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001380 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001381 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001382 }
shanehb7977c52010-01-18 18:17:10 +00001383
drhefbf3b12014-02-28 20:47:24 +00001384 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1385 if( pArg && pArg->autoEQP ){
1386 sqlite3_stmt *pExplain;
1387 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1388 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1389 if( rc==SQLITE_OK ){
1390 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1391 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1392 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1393 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1394 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1395 }
1396 }
1397 sqlite3_finalize(pExplain);
1398 sqlite3_free(zEQP);
1399 }
1400
dana98bf362013-11-13 18:35:01 +00001401 /* If the shell is currently in ".explain" mode, gather the extra
1402 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001403 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001404 explain_data_prepare(pArg, pStmt);
1405 }
1406
shaneb9fc17d2009-10-22 21:23:35 +00001407 /* perform the first step. this will tell us if we
1408 ** have a result set or not and how wide it is.
1409 */
1410 rc = sqlite3_step(pStmt);
1411 /* if we have a result set... */
1412 if( SQLITE_ROW == rc ){
1413 /* if we have a callback... */
1414 if( xCallback ){
1415 /* allocate space for col name ptr, value ptr, and type */
1416 int nCol = sqlite3_column_count(pStmt);
1417 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1418 if( !pData ){
1419 rc = SQLITE_NOMEM;
1420 }else{
1421 char **azCols = (char **)pData; /* Names of result columns */
1422 char **azVals = &azCols[nCol]; /* Results */
1423 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001424 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001425 assert(sizeof(int) <= sizeof(char *));
1426 /* save off ptrs to column names */
1427 for(i=0; i<nCol; i++){
1428 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1429 }
shaneb9fc17d2009-10-22 21:23:35 +00001430 do{
1431 /* extract the data and data types */
1432 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001433 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001434 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001435 azVals[i] = "";
1436 }else{
1437 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1438 }
shaneb9fc17d2009-10-22 21:23:35 +00001439 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1440 rc = SQLITE_NOMEM;
1441 break; /* from for */
1442 }
1443 } /* end for */
1444
1445 /* if data and types extracted successfully... */
1446 if( SQLITE_ROW == rc ){
1447 /* call the supplied callback with the result row data */
1448 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1449 rc = SQLITE_ABORT;
1450 }else{
1451 rc = sqlite3_step(pStmt);
1452 }
1453 }
1454 } while( SQLITE_ROW == rc );
1455 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001456 }
1457 }else{
1458 do{
1459 rc = sqlite3_step(pStmt);
1460 } while( rc == SQLITE_ROW );
1461 }
1462 }
1463
dana98bf362013-11-13 18:35:01 +00001464 explain_data_delete(pArg);
1465
shaneh642d8b82010-07-28 16:05:34 +00001466 /* print usage stats if stats on */
1467 if( pArg && pArg->statsOn ){
1468 display_stats(db, pArg, 0);
1469 }
1470
dan8d1edb92014-11-05 09:07:28 +00001471 /* print loop-counters if required */
1472 if( pArg && pArg->scanstatsOn ){
1473 display_scanstats(db, pArg);
1474 }
1475
dan4564ced2010-01-05 04:59:56 +00001476 /* Finalize the statement just executed. If this fails, save a
1477 ** copy of the error message. Otherwise, set zSql to point to the
1478 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001479 rc2 = sqlite3_finalize(pStmt);
1480 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001481 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001482 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001483 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001484 }else if( pzErrMsg ){
1485 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001486 }
shaneh642d8b82010-07-28 16:05:34 +00001487
1488 /* clear saved stmt handle */
1489 if( pArg ){
1490 pArg->pStmt = NULL;
1491 }
shane626a6e42009-10-22 17:30:15 +00001492 }
shaneb9fc17d2009-10-22 21:23:35 +00001493 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001494
1495 return rc;
1496}
1497
drhdd3d4592004-08-30 01:54:05 +00001498
drh33048c02001-10-01 14:29:22 +00001499/*
drh4c653a02000-06-07 01:27:47 +00001500** This is a different callback routine used for dumping the database.
1501** Each row received by this callback consists of a table name,
1502** the table type ("index" or "table") and SQL to create the table.
1503** This routine should print text sufficient to recreate the table.
1504*/
1505static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001506 int rc;
1507 const char *zTable;
1508 const char *zType;
1509 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001510 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001511 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001512
drh902b9ee2008-12-05 17:17:07 +00001513 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001514 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001515 zTable = azArg[0];
1516 zType = azArg[1];
1517 zSql = azArg[2];
1518
drh00b950d2005-09-11 02:03:03 +00001519 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001520 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001521 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001522 fprintf(p->out, "ANALYZE sqlite_master;\n");
1523 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1524 return 0;
drh45e29d82006-11-20 16:21:10 +00001525 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1526 char *zIns;
1527 if( !p->writableSchema ){
1528 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1529 p->writableSchema = 1;
1530 }
1531 zIns = sqlite3_mprintf(
1532 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1533 "VALUES('table','%q','%q',0,'%q');",
1534 zTable, zTable, zSql);
1535 fprintf(p->out, "%s\n", zIns);
1536 sqlite3_free(zIns);
1537 return 0;
drh00b950d2005-09-11 02:03:03 +00001538 }else{
1539 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001540 }
danielk19772a02e332004-06-05 08:04:36 +00001541
1542 if( strcmp(zType, "table")==0 ){
1543 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001544 char *zSelect = 0;
1545 char *zTableInfo = 0;
1546 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001547 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001548
1549 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1550 zTableInfo = appendText(zTableInfo, zTable, '"');
1551 zTableInfo = appendText(zTableInfo, ");", 0);
1552
drhc7181902014-02-27 15:04:13 +00001553 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001554 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001555 if( rc!=SQLITE_OK || !pTableInfo ){
1556 return 1;
1557 }
1558
1559 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001560 /* Always quote the table name, even if it appears to be pure ascii,
1561 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1562 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001563 if( zTmp ){
1564 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001565 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001566 }
1567 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1568 rc = sqlite3_step(pTableInfo);
1569 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001570 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001571 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001572 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001573 rc = sqlite3_step(pTableInfo);
1574 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001575 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001576 }else{
1577 zSelect = appendText(zSelect, ") ", 0);
1578 }
drh157e29a2009-05-21 15:15:00 +00001579 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001580 }
1581 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001582 if( rc!=SQLITE_OK || nRow==0 ){
1583 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001584 return 1;
1585 }
1586 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1587 zSelect = appendText(zSelect, zTable, '"');
1588
drh2f464a02011-10-13 00:41:49 +00001589 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001590 if( rc==SQLITE_CORRUPT ){
1591 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001592 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001593 }
drh85e72432012-04-11 11:38:53 +00001594 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001595 }
drh4c653a02000-06-07 01:27:47 +00001596 return 0;
1597}
1598
1599/*
drh45e29d82006-11-20 16:21:10 +00001600** Run zQuery. Use dump_callback() as the callback routine so that
1601** the contents of the query are output as SQL statements.
1602**
drhdd3d4592004-08-30 01:54:05 +00001603** If we get a SQLITE_CORRUPT error, rerun the query after appending
1604** "ORDER BY rowid DESC" to the end.
1605*/
1606static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001607 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001608 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001609){
1610 int rc;
drh2f464a02011-10-13 00:41:49 +00001611 char *zErr = 0;
1612 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001613 if( rc==SQLITE_CORRUPT ){
1614 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001615 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001616 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1617 if( zErr ){
1618 fprintf(p->out, "/****** %s ******/\n", zErr);
1619 sqlite3_free(zErr);
1620 zErr = 0;
1621 }
drhdd3d4592004-08-30 01:54:05 +00001622 zQ2 = malloc( len+100 );
1623 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001624 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001625 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1626 if( rc ){
1627 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1628 }else{
1629 rc = SQLITE_CORRUPT;
1630 }
1631 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001632 free(zQ2);
1633 }
1634 return rc;
1635}
1636
1637/*
drh75897232000-05-29 14:26:00 +00001638** Text of a help message
1639*/
persicom1d0b8722002-04-18 02:53:04 +00001640static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001641 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001642 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001643 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001644 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001645 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001646 " If TABLE specified, only dump tables matching\n"
1647 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001648 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001649 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001650 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001651 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001652 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001653 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001654 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001655 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001656 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001657 ".indices ?TABLE? Show names of all indices\n"
1658 " If TABLE specified, only show indices for tables\n"
1659 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001660#ifdef SQLITE_ENABLE_IOTRACE
1661 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1662#endif
drh70df4fe2006-06-13 15:12:21 +00001663#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001664 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001665#endif
drh127f9d72010-02-23 01:47:00 +00001666 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001667 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001668 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001669 " column Left-aligned columns. (See .width)\n"
1670 " html HTML <table> code\n"
1671 " insert SQL insert statements for TABLE\n"
1672 " line One value per line\n"
1673 " list Values delimited by .separator string\n"
1674 " tabs Tab-separated values\n"
1675 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001676 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001677 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001678 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001679 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001680 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001681 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001682 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001683 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001684 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001685 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001686 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001687 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001688 " If TABLE specified, only show tables matching\n"
1689 " LIKE pattern TABLE.\n"
drh6976c212014-07-24 12:09:47 +00001690 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1691 " NL is the end-of-line mark for CSV\n"
drh62cdde52014-05-28 20:22:28 +00001692 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001693 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001694 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001695 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001696 ".tables ?TABLE? List names of tables\n"
1697 " If TABLE specified, only list tables matching\n"
1698 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001699 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001700 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001701 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001702 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001703 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001704 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001705;
1706
drhdaffd0e2001-04-11 14:28:42 +00001707/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001708static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001709/*
1710** Implementation of the "readfile(X)" SQL function. The entire content
1711** of the file named X is read and returned as a BLOB. NULL is returned
1712** if the file does not exist or is unreadable.
1713*/
1714static void readfileFunc(
1715 sqlite3_context *context,
1716 int argc,
1717 sqlite3_value **argv
1718){
1719 const char *zName;
1720 FILE *in;
1721 long nIn;
1722 void *pBuf;
1723
1724 zName = (const char*)sqlite3_value_text(argv[0]);
1725 if( zName==0 ) return;
1726 in = fopen(zName, "rb");
1727 if( in==0 ) return;
1728 fseek(in, 0, SEEK_END);
1729 nIn = ftell(in);
1730 rewind(in);
1731 pBuf = sqlite3_malloc( nIn );
1732 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1733 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1734 }else{
1735 sqlite3_free(pBuf);
1736 }
1737 fclose(in);
1738}
1739
1740/*
1741** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1742** is written into file X. The number of bytes written is returned. Or
1743** NULL is returned if something goes wrong, such as being unable to open
1744** file X for writing.
1745*/
1746static void writefileFunc(
1747 sqlite3_context *context,
1748 int argc,
1749 sqlite3_value **argv
1750){
1751 FILE *out;
1752 const char *z;
drhba5b0932014-07-24 12:39:59 +00001753 sqlite3_int64 rc;
1754 const char *zFile;
1755
1756 zFile = (const char*)sqlite3_value_text(argv[0]);
1757 if( zFile==0 ) return;
1758 out = fopen(zFile, "wb");
1759 if( out==0 ) return;
1760 z = (const char*)sqlite3_value_blob(argv[1]);
1761 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001762 rc = 0;
1763 }else{
drh490fe862014-08-11 14:21:32 +00001764 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001765 }
1766 fclose(out);
1767 sqlite3_result_int64(context, rc);
1768}
drhdaffd0e2001-04-11 14:28:42 +00001769
drh75897232000-05-29 14:26:00 +00001770/*
drh44c2eb12003-04-30 11:38:26 +00001771** Make sure the database is open. If it is not, then open it. If
1772** the database fails to open, print an error message and exit.
1773*/
drhdcd87a92014-08-18 13:45:42 +00001774static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001775 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001776 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001777 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001778 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001779 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1780 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1781 shellstaticFunc, 0, 0);
1782 }
1783 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001784 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001785 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001786 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001787 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001788 }
drhc2e87a32006-06-27 15:16:14 +00001789#ifndef SQLITE_OMIT_LOAD_EXTENSION
1790 sqlite3_enable_load_extension(p->db, 1);
1791#endif
drhba5b0932014-07-24 12:39:59 +00001792 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1793 readfileFunc, 0, 0);
1794 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1795 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001796 }
1797}
1798
1799/*
drhfeac5f82004-08-01 00:10:45 +00001800** Do C-language style dequoting.
1801**
1802** \t -> tab
1803** \n -> newline
1804** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001805** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001806** \NNN -> ascii character NNN in octal
1807** \\ -> backslash
1808*/
1809static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001810 int i, j;
1811 char c;
drhc2ce0be2014-05-29 12:36:14 +00001812 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001813 for(i=j=0; (c = z[i])!=0; i++, j++){
1814 if( c=='\\' ){
1815 c = z[++i];
1816 if( c=='n' ){
1817 c = '\n';
1818 }else if( c=='t' ){
1819 c = '\t';
1820 }else if( c=='r' ){
1821 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001822 }else if( c=='\\' ){
1823 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001824 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001825 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001826 if( z[i+1]>='0' && z[i+1]<='7' ){
1827 i++;
1828 c = (c<<3) + z[i] - '0';
1829 if( z[i+1]>='0' && z[i+1]<='7' ){
1830 i++;
1831 c = (c<<3) + z[i] - '0';
1832 }
1833 }
1834 }
1835 }
1836 z[j] = c;
1837 }
drhc2ce0be2014-05-29 12:36:14 +00001838 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001839}
1840
1841/*
drh348d19c2013-06-03 12:47:43 +00001842** Return the value of a hexadecimal digit. Return -1 if the input
1843** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001844*/
drh348d19c2013-06-03 12:47:43 +00001845static int hexDigitValue(char c){
1846 if( c>='0' && c<='9' ) return c - '0';
1847 if( c>='a' && c<='f' ) return c - 'a' + 10;
1848 if( c>='A' && c<='F' ) return c - 'A' + 10;
1849 return -1;
drhc28490c2006-10-26 14:25:58 +00001850}
1851
1852/*
drh7d9f3942013-04-03 01:26:54 +00001853** Interpret zArg as an integer value, possibly with suffixes.
1854*/
1855static sqlite3_int64 integerValue(const char *zArg){
1856 sqlite3_int64 v = 0;
1857 static const struct { char *zSuffix; int iMult; } aMult[] = {
1858 { "KiB", 1024 },
1859 { "MiB", 1024*1024 },
1860 { "GiB", 1024*1024*1024 },
1861 { "KB", 1000 },
1862 { "MB", 1000000 },
1863 { "GB", 1000000000 },
1864 { "K", 1000 },
1865 { "M", 1000000 },
1866 { "G", 1000000000 },
1867 };
1868 int i;
1869 int isNeg = 0;
1870 if( zArg[0]=='-' ){
1871 isNeg = 1;
1872 zArg++;
1873 }else if( zArg[0]=='+' ){
1874 zArg++;
1875 }
drh348d19c2013-06-03 12:47:43 +00001876 if( zArg[0]=='0' && zArg[1]=='x' ){
1877 int x;
1878 zArg += 2;
1879 while( (x = hexDigitValue(zArg[0]))>=0 ){
1880 v = (v<<4) + x;
1881 zArg++;
1882 }
1883 }else{
1884 while( IsDigit(zArg[0]) ){
1885 v = v*10 + zArg[0] - '0';
1886 zArg++;
1887 }
drh7d9f3942013-04-03 01:26:54 +00001888 }
drhc2bed0a2013-05-24 11:57:50 +00001889 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001890 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1891 v *= aMult[i].iMult;
1892 break;
1893 }
1894 }
1895 return isNeg? -v : v;
1896}
1897
1898/*
drh348d19c2013-06-03 12:47:43 +00001899** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1900** for TRUE and FALSE. Return the integer value if appropriate.
1901*/
1902static int booleanValue(char *zArg){
1903 int i;
1904 if( zArg[0]=='0' && zArg[1]=='x' ){
1905 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1906 }else{
1907 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1908 }
1909 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1910 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1911 return 1;
1912 }
1913 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1914 return 0;
1915 }
1916 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1917 zArg);
1918 return 0;
1919}
1920
1921/*
drh42f64e52012-04-04 16:56:23 +00001922** Close an output file, assuming it is not stderr or stdout
1923*/
1924static void output_file_close(FILE *f){
1925 if( f && f!=stdout && f!=stderr ) fclose(f);
1926}
1927
1928/*
1929** Try to open an output file. The names "stdout" and "stderr" are
1930** recognized and do the right thing. NULL is returned if the output
1931** filename is "off".
1932*/
1933static FILE *output_file_open(const char *zFile){
1934 FILE *f;
1935 if( strcmp(zFile,"stdout")==0 ){
1936 f = stdout;
1937 }else if( strcmp(zFile, "stderr")==0 ){
1938 f = stderr;
1939 }else if( strcmp(zFile, "off")==0 ){
1940 f = 0;
1941 }else{
1942 f = fopen(zFile, "wb");
1943 if( f==0 ){
1944 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1945 }
1946 }
1947 return f;
1948}
1949
1950/*
1951** A routine for handling output from sqlite3_trace().
1952*/
1953static void sql_trace_callback(void *pArg, const char *z){
1954 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00001955 if( f ){
1956 int i = (int)strlen(z);
1957 while( i>0 && z[i-1]==';' ){ i--; }
1958 fprintf(f, "%.*s;\n", i, z);
1959 }
drh42f64e52012-04-04 16:56:23 +00001960}
1961
1962/*
drhd8621b92012-04-17 09:09:33 +00001963** A no-op routine that runs with the ".breakpoint" doc-command. This is
1964** a useful spot to set a debugger breakpoint.
1965*/
1966static void test_breakpoint(void){
1967 static int nCall = 0;
1968 nCall++;
1969}
1970
1971/*
drhdb95f682013-06-26 22:46:00 +00001972** An object used to read a CSV file
1973*/
1974typedef struct CSVReader CSVReader;
1975struct CSVReader {
1976 const char *zFile; /* Name of the input file */
1977 FILE *in; /* Read the CSV text from this input stream */
1978 char *z; /* Accumulated text for a field */
1979 int n; /* Number of bytes in z */
1980 int nAlloc; /* Space allocated for z[] */
1981 int nLine; /* Current line number */
1982 int cTerm; /* Character that terminated the most recent field */
1983 int cSeparator; /* The separator character. (Usually ",") */
1984};
1985
1986/* Append a single byte to z[] */
1987static void csv_append_char(CSVReader *p, int c){
1988 if( p->n+1>=p->nAlloc ){
1989 p->nAlloc += p->nAlloc + 100;
1990 p->z = sqlite3_realloc(p->z, p->nAlloc);
1991 if( p->z==0 ){
1992 fprintf(stderr, "out of memory\n");
1993 exit(1);
1994 }
1995 }
1996 p->z[p->n++] = (char)c;
1997}
1998
1999/* Read a single field of CSV text. Compatible with rfc4180 and extended
2000** with the option of having a separator other than ",".
2001**
2002** + Input comes from p->in.
2003** + Store results in p->z of length p->n. Space to hold p->z comes
2004** from sqlite3_malloc().
2005** + Use p->cSep as the separator. The default is ",".
2006** + Keep track of the line number in p->nLine.
2007** + Store the character that terminates the field in p->cTerm. Store
2008** EOF on end-of-file.
2009** + Report syntax errors on stderr
2010*/
2011static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00002012 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002013 int cSep = p->cSeparator;
2014 p->n = 0;
2015 c = fgetc(p->in);
2016 if( c==EOF || seenInterrupt ){
2017 p->cTerm = EOF;
2018 return 0;
2019 }
2020 if( c=='"' ){
2021 int startLine = p->nLine;
2022 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002023 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002024 while( 1 ){
2025 c = fgetc(p->in);
2026 if( c=='\n' ) p->nLine++;
2027 if( c==cQuote ){
2028 if( pc==cQuote ){
2029 pc = 0;
2030 continue;
2031 }
2032 }
2033 if( (c==cSep && pc==cQuote)
2034 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00002035 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002036 || (c==EOF && pc==cQuote)
2037 ){
2038 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002039 p->cTerm = c;
2040 break;
2041 }
2042 if( pc==cQuote && c!='\r' ){
2043 fprintf(stderr, "%s:%d: unescaped %c character\n",
2044 p->zFile, p->nLine, cQuote);
2045 }
2046 if( c==EOF ){
2047 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2048 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00002049 p->cTerm = EOF;
2050 break;
2051 }
2052 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002053 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002054 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002055 }
drhdb95f682013-06-26 22:46:00 +00002056 }else{
drhd0a64dc2013-06-30 20:24:26 +00002057 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00002058 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002059 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002060 }
2061 if( c=='\n' ){
2062 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002063 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002064 }
drhdb95f682013-06-26 22:46:00 +00002065 p->cTerm = c;
2066 }
drh8dd675e2013-07-12 21:09:24 +00002067 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002068 return p->z;
2069}
2070
2071/*
drh4bbcf102014-02-06 02:46:08 +00002072** Try to transfer data for table zTable. If an error is seen while
2073** moving forward, try to go backwards. The backwards movement won't
2074** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002075*/
mistachkine31ae902014-02-06 01:15:29 +00002076static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002077 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002078 sqlite3 *newDb,
2079 const char *zTable
2080){
2081 sqlite3_stmt *pQuery = 0;
2082 sqlite3_stmt *pInsert = 0;
2083 char *zQuery = 0;
2084 char *zInsert = 0;
2085 int rc;
2086 int i, j, n;
2087 int nTable = (int)strlen(zTable);
2088 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002089 int cnt = 0;
2090 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002091
2092 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2093 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2094 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002095 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002096 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2097 zQuery);
2098 goto end_data_xfer;
2099 }
2100 n = sqlite3_column_count(pQuery);
2101 zInsert = sqlite3_malloc(200 + nTable + n*3);
2102 if( zInsert==0 ){
2103 fprintf(stderr, "out of memory\n");
2104 goto end_data_xfer;
2105 }
2106 sqlite3_snprintf(200+nTable,zInsert,
2107 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2108 i = (int)strlen(zInsert);
2109 for(j=1; j<n; j++){
2110 memcpy(zInsert+i, ",?", 2);
2111 i += 2;
2112 }
2113 memcpy(zInsert+i, ");", 3);
2114 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2115 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002116 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002117 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2118 zQuery);
2119 goto end_data_xfer;
2120 }
2121 for(k=0; k<2; k++){
2122 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2123 for(i=0; i<n; i++){
2124 switch( sqlite3_column_type(pQuery, i) ){
2125 case SQLITE_NULL: {
2126 sqlite3_bind_null(pInsert, i+1);
2127 break;
2128 }
2129 case SQLITE_INTEGER: {
2130 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2131 break;
2132 }
2133 case SQLITE_FLOAT: {
2134 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2135 break;
2136 }
2137 case SQLITE_TEXT: {
2138 sqlite3_bind_text(pInsert, i+1,
2139 (const char*)sqlite3_column_text(pQuery,i),
2140 -1, SQLITE_STATIC);
2141 break;
2142 }
2143 case SQLITE_BLOB: {
2144 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2145 sqlite3_column_bytes(pQuery,i),
2146 SQLITE_STATIC);
2147 break;
2148 }
2149 }
2150 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002151 rc = sqlite3_step(pInsert);
2152 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2153 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2154 sqlite3_errmsg(newDb));
2155 }
drh3350ce92014-02-06 00:49:12 +00002156 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002157 cnt++;
2158 if( (cnt%spinRate)==0 ){
2159 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2160 fflush(stdout);
2161 }
drh3350ce92014-02-06 00:49:12 +00002162 } /* End while */
2163 if( rc==SQLITE_DONE ) break;
2164 sqlite3_finalize(pQuery);
2165 sqlite3_free(zQuery);
2166 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2167 zTable);
2168 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2169 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002170 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2171 break;
drh3350ce92014-02-06 00:49:12 +00002172 }
2173 } /* End for(k=0...) */
2174
2175end_data_xfer:
2176 sqlite3_finalize(pQuery);
2177 sqlite3_finalize(pInsert);
2178 sqlite3_free(zQuery);
2179 sqlite3_free(zInsert);
2180}
2181
2182
2183/*
2184** Try to transfer all rows of the schema that match zWhere. For
2185** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002186** If an error is encountered while moving forward through the
2187** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002188*/
mistachkine31ae902014-02-06 01:15:29 +00002189static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002190 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002191 sqlite3 *newDb,
2192 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002193 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002194){
2195 sqlite3_stmt *pQuery = 0;
2196 char *zQuery = 0;
2197 int rc;
2198 const unsigned char *zName;
2199 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002200 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002201
2202 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2203 " WHERE %s", zWhere);
2204 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2205 if( rc ){
2206 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2207 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2208 zQuery);
2209 goto end_schema_xfer;
2210 }
2211 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2212 zName = sqlite3_column_text(pQuery, 0);
2213 zSql = sqlite3_column_text(pQuery, 1);
2214 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002215 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2216 if( zErrMsg ){
2217 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2218 sqlite3_free(zErrMsg);
2219 zErrMsg = 0;
2220 }
drh3350ce92014-02-06 00:49:12 +00002221 if( xForEach ){
2222 xForEach(p, newDb, (const char*)zName);
2223 }
2224 printf("done\n");
2225 }
2226 if( rc!=SQLITE_DONE ){
2227 sqlite3_finalize(pQuery);
2228 sqlite3_free(zQuery);
2229 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2230 " WHERE %s ORDER BY rowid DESC", zWhere);
2231 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2232 if( rc ){
2233 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2234 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2235 zQuery);
2236 goto end_schema_xfer;
2237 }
2238 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2239 zName = sqlite3_column_text(pQuery, 0);
2240 zSql = sqlite3_column_text(pQuery, 1);
2241 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002242 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2243 if( zErrMsg ){
2244 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2245 sqlite3_free(zErrMsg);
2246 zErrMsg = 0;
2247 }
drh3350ce92014-02-06 00:49:12 +00002248 if( xForEach ){
2249 xForEach(p, newDb, (const char*)zName);
2250 }
2251 printf("done\n");
2252 }
2253 }
2254end_schema_xfer:
2255 sqlite3_finalize(pQuery);
2256 sqlite3_free(zQuery);
2257}
2258
2259/*
2260** Open a new database file named "zNewDb". Try to recover as much information
2261** as possible out of the main database (which might be corrupt) and write it
2262** into zNewDb.
2263*/
drhdcd87a92014-08-18 13:45:42 +00002264static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002265 int rc;
2266 sqlite3 *newDb = 0;
2267 if( access(zNewDb,0)==0 ){
2268 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2269 return;
2270 }
2271 rc = sqlite3_open(zNewDb, &newDb);
2272 if( rc ){
2273 fprintf(stderr, "Cannot create output database: %s\n",
2274 sqlite3_errmsg(newDb));
2275 }else{
drh54d0d2d2014-04-03 00:32:13 +00002276 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002277 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002278 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2279 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002280 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002281 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002282 }
2283 sqlite3_close(newDb);
2284}
2285
2286/*
drhc2ce0be2014-05-29 12:36:14 +00002287** Change the output file back to stdout
2288*/
drhdcd87a92014-08-18 13:45:42 +00002289static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002290 if( p->outfile[0]=='|' ){
2291 pclose(p->out);
2292 }else{
2293 output_file_close(p->out);
2294 }
2295 p->outfile[0] = 0;
2296 p->out = stdout;
2297}
2298
2299/*
drh75897232000-05-29 14:26:00 +00002300** If an input line begins with "." then invoke this routine to
2301** process that line.
drh67505e72002-04-19 12:34:06 +00002302**
drh47ad6842006-11-08 12:25:42 +00002303** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002304*/
drhdcd87a92014-08-18 13:45:42 +00002305static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002306 int i = 1;
2307 int nArg = 0;
2308 int n, c;
drh67505e72002-04-19 12:34:06 +00002309 int rc = 0;
drh75897232000-05-29 14:26:00 +00002310 char *azArg[50];
2311
2312 /* Parse the input line into tokens.
2313 */
2314 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002315 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002316 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002317 if( zLine[i]=='\'' || zLine[i]=='"' ){
2318 int delim = zLine[i++];
2319 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002320 while( zLine[i] && zLine[i]!=delim ){
2321 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2322 i++;
2323 }
drh75897232000-05-29 14:26:00 +00002324 if( zLine[i]==delim ){
2325 zLine[i++] = 0;
2326 }
drhfeac5f82004-08-01 00:10:45 +00002327 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002328 }else{
2329 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002330 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002331 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002332 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002333 }
2334 }
2335
2336 /* Process the input line.
2337 */
shane9bd1b442009-10-23 01:27:39 +00002338 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002339 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002340 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002341 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2342 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2343 ){
drhbc46f022013-01-23 18:53:23 +00002344 const char *zDestFile = 0;
2345 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002346 sqlite3 *pDest;
2347 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002348 int j;
2349 for(j=1; j<nArg; j++){
2350 const char *z = azArg[j];
2351 if( z[0]=='-' ){
2352 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002353 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002354 {
2355 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2356 return 1;
2357 }
2358 }else if( zDestFile==0 ){
2359 zDestFile = azArg[j];
2360 }else if( zDb==0 ){
2361 zDb = zDestFile;
2362 zDestFile = azArg[j];
2363 }else{
2364 fprintf(stderr, "too many arguments to .backup\n");
2365 return 1;
2366 }
drh9ff849f2009-02-04 20:55:57 +00002367 }
drhbc46f022013-01-23 18:53:23 +00002368 if( zDestFile==0 ){
2369 fprintf(stderr, "missing FILENAME argument on .backup\n");
2370 return 1;
2371 }
2372 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002373 rc = sqlite3_open(zDestFile, &pDest);
2374 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002375 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002376 sqlite3_close(pDest);
2377 return 1;
2378 }
drh05782482013-10-24 15:20:20 +00002379 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002380 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2381 if( pBackup==0 ){
2382 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2383 sqlite3_close(pDest);
2384 return 1;
2385 }
2386 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2387 sqlite3_backup_finish(pBackup);
2388 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002389 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002390 }else{
2391 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002392 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002393 }
2394 sqlite3_close(pDest);
2395 }else
2396
drhc2ce0be2014-05-29 12:36:14 +00002397 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2398 if( nArg==2 ){
2399 bail_on_error = booleanValue(azArg[1]);
2400 }else{
2401 fprintf(stderr, "Usage: .bail on|off\n");
2402 rc = 1;
2403 }
drhc49f44e2006-10-26 18:15:42 +00002404 }else
2405
drhd8621b92012-04-17 09:09:33 +00002406 /* The undocumented ".breakpoint" command causes a call to the no-op
2407 ** routine named test_breakpoint().
2408 */
2409 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2410 test_breakpoint();
2411 }else
2412
drhc2ce0be2014-05-29 12:36:14 +00002413 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2414 if( nArg==2 ){
2415 tryToClone(p, azArg[1]);
2416 }else{
2417 fprintf(stderr, "Usage: .clone FILENAME\n");
2418 rc = 1;
2419 }
mistachkine31ae902014-02-06 01:15:29 +00002420 }else
2421
drhc2ce0be2014-05-29 12:36:14 +00002422 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002423 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002424 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002425 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002426 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002427 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002428 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002429 data.colWidth[0] = 3;
2430 data.colWidth[1] = 15;
2431 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002432 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002433 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002434 if( zErrMsg ){
2435 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002436 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002437 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002438 }
2439 }else
2440
drhc2ce0be2014-05-29 12:36:14 +00002441 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002442 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002443 /* When playing back a "dump", the content might appear in an order
2444 ** which causes immediate foreign key constraints to be violated.
2445 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002446 if( nArg!=1 && nArg!=2 ){
2447 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2448 rc = 1;
2449 goto meta_command_exit;
2450 }
drhf1dfc4f2009-09-23 15:51:35 +00002451 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002452 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002453 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002454 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002455 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002456 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002457 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002458 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002459 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002460 );
2461 run_schema_dump_query(p,
2462 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002463 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002464 );
drh2f464a02011-10-13 00:41:49 +00002465 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002466 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002467 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002468 );
drh4c653a02000-06-07 01:27:47 +00002469 }else{
2470 int i;
drhdd3d4592004-08-30 01:54:05 +00002471 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002472 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002473 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002474 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002475 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002476 " AND sql NOT NULL");
2477 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002478 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002479 "WHERE sql NOT NULL"
2480 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002481 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002482 );
danielk1977bc6ada42004-06-30 08:20:16 +00002483 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002484 }
2485 }
drh45e29d82006-11-20 16:21:10 +00002486 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002487 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002488 p->writableSchema = 0;
2489 }
drh56197952011-10-13 16:30:13 +00002490 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2491 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002492 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002493 }else
drh75897232000-05-29 14:26:00 +00002494
drhc2ce0be2014-05-29 12:36:14 +00002495 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2496 if( nArg==2 ){
2497 p->echoOn = booleanValue(azArg[1]);
2498 }else{
2499 fprintf(stderr, "Usage: .echo on|off\n");
2500 rc = 1;
2501 }
drhdaffd0e2001-04-11 14:28:42 +00002502 }else
2503
drhc2ce0be2014-05-29 12:36:14 +00002504 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2505 if( nArg==2 ){
2506 p->autoEQP = booleanValue(azArg[1]);
2507 }else{
2508 fprintf(stderr, "Usage: .eqp on|off\n");
2509 rc = 1;
2510 }
drhefbf3b12014-02-28 20:47:24 +00002511 }else
2512
drhd3ac7d92013-01-25 18:33:43 +00002513 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002514 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002515 rc = 2;
drh75897232000-05-29 14:26:00 +00002516 }else
2517
drhc2ce0be2014-05-29 12:36:14 +00002518 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002519 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002520 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002521 if(!p->normalMode.valid) {
2522 p->normalMode.valid = 1;
2523 p->normalMode.mode = p->mode;
2524 p->normalMode.showHeader = p->showHeader;
2525 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002526 }
2527 /* We could put this code under the !p->explainValid
2528 ** condition so that it does not execute if we are already in
2529 ** explain mode. However, always executing it allows us an easy
2530 ** was to reset to explain mode in case the user previously
2531 ** did an .explain followed by a .width, .mode or .header
2532 ** command.
2533 */
danielk19770d78bae2008-01-03 07:09:48 +00002534 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002535 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002536 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002537 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002538 p->colWidth[1] = 13; /* opcode */
2539 p->colWidth[2] = 4; /* P1 */
2540 p->colWidth[3] = 4; /* P2 */
2541 p->colWidth[4] = 4; /* P3 */
2542 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002543 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002544 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002545 }else if (p->normalMode.valid) {
2546 p->normalMode.valid = 0;
2547 p->mode = p->normalMode.mode;
2548 p->showHeader = p->normalMode.showHeader;
2549 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002550 }
drh75897232000-05-29 14:26:00 +00002551 }else
2552
drhc1971542014-06-23 23:28:13 +00002553 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002554 ShellState data;
drhc1971542014-06-23 23:28:13 +00002555 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002556 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002557 if( nArg!=1 ){
2558 fprintf(stderr, "Usage: .fullschema\n");
2559 rc = 1;
2560 goto meta_command_exit;
2561 }
2562 open_db(p, 0);
2563 memcpy(&data, p, sizeof(data));
2564 data.showHeader = 0;
2565 data.mode = MODE_Semi;
2566 rc = sqlite3_exec(p->db,
2567 "SELECT sql FROM"
2568 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2569 " FROM sqlite_master UNION ALL"
2570 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002571 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002572 "ORDER BY rowid",
2573 callback, &data, &zErrMsg
2574 );
drh56f674c2014-07-18 14:43:29 +00002575 if( rc==SQLITE_OK ){
2576 sqlite3_stmt *pStmt;
2577 rc = sqlite3_prepare_v2(p->db,
2578 "SELECT rowid FROM sqlite_master"
2579 " WHERE name GLOB 'sqlite_stat[134]'",
2580 -1, &pStmt, 0);
2581 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2582 sqlite3_finalize(pStmt);
2583 }
2584 if( doStats==0 ){
2585 fprintf(p->out, "/* No STAT tables available */\n");
2586 }else{
2587 fprintf(p->out, "ANALYZE sqlite_master;\n");
2588 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2589 callback, &data, &zErrMsg);
2590 data.mode = MODE_Insert;
2591 data.zDestTable = "sqlite_stat1";
2592 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2593 shell_callback, &data,&zErrMsg);
2594 data.zDestTable = "sqlite_stat3";
2595 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2596 shell_callback, &data,&zErrMsg);
2597 data.zDestTable = "sqlite_stat4";
2598 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2599 shell_callback, &data, &zErrMsg);
2600 fprintf(p->out, "ANALYZE sqlite_master;\n");
2601 }
drhc1971542014-06-23 23:28:13 +00002602 }else
2603
drhc2ce0be2014-05-29 12:36:14 +00002604 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2605 if( nArg==2 ){
2606 p->showHeader = booleanValue(azArg[1]);
2607 }else{
2608 fprintf(stderr, "Usage: .headers on|off\n");
2609 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002610 }
drh75897232000-05-29 14:26:00 +00002611 }else
2612
drhc2ce0be2014-05-29 12:36:14 +00002613 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2614 fprintf(p->out, "%s", zHelp);
2615 }else
2616
2617 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002618 char *zTable; /* Insert data into this table */
2619 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002620 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002621 int nCol; /* Number of columns in the table */
2622 int nByte; /* Number of bytes in an SQL string */
2623 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002624 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002625 int nSep; /* Number of bytes in p->separator[] */
2626 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002627 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002628 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002629
drhc2ce0be2014-05-29 12:36:14 +00002630 if( nArg!=3 ){
2631 fprintf(stderr, "Usage: .import FILE TABLE\n");
2632 goto meta_command_exit;
2633 }
drh01f37542014-05-31 15:43:33 +00002634 zFile = azArg[1];
2635 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002636 seenInterrupt = 0;
2637 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002638 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002639 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002640 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002641 fprintf(stderr, "Error: non-null separator required for import\n");
2642 return 1;
drhfeac5f82004-08-01 00:10:45 +00002643 }
drhdb95f682013-06-26 22:46:00 +00002644 if( nSep>1 ){
2645 fprintf(stderr, "Error: multi-character separators not allowed"
2646 " for import\n");
2647 return 1;
2648 }
drh5bde8162013-06-27 14:07:53 +00002649 sCsv.zFile = zFile;
2650 sCsv.nLine = 1;
2651 if( sCsv.zFile[0]=='|' ){
2652 sCsv.in = popen(sCsv.zFile+1, "r");
2653 sCsv.zFile = "<pipe>";
2654 xCloser = pclose;
2655 }else{
2656 sCsv.in = fopen(sCsv.zFile, "rb");
2657 xCloser = fclose;
2658 }
drhdb95f682013-06-26 22:46:00 +00002659 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002660 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002661 return 1;
2662 }
2663 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002664 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002665 if( zSql==0 ){
2666 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002667 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002668 return 1;
2669 }
drh4f21c4a2008-12-10 22:15:00 +00002670 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002671 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002672 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002673 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2674 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2675 char cSep = '(';
2676 while( csv_read_one_field(&sCsv) ){
2677 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2678 cSep = ',';
2679 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2680 }
drh5bde8162013-06-27 14:07:53 +00002681 if( cSep=='(' ){
2682 sqlite3_free(zCreate);
2683 sqlite3_free(sCsv.z);
2684 xCloser(sCsv.in);
2685 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2686 return 1;
2687 }
drhdb95f682013-06-26 22:46:00 +00002688 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2689 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2690 sqlite3_free(zCreate);
2691 if( rc ){
2692 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2693 sqlite3_errmsg(db));
2694 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002695 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002696 return 1;
2697 }
drhc7181902014-02-27 15:04:13 +00002698 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002699 }
drhfeac5f82004-08-01 00:10:45 +00002700 sqlite3_free(zSql);
2701 if( rc ){
shane916f9612009-10-23 00:37:15 +00002702 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002703 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002704 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002705 return 1;
drhfeac5f82004-08-01 00:10:45 +00002706 }
shane916f9612009-10-23 00:37:15 +00002707 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002708 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002709 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002710 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002711 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002712 if( zSql==0 ){
2713 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002714 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002715 return 1;
2716 }
drhdb95f682013-06-26 22:46:00 +00002717 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002718 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002719 for(i=1; i<nCol; i++){
2720 zSql[j++] = ',';
2721 zSql[j++] = '?';
2722 }
2723 zSql[j++] = ')';
2724 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002725 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002726 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002727 if( rc ){
2728 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002729 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002730 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002731 return 1;
drhfeac5f82004-08-01 00:10:45 +00002732 }
drh2d463112013-08-06 14:36:36 +00002733 needCommit = sqlite3_get_autocommit(db);
2734 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002735 do{
2736 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002737 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002738 char *z = csv_read_one_field(&sCsv);
2739 if( z==0 && i==0 ) break;
2740 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2741 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2742 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2743 "filling the rest with NULL\n",
2744 sCsv.zFile, startLine, nCol, i+1);
2745 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002746 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002747 }
drhfeac5f82004-08-01 00:10:45 +00002748 }
drhdb95f682013-06-26 22:46:00 +00002749 if( sCsv.cTerm==sCsv.cSeparator ){
2750 do{
2751 csv_read_one_field(&sCsv);
2752 i++;
2753 }while( sCsv.cTerm==sCsv.cSeparator );
2754 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2755 "extras ignored\n",
2756 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002757 }
drhdb95f682013-06-26 22:46:00 +00002758 if( i>=nCol ){
2759 sqlite3_step(pStmt);
2760 rc = sqlite3_reset(pStmt);
2761 if( rc!=SQLITE_OK ){
2762 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2763 sqlite3_errmsg(db));
2764 }
2765 }
2766 }while( sCsv.cTerm!=EOF );
2767
drh5bde8162013-06-27 14:07:53 +00002768 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002769 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002770 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002771 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002772 }else
2773
drhc2ce0be2014-05-29 12:36:14 +00002774 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002775 ShellState data;
drh75897232000-05-29 14:26:00 +00002776 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002777 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002778 memcpy(&data, p, sizeof(data));
2779 data.showHeader = 0;
2780 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002781 if( nArg==1 ){
2782 rc = sqlite3_exec(p->db,
2783 "SELECT name FROM sqlite_master "
2784 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2785 "UNION ALL "
2786 "SELECT name FROM sqlite_temp_master "
2787 "WHERE type='index' "
2788 "ORDER BY 1",
2789 callback, &data, &zErrMsg
2790 );
drhc2ce0be2014-05-29 12:36:14 +00002791 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002792 zShellStatic = azArg[1];
2793 rc = sqlite3_exec(p->db,
2794 "SELECT name FROM sqlite_master "
2795 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2796 "UNION ALL "
2797 "SELECT name FROM sqlite_temp_master "
2798 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2799 "ORDER BY 1",
2800 callback, &data, &zErrMsg
2801 );
2802 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002803 }else{
2804 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2805 rc = 1;
2806 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002807 }
drh75897232000-05-29 14:26:00 +00002808 if( zErrMsg ){
2809 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002810 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002811 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002812 }else if( rc != SQLITE_OK ){
2813 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2814 rc = 1;
drh75897232000-05-29 14:26:00 +00002815 }
2816 }else
2817
drhae5e4452007-05-03 17:18:36 +00002818#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002819 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002820 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002821 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2822 iotrace = 0;
2823 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002824 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002825 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002826 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002827 iotrace = stdout;
2828 }else{
2829 iotrace = fopen(azArg[1], "w");
2830 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002831 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002832 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002833 rc = 1;
drhb0603412007-02-28 04:47:26 +00002834 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002835 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002836 }
2837 }
2838 }else
drhae5e4452007-05-03 17:18:36 +00002839#endif
drhb0603412007-02-28 04:47:26 +00002840
drh70df4fe2006-06-13 15:12:21 +00002841#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002842 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002843 const char *zFile, *zProc;
2844 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002845 if( nArg<2 ){
2846 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2847 rc = 1;
2848 goto meta_command_exit;
2849 }
drh1e397f82006-06-08 15:28:43 +00002850 zFile = azArg[1];
2851 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002852 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002853 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2854 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002855 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002856 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002857 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002858 }
2859 }else
drh70df4fe2006-06-13 15:12:21 +00002860#endif
drh1e397f82006-06-08 15:28:43 +00002861
drhc2ce0be2014-05-29 12:36:14 +00002862 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2863 if( nArg!=2 ){
2864 fprintf(stderr, "Usage: .log FILENAME\n");
2865 rc = 1;
2866 }else{
2867 const char *zFile = azArg[1];
2868 output_file_close(p->pLog);
2869 p->pLog = output_file_open(zFile);
2870 }
drh127f9d72010-02-23 01:47:00 +00002871 }else
2872
drhc2ce0be2014-05-29 12:36:14 +00002873 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2874 const char *zMode = nArg>=2 ? azArg[1] : "";
2875 int n2 = (int)strlen(zMode);
2876 int c2 = zMode[0];
2877 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002878 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002879 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002880 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002881 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002882 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002883 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002884 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002885 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002886 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002887 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002888 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002889 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002890 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drh6976c212014-07-24 12:09:47 +00002891 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
drhc2ce0be2014-05-29 12:36:14 +00002892 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002893 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002894 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002895 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002896 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002897 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002898 }else {
shane9bd1b442009-10-23 01:27:39 +00002899 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002900 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002901 rc = 1;
drh75897232000-05-29 14:26:00 +00002902 }
2903 }else
2904
drhc2ce0be2014-05-29 12:36:14 +00002905 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2906 if( nArg==2 ){
2907 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2908 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2909 }else{
2910 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002911 rc = 1;
2912 }
2913 }else
2914
drh05782482013-10-24 15:20:20 +00002915 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2916 sqlite3 *savedDb = p->db;
2917 const char *zSavedFilename = p->zDbFilename;
2918 char *zNewFilename = 0;
2919 p->db = 0;
2920 if( nArg>=2 ){
2921 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2922 }
2923 open_db(p, 1);
2924 if( p->db!=0 ){
2925 sqlite3_close(savedDb);
2926 sqlite3_free(p->zFreeOnClose);
2927 p->zFreeOnClose = zNewFilename;
2928 }else{
2929 sqlite3_free(zNewFilename);
2930 p->db = savedDb;
2931 p->zDbFilename = zSavedFilename;
2932 }
2933 }else
2934
drhc2ce0be2014-05-29 12:36:14 +00002935 if( c=='o'
2936 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2937 ){
2938 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2939 if( nArg>2 ){
2940 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2941 rc = 1;
2942 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002943 }
drhc2ce0be2014-05-29 12:36:14 +00002944 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2945 if( nArg<2 ){
2946 fprintf(stderr, "Usage: .once FILE\n");
2947 rc = 1;
2948 goto meta_command_exit;
2949 }
2950 p->outCount = 2;
2951 }else{
2952 p->outCount = 0;
2953 }
2954 output_reset(p);
2955 if( zFile[0]=='|' ){
2956 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002957 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002958 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002959 p->out = stdout;
2960 rc = 1;
2961 }else{
drhc2ce0be2014-05-29 12:36:14 +00002962 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002963 }
drh75897232000-05-29 14:26:00 +00002964 }else{
drhc2ce0be2014-05-29 12:36:14 +00002965 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002966 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002967 if( strcmp(zFile,"off")!=0 ){
2968 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002969 }
drh75897232000-05-29 14:26:00 +00002970 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002971 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002972 } else {
drhc2ce0be2014-05-29 12:36:14 +00002973 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002974 }
2975 }
2976 }else
2977
drh078b1fd2012-09-21 13:40:02 +00002978 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2979 int i;
2980 for(i=1; i<nArg; i++){
2981 if( i>1 ) fprintf(p->out, " ");
2982 fprintf(p->out, "%s", azArg[i]);
2983 }
2984 fprintf(p->out, "\n");
2985 }else
2986
drhc2ce0be2014-05-29 12:36:14 +00002987 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002988 if( nArg >= 2) {
2989 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2990 }
2991 if( nArg >= 3) {
2992 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2993 }
2994 }else
2995
drhc2ce0be2014-05-29 12:36:14 +00002996 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002997 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002998 }else
2999
drhc2ce0be2014-05-29 12:36:14 +00003000 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3001 FILE *alt;
3002 if( nArg!=2 ){
3003 fprintf(stderr, "Usage: .read FILE\n");
3004 rc = 1;
3005 goto meta_command_exit;
3006 }
3007 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003008 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003009 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3010 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003011 }else{
shane9bd1b442009-10-23 01:27:39 +00003012 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003013 fclose(alt);
3014 }
3015 }else
3016
drhc2ce0be2014-05-29 12:36:14 +00003017 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003018 const char *zSrcFile;
3019 const char *zDb;
3020 sqlite3 *pSrc;
3021 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003022 int nTimeout = 0;
3023
drh9ff849f2009-02-04 20:55:57 +00003024 if( nArg==2 ){
3025 zSrcFile = azArg[1];
3026 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003027 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003028 zSrcFile = azArg[2];
3029 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003030 }else{
3031 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3032 rc = 1;
3033 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003034 }
3035 rc = sqlite3_open(zSrcFile, &pSrc);
3036 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003037 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003038 sqlite3_close(pSrc);
3039 return 1;
3040 }
drh05782482013-10-24 15:20:20 +00003041 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003042 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3043 if( pBackup==0 ){
3044 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3045 sqlite3_close(pSrc);
3046 return 1;
3047 }
drhdc2c4912009-02-04 22:46:47 +00003048 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3049 || rc==SQLITE_BUSY ){
3050 if( rc==SQLITE_BUSY ){
3051 if( nTimeout++ >= 3 ) break;
3052 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003053 }
3054 }
3055 sqlite3_backup_finish(pBackup);
3056 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003057 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003058 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003059 fprintf(stderr, "Error: source database is busy\n");
3060 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003061 }else{
3062 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003063 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003064 }
3065 sqlite3_close(pSrc);
3066 }else
3067
dan8d1edb92014-11-05 09:07:28 +00003068
3069 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3070 if( nArg==2 ){
3071 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003072#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3073 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3074#endif
dan8d1edb92014-11-05 09:07:28 +00003075 }else{
3076 fprintf(stderr, "Usage: .scanstats on|off\n");
3077 rc = 1;
3078 }
3079 }else
3080
drhc2ce0be2014-05-29 12:36:14 +00003081 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003082 ShellState data;
drh75897232000-05-29 14:26:00 +00003083 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003084 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003085 memcpy(&data, p, sizeof(data));
3086 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003087 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003088 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003089 int i;
drhf0693c82011-10-11 20:41:54 +00003090 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003091 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003092 char *new_argv[2], *new_colv[2];
3093 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3094 " type text,\n"
3095 " name text,\n"
3096 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003097 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003098 " sql text\n"
3099 ")";
3100 new_argv[1] = 0;
3101 new_colv[0] = "sql";
3102 new_colv[1] = 0;
3103 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003104 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003105 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003106 char *new_argv[2], *new_colv[2];
3107 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3108 " type text,\n"
3109 " name text,\n"
3110 " tbl_name text,\n"
3111 " rootpage integer,\n"
3112 " sql text\n"
3113 ")";
3114 new_argv[1] = 0;
3115 new_colv[0] = "sql";
3116 new_colv[1] = 0;
3117 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003118 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003119 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003120 zShellStatic = azArg[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) "
drh6ac7a582011-11-04 00:35:56 +00003126 "WHERE lower(tbl_name) LIKE shellstatic()"
3127 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003128 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003129 callback, &data, &zErrMsg);
3130 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003131 }
drhc2ce0be2014-05-29 12:36:14 +00003132 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003133 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003134 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003135 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003136 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003137 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003138 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003139 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003140 callback, &data, &zErrMsg
3141 );
drhc2ce0be2014-05-29 12:36:14 +00003142 }else{
3143 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3144 rc = 1;
3145 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003146 }
drh75897232000-05-29 14:26:00 +00003147 if( zErrMsg ){
3148 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003149 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003150 rc = 1;
3151 }else if( rc != SQLITE_OK ){
3152 fprintf(stderr,"Error: querying schema information\n");
3153 rc = 1;
3154 }else{
3155 rc = 0;
drh75897232000-05-29 14:26:00 +00003156 }
3157 }else
3158
drhabd4c722014-09-20 18:18:33 +00003159
3160#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3161 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3162 extern int sqlite3SelectTrace;
3163 sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3164 }else
3165#endif
3166
3167
drh340f5822013-06-27 13:01:21 +00003168#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003169 /* Undocumented commands for internal testing. Subject to change
3170 ** without notice. */
3171 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3172 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3173 int i, v;
3174 for(i=1; i<nArg; i++){
3175 v = booleanValue(azArg[i]);
3176 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3177 }
3178 }
3179 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3180 int i; sqlite3_int64 v;
3181 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003182 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003183 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003184 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003185 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003186 }
3187 }
3188 }else
drh340f5822013-06-27 13:01:21 +00003189#endif
drh348d19c2013-06-03 12:47:43 +00003190
drhc2ce0be2014-05-29 12:36:14 +00003191 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003192 if( nArg<2 || nArg>3 ){
3193 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
drhc2ce0be2014-05-29 12:36:14 +00003194 rc = 1;
3195 }
drh6976c212014-07-24 12:09:47 +00003196 if( nArg>=2 ){
3197 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3198 }
3199 if( nArg>=3 ){
3200 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3201 }
drh75897232000-05-29 14:26:00 +00003202 }else
3203
drh62cdde52014-05-28 20:22:28 +00003204 if( c=='s'
3205 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003206 ){
3207 char *zCmd;
drh54027102014-08-06 14:36:53 +00003208 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003209 if( nArg<2 ){
3210 fprintf(stderr, "Usage: .system COMMAND\n");
3211 rc = 1;
3212 goto meta_command_exit;
3213 }
drhdcb3e3d2014-05-29 03:17:29 +00003214 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003215 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003216 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3217 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003218 }
drh54027102014-08-06 14:36:53 +00003219 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003220 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003221 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003222 }else
3223
drhc2ce0be2014-05-29 12:36:14 +00003224 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003225 int i;
drhc2ce0be2014-05-29 12:36:14 +00003226 if( nArg!=1 ){
3227 fprintf(stderr, "Usage: .show\n");
3228 rc = 1;
3229 goto meta_command_exit;
3230 }
persicom7e2dfdd2002-04-18 02:46:52 +00003231 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003232 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003233 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003234 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003235 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003236 fprintf(p->out,"%9.9s: ", "nullvalue");
3237 output_c_string(p->out, p->nullvalue);
3238 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003239 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003240 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003241 fprintf(p->out,"%9.9s: ", "separator");
3242 output_c_string(p->out, p->separator);
drh6976c212014-07-24 12:09:47 +00003243 fprintf(p->out," ");
3244 output_c_string(p->out, p->newline);
drhfeac5f82004-08-01 00:10:45 +00003245 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003246 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003247 fprintf(p->out,"%9.9s: ","width");
3248 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003249 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003250 }
drhfeac5f82004-08-01 00:10:45 +00003251 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003252 }else
3253
drhc2ce0be2014-05-29 12:36:14 +00003254 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3255 if( nArg==2 ){
3256 p->statsOn = booleanValue(azArg[1]);
3257 }else{
3258 fprintf(stderr, "Usage: .stats on|off\n");
3259 rc = 1;
3260 }
shaneh642d8b82010-07-28 16:05:34 +00003261 }else
3262
drhc2ce0be2014-05-29 12:36:14 +00003263 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003264 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003265 char **azResult;
drh98781232012-04-23 12:38:05 +00003266 int nRow, nAlloc;
3267 char *zSql = 0;
3268 int ii;
drh05782482013-10-24 15:20:20 +00003269 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003270 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3271 if( rc ) return rc;
3272 zSql = sqlite3_mprintf(
3273 "SELECT name FROM sqlite_master"
3274 " WHERE type IN ('table','view')"
3275 " AND name NOT LIKE 'sqlite_%%'"
3276 " AND name LIKE ?1");
3277 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3278 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3279 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3280 if( strcmp(zDbName,"temp")==0 ){
3281 zSql = sqlite3_mprintf(
3282 "%z UNION ALL "
3283 "SELECT 'temp.' || name FROM sqlite_temp_master"
3284 " WHERE type IN ('table','view')"
3285 " AND name NOT LIKE 'sqlite_%%'"
3286 " AND name LIKE ?1", zSql);
3287 }else{
3288 zSql = sqlite3_mprintf(
3289 "%z UNION ALL "
3290 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3291 " WHERE type IN ('table','view')"
3292 " AND name NOT LIKE 'sqlite_%%'"
3293 " AND name LIKE ?1", zSql, zDbName, zDbName);
3294 }
drha50da102000-08-08 20:19:09 +00003295 }
drh98781232012-04-23 12:38:05 +00003296 sqlite3_finalize(pStmt);
3297 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3298 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3299 sqlite3_free(zSql);
3300 if( rc ) return rc;
3301 nRow = nAlloc = 0;
3302 azResult = 0;
3303 if( nArg>1 ){
3304 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003305 }else{
drh98781232012-04-23 12:38:05 +00003306 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3307 }
3308 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3309 if( nRow>=nAlloc ){
3310 char **azNew;
3311 int n = nAlloc*2 + 10;
3312 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3313 if( azNew==0 ){
3314 fprintf(stderr, "Error: out of memory\n");
3315 break;
3316 }
3317 nAlloc = n;
3318 azResult = azNew;
3319 }
3320 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3321 if( azResult[nRow] ) nRow++;
3322 }
3323 sqlite3_finalize(pStmt);
3324 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003325 int len, maxlen = 0;
3326 int i, j;
3327 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003328 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003329 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003330 if( len>maxlen ) maxlen = len;
3331 }
3332 nPrintCol = 80/(maxlen+2);
3333 if( nPrintCol<1 ) nPrintCol = 1;
3334 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3335 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003336 for(j=i; j<nRow; j+=nPrintRow){
3337 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003338 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003339 }
drh151b7d52013-05-06 20:28:54 +00003340 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003341 }
3342 }
drh98781232012-04-23 12:38:05 +00003343 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3344 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003345 }else
3346
shaneh96887e12011-02-10 21:08:58 +00003347 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003348 static const struct {
3349 const char *zCtrlName; /* Name of a test-control option */
3350 int ctrlCode; /* Integer code for that option */
3351 } aCtrl[] = {
3352 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3353 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3354 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3355 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3356 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3357 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3358 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3359 { "assert", SQLITE_TESTCTRL_ASSERT },
3360 { "always", SQLITE_TESTCTRL_ALWAYS },
3361 { "reserve", SQLITE_TESTCTRL_RESERVE },
3362 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3363 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003364 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003365 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003366 };
shaneh96887e12011-02-10 21:08:58 +00003367 int testctrl = -1;
3368 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003369 int i, n;
drh05782482013-10-24 15:20:20 +00003370 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003371
drhd416fe72011-03-17 16:45:50 +00003372 /* convert testctrl text option to value. allow any unique prefix
3373 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003374 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003375 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003376 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3377 if( testctrl<0 ){
3378 testctrl = aCtrl[i].ctrlCode;
3379 }else{
drhb07028f2011-10-14 21:49:18 +00003380 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003381 testctrl = -1;
3382 break;
3383 }
3384 }
3385 }
drh348d19c2013-06-03 12:47:43 +00003386 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003387 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3388 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3389 }else{
3390 switch(testctrl){
3391
3392 /* sqlite3_test_control(int, db, int) */
3393 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3394 case SQLITE_TESTCTRL_RESERVE:
3395 if( nArg==3 ){
3396 int opt = (int)strtol(azArg[2], 0, 0);
3397 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003398 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003399 } else {
drhd416fe72011-03-17 16:45:50 +00003400 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3401 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003402 }
3403 break;
3404
3405 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003406 case SQLITE_TESTCTRL_PRNG_SAVE:
3407 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003408 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003409 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003410 if( nArg==2 ){
3411 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003412 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003413 } else {
3414 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3415 }
3416 break;
3417
3418 /* sqlite3_test_control(int, uint) */
3419 case SQLITE_TESTCTRL_PENDING_BYTE:
3420 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003421 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003422 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003423 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003424 } else {
drhd416fe72011-03-17 16:45:50 +00003425 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3426 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003427 }
3428 break;
3429
3430 /* sqlite3_test_control(int, int) */
3431 case SQLITE_TESTCTRL_ASSERT:
3432 case SQLITE_TESTCTRL_ALWAYS:
3433 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003434 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003435 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003436 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003437 } else {
drhd416fe72011-03-17 16:45:50 +00003438 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3439 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003440 }
3441 break;
3442
3443 /* sqlite3_test_control(int, char *) */
3444#ifdef SQLITE_N_KEYWORD
3445 case SQLITE_TESTCTRL_ISKEYWORD:
3446 if( nArg==3 ){
3447 const char *opt = azArg[2];
3448 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003449 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003450 } else {
drhd416fe72011-03-17 16:45:50 +00003451 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3452 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003453 }
3454 break;
3455#endif
3456
3457 case SQLITE_TESTCTRL_BITVEC_TEST:
3458 case SQLITE_TESTCTRL_FAULT_INSTALL:
3459 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3460 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3461 default:
drhd416fe72011-03-17 16:45:50 +00003462 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3463 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003464 break;
3465 }
3466 }
3467 }else
3468
drhc2ce0be2014-05-29 12:36:14 +00003469 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003470 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003471 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003472 }else
3473
drhc2ce0be2014-05-29 12:36:14 +00003474 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3475 if( nArg==2 ){
3476 enableTimer = booleanValue(azArg[1]);
3477 if( enableTimer && !HAS_TIMER ){
3478 fprintf(stderr, "Error: timer not available on this system.\n");
3479 enableTimer = 0;
3480 }
3481 }else{
3482 fprintf(stderr, "Usage: .timer on|off\n");
3483 rc = 1;
3484 }
shanehe2aa9d72009-11-06 17:20:17 +00003485 }else
3486
drhc2ce0be2014-05-29 12:36:14 +00003487 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003488 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003489 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003490 if( nArg!=2 ){
3491 fprintf(stderr, "Usage: .trace FILE|off\n");
3492 rc = 1;
3493 goto meta_command_exit;
3494 }
drh42f64e52012-04-04 16:56:23 +00003495 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003496#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003497 if( p->traceOut==0 ){
3498 sqlite3_trace(p->db, 0, 0);
3499 }else{
3500 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3501 }
3502#endif
3503 }else
3504
drhf442e332014-09-10 19:01:14 +00003505#if SQLITE_USER_AUTHENTICATION
3506 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3507 if( nArg<2 ){
3508 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3509 rc = 1;
3510 goto meta_command_exit;
3511 }
drh7883ecf2014-09-11 16:19:31 +00003512 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003513 if( strcmp(azArg[1],"login")==0 ){
3514 if( nArg!=4 ){
3515 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3516 rc = 1;
3517 goto meta_command_exit;
3518 }
drhd39c40f2014-09-11 00:27:53 +00003519 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3520 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003521 if( rc ){
3522 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3523 rc = 1;
3524 }
3525 }else if( strcmp(azArg[1],"add")==0 ){
3526 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003527 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003528 rc = 1;
3529 goto meta_command_exit;
3530 }
drhd39c40f2014-09-11 00:27:53 +00003531 rc = sqlite3_user_add(p->db, azArg[2],
3532 azArg[3], (int)strlen(azArg[3]),
3533 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003534 if( rc ){
3535 fprintf(stderr, "User-Add failed: %d\n", rc);
3536 rc = 1;
3537 }
3538 }else if( strcmp(azArg[1],"edit")==0 ){
3539 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003540 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003541 rc = 1;
3542 goto meta_command_exit;
3543 }
drhd39c40f2014-09-11 00:27:53 +00003544 rc = sqlite3_user_change(p->db, azArg[2],
3545 azArg[3], (int)strlen(azArg[3]),
3546 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003547 if( rc ){
3548 fprintf(stderr, "User-Edit failed: %d\n", rc);
3549 rc = 1;
3550 }
3551 }else if( strcmp(azArg[1],"delete")==0 ){
3552 if( nArg!=3 ){
3553 fprintf(stderr, "Usage: .user delete USER\n");
3554 rc = 1;
3555 goto meta_command_exit;
3556 }
3557 rc = sqlite3_user_delete(p->db, azArg[2]);
3558 if( rc ){
3559 fprintf(stderr, "User-Delete failed: %d\n", rc);
3560 rc = 1;
3561 }
3562 }else{
3563 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3564 rc = 1;
3565 goto meta_command_exit;
3566 }
3567 }else
3568#endif /* SQLITE_USER_AUTHENTICATION */
3569
drh9fd301b2011-06-03 13:28:22 +00003570 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003571 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003572 sqlite3_libversion(), sqlite3_sourceid());
3573 }else
3574
drhde60fc22011-12-14 17:53:36 +00003575 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3576 const char *zDbName = nArg==2 ? azArg[1] : "main";
3577 char *zVfsName = 0;
3578 if( p->db ){
3579 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3580 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003581 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003582 sqlite3_free(zVfsName);
3583 }
3584 }
3585 }else
3586
drhcef4fc82012-09-21 22:50:45 +00003587#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3588 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3589 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003590 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003591 }else
3592#endif
3593
drhc2ce0be2014-05-29 12:36:14 +00003594 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003595 int j;
drh43617e92006-03-06 20:55:46 +00003596 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003597 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003598 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003599 }
3600 }else
3601
3602 {
shane9bd1b442009-10-23 01:27:39 +00003603 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003604 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003605 rc = 1;
drh75897232000-05-29 14:26:00 +00003606 }
drh67505e72002-04-19 12:34:06 +00003607
drhc2ce0be2014-05-29 12:36:14 +00003608meta_command_exit:
3609 if( p->outCount ){
3610 p->outCount--;
3611 if( p->outCount==0 ) output_reset(p);
3612 }
drh67505e72002-04-19 12:34:06 +00003613 return rc;
drh75897232000-05-29 14:26:00 +00003614}
3615
drh67505e72002-04-19 12:34:06 +00003616/*
drh91a66392007-09-07 01:12:32 +00003617** Return TRUE if a semicolon occurs anywhere in the first N characters
3618** of string z[].
drh324ccef2003-02-05 14:06:20 +00003619*/
drh9f099fd2013-08-06 14:01:46 +00003620static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003621 int i;
3622 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3623 return 0;
drh324ccef2003-02-05 14:06:20 +00003624}
3625
3626/*
drh70c7a4b2003-04-26 03:03:06 +00003627** Test to see if a line consists entirely of whitespace.
3628*/
3629static int _all_whitespace(const char *z){
3630 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003631 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003632 if( *z=='/' && z[1]=='*' ){
3633 z += 2;
3634 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3635 if( *z==0 ) return 0;
3636 z++;
3637 continue;
3638 }
3639 if( *z=='-' && z[1]=='-' ){
3640 z += 2;
3641 while( *z && *z!='\n' ){ z++; }
3642 if( *z==0 ) return 1;
3643 continue;
3644 }
3645 return 0;
3646 }
3647 return 1;
3648}
3649
3650/*
drha9b17162003-04-29 18:01:28 +00003651** Return TRUE if the line typed in is an SQL command terminator other
3652** than a semi-colon. The SQL Server style "go" command is understood
3653** as is the Oracle "/".
3654*/
drh9f099fd2013-08-06 14:01:46 +00003655static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003656 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003657 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3658 return 1; /* Oracle */
3659 }
drhf0693c82011-10-11 20:41:54 +00003660 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003661 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003662 return 1; /* SQL Server */
3663 }
3664 return 0;
3665}
3666
3667/*
drh233a5312008-12-18 22:25:13 +00003668** Return true if zSql is a complete SQL statement. Return false if it
3669** ends in the middle of a string literal or C-style comment.
3670*/
drh9f099fd2013-08-06 14:01:46 +00003671static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003672 int rc;
3673 if( zSql==0 ) return 1;
3674 zSql[nSql] = ';';
3675 zSql[nSql+1] = 0;
3676 rc = sqlite3_complete(zSql);
3677 zSql[nSql] = 0;
3678 return rc;
3679}
3680
3681/*
drh67505e72002-04-19 12:34:06 +00003682** Read input from *in and process it. If *in==0 then input
3683** is interactive - the user is typing it it. Otherwise, input
3684** is coming from a file or device. A prompt is issued and history
3685** is saved only if input is interactive. An interrupt signal will
3686** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003687**
3688** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003689*/
drhdcd87a92014-08-18 13:45:42 +00003690static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003691 char *zLine = 0; /* A single input line */
3692 char *zSql = 0; /* Accumulated SQL text */
3693 int nLine; /* Length of current line */
3694 int nSql = 0; /* Bytes of zSql[] used */
3695 int nAlloc = 0; /* Allocated zSql[] space */
3696 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3697 char *zErrMsg; /* Error message returned */
3698 int rc; /* Error code */
3699 int errCnt = 0; /* Number of errors seen */
3700 int lineno = 0; /* Current line number */
3701 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003702
3703 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3704 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003705 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003706 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003707 /* End of input */
3708 if( stdin_is_interactive ) printf("\n");
3709 break;
drhc49f44e2006-10-26 18:15:42 +00003710 }
drh67505e72002-04-19 12:34:06 +00003711 if( seenInterrupt ){
3712 if( in!=0 ) break;
3713 seenInterrupt = 0;
3714 }
drhc28490c2006-10-26 14:25:58 +00003715 lineno++;
drh849a9d92013-12-21 15:46:06 +00003716 if( nSql==0 && _all_whitespace(zLine) ){
3717 if( p->echoOn ) printf("%s\n", zLine);
3718 continue;
3719 }
drh2af0b2d2002-02-21 02:25:02 +00003720 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003721 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003722 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003723 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003724 break;
3725 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003726 errCnt++;
3727 }
drhdaffd0e2001-04-11 14:28:42 +00003728 continue;
3729 }
drh9f099fd2013-08-06 14:01:46 +00003730 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003731 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003732 }
drh9f099fd2013-08-06 14:01:46 +00003733 nLine = strlen30(zLine);
3734 if( nSql+nLine+2>=nAlloc ){
3735 nAlloc = nSql+nLine+100;
3736 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003737 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003738 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003739 exit(1);
3740 }
drhdaffd0e2001-04-11 14:28:42 +00003741 }
drh9f099fd2013-08-06 14:01:46 +00003742 nSqlPrior = nSql;
3743 if( nSql==0 ){
3744 int i;
3745 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003746 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003747 memcpy(zSql, zLine+i, nLine+1-i);
3748 startline = lineno;
3749 nSql = nLine-i;
3750 }else{
3751 zSql[nSql++] = '\n';
3752 memcpy(zSql+nSql, zLine, nLine+1);
3753 nSql += nLine;
3754 }
3755 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003756 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003757 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003758 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003759 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003760 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003761 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003762 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003763 char zPrefix[100];
3764 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003765 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003766 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003767 }else{
shane9bd1b442009-10-23 01:27:39 +00003768 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003769 }
drh7f953e22002-07-13 17:33:45 +00003770 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003771 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003772 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003773 zErrMsg = 0;
3774 }else{
shaned2bed1c2009-10-21 03:56:54 +00003775 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003776 }
drhc49f44e2006-10-26 18:15:42 +00003777 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003778 }
drhdaffd0e2001-04-11 14:28:42 +00003779 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003780 if( p->outCount ){
3781 output_reset(p);
3782 p->outCount = 0;
3783 }
drh9f099fd2013-08-06 14:01:46 +00003784 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003785 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003786 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003787 }
3788 }
drh9f099fd2013-08-06 14:01:46 +00003789 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003790 if( !_all_whitespace(zSql) ){
3791 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00003792 errCnt++;
drhd416fe72011-03-17 16:45:50 +00003793 }
drhdaffd0e2001-04-11 14:28:42 +00003794 free(zSql);
3795 }
danielk19772ac27622007-07-03 05:31:16 +00003796 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003797 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003798}
3799
drh67505e72002-04-19 12:34:06 +00003800/*
3801** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003802** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003803*/
3804static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003805 static char *home_dir = NULL;
3806 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003807
drh83905c92012-06-21 13:00:37 +00003808#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003809 {
3810 struct passwd *pwent;
3811 uid_t uid = getuid();
3812 if( (pwent=getpwuid(uid)) != NULL) {
3813 home_dir = pwent->pw_dir;
3814 }
drh67505e72002-04-19 12:34:06 +00003815 }
3816#endif
3817
chw65d3c132007-11-12 21:09:10 +00003818#if defined(_WIN32_WCE)
3819 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3820 */
drh85e72432012-04-11 11:38:53 +00003821 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003822#else
3823
drh83905c92012-06-21 13:00:37 +00003824#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003825 if (!home_dir) {
3826 home_dir = getenv("USERPROFILE");
3827 }
3828#endif
3829
drh67505e72002-04-19 12:34:06 +00003830 if (!home_dir) {
3831 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003832 }
3833
drh83905c92012-06-21 13:00:37 +00003834#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003835 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003836 char *zDrive, *zPath;
3837 int n;
3838 zDrive = getenv("HOMEDRIVE");
3839 zPath = getenv("HOMEPATH");
3840 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003841 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003842 home_dir = malloc( n );
3843 if( home_dir==0 ) return 0;
3844 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3845 return home_dir;
3846 }
3847 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003848 }
3849#endif
3850
chw65d3c132007-11-12 21:09:10 +00003851#endif /* !_WIN32_WCE */
3852
drh67505e72002-04-19 12:34:06 +00003853 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003854 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003855 char *z = malloc( n );
3856 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003857 home_dir = z;
3858 }
drhe98d4fa2002-04-21 19:06:22 +00003859
drh67505e72002-04-19 12:34:06 +00003860 return home_dir;
3861}
3862
3863/*
3864** Read input from the file given by sqliterc_override. Or if that
3865** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003866**
3867** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003868*/
shane9bd1b442009-10-23 01:27:39 +00003869static int process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00003870 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00003871 const char *sqliterc_override /* Name of config file. NULL to use default */
3872){
persicom7e2dfdd2002-04-18 02:46:52 +00003873 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003874 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003875 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003876 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003877 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003878
3879 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003880 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003881 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003882#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003883 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003884#endif
shane9bd1b442009-10-23 01:27:39 +00003885 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003886 }
drh2f3de322012-06-27 16:41:31 +00003887 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003888 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3889 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003890 }
drha1f9b5e2004-02-14 16:31:02 +00003891 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003892 if( in ){
drhc28490c2006-10-26 14:25:58 +00003893 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003894 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003895 }
shane9bd1b442009-10-23 01:27:39 +00003896 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003897 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003898 }
drh85e72432012-04-11 11:38:53 +00003899 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003900 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003901}
3902
drh67505e72002-04-19 12:34:06 +00003903/*
drhe1e38c42003-05-04 18:30:59 +00003904** Show available command line options
3905*/
3906static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003907 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003908 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003909 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003910 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003911 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003912 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003913 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003914 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003915#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3916 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3917#endif
drhcc3b4f82012-02-07 14:13:50 +00003918 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003919 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003920 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003921 " -line set output mode to 'line'\n"
3922 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00003923 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00003924 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003925#ifdef SQLITE_ENABLE_MULTIPLEX
3926 " -multiplex enable the multiplexor VFS\n"
3927#endif
drh6976c212014-07-24 12:09:47 +00003928 " -newline SEP set newline character(s) for CSV\n"
drh98d312f2012-10-25 15:23:14 +00003929 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00003930 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
3931 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
drh98d312f2012-10-25 15:23:14 +00003932 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003933 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003934 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003935 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003936#ifdef SQLITE_ENABLE_VFSTRACE
3937 " -vfstrace enable tracing of all VFS calls\n"
3938#endif
drhe1e38c42003-05-04 18:30:59 +00003939;
3940static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003941 fprintf(stderr,
3942 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3943 "FILENAME is the name of an SQLite database. A new database is created\n"
3944 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003945 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003946 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003947 }else{
3948 fprintf(stderr, "Use the -help option for additional information\n");
3949 }
3950 exit(1);
3951}
3952
3953/*
drh67505e72002-04-19 12:34:06 +00003954** Initialize the state information in data
3955*/
drhdcd87a92014-08-18 13:45:42 +00003956static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003957 memset(data, 0, sizeof(*data));
3958 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003959 memcpy(data->separator,"|", 2);
drh6976c212014-07-24 12:09:47 +00003960 memcpy(data->newline,"\r\n", 3);
persicom7e2dfdd2002-04-18 02:46:52 +00003961 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00003962 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00003963 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003964 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00003965 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00003966 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3967 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00003968}
3969
drh98d312f2012-10-25 15:23:14 +00003970/*
drh5c7976f2014-02-10 19:59:27 +00003971** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003972*/
3973#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003974static void printBold(const char *zText){
3975 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3976 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3977 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3978 SetConsoleTextAttribute(out,
3979 FOREGROUND_RED|FOREGROUND_INTENSITY
3980 );
3981 printf("%s", zText);
3982 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003983}
3984#else
drh5c7976f2014-02-10 19:59:27 +00003985static void printBold(const char *zText){
3986 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003987}
3988#endif
3989
3990/*
drh98d312f2012-10-25 15:23:14 +00003991** Get the argument to an --option. Throw an error and die if no argument
3992** is available.
3993*/
3994static char *cmdline_option_value(int argc, char **argv, int i){
3995 if( i==argc ){
3996 fprintf(stderr, "%s: Error: missing argument to %s\n",
3997 argv[0], argv[argc-1]);
3998 exit(1);
3999 }
4000 return argv[i];
4001}
4002
drh75897232000-05-29 14:26:00 +00004003int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004004 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004005 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004006 const char *zInitFile = 0;
4007 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00004008 int i;
drhc28490c2006-10-26 14:25:58 +00004009 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004010 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00004011
drh69b30ab2014-02-27 15:11:52 +00004012#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004013 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4014 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4015 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4016 exit(1);
4017 }
drhc7181902014-02-27 15:04:13 +00004018#endif
drhdaffd0e2001-04-11 14:28:42 +00004019 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004020 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004021 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004022
drh44c2eb12003-04-30 11:38:26 +00004023 /* Make sure we have a valid signal handler early, before anything
4024 ** else is done.
4025 */
drh4c504392000-10-16 22:06:40 +00004026#ifdef SIGINT
4027 signal(SIGINT, interrupt_handler);
4028#endif
drh44c2eb12003-04-30 11:38:26 +00004029
drh22fbcb82004-02-01 01:22:50 +00004030 /* Do an initial pass through the command-line argument to locate
4031 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004032 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004033 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004034 */
drh98d312f2012-10-25 15:23:14 +00004035 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004036 char *z;
drhc28490c2006-10-26 14:25:58 +00004037 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004038 if( z[0]!='-' ){
4039 if( data.zDbFilename==0 ){
4040 data.zDbFilename = z;
4041 continue;
4042 }
4043 if( zFirstCmd==0 ){
4044 zFirstCmd = z;
4045 continue;
4046 }
4047 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
4048 fprintf(stderr,"Use -help for a list of options.\n");
4049 return 1;
4050 }
drhcc3b4f82012-02-07 14:13:50 +00004051 if( z[1]=='-' ) z++;
4052 if( strcmp(z,"-separator")==0
4053 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004054 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004055 || strcmp(z,"-cmd")==0
4056 ){
drh98d312f2012-10-25 15:23:14 +00004057 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004058 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004059 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004060 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004061 /* Need to check for batch mode here to so we can avoid printing
4062 ** informational messages (like from process_sqliterc) before
4063 ** we do the actual processing of arguments later in a second pass.
4064 */
shanef69573d2009-10-24 02:06:14 +00004065 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004066 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004067#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004068 const char *zSize;
4069 sqlite3_int64 szHeap;
4070
drh98d312f2012-10-25 15:23:14 +00004071 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004072 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004073 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004074 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4075#endif
drh44dec872014-08-30 15:49:25 +00004076 }else if( strcmp(z,"-scratch")==0 ){
4077 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004078 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004079 if( sz>400000 ) sz = 400000;
4080 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004081 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004082 if( n>10 ) n = 10;
4083 if( n<1 ) n = 1;
4084 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4085 data.shellFlgs |= SHFLG_Scratch;
4086 }else if( strcmp(z,"-pagecache")==0 ){
4087 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004088 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004089 if( sz>70000 ) sz = 70000;
4090 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004091 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004092 if( n<10 ) n = 10;
4093 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4094 data.shellFlgs |= SHFLG_Pagecache;
4095 }else if( strcmp(z,"-lookaside")==0 ){
4096 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004097 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004098 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004099 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004100 if( n<0 ) n = 0;
4101 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4102 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004103#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004104 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004105 extern int vfstrace_register(
4106 const char *zTraceName,
4107 const char *zOldVfsName,
4108 int (*xOut)(const char*,void*),
4109 void *pOutArg,
4110 int makeDefault
4111 );
drh2b625e22011-03-16 17:05:28 +00004112 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004113#endif
drh6f25e892011-07-08 17:02:57 +00004114#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004115 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004116 extern int sqlite3_multiple_initialize(const char*,int);
4117 sqlite3_multiplex_initialize(0, 1);
4118#endif
drh7d9f3942013-04-03 01:26:54 +00004119 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004120 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4121 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004122 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004123 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004124 if( pVfs ){
4125 sqlite3_vfs_register(pVfs, 1);
4126 }else{
4127 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4128 exit(1);
4129 }
drh44c2eb12003-04-30 11:38:26 +00004130 }
4131 }
drh98d312f2012-10-25 15:23:14 +00004132 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004133#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004134 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004135 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004136#else
shane86f5bdb2009-10-24 02:00:07 +00004137 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4138 return 1;
drh01b41712005-08-29 23:06:23 +00004139#endif
drhc7181902014-02-27 15:04:13 +00004140#ifdef SQLITE_SHELL_DBNAME_PROC
4141 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4142 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4143 warnInmemoryDb = 0; }
4144#endif
drh98d312f2012-10-25 15:23:14 +00004145 }
4146 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004147
drh44c2eb12003-04-30 11:38:26 +00004148 /* Go ahead and open the database file if it already exists. If the
4149 ** file does not exist, delay opening it. This prevents empty database
4150 ** files from being created if a user mistypes the database name argument
4151 ** to the sqlite command-line tool.
4152 */
drhc8d74412004-08-31 23:41:26 +00004153 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004154 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004155 }
4156
drh22fbcb82004-02-01 01:22:50 +00004157 /* Process the initialization file if there is one. If no -init option
4158 ** is given on the command line, look for a file named ~/.sqliterc and
4159 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004160 */
shane86f5bdb2009-10-24 02:00:07 +00004161 rc = process_sqliterc(&data,zInitFile);
4162 if( rc>0 ){
4163 return rc;
4164 }
drh44c2eb12003-04-30 11:38:26 +00004165
drh22fbcb82004-02-01 01:22:50 +00004166 /* Make a second pass through the command-line argument and set
4167 ** options. This second pass is delayed until after the initialization
4168 ** file is processed so that the command-line arguments will override
4169 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004170 */
drh98d312f2012-10-25 15:23:14 +00004171 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004172 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004173 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004174 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004175 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004176 i++;
4177 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004178 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004179 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004180 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004181 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004182 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004183 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004184 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004185 }else if( strcmp(z,"-csv")==0 ){
4186 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00004187 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00004188 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004189 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00004190 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004191 }else if( strcmp(z,"-newline")==0 ){
4192 sqlite3_snprintf(sizeof(data.newline), data.newline,
4193 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004194 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004195 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004196 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004197 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004198 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004199 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004200 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004201 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004202 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004203 }else if( strcmp(z,"-eqp")==0 ){
4204 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004205 }else if( strcmp(z,"-stats")==0 ){
4206 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004207 }else if( strcmp(z,"-scanstats")==0 ){
4208 data.scanstatsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004209 }else if( strcmp(z,"-bail")==0 ){
4210 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004211 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004212 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004213 return 0;
drhc28490c2006-10-26 14:25:58 +00004214 }else if( strcmp(z,"-interactive")==0 ){
4215 stdin_is_interactive = 1;
4216 }else if( strcmp(z,"-batch")==0 ){
4217 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004218 }else if( strcmp(z,"-heap")==0 ){
4219 i++;
drh44dec872014-08-30 15:49:25 +00004220 }else if( strcmp(z,"-scratch")==0 ){
4221 i+=2;
4222 }else if( strcmp(z,"-pagecache")==0 ){
4223 i+=2;
4224 }else if( strcmp(z,"-lookaside")==0 ){
4225 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004226 }else if( strcmp(z,"-mmap")==0 ){
4227 i++;
drha7e61d82011-03-12 17:02:57 +00004228 }else if( strcmp(z,"-vfs")==0 ){
4229 i++;
drh6f25e892011-07-08 17:02:57 +00004230#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004231 }else if( strcmp(z,"-vfstrace")==0 ){
4232 i++;
drh6f25e892011-07-08 17:02:57 +00004233#endif
4234#ifdef SQLITE_ENABLE_MULTIPLEX
4235 }else if( strcmp(z,"-multiplex")==0 ){
4236 i++;
4237#endif
drhcc3b4f82012-02-07 14:13:50 +00004238 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004239 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004240 }else if( strcmp(z,"-cmd")==0 ){
4241 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004242 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004243 if( z[0]=='.' ){
4244 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004245 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004246 }else{
drh05782482013-10-24 15:20:20 +00004247 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004248 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4249 if( zErrMsg!=0 ){
4250 fprintf(stderr,"Error: %s\n", zErrMsg);
4251 if( bail_on_error ) return rc!=0 ? rc : 1;
4252 }else if( rc!=0 ){
4253 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4254 if( bail_on_error ) return rc;
4255 }
4256 }
drh1e5d0e92000-05-31 23:33:17 +00004257 }else{
shane86f5bdb2009-10-24 02:00:07 +00004258 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004259 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004260 return 1;
4261 }
4262 }
drh44c2eb12003-04-30 11:38:26 +00004263
drh22fbcb82004-02-01 01:22:50 +00004264 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00004265 /* Run just the command that follows the database name
4266 */
drh22fbcb82004-02-01 01:22:50 +00004267 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00004268 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00004269 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00004270 }else{
drh05782482013-10-24 15:20:20 +00004271 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00004272 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00004273 if( zErrMsg!=0 ){
4274 fprintf(stderr,"Error: %s\n", zErrMsg);
4275 return rc!=0 ? rc : 1;
4276 }else if( rc!=0 ){
4277 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4278 return rc;
drh6ff13852001-11-25 13:18:23 +00004279 }
drh75897232000-05-29 14:26:00 +00004280 }
4281 }else{
drh44c2eb12003-04-30 11:38:26 +00004282 /* Run commands received from standard input
4283 */
drhc28490c2006-10-26 14:25:58 +00004284 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004285 char *zHome;
4286 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004287 int nHistory;
drh75897232000-05-29 14:26:00 +00004288 printf(
drh743e0032011-12-12 16:51:50 +00004289 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004290 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004291 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004292 );
drhb3735912014-02-10 16:13:42 +00004293 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004294 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004295 printBold("transient in-memory database");
4296 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004297 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004298 }
drh67505e72002-04-19 12:34:06 +00004299 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004300 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004301 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004302 if( (zHistory = malloc(nHistory))!=0 ){
4303 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4304 }
drh67505e72002-04-19 12:34:06 +00004305 }
drhaaa21b42014-02-11 14:37:51 +00004306#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004307 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004308#endif
drhc28490c2006-10-26 14:25:58 +00004309 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004310 if( zHistory ){
4311 stifle_history(100);
4312 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004313 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004314 }
drhdaffd0e2001-04-11 14:28:42 +00004315 }else{
drhc28490c2006-10-26 14:25:58 +00004316 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004317 }
4318 }
drh33048c02001-10-01 14:29:22 +00004319 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004320 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004321 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004322 }
drh05782482013-10-24 15:20:20 +00004323 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004324 return rc;
drh75897232000-05-29 14:26:00 +00004325}