blob: fc5459e3b2a40649d4be0c657de3b6c1b14231da [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 */
danf533dbe2014-10-23 17:26:22 +0000460 int loopCountersOn; /* True to display loop counters */
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
danf533dbe2014-10-23 17:26:22 +00001093static void display_loop_counters(
1094 sqlite3 *db, /* Database to query */
1095 ShellState *pArg /* Pointer to ShellState */
1096){
1097#if !defined(SQLITE_DEBUG) || !defined(SQLITE_ENABLE_LOOPCOUNTERS)
1098 fprintf(pArg->out,
1099 "No loop counters. "
1100 "Rebuild with SQLITE_DEBUG and SQLITE_ENABLE_LOOPCOUNTERS"
1101 );
1102#else
1103 int i;
1104 for(i=0; 1; i++){
1105 int nTest;
1106 int nVisit;
1107 int iSub;
1108 int iLoop;
1109 const char *zLoop;
1110 zLoop = sqlite3_stmt_loopcounter(pArg->pStmt, i, &iSub, &iLoop, &nTest, &nVisit);
1111 if( zLoop==0 ) break;
1112 fprintf(pArg->out, "loop %d.%d: (%d/%d) %s\n", iSub, iLoop, nVisit, nTest, zLoop);
1113 }
1114#endif
1115}
1116
shane626a6e42009-10-22 17:30:15 +00001117/*
shaneh642d8b82010-07-28 16:05:34 +00001118** Display memory stats.
1119*/
1120static int display_stats(
1121 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001122 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001123 int bReset /* True to reset the stats */
1124){
1125 int iCur;
1126 int iHiwtr;
1127
1128 if( pArg && pArg->out ){
1129
1130 iHiwtr = iCur = -1;
1131 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001132 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001133 iHiwtr = iCur = -1;
1134 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001135 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001136 if( pArg->shellFlgs & SHFLG_Pagecache ){
1137 iHiwtr = iCur = -1;
1138 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1140 }
shaneh642d8b82010-07-28 16:05:34 +00001141 iHiwtr = iCur = -1;
1142 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1143 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001144 if( pArg->shellFlgs & SHFLG_Scratch ){
1145 iHiwtr = iCur = -1;
1146 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1147 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1148 }
shaneh642d8b82010-07-28 16:05:34 +00001149 iHiwtr = iCur = -1;
1150 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1151 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1152 iHiwtr = iCur = -1;
1153 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1154 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1155 iHiwtr = iCur = -1;
1156 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1157 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1158 iHiwtr = iCur = -1;
1159 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1160 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1161#ifdef YYTRACKMAXSTACKDEPTH
1162 iHiwtr = iCur = -1;
1163 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1164 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1165#endif
1166 }
1167
1168 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001169 if( pArg->shellFlgs & SHFLG_Lookaside ){
1170 iHiwtr = iCur = -1;
1171 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1172 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
1173 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1174 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1175 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1176 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1177 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1178 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1179 }
shaneh642d8b82010-07-28 16:05:34 +00001180 iHiwtr = iCur = -1;
1181 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001182 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1183 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1184 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1185 iHiwtr = iCur = -1;
1186 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1187 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001188 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001189 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1190 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1191 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001192 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1193 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1194 iHiwtr = iCur = -1;
1195 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1196 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1197 }
1198
1199 if( pArg && pArg->out && db && pArg->pStmt ){
1200 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1201 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1202 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1203 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1204 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1205 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001206 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1207 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001208 }
1209
1210 return 0;
1211}
1212
1213/*
dana98bf362013-11-13 18:35:01 +00001214** Parameter azArray points to a zero-terminated array of strings. zStr
1215** points to a single nul-terminated string. Return non-zero if zStr
1216** is equal, according to strcmp(), to any of the strings in the array.
1217** Otherwise, return zero.
1218*/
1219static int str_in_array(const char *zStr, const char **azArray){
1220 int i;
1221 for(i=0; azArray[i]; i++){
1222 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1223 }
1224 return 0;
1225}
1226
1227/*
1228** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001229** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001230** spaces each opcode should be indented before it is output.
1231**
1232** The indenting rules are:
1233**
1234** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1235** all opcodes that occur between the p2 jump destination and the opcode
1236** itself by 2 spaces.
1237**
drh01752bc2013-11-14 23:59:33 +00001238** * For each "Goto", if the jump destination is earlier in the program
1239** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001240** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001241** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001242** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001243** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001244*/
drhdcd87a92014-08-18 13:45:42 +00001245static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001246 const char *zSql; /* The text of the SQL statement */
1247 const char *z; /* Used to check if this is an EXPLAIN */
1248 int *abYield = 0; /* True if op is an OP_Yield */
1249 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001250 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001251
drh8ad0de32014-03-20 18:45:27 +00001252 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1253 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001254 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001255 const char *azGoto[] = { "Goto", 0 };
1256
1257 /* Try to figure out if this is really an EXPLAIN statement. If this
1258 ** cannot be verified, return early. */
1259 zSql = sqlite3_sql(pSql);
1260 if( zSql==0 ) return;
1261 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1262 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1263
1264 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1265 int i;
danc4650bb2013-11-18 08:41:06 +00001266 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001267 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001268
1269 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1270 ** p2 is an instruction address, set variable p2op to the index of that
1271 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1272 ** the current instruction is part of a sub-program generated by an
1273 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001274 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001275 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001276
1277 /* Grow the p->aiIndent array as required */
1278 if( iOp>=nAlloc ){
1279 nAlloc += 100;
1280 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1281 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1282 }
1283 abYield[iOp] = str_in_array(zOp, azYield);
1284 p->aiIndent[iOp] = 0;
1285 p->nIndent = iOp+1;
1286
1287 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001288 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001289 }
drhfe705102014-03-06 13:38:37 +00001290 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1291 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1292 ){
drhe73f0592014-01-21 22:25:45 +00001293 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001294 }
1295 }
1296
danc4650bb2013-11-18 08:41:06 +00001297 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001298 sqlite3_free(abYield);
1299 sqlite3_reset(pSql);
1300}
1301
1302/*
1303** Free the array allocated by explain_data_prepare().
1304*/
drhdcd87a92014-08-18 13:45:42 +00001305static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001306 sqlite3_free(p->aiIndent);
1307 p->aiIndent = 0;
1308 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001309 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001310}
1311
1312/*
shane626a6e42009-10-22 17:30:15 +00001313** Execute a statement or set of statements. Print
1314** any result rows/columns depending on the current mode
1315** set via the supplied callback.
1316**
1317** This is very similar to SQLite's built-in sqlite3_exec()
1318** function except it takes a slightly different callback
1319** and callback data argument.
1320*/
1321static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001322 sqlite3 *db, /* An open database */
1323 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001324 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001325 /* (not the same as sqlite3_exec) */
1326 ShellState *pArg, /* Pointer to ShellState */
1327 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001328){
dan4564ced2010-01-05 04:59:56 +00001329 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1330 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001331 int rc2;
dan4564ced2010-01-05 04:59:56 +00001332 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001333
1334 if( pzErrMsg ){
1335 *pzErrMsg = NULL;
1336 }
1337
shaneb9fc17d2009-10-22 21:23:35 +00001338 while( zSql[0] && (SQLITE_OK == rc) ){
1339 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1340 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001341 if( pzErrMsg ){
1342 *pzErrMsg = save_err_msg(db);
1343 }
1344 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001345 if( !pStmt ){
1346 /* this happens for a comment or white-space */
1347 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001348 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001349 continue;
1350 }
shane626a6e42009-10-22 17:30:15 +00001351
shaneh642d8b82010-07-28 16:05:34 +00001352 /* save off the prepared statment handle and reset row count */
1353 if( pArg ){
1354 pArg->pStmt = pStmt;
1355 pArg->cnt = 0;
1356 }
1357
shanehb7977c52010-01-18 18:17:10 +00001358 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001359 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001360 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001361 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001362 }
shanehb7977c52010-01-18 18:17:10 +00001363
drhefbf3b12014-02-28 20:47:24 +00001364 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1365 if( pArg && pArg->autoEQP ){
1366 sqlite3_stmt *pExplain;
1367 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1368 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1369 if( rc==SQLITE_OK ){
1370 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1371 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1372 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1373 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1374 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1375 }
1376 }
1377 sqlite3_finalize(pExplain);
1378 sqlite3_free(zEQP);
1379 }
1380
dana98bf362013-11-13 18:35:01 +00001381 /* If the shell is currently in ".explain" mode, gather the extra
1382 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001383 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001384 explain_data_prepare(pArg, pStmt);
1385 }
1386
shaneb9fc17d2009-10-22 21:23:35 +00001387 /* perform the first step. this will tell us if we
1388 ** have a result set or not and how wide it is.
1389 */
1390 rc = sqlite3_step(pStmt);
1391 /* if we have a result set... */
1392 if( SQLITE_ROW == rc ){
1393 /* if we have a callback... */
1394 if( xCallback ){
1395 /* allocate space for col name ptr, value ptr, and type */
1396 int nCol = sqlite3_column_count(pStmt);
1397 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1398 if( !pData ){
1399 rc = SQLITE_NOMEM;
1400 }else{
1401 char **azCols = (char **)pData; /* Names of result columns */
1402 char **azVals = &azCols[nCol]; /* Results */
1403 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001404 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001405 assert(sizeof(int) <= sizeof(char *));
1406 /* save off ptrs to column names */
1407 for(i=0; i<nCol; i++){
1408 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1409 }
shaneb9fc17d2009-10-22 21:23:35 +00001410 do{
1411 /* extract the data and data types */
1412 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001413 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001414 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001415 azVals[i] = "";
1416 }else{
1417 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1418 }
shaneb9fc17d2009-10-22 21:23:35 +00001419 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1420 rc = SQLITE_NOMEM;
1421 break; /* from for */
1422 }
1423 } /* end for */
1424
1425 /* if data and types extracted successfully... */
1426 if( SQLITE_ROW == rc ){
1427 /* call the supplied callback with the result row data */
1428 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1429 rc = SQLITE_ABORT;
1430 }else{
1431 rc = sqlite3_step(pStmt);
1432 }
1433 }
1434 } while( SQLITE_ROW == rc );
1435 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001436 }
1437 }else{
1438 do{
1439 rc = sqlite3_step(pStmt);
1440 } while( rc == SQLITE_ROW );
1441 }
1442 }
1443
dana98bf362013-11-13 18:35:01 +00001444 explain_data_delete(pArg);
1445
shaneh642d8b82010-07-28 16:05:34 +00001446 /* print usage stats if stats on */
1447 if( pArg && pArg->statsOn ){
1448 display_stats(db, pArg, 0);
1449 }
1450
danf533dbe2014-10-23 17:26:22 +00001451 /* print loop-counters if required */
1452 if( pArg && pArg->loopCountersOn ){
1453 display_loop_counters(db, pArg);
1454 }
1455
dan4564ced2010-01-05 04:59:56 +00001456 /* Finalize the statement just executed. If this fails, save a
1457 ** copy of the error message. Otherwise, set zSql to point to the
1458 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001459 rc2 = sqlite3_finalize(pStmt);
1460 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001461 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001462 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001463 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001464 }else if( pzErrMsg ){
1465 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001466 }
shaneh642d8b82010-07-28 16:05:34 +00001467
1468 /* clear saved stmt handle */
1469 if( pArg ){
1470 pArg->pStmt = NULL;
1471 }
shane626a6e42009-10-22 17:30:15 +00001472 }
shaneb9fc17d2009-10-22 21:23:35 +00001473 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001474
1475 return rc;
1476}
1477
drhdd3d4592004-08-30 01:54:05 +00001478
drh33048c02001-10-01 14:29:22 +00001479/*
drh4c653a02000-06-07 01:27:47 +00001480** This is a different callback routine used for dumping the database.
1481** Each row received by this callback consists of a table name,
1482** the table type ("index" or "table") and SQL to create the table.
1483** This routine should print text sufficient to recreate the table.
1484*/
1485static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001486 int rc;
1487 const char *zTable;
1488 const char *zType;
1489 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001490 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001491 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001492
drh902b9ee2008-12-05 17:17:07 +00001493 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001494 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001495 zTable = azArg[0];
1496 zType = azArg[1];
1497 zSql = azArg[2];
1498
drh00b950d2005-09-11 02:03:03 +00001499 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001500 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001501 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001502 fprintf(p->out, "ANALYZE sqlite_master;\n");
1503 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1504 return 0;
drh45e29d82006-11-20 16:21:10 +00001505 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1506 char *zIns;
1507 if( !p->writableSchema ){
1508 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1509 p->writableSchema = 1;
1510 }
1511 zIns = sqlite3_mprintf(
1512 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1513 "VALUES('table','%q','%q',0,'%q');",
1514 zTable, zTable, zSql);
1515 fprintf(p->out, "%s\n", zIns);
1516 sqlite3_free(zIns);
1517 return 0;
drh00b950d2005-09-11 02:03:03 +00001518 }else{
1519 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001520 }
danielk19772a02e332004-06-05 08:04:36 +00001521
1522 if( strcmp(zType, "table")==0 ){
1523 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001524 char *zSelect = 0;
1525 char *zTableInfo = 0;
1526 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001527 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001528
1529 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1530 zTableInfo = appendText(zTableInfo, zTable, '"');
1531 zTableInfo = appendText(zTableInfo, ");", 0);
1532
drhc7181902014-02-27 15:04:13 +00001533 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001534 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001535 if( rc!=SQLITE_OK || !pTableInfo ){
1536 return 1;
1537 }
1538
1539 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001540 /* Always quote the table name, even if it appears to be pure ascii,
1541 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1542 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001543 if( zTmp ){
1544 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001545 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001546 }
1547 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1548 rc = sqlite3_step(pTableInfo);
1549 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001550 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001551 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001552 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001553 rc = sqlite3_step(pTableInfo);
1554 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001555 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001556 }else{
1557 zSelect = appendText(zSelect, ") ", 0);
1558 }
drh157e29a2009-05-21 15:15:00 +00001559 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001560 }
1561 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001562 if( rc!=SQLITE_OK || nRow==0 ){
1563 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001564 return 1;
1565 }
1566 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1567 zSelect = appendText(zSelect, zTable, '"');
1568
drh2f464a02011-10-13 00:41:49 +00001569 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001570 if( rc==SQLITE_CORRUPT ){
1571 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001572 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001573 }
drh85e72432012-04-11 11:38:53 +00001574 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001575 }
drh4c653a02000-06-07 01:27:47 +00001576 return 0;
1577}
1578
1579/*
drh45e29d82006-11-20 16:21:10 +00001580** Run zQuery. Use dump_callback() as the callback routine so that
1581** the contents of the query are output as SQL statements.
1582**
drhdd3d4592004-08-30 01:54:05 +00001583** If we get a SQLITE_CORRUPT error, rerun the query after appending
1584** "ORDER BY rowid DESC" to the end.
1585*/
1586static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001587 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001588 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001589){
1590 int rc;
drh2f464a02011-10-13 00:41:49 +00001591 char *zErr = 0;
1592 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001593 if( rc==SQLITE_CORRUPT ){
1594 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001595 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001596 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1597 if( zErr ){
1598 fprintf(p->out, "/****** %s ******/\n", zErr);
1599 sqlite3_free(zErr);
1600 zErr = 0;
1601 }
drhdd3d4592004-08-30 01:54:05 +00001602 zQ2 = malloc( len+100 );
1603 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001604 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001605 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1606 if( rc ){
1607 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1608 }else{
1609 rc = SQLITE_CORRUPT;
1610 }
1611 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001612 free(zQ2);
1613 }
1614 return rc;
1615}
1616
1617/*
drh75897232000-05-29 14:26:00 +00001618** Text of a help message
1619*/
persicom1d0b8722002-04-18 02:53:04 +00001620static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001621 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001622 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001623 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001624 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001625 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001626 " If TABLE specified, only dump tables matching\n"
1627 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001628 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001629 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001630 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001631 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001632 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001633 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001634 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001635 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001636 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001637 ".indices ?TABLE? Show names of all indices\n"
1638 " If TABLE specified, only show indices for tables\n"
1639 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001640#ifdef SQLITE_ENABLE_IOTRACE
1641 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1642#endif
drh70df4fe2006-06-13 15:12:21 +00001643#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001644 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001645#endif
drh127f9d72010-02-23 01:47:00 +00001646 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001647 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001648 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001649 " column Left-aligned columns. (See .width)\n"
1650 " html HTML <table> code\n"
1651 " insert SQL insert statements for TABLE\n"
1652 " line One value per line\n"
1653 " list Values delimited by .separator string\n"
1654 " tabs Tab-separated values\n"
1655 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001656 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001657 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001658 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001659 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001660 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001661 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001662 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001663 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001664 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001665 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001666 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001667 " If TABLE specified, only show tables matching\n"
1668 " LIKE pattern TABLE.\n"
drh6976c212014-07-24 12:09:47 +00001669 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1670 " NL is the end-of-line mark for CSV\n"
drh62cdde52014-05-28 20:22:28 +00001671 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001672 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001673 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001674 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001675 ".tables ?TABLE? List names of tables\n"
1676 " If TABLE specified, only list tables matching\n"
1677 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001678 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001679 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001680 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001681 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001682 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001683 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001684;
1685
drhdaffd0e2001-04-11 14:28:42 +00001686/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001687static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001688/*
1689** Implementation of the "readfile(X)" SQL function. The entire content
1690** of the file named X is read and returned as a BLOB. NULL is returned
1691** if the file does not exist or is unreadable.
1692*/
1693static void readfileFunc(
1694 sqlite3_context *context,
1695 int argc,
1696 sqlite3_value **argv
1697){
1698 const char *zName;
1699 FILE *in;
1700 long nIn;
1701 void *pBuf;
1702
1703 zName = (const char*)sqlite3_value_text(argv[0]);
1704 if( zName==0 ) return;
1705 in = fopen(zName, "rb");
1706 if( in==0 ) return;
1707 fseek(in, 0, SEEK_END);
1708 nIn = ftell(in);
1709 rewind(in);
1710 pBuf = sqlite3_malloc( nIn );
1711 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1712 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1713 }else{
1714 sqlite3_free(pBuf);
1715 }
1716 fclose(in);
1717}
1718
1719/*
1720** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1721** is written into file X. The number of bytes written is returned. Or
1722** NULL is returned if something goes wrong, such as being unable to open
1723** file X for writing.
1724*/
1725static void writefileFunc(
1726 sqlite3_context *context,
1727 int argc,
1728 sqlite3_value **argv
1729){
1730 FILE *out;
1731 const char *z;
drhba5b0932014-07-24 12:39:59 +00001732 sqlite3_int64 rc;
1733 const char *zFile;
1734
1735 zFile = (const char*)sqlite3_value_text(argv[0]);
1736 if( zFile==0 ) return;
1737 out = fopen(zFile, "wb");
1738 if( out==0 ) return;
1739 z = (const char*)sqlite3_value_blob(argv[1]);
1740 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001741 rc = 0;
1742 }else{
drh490fe862014-08-11 14:21:32 +00001743 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001744 }
1745 fclose(out);
1746 sqlite3_result_int64(context, rc);
1747}
drhdaffd0e2001-04-11 14:28:42 +00001748
drh75897232000-05-29 14:26:00 +00001749/*
drh44c2eb12003-04-30 11:38:26 +00001750** Make sure the database is open. If it is not, then open it. If
1751** the database fails to open, print an error message and exit.
1752*/
drhdcd87a92014-08-18 13:45:42 +00001753static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001754 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001755 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001756 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001757 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001758 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1759 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1760 shellstaticFunc, 0, 0);
1761 }
1762 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001763 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001764 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001765 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001766 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001767 }
drhc2e87a32006-06-27 15:16:14 +00001768#ifndef SQLITE_OMIT_LOAD_EXTENSION
1769 sqlite3_enable_load_extension(p->db, 1);
1770#endif
drhba5b0932014-07-24 12:39:59 +00001771 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1772 readfileFunc, 0, 0);
1773 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1774 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001775 }
1776}
1777
1778/*
drhfeac5f82004-08-01 00:10:45 +00001779** Do C-language style dequoting.
1780**
1781** \t -> tab
1782** \n -> newline
1783** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001784** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001785** \NNN -> ascii character NNN in octal
1786** \\ -> backslash
1787*/
1788static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001789 int i, j;
1790 char c;
drhc2ce0be2014-05-29 12:36:14 +00001791 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001792 for(i=j=0; (c = z[i])!=0; i++, j++){
1793 if( c=='\\' ){
1794 c = z[++i];
1795 if( c=='n' ){
1796 c = '\n';
1797 }else if( c=='t' ){
1798 c = '\t';
1799 }else if( c=='r' ){
1800 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001801 }else if( c=='\\' ){
1802 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001803 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001804 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001805 if( z[i+1]>='0' && z[i+1]<='7' ){
1806 i++;
1807 c = (c<<3) + z[i] - '0';
1808 if( z[i+1]>='0' && z[i+1]<='7' ){
1809 i++;
1810 c = (c<<3) + z[i] - '0';
1811 }
1812 }
1813 }
1814 }
1815 z[j] = c;
1816 }
drhc2ce0be2014-05-29 12:36:14 +00001817 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001818}
1819
1820/*
drh348d19c2013-06-03 12:47:43 +00001821** Return the value of a hexadecimal digit. Return -1 if the input
1822** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001823*/
drh348d19c2013-06-03 12:47:43 +00001824static int hexDigitValue(char c){
1825 if( c>='0' && c<='9' ) return c - '0';
1826 if( c>='a' && c<='f' ) return c - 'a' + 10;
1827 if( c>='A' && c<='F' ) return c - 'A' + 10;
1828 return -1;
drhc28490c2006-10-26 14:25:58 +00001829}
1830
1831/*
drh7d9f3942013-04-03 01:26:54 +00001832** Interpret zArg as an integer value, possibly with suffixes.
1833*/
1834static sqlite3_int64 integerValue(const char *zArg){
1835 sqlite3_int64 v = 0;
1836 static const struct { char *zSuffix; int iMult; } aMult[] = {
1837 { "KiB", 1024 },
1838 { "MiB", 1024*1024 },
1839 { "GiB", 1024*1024*1024 },
1840 { "KB", 1000 },
1841 { "MB", 1000000 },
1842 { "GB", 1000000000 },
1843 { "K", 1000 },
1844 { "M", 1000000 },
1845 { "G", 1000000000 },
1846 };
1847 int i;
1848 int isNeg = 0;
1849 if( zArg[0]=='-' ){
1850 isNeg = 1;
1851 zArg++;
1852 }else if( zArg[0]=='+' ){
1853 zArg++;
1854 }
drh348d19c2013-06-03 12:47:43 +00001855 if( zArg[0]=='0' && zArg[1]=='x' ){
1856 int x;
1857 zArg += 2;
1858 while( (x = hexDigitValue(zArg[0]))>=0 ){
1859 v = (v<<4) + x;
1860 zArg++;
1861 }
1862 }else{
1863 while( IsDigit(zArg[0]) ){
1864 v = v*10 + zArg[0] - '0';
1865 zArg++;
1866 }
drh7d9f3942013-04-03 01:26:54 +00001867 }
drhc2bed0a2013-05-24 11:57:50 +00001868 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001869 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1870 v *= aMult[i].iMult;
1871 break;
1872 }
1873 }
1874 return isNeg? -v : v;
1875}
1876
1877/*
drh348d19c2013-06-03 12:47:43 +00001878** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1879** for TRUE and FALSE. Return the integer value if appropriate.
1880*/
1881static int booleanValue(char *zArg){
1882 int i;
1883 if( zArg[0]=='0' && zArg[1]=='x' ){
1884 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1885 }else{
1886 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1887 }
1888 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1889 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1890 return 1;
1891 }
1892 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1893 return 0;
1894 }
1895 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1896 zArg);
1897 return 0;
1898}
1899
1900/*
drh42f64e52012-04-04 16:56:23 +00001901** Close an output file, assuming it is not stderr or stdout
1902*/
1903static void output_file_close(FILE *f){
1904 if( f && f!=stdout && f!=stderr ) fclose(f);
1905}
1906
1907/*
1908** Try to open an output file. The names "stdout" and "stderr" are
1909** recognized and do the right thing. NULL is returned if the output
1910** filename is "off".
1911*/
1912static FILE *output_file_open(const char *zFile){
1913 FILE *f;
1914 if( strcmp(zFile,"stdout")==0 ){
1915 f = stdout;
1916 }else if( strcmp(zFile, "stderr")==0 ){
1917 f = stderr;
1918 }else if( strcmp(zFile, "off")==0 ){
1919 f = 0;
1920 }else{
1921 f = fopen(zFile, "wb");
1922 if( f==0 ){
1923 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1924 }
1925 }
1926 return f;
1927}
1928
1929/*
1930** A routine for handling output from sqlite3_trace().
1931*/
1932static void sql_trace_callback(void *pArg, const char *z){
1933 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00001934 if( f ){
1935 int i = (int)strlen(z);
1936 while( i>0 && z[i-1]==';' ){ i--; }
1937 fprintf(f, "%.*s;\n", i, z);
1938 }
drh42f64e52012-04-04 16:56:23 +00001939}
1940
1941/*
drhd8621b92012-04-17 09:09:33 +00001942** A no-op routine that runs with the ".breakpoint" doc-command. This is
1943** a useful spot to set a debugger breakpoint.
1944*/
1945static void test_breakpoint(void){
1946 static int nCall = 0;
1947 nCall++;
1948}
1949
1950/*
drhdb95f682013-06-26 22:46:00 +00001951** An object used to read a CSV file
1952*/
1953typedef struct CSVReader CSVReader;
1954struct CSVReader {
1955 const char *zFile; /* Name of the input file */
1956 FILE *in; /* Read the CSV text from this input stream */
1957 char *z; /* Accumulated text for a field */
1958 int n; /* Number of bytes in z */
1959 int nAlloc; /* Space allocated for z[] */
1960 int nLine; /* Current line number */
1961 int cTerm; /* Character that terminated the most recent field */
1962 int cSeparator; /* The separator character. (Usually ",") */
1963};
1964
1965/* Append a single byte to z[] */
1966static void csv_append_char(CSVReader *p, int c){
1967 if( p->n+1>=p->nAlloc ){
1968 p->nAlloc += p->nAlloc + 100;
1969 p->z = sqlite3_realloc(p->z, p->nAlloc);
1970 if( p->z==0 ){
1971 fprintf(stderr, "out of memory\n");
1972 exit(1);
1973 }
1974 }
1975 p->z[p->n++] = (char)c;
1976}
1977
1978/* Read a single field of CSV text. Compatible with rfc4180 and extended
1979** with the option of having a separator other than ",".
1980**
1981** + Input comes from p->in.
1982** + Store results in p->z of length p->n. Space to hold p->z comes
1983** from sqlite3_malloc().
1984** + Use p->cSep as the separator. The default is ",".
1985** + Keep track of the line number in p->nLine.
1986** + Store the character that terminates the field in p->cTerm. Store
1987** EOF on end-of-file.
1988** + Report syntax errors on stderr
1989*/
1990static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001991 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001992 int cSep = p->cSeparator;
1993 p->n = 0;
1994 c = fgetc(p->in);
1995 if( c==EOF || seenInterrupt ){
1996 p->cTerm = EOF;
1997 return 0;
1998 }
1999 if( c=='"' ){
2000 int startLine = p->nLine;
2001 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002002 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002003 while( 1 ){
2004 c = fgetc(p->in);
2005 if( c=='\n' ) p->nLine++;
2006 if( c==cQuote ){
2007 if( pc==cQuote ){
2008 pc = 0;
2009 continue;
2010 }
2011 }
2012 if( (c==cSep && pc==cQuote)
2013 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00002014 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002015 || (c==EOF && pc==cQuote)
2016 ){
2017 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002018 p->cTerm = c;
2019 break;
2020 }
2021 if( pc==cQuote && c!='\r' ){
2022 fprintf(stderr, "%s:%d: unescaped %c character\n",
2023 p->zFile, p->nLine, cQuote);
2024 }
2025 if( c==EOF ){
2026 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2027 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00002028 p->cTerm = EOF;
2029 break;
2030 }
2031 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002032 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002033 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002034 }
drhdb95f682013-06-26 22:46:00 +00002035 }else{
drhd0a64dc2013-06-30 20:24:26 +00002036 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00002037 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002038 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002039 }
2040 if( c=='\n' ){
2041 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002042 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002043 }
drhdb95f682013-06-26 22:46:00 +00002044 p->cTerm = c;
2045 }
drh8dd675e2013-07-12 21:09:24 +00002046 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002047 return p->z;
2048}
2049
2050/*
drh4bbcf102014-02-06 02:46:08 +00002051** Try to transfer data for table zTable. If an error is seen while
2052** moving forward, try to go backwards. The backwards movement won't
2053** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002054*/
mistachkine31ae902014-02-06 01:15:29 +00002055static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002056 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002057 sqlite3 *newDb,
2058 const char *zTable
2059){
2060 sqlite3_stmt *pQuery = 0;
2061 sqlite3_stmt *pInsert = 0;
2062 char *zQuery = 0;
2063 char *zInsert = 0;
2064 int rc;
2065 int i, j, n;
2066 int nTable = (int)strlen(zTable);
2067 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002068 int cnt = 0;
2069 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002070
2071 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2072 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2073 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002074 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002075 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2076 zQuery);
2077 goto end_data_xfer;
2078 }
2079 n = sqlite3_column_count(pQuery);
2080 zInsert = sqlite3_malloc(200 + nTable + n*3);
2081 if( zInsert==0 ){
2082 fprintf(stderr, "out of memory\n");
2083 goto end_data_xfer;
2084 }
2085 sqlite3_snprintf(200+nTable,zInsert,
2086 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2087 i = (int)strlen(zInsert);
2088 for(j=1; j<n; j++){
2089 memcpy(zInsert+i, ",?", 2);
2090 i += 2;
2091 }
2092 memcpy(zInsert+i, ");", 3);
2093 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 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(newDb), sqlite3_errmsg(newDb),
2097 zQuery);
2098 goto end_data_xfer;
2099 }
2100 for(k=0; k<2; k++){
2101 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2102 for(i=0; i<n; i++){
2103 switch( sqlite3_column_type(pQuery, i) ){
2104 case SQLITE_NULL: {
2105 sqlite3_bind_null(pInsert, i+1);
2106 break;
2107 }
2108 case SQLITE_INTEGER: {
2109 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2110 break;
2111 }
2112 case SQLITE_FLOAT: {
2113 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2114 break;
2115 }
2116 case SQLITE_TEXT: {
2117 sqlite3_bind_text(pInsert, i+1,
2118 (const char*)sqlite3_column_text(pQuery,i),
2119 -1, SQLITE_STATIC);
2120 break;
2121 }
2122 case SQLITE_BLOB: {
2123 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2124 sqlite3_column_bytes(pQuery,i),
2125 SQLITE_STATIC);
2126 break;
2127 }
2128 }
2129 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002130 rc = sqlite3_step(pInsert);
2131 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2132 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2133 sqlite3_errmsg(newDb));
2134 }
drh3350ce92014-02-06 00:49:12 +00002135 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002136 cnt++;
2137 if( (cnt%spinRate)==0 ){
2138 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2139 fflush(stdout);
2140 }
drh3350ce92014-02-06 00:49:12 +00002141 } /* End while */
2142 if( rc==SQLITE_DONE ) break;
2143 sqlite3_finalize(pQuery);
2144 sqlite3_free(zQuery);
2145 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2146 zTable);
2147 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2148 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002149 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2150 break;
drh3350ce92014-02-06 00:49:12 +00002151 }
2152 } /* End for(k=0...) */
2153
2154end_data_xfer:
2155 sqlite3_finalize(pQuery);
2156 sqlite3_finalize(pInsert);
2157 sqlite3_free(zQuery);
2158 sqlite3_free(zInsert);
2159}
2160
2161
2162/*
2163** Try to transfer all rows of the schema that match zWhere. For
2164** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002165** If an error is encountered while moving forward through the
2166** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002167*/
mistachkine31ae902014-02-06 01:15:29 +00002168static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002169 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002170 sqlite3 *newDb,
2171 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002172 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002173){
2174 sqlite3_stmt *pQuery = 0;
2175 char *zQuery = 0;
2176 int rc;
2177 const unsigned char *zName;
2178 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002179 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002180
2181 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2182 " WHERE %s", zWhere);
2183 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2184 if( rc ){
2185 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2186 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2187 zQuery);
2188 goto end_schema_xfer;
2189 }
2190 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2191 zName = sqlite3_column_text(pQuery, 0);
2192 zSql = sqlite3_column_text(pQuery, 1);
2193 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002194 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2195 if( zErrMsg ){
2196 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2197 sqlite3_free(zErrMsg);
2198 zErrMsg = 0;
2199 }
drh3350ce92014-02-06 00:49:12 +00002200 if( xForEach ){
2201 xForEach(p, newDb, (const char*)zName);
2202 }
2203 printf("done\n");
2204 }
2205 if( rc!=SQLITE_DONE ){
2206 sqlite3_finalize(pQuery);
2207 sqlite3_free(zQuery);
2208 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2209 " WHERE %s ORDER BY rowid DESC", zWhere);
2210 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2211 if( rc ){
2212 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2213 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2214 zQuery);
2215 goto end_schema_xfer;
2216 }
2217 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2218 zName = sqlite3_column_text(pQuery, 0);
2219 zSql = sqlite3_column_text(pQuery, 1);
2220 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002221 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2222 if( zErrMsg ){
2223 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2224 sqlite3_free(zErrMsg);
2225 zErrMsg = 0;
2226 }
drh3350ce92014-02-06 00:49:12 +00002227 if( xForEach ){
2228 xForEach(p, newDb, (const char*)zName);
2229 }
2230 printf("done\n");
2231 }
2232 }
2233end_schema_xfer:
2234 sqlite3_finalize(pQuery);
2235 sqlite3_free(zQuery);
2236}
2237
2238/*
2239** Open a new database file named "zNewDb". Try to recover as much information
2240** as possible out of the main database (which might be corrupt) and write it
2241** into zNewDb.
2242*/
drhdcd87a92014-08-18 13:45:42 +00002243static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002244 int rc;
2245 sqlite3 *newDb = 0;
2246 if( access(zNewDb,0)==0 ){
2247 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2248 return;
2249 }
2250 rc = sqlite3_open(zNewDb, &newDb);
2251 if( rc ){
2252 fprintf(stderr, "Cannot create output database: %s\n",
2253 sqlite3_errmsg(newDb));
2254 }else{
drh54d0d2d2014-04-03 00:32:13 +00002255 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002256 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002257 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2258 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002259 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002260 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002261 }
2262 sqlite3_close(newDb);
2263}
2264
2265/*
drhc2ce0be2014-05-29 12:36:14 +00002266** Change the output file back to stdout
2267*/
drhdcd87a92014-08-18 13:45:42 +00002268static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002269 if( p->outfile[0]=='|' ){
2270 pclose(p->out);
2271 }else{
2272 output_file_close(p->out);
2273 }
2274 p->outfile[0] = 0;
2275 p->out = stdout;
2276}
2277
2278/*
drh75897232000-05-29 14:26:00 +00002279** If an input line begins with "." then invoke this routine to
2280** process that line.
drh67505e72002-04-19 12:34:06 +00002281**
drh47ad6842006-11-08 12:25:42 +00002282** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002283*/
drhdcd87a92014-08-18 13:45:42 +00002284static int do_meta_command(char *zLine, ShellState *p){
drh75897232000-05-29 14:26:00 +00002285 int i = 1;
2286 int nArg = 0;
2287 int n, c;
drh67505e72002-04-19 12:34:06 +00002288 int rc = 0;
drh75897232000-05-29 14:26:00 +00002289 char *azArg[50];
2290
2291 /* Parse the input line into tokens.
2292 */
2293 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002294 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002295 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002296 if( zLine[i]=='\'' || zLine[i]=='"' ){
2297 int delim = zLine[i++];
2298 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002299 while( zLine[i] && zLine[i]!=delim ){
2300 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2301 i++;
2302 }
drh75897232000-05-29 14:26:00 +00002303 if( zLine[i]==delim ){
2304 zLine[i++] = 0;
2305 }
drhfeac5f82004-08-01 00:10:45 +00002306 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002307 }else{
2308 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002309 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002310 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002311 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002312 }
2313 }
2314
2315 /* Process the input line.
2316 */
shane9bd1b442009-10-23 01:27:39 +00002317 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002318 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002319 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002320 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2321 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2322 ){
drhbc46f022013-01-23 18:53:23 +00002323 const char *zDestFile = 0;
2324 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002325 sqlite3 *pDest;
2326 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002327 int j;
2328 for(j=1; j<nArg; j++){
2329 const char *z = azArg[j];
2330 if( z[0]=='-' ){
2331 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002332 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002333 {
2334 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2335 return 1;
2336 }
2337 }else if( zDestFile==0 ){
2338 zDestFile = azArg[j];
2339 }else if( zDb==0 ){
2340 zDb = zDestFile;
2341 zDestFile = azArg[j];
2342 }else{
2343 fprintf(stderr, "too many arguments to .backup\n");
2344 return 1;
2345 }
drh9ff849f2009-02-04 20:55:57 +00002346 }
drhbc46f022013-01-23 18:53:23 +00002347 if( zDestFile==0 ){
2348 fprintf(stderr, "missing FILENAME argument on .backup\n");
2349 return 1;
2350 }
2351 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002352 rc = sqlite3_open(zDestFile, &pDest);
2353 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002354 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002355 sqlite3_close(pDest);
2356 return 1;
2357 }
drh05782482013-10-24 15:20:20 +00002358 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002359 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2360 if( pBackup==0 ){
2361 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2362 sqlite3_close(pDest);
2363 return 1;
2364 }
2365 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2366 sqlite3_backup_finish(pBackup);
2367 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002368 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002369 }else{
2370 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002371 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002372 }
2373 sqlite3_close(pDest);
2374 }else
2375
drhc2ce0be2014-05-29 12:36:14 +00002376 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2377 if( nArg==2 ){
2378 bail_on_error = booleanValue(azArg[1]);
2379 }else{
2380 fprintf(stderr, "Usage: .bail on|off\n");
2381 rc = 1;
2382 }
drhc49f44e2006-10-26 18:15:42 +00002383 }else
2384
drhd8621b92012-04-17 09:09:33 +00002385 /* The undocumented ".breakpoint" command causes a call to the no-op
2386 ** routine named test_breakpoint().
2387 */
2388 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2389 test_breakpoint();
2390 }else
2391
drhc2ce0be2014-05-29 12:36:14 +00002392 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2393 if( nArg==2 ){
2394 tryToClone(p, azArg[1]);
2395 }else{
2396 fprintf(stderr, "Usage: .clone FILENAME\n");
2397 rc = 1;
2398 }
mistachkine31ae902014-02-06 01:15:29 +00002399 }else
2400
drhc2ce0be2014-05-29 12:36:14 +00002401 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002402 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002403 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002404 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002405 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002406 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002407 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002408 data.colWidth[0] = 3;
2409 data.colWidth[1] = 15;
2410 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002411 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002412 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002413 if( zErrMsg ){
2414 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002415 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002416 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002417 }
2418 }else
2419
drhc2ce0be2014-05-29 12:36:14 +00002420 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002421 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002422 /* When playing back a "dump", the content might appear in an order
2423 ** which causes immediate foreign key constraints to be violated.
2424 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002425 if( nArg!=1 && nArg!=2 ){
2426 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2427 rc = 1;
2428 goto meta_command_exit;
2429 }
drhf1dfc4f2009-09-23 15:51:35 +00002430 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002431 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002432 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002433 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002434 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002435 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002436 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002437 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002438 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002439 );
2440 run_schema_dump_query(p,
2441 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002442 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002443 );
drh2f464a02011-10-13 00:41:49 +00002444 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002445 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002446 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002447 );
drh4c653a02000-06-07 01:27:47 +00002448 }else{
2449 int i;
drhdd3d4592004-08-30 01:54:05 +00002450 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002451 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002452 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002453 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002454 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002455 " AND sql NOT NULL");
2456 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002457 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002458 "WHERE sql NOT NULL"
2459 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002460 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002461 );
danielk1977bc6ada42004-06-30 08:20:16 +00002462 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002463 }
2464 }
drh45e29d82006-11-20 16:21:10 +00002465 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002466 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002467 p->writableSchema = 0;
2468 }
drh56197952011-10-13 16:30:13 +00002469 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2470 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002471 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002472 }else
drh75897232000-05-29 14:26:00 +00002473
drhc2ce0be2014-05-29 12:36:14 +00002474 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2475 if( nArg==2 ){
2476 p->echoOn = booleanValue(azArg[1]);
2477 }else{
2478 fprintf(stderr, "Usage: .echo on|off\n");
2479 rc = 1;
2480 }
drhdaffd0e2001-04-11 14:28:42 +00002481 }else
2482
drhc2ce0be2014-05-29 12:36:14 +00002483 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2484 if( nArg==2 ){
2485 p->autoEQP = booleanValue(azArg[1]);
2486 }else{
2487 fprintf(stderr, "Usage: .eqp on|off\n");
2488 rc = 1;
2489 }
drhefbf3b12014-02-28 20:47:24 +00002490 }else
2491
drhd3ac7d92013-01-25 18:33:43 +00002492 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002493 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002494 rc = 2;
drh75897232000-05-29 14:26:00 +00002495 }else
2496
drhc2ce0be2014-05-29 12:36:14 +00002497 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002498 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002499 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002500 if(!p->normalMode.valid) {
2501 p->normalMode.valid = 1;
2502 p->normalMode.mode = p->mode;
2503 p->normalMode.showHeader = p->showHeader;
2504 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002505 }
2506 /* We could put this code under the !p->explainValid
2507 ** condition so that it does not execute if we are already in
2508 ** explain mode. However, always executing it allows us an easy
2509 ** was to reset to explain mode in case the user previously
2510 ** did an .explain followed by a .width, .mode or .header
2511 ** command.
2512 */
danielk19770d78bae2008-01-03 07:09:48 +00002513 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002514 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002515 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002516 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002517 p->colWidth[1] = 13; /* opcode */
2518 p->colWidth[2] = 4; /* P1 */
2519 p->colWidth[3] = 4; /* P2 */
2520 p->colWidth[4] = 4; /* P3 */
2521 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002522 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002523 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002524 }else if (p->normalMode.valid) {
2525 p->normalMode.valid = 0;
2526 p->mode = p->normalMode.mode;
2527 p->showHeader = p->normalMode.showHeader;
2528 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002529 }
drh75897232000-05-29 14:26:00 +00002530 }else
2531
drhc1971542014-06-23 23:28:13 +00002532 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002533 ShellState data;
drhc1971542014-06-23 23:28:13 +00002534 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002535 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002536 if( nArg!=1 ){
2537 fprintf(stderr, "Usage: .fullschema\n");
2538 rc = 1;
2539 goto meta_command_exit;
2540 }
2541 open_db(p, 0);
2542 memcpy(&data, p, sizeof(data));
2543 data.showHeader = 0;
2544 data.mode = MODE_Semi;
2545 rc = sqlite3_exec(p->db,
2546 "SELECT sql FROM"
2547 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2548 " FROM sqlite_master UNION ALL"
2549 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002550 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002551 "ORDER BY rowid",
2552 callback, &data, &zErrMsg
2553 );
drh56f674c2014-07-18 14:43:29 +00002554 if( rc==SQLITE_OK ){
2555 sqlite3_stmt *pStmt;
2556 rc = sqlite3_prepare_v2(p->db,
2557 "SELECT rowid FROM sqlite_master"
2558 " WHERE name GLOB 'sqlite_stat[134]'",
2559 -1, &pStmt, 0);
2560 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2561 sqlite3_finalize(pStmt);
2562 }
2563 if( doStats==0 ){
2564 fprintf(p->out, "/* No STAT tables available */\n");
2565 }else{
2566 fprintf(p->out, "ANALYZE sqlite_master;\n");
2567 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2568 callback, &data, &zErrMsg);
2569 data.mode = MODE_Insert;
2570 data.zDestTable = "sqlite_stat1";
2571 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2572 shell_callback, &data,&zErrMsg);
2573 data.zDestTable = "sqlite_stat3";
2574 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2575 shell_callback, &data,&zErrMsg);
2576 data.zDestTable = "sqlite_stat4";
2577 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2578 shell_callback, &data, &zErrMsg);
2579 fprintf(p->out, "ANALYZE sqlite_master;\n");
2580 }
drhc1971542014-06-23 23:28:13 +00002581 }else
2582
drhc2ce0be2014-05-29 12:36:14 +00002583 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2584 if( nArg==2 ){
2585 p->showHeader = booleanValue(azArg[1]);
2586 }else{
2587 fprintf(stderr, "Usage: .headers on|off\n");
2588 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002589 }
drh75897232000-05-29 14:26:00 +00002590 }else
2591
drhc2ce0be2014-05-29 12:36:14 +00002592 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2593 fprintf(p->out, "%s", zHelp);
2594 }else
2595
2596 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002597 char *zTable; /* Insert data into this table */
2598 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002599 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002600 int nCol; /* Number of columns in the table */
2601 int nByte; /* Number of bytes in an SQL string */
2602 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002603 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002604 int nSep; /* Number of bytes in p->separator[] */
2605 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002606 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002607 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002608
drhc2ce0be2014-05-29 12:36:14 +00002609 if( nArg!=3 ){
2610 fprintf(stderr, "Usage: .import FILE TABLE\n");
2611 goto meta_command_exit;
2612 }
drh01f37542014-05-31 15:43:33 +00002613 zFile = azArg[1];
2614 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002615 seenInterrupt = 0;
2616 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002617 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002618 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002619 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002620 fprintf(stderr, "Error: non-null separator required for import\n");
2621 return 1;
drhfeac5f82004-08-01 00:10:45 +00002622 }
drhdb95f682013-06-26 22:46:00 +00002623 if( nSep>1 ){
2624 fprintf(stderr, "Error: multi-character separators not allowed"
2625 " for import\n");
2626 return 1;
2627 }
drh5bde8162013-06-27 14:07:53 +00002628 sCsv.zFile = zFile;
2629 sCsv.nLine = 1;
2630 if( sCsv.zFile[0]=='|' ){
2631 sCsv.in = popen(sCsv.zFile+1, "r");
2632 sCsv.zFile = "<pipe>";
2633 xCloser = pclose;
2634 }else{
2635 sCsv.in = fopen(sCsv.zFile, "rb");
2636 xCloser = fclose;
2637 }
drhdb95f682013-06-26 22:46:00 +00002638 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002639 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002640 return 1;
2641 }
2642 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002643 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002644 if( zSql==0 ){
2645 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002646 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002647 return 1;
2648 }
drh4f21c4a2008-12-10 22:15:00 +00002649 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002650 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002651 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002652 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2653 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2654 char cSep = '(';
2655 while( csv_read_one_field(&sCsv) ){
2656 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2657 cSep = ',';
2658 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2659 }
drh5bde8162013-06-27 14:07:53 +00002660 if( cSep=='(' ){
2661 sqlite3_free(zCreate);
2662 sqlite3_free(sCsv.z);
2663 xCloser(sCsv.in);
2664 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2665 return 1;
2666 }
drhdb95f682013-06-26 22:46:00 +00002667 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2668 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2669 sqlite3_free(zCreate);
2670 if( rc ){
2671 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2672 sqlite3_errmsg(db));
2673 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002674 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002675 return 1;
2676 }
drhc7181902014-02-27 15:04:13 +00002677 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002678 }
drhfeac5f82004-08-01 00:10:45 +00002679 sqlite3_free(zSql);
2680 if( rc ){
shane916f9612009-10-23 00:37:15 +00002681 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002682 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002683 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002684 return 1;
drhfeac5f82004-08-01 00:10:45 +00002685 }
shane916f9612009-10-23 00:37:15 +00002686 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002687 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002688 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002689 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002690 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002691 if( zSql==0 ){
2692 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002693 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002694 return 1;
2695 }
drhdb95f682013-06-26 22:46:00 +00002696 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002697 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002698 for(i=1; i<nCol; i++){
2699 zSql[j++] = ',';
2700 zSql[j++] = '?';
2701 }
2702 zSql[j++] = ')';
2703 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002704 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002705 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002706 if( rc ){
2707 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002708 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002709 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002710 return 1;
drhfeac5f82004-08-01 00:10:45 +00002711 }
drh2d463112013-08-06 14:36:36 +00002712 needCommit = sqlite3_get_autocommit(db);
2713 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002714 do{
2715 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002716 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002717 char *z = csv_read_one_field(&sCsv);
2718 if( z==0 && i==0 ) break;
2719 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2720 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2721 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2722 "filling the rest with NULL\n",
2723 sCsv.zFile, startLine, nCol, i+1);
2724 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002725 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002726 }
drhfeac5f82004-08-01 00:10:45 +00002727 }
drhdb95f682013-06-26 22:46:00 +00002728 if( sCsv.cTerm==sCsv.cSeparator ){
2729 do{
2730 csv_read_one_field(&sCsv);
2731 i++;
2732 }while( sCsv.cTerm==sCsv.cSeparator );
2733 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2734 "extras ignored\n",
2735 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002736 }
drhdb95f682013-06-26 22:46:00 +00002737 if( i>=nCol ){
2738 sqlite3_step(pStmt);
2739 rc = sqlite3_reset(pStmt);
2740 if( rc!=SQLITE_OK ){
2741 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2742 sqlite3_errmsg(db));
2743 }
2744 }
2745 }while( sCsv.cTerm!=EOF );
2746
drh5bde8162013-06-27 14:07:53 +00002747 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002748 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002749 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002750 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002751 }else
2752
drhc2ce0be2014-05-29 12:36:14 +00002753 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002754 ShellState data;
drh75897232000-05-29 14:26:00 +00002755 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002756 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002757 memcpy(&data, p, sizeof(data));
2758 data.showHeader = 0;
2759 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002760 if( nArg==1 ){
2761 rc = sqlite3_exec(p->db,
2762 "SELECT name FROM sqlite_master "
2763 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2764 "UNION ALL "
2765 "SELECT name FROM sqlite_temp_master "
2766 "WHERE type='index' "
2767 "ORDER BY 1",
2768 callback, &data, &zErrMsg
2769 );
drhc2ce0be2014-05-29 12:36:14 +00002770 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002771 zShellStatic = azArg[1];
2772 rc = sqlite3_exec(p->db,
2773 "SELECT name FROM sqlite_master "
2774 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2775 "UNION ALL "
2776 "SELECT name FROM sqlite_temp_master "
2777 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2778 "ORDER BY 1",
2779 callback, &data, &zErrMsg
2780 );
2781 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002782 }else{
2783 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2784 rc = 1;
2785 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002786 }
drh75897232000-05-29 14:26:00 +00002787 if( zErrMsg ){
2788 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002789 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002790 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002791 }else if( rc != SQLITE_OK ){
2792 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2793 rc = 1;
drh75897232000-05-29 14:26:00 +00002794 }
2795 }else
2796
drhae5e4452007-05-03 17:18:36 +00002797#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002798 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002799 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002800 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2801 iotrace = 0;
2802 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002803 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002804 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002805 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002806 iotrace = stdout;
2807 }else{
2808 iotrace = fopen(azArg[1], "w");
2809 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002810 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002811 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002812 rc = 1;
drhb0603412007-02-28 04:47:26 +00002813 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002814 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002815 }
2816 }
2817 }else
drhae5e4452007-05-03 17:18:36 +00002818#endif
drhb0603412007-02-28 04:47:26 +00002819
drh70df4fe2006-06-13 15:12:21 +00002820#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002821 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002822 const char *zFile, *zProc;
2823 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002824 if( nArg<2 ){
2825 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2826 rc = 1;
2827 goto meta_command_exit;
2828 }
drh1e397f82006-06-08 15:28:43 +00002829 zFile = azArg[1];
2830 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002831 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002832 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2833 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002834 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002835 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002836 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002837 }
2838 }else
drh70df4fe2006-06-13 15:12:21 +00002839#endif
drh1e397f82006-06-08 15:28:43 +00002840
drhc2ce0be2014-05-29 12:36:14 +00002841 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2842 if( nArg!=2 ){
2843 fprintf(stderr, "Usage: .log FILENAME\n");
2844 rc = 1;
2845 }else{
2846 const char *zFile = azArg[1];
2847 output_file_close(p->pLog);
2848 p->pLog = output_file_open(zFile);
2849 }
drh127f9d72010-02-23 01:47:00 +00002850 }else
2851
danf533dbe2014-10-23 17:26:22 +00002852 if( c=='l' && strncmp(azArg[0], "loopcounters", n)==0 ){
2853 if( nArg==2 ){
2854 p->loopCountersOn = booleanValue(azArg[1]);
2855 }else{
2856 fprintf(stderr, "Usage: .loopcounters on|off\n");
2857 rc = 1;
2858 }
2859 }else
2860
2861
drhc2ce0be2014-05-29 12:36:14 +00002862 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2863 const char *zMode = nArg>=2 ? azArg[1] : "";
2864 int n2 = (int)strlen(zMode);
2865 int c2 = zMode[0];
2866 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002867 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002868 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002869 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002870 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002871 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002872 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002873 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002874 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002875 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002876 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002877 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002878 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002879 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drh6976c212014-07-24 12:09:47 +00002880 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
drhc2ce0be2014-05-29 12:36:14 +00002881 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002882 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002883 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002884 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002885 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002886 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002887 }else {
shane9bd1b442009-10-23 01:27:39 +00002888 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002889 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002890 rc = 1;
drh75897232000-05-29 14:26:00 +00002891 }
2892 }else
2893
drhc2ce0be2014-05-29 12:36:14 +00002894 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2895 if( nArg==2 ){
2896 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2897 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2898 }else{
2899 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002900 rc = 1;
2901 }
2902 }else
2903
drh05782482013-10-24 15:20:20 +00002904 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2905 sqlite3 *savedDb = p->db;
2906 const char *zSavedFilename = p->zDbFilename;
2907 char *zNewFilename = 0;
2908 p->db = 0;
2909 if( nArg>=2 ){
2910 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2911 }
2912 open_db(p, 1);
2913 if( p->db!=0 ){
2914 sqlite3_close(savedDb);
2915 sqlite3_free(p->zFreeOnClose);
2916 p->zFreeOnClose = zNewFilename;
2917 }else{
2918 sqlite3_free(zNewFilename);
2919 p->db = savedDb;
2920 p->zDbFilename = zSavedFilename;
2921 }
2922 }else
2923
drhc2ce0be2014-05-29 12:36:14 +00002924 if( c=='o'
2925 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2926 ){
2927 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2928 if( nArg>2 ){
2929 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2930 rc = 1;
2931 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002932 }
drhc2ce0be2014-05-29 12:36:14 +00002933 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2934 if( nArg<2 ){
2935 fprintf(stderr, "Usage: .once FILE\n");
2936 rc = 1;
2937 goto meta_command_exit;
2938 }
2939 p->outCount = 2;
2940 }else{
2941 p->outCount = 0;
2942 }
2943 output_reset(p);
2944 if( zFile[0]=='|' ){
2945 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002946 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002947 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002948 p->out = stdout;
2949 rc = 1;
2950 }else{
drhc2ce0be2014-05-29 12:36:14 +00002951 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002952 }
drh75897232000-05-29 14:26:00 +00002953 }else{
drhc2ce0be2014-05-29 12:36:14 +00002954 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002955 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002956 if( strcmp(zFile,"off")!=0 ){
2957 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002958 }
drh75897232000-05-29 14:26:00 +00002959 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002960 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002961 } else {
drhc2ce0be2014-05-29 12:36:14 +00002962 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002963 }
2964 }
2965 }else
2966
drh078b1fd2012-09-21 13:40:02 +00002967 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2968 int i;
2969 for(i=1; i<nArg; i++){
2970 if( i>1 ) fprintf(p->out, " ");
2971 fprintf(p->out, "%s", azArg[i]);
2972 }
2973 fprintf(p->out, "\n");
2974 }else
2975
drhc2ce0be2014-05-29 12:36:14 +00002976 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002977 if( nArg >= 2) {
2978 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2979 }
2980 if( nArg >= 3) {
2981 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2982 }
2983 }else
2984
drhc2ce0be2014-05-29 12:36:14 +00002985 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002986 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002987 }else
2988
drhc2ce0be2014-05-29 12:36:14 +00002989 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
2990 FILE *alt;
2991 if( nArg!=2 ){
2992 fprintf(stderr, "Usage: .read FILE\n");
2993 rc = 1;
2994 goto meta_command_exit;
2995 }
2996 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002997 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002998 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2999 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003000 }else{
shane9bd1b442009-10-23 01:27:39 +00003001 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003002 fclose(alt);
3003 }
3004 }else
3005
drhc2ce0be2014-05-29 12:36:14 +00003006 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003007 const char *zSrcFile;
3008 const char *zDb;
3009 sqlite3 *pSrc;
3010 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003011 int nTimeout = 0;
3012
drh9ff849f2009-02-04 20:55:57 +00003013 if( nArg==2 ){
3014 zSrcFile = azArg[1];
3015 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003016 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003017 zSrcFile = azArg[2];
3018 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003019 }else{
3020 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3021 rc = 1;
3022 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003023 }
3024 rc = sqlite3_open(zSrcFile, &pSrc);
3025 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003026 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003027 sqlite3_close(pSrc);
3028 return 1;
3029 }
drh05782482013-10-24 15:20:20 +00003030 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003031 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3032 if( pBackup==0 ){
3033 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3034 sqlite3_close(pSrc);
3035 return 1;
3036 }
drhdc2c4912009-02-04 22:46:47 +00003037 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3038 || rc==SQLITE_BUSY ){
3039 if( rc==SQLITE_BUSY ){
3040 if( nTimeout++ >= 3 ) break;
3041 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003042 }
3043 }
3044 sqlite3_backup_finish(pBackup);
3045 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003046 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003047 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003048 fprintf(stderr, "Error: source database is busy\n");
3049 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003050 }else{
3051 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003052 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003053 }
3054 sqlite3_close(pSrc);
3055 }else
3056
drhc2ce0be2014-05-29 12:36:14 +00003057 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003058 ShellState data;
drh75897232000-05-29 14:26:00 +00003059 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003060 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003061 memcpy(&data, p, sizeof(data));
3062 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003063 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003064 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003065 int i;
drhf0693c82011-10-11 20:41:54 +00003066 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003067 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003068 char *new_argv[2], *new_colv[2];
3069 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3070 " type text,\n"
3071 " name text,\n"
3072 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003073 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003074 " sql text\n"
3075 ")";
3076 new_argv[1] = 0;
3077 new_colv[0] = "sql";
3078 new_colv[1] = 0;
3079 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003080 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003081 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003082 char *new_argv[2], *new_colv[2];
3083 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3084 " type text,\n"
3085 " name text,\n"
3086 " tbl_name text,\n"
3087 " rootpage integer,\n"
3088 " sql text\n"
3089 ")";
3090 new_argv[1] = 0;
3091 new_colv[0] = "sql";
3092 new_colv[1] = 0;
3093 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003094 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003095 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003096 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003097 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003098 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003099 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003100 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003101 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003102 "WHERE lower(tbl_name) LIKE shellstatic()"
3103 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003104 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003105 callback, &data, &zErrMsg);
3106 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003107 }
drhc2ce0be2014-05-29 12:36:14 +00003108 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003109 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003110 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003111 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003112 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003113 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003114 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003115 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003116 callback, &data, &zErrMsg
3117 );
drhc2ce0be2014-05-29 12:36:14 +00003118 }else{
3119 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3120 rc = 1;
3121 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003122 }
drh75897232000-05-29 14:26:00 +00003123 if( zErrMsg ){
3124 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003125 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003126 rc = 1;
3127 }else if( rc != SQLITE_OK ){
3128 fprintf(stderr,"Error: querying schema information\n");
3129 rc = 1;
3130 }else{
3131 rc = 0;
drh75897232000-05-29 14:26:00 +00003132 }
3133 }else
3134
drhabd4c722014-09-20 18:18:33 +00003135
3136#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3137 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3138 extern int sqlite3SelectTrace;
3139 sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3140 }else
3141#endif
3142
3143
drh340f5822013-06-27 13:01:21 +00003144#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003145 /* Undocumented commands for internal testing. Subject to change
3146 ** without notice. */
3147 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3148 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3149 int i, v;
3150 for(i=1; i<nArg; i++){
3151 v = booleanValue(azArg[i]);
3152 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3153 }
3154 }
3155 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3156 int i; sqlite3_int64 v;
3157 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003158 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003159 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003160 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003161 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003162 }
3163 }
3164 }else
drh340f5822013-06-27 13:01:21 +00003165#endif
drh348d19c2013-06-03 12:47:43 +00003166
drhc2ce0be2014-05-29 12:36:14 +00003167 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003168 if( nArg<2 || nArg>3 ){
3169 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
drhc2ce0be2014-05-29 12:36:14 +00003170 rc = 1;
3171 }
drh6976c212014-07-24 12:09:47 +00003172 if( nArg>=2 ){
3173 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3174 }
3175 if( nArg>=3 ){
3176 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3177 }
drh75897232000-05-29 14:26:00 +00003178 }else
3179
drh62cdde52014-05-28 20:22:28 +00003180 if( c=='s'
3181 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003182 ){
3183 char *zCmd;
drh54027102014-08-06 14:36:53 +00003184 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003185 if( nArg<2 ){
3186 fprintf(stderr, "Usage: .system COMMAND\n");
3187 rc = 1;
3188 goto meta_command_exit;
3189 }
drhdcb3e3d2014-05-29 03:17:29 +00003190 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003191 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003192 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3193 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003194 }
drh54027102014-08-06 14:36:53 +00003195 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003196 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003197 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003198 }else
3199
drhc2ce0be2014-05-29 12:36:14 +00003200 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003201 int i;
drhc2ce0be2014-05-29 12:36:14 +00003202 if( nArg!=1 ){
3203 fprintf(stderr, "Usage: .show\n");
3204 rc = 1;
3205 goto meta_command_exit;
3206 }
persicom7e2dfdd2002-04-18 02:46:52 +00003207 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003208 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003209 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003210 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003211 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003212 fprintf(p->out,"%9.9s: ", "nullvalue");
3213 output_c_string(p->out, p->nullvalue);
3214 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003215 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003216 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003217 fprintf(p->out,"%9.9s: ", "separator");
3218 output_c_string(p->out, p->separator);
drh6976c212014-07-24 12:09:47 +00003219 fprintf(p->out," ");
3220 output_c_string(p->out, p->newline);
drhfeac5f82004-08-01 00:10:45 +00003221 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003222 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003223 fprintf(p->out,"%9.9s: ","width");
3224 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003225 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003226 }
drhfeac5f82004-08-01 00:10:45 +00003227 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003228 }else
3229
drhc2ce0be2014-05-29 12:36:14 +00003230 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3231 if( nArg==2 ){
3232 p->statsOn = booleanValue(azArg[1]);
3233 }else{
3234 fprintf(stderr, "Usage: .stats on|off\n");
3235 rc = 1;
3236 }
shaneh642d8b82010-07-28 16:05:34 +00003237 }else
3238
drhc2ce0be2014-05-29 12:36:14 +00003239 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003240 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003241 char **azResult;
drh98781232012-04-23 12:38:05 +00003242 int nRow, nAlloc;
3243 char *zSql = 0;
3244 int ii;
drh05782482013-10-24 15:20:20 +00003245 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003246 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3247 if( rc ) return rc;
3248 zSql = sqlite3_mprintf(
3249 "SELECT name FROM sqlite_master"
3250 " WHERE type IN ('table','view')"
3251 " AND name NOT LIKE 'sqlite_%%'"
3252 " AND name LIKE ?1");
3253 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3254 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3255 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3256 if( strcmp(zDbName,"temp")==0 ){
3257 zSql = sqlite3_mprintf(
3258 "%z UNION ALL "
3259 "SELECT 'temp.' || name FROM sqlite_temp_master"
3260 " WHERE type IN ('table','view')"
3261 " AND name NOT LIKE 'sqlite_%%'"
3262 " AND name LIKE ?1", zSql);
3263 }else{
3264 zSql = sqlite3_mprintf(
3265 "%z UNION ALL "
3266 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3267 " WHERE type IN ('table','view')"
3268 " AND name NOT LIKE 'sqlite_%%'"
3269 " AND name LIKE ?1", zSql, zDbName, zDbName);
3270 }
drha50da102000-08-08 20:19:09 +00003271 }
drh98781232012-04-23 12:38:05 +00003272 sqlite3_finalize(pStmt);
3273 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3274 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3275 sqlite3_free(zSql);
3276 if( rc ) return rc;
3277 nRow = nAlloc = 0;
3278 azResult = 0;
3279 if( nArg>1 ){
3280 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003281 }else{
drh98781232012-04-23 12:38:05 +00003282 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3283 }
3284 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3285 if( nRow>=nAlloc ){
3286 char **azNew;
3287 int n = nAlloc*2 + 10;
3288 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3289 if( azNew==0 ){
3290 fprintf(stderr, "Error: out of memory\n");
3291 break;
3292 }
3293 nAlloc = n;
3294 azResult = azNew;
3295 }
3296 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3297 if( azResult[nRow] ) nRow++;
3298 }
3299 sqlite3_finalize(pStmt);
3300 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003301 int len, maxlen = 0;
3302 int i, j;
3303 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003304 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003305 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003306 if( len>maxlen ) maxlen = len;
3307 }
3308 nPrintCol = 80/(maxlen+2);
3309 if( nPrintCol<1 ) nPrintCol = 1;
3310 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3311 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003312 for(j=i; j<nRow; j+=nPrintRow){
3313 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003314 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003315 }
drh151b7d52013-05-06 20:28:54 +00003316 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003317 }
3318 }
drh98781232012-04-23 12:38:05 +00003319 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3320 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003321 }else
3322
shaneh96887e12011-02-10 21:08:58 +00003323 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003324 static const struct {
3325 const char *zCtrlName; /* Name of a test-control option */
3326 int ctrlCode; /* Integer code for that option */
3327 } aCtrl[] = {
3328 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3329 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3330 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3331 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3332 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3333 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3334 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3335 { "assert", SQLITE_TESTCTRL_ASSERT },
3336 { "always", SQLITE_TESTCTRL_ALWAYS },
3337 { "reserve", SQLITE_TESTCTRL_RESERVE },
3338 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3339 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003340 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003341 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003342 };
shaneh96887e12011-02-10 21:08:58 +00003343 int testctrl = -1;
3344 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003345 int i, n;
drh05782482013-10-24 15:20:20 +00003346 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003347
drhd416fe72011-03-17 16:45:50 +00003348 /* convert testctrl text option to value. allow any unique prefix
3349 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003350 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003351 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003352 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3353 if( testctrl<0 ){
3354 testctrl = aCtrl[i].ctrlCode;
3355 }else{
drhb07028f2011-10-14 21:49:18 +00003356 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003357 testctrl = -1;
3358 break;
3359 }
3360 }
3361 }
drh348d19c2013-06-03 12:47:43 +00003362 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003363 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3364 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3365 }else{
3366 switch(testctrl){
3367
3368 /* sqlite3_test_control(int, db, int) */
3369 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3370 case SQLITE_TESTCTRL_RESERVE:
3371 if( nArg==3 ){
3372 int opt = (int)strtol(azArg[2], 0, 0);
3373 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003374 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003375 } else {
drhd416fe72011-03-17 16:45:50 +00003376 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3377 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003378 }
3379 break;
3380
3381 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003382 case SQLITE_TESTCTRL_PRNG_SAVE:
3383 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003384 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003385 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003386 if( nArg==2 ){
3387 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003388 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003389 } else {
3390 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3391 }
3392 break;
3393
3394 /* sqlite3_test_control(int, uint) */
3395 case SQLITE_TESTCTRL_PENDING_BYTE:
3396 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003397 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003398 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003399 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003400 } else {
drhd416fe72011-03-17 16:45:50 +00003401 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3402 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003403 }
3404 break;
3405
3406 /* sqlite3_test_control(int, int) */
3407 case SQLITE_TESTCTRL_ASSERT:
3408 case SQLITE_TESTCTRL_ALWAYS:
3409 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003410 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003411 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003412 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003413 } else {
drhd416fe72011-03-17 16:45:50 +00003414 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3415 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003416 }
3417 break;
3418
3419 /* sqlite3_test_control(int, char *) */
3420#ifdef SQLITE_N_KEYWORD
3421 case SQLITE_TESTCTRL_ISKEYWORD:
3422 if( nArg==3 ){
3423 const char *opt = azArg[2];
3424 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003425 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003426 } else {
drhd416fe72011-03-17 16:45:50 +00003427 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3428 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003429 }
3430 break;
3431#endif
3432
3433 case SQLITE_TESTCTRL_BITVEC_TEST:
3434 case SQLITE_TESTCTRL_FAULT_INSTALL:
3435 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3436 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3437 default:
drhd416fe72011-03-17 16:45:50 +00003438 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3439 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003440 break;
3441 }
3442 }
3443 }else
3444
drhc2ce0be2014-05-29 12:36:14 +00003445 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003446 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003447 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003448 }else
3449
drhc2ce0be2014-05-29 12:36:14 +00003450 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3451 if( nArg==2 ){
3452 enableTimer = booleanValue(azArg[1]);
3453 if( enableTimer && !HAS_TIMER ){
3454 fprintf(stderr, "Error: timer not available on this system.\n");
3455 enableTimer = 0;
3456 }
3457 }else{
3458 fprintf(stderr, "Usage: .timer on|off\n");
3459 rc = 1;
3460 }
shanehe2aa9d72009-11-06 17:20:17 +00003461 }else
3462
drhc2ce0be2014-05-29 12:36:14 +00003463 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003464 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003465 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003466 if( nArg!=2 ){
3467 fprintf(stderr, "Usage: .trace FILE|off\n");
3468 rc = 1;
3469 goto meta_command_exit;
3470 }
drh42f64e52012-04-04 16:56:23 +00003471 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003472#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003473 if( p->traceOut==0 ){
3474 sqlite3_trace(p->db, 0, 0);
3475 }else{
3476 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3477 }
3478#endif
3479 }else
3480
drhf442e332014-09-10 19:01:14 +00003481#if SQLITE_USER_AUTHENTICATION
3482 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3483 if( nArg<2 ){
3484 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3485 rc = 1;
3486 goto meta_command_exit;
3487 }
drh7883ecf2014-09-11 16:19:31 +00003488 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003489 if( strcmp(azArg[1],"login")==0 ){
3490 if( nArg!=4 ){
3491 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3492 rc = 1;
3493 goto meta_command_exit;
3494 }
drhd39c40f2014-09-11 00:27:53 +00003495 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3496 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003497 if( rc ){
3498 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3499 rc = 1;
3500 }
3501 }else if( strcmp(azArg[1],"add")==0 ){
3502 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003503 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003504 rc = 1;
3505 goto meta_command_exit;
3506 }
drhd39c40f2014-09-11 00:27:53 +00003507 rc = sqlite3_user_add(p->db, azArg[2],
3508 azArg[3], (int)strlen(azArg[3]),
3509 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003510 if( rc ){
3511 fprintf(stderr, "User-Add failed: %d\n", rc);
3512 rc = 1;
3513 }
3514 }else if( strcmp(azArg[1],"edit")==0 ){
3515 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003516 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003517 rc = 1;
3518 goto meta_command_exit;
3519 }
drhd39c40f2014-09-11 00:27:53 +00003520 rc = sqlite3_user_change(p->db, azArg[2],
3521 azArg[3], (int)strlen(azArg[3]),
3522 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003523 if( rc ){
3524 fprintf(stderr, "User-Edit failed: %d\n", rc);
3525 rc = 1;
3526 }
3527 }else if( strcmp(azArg[1],"delete")==0 ){
3528 if( nArg!=3 ){
3529 fprintf(stderr, "Usage: .user delete USER\n");
3530 rc = 1;
3531 goto meta_command_exit;
3532 }
3533 rc = sqlite3_user_delete(p->db, azArg[2]);
3534 if( rc ){
3535 fprintf(stderr, "User-Delete failed: %d\n", rc);
3536 rc = 1;
3537 }
3538 }else{
3539 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3540 rc = 1;
3541 goto meta_command_exit;
3542 }
3543 }else
3544#endif /* SQLITE_USER_AUTHENTICATION */
3545
drh9fd301b2011-06-03 13:28:22 +00003546 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003547 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003548 sqlite3_libversion(), sqlite3_sourceid());
3549 }else
3550
drhde60fc22011-12-14 17:53:36 +00003551 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3552 const char *zDbName = nArg==2 ? azArg[1] : "main";
3553 char *zVfsName = 0;
3554 if( p->db ){
3555 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3556 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003557 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003558 sqlite3_free(zVfsName);
3559 }
3560 }
3561 }else
3562
drhcef4fc82012-09-21 22:50:45 +00003563#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3564 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3565 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003566 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003567 }else
3568#endif
3569
drhc2ce0be2014-05-29 12:36:14 +00003570 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003571 int j;
drh43617e92006-03-06 20:55:46 +00003572 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003573 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003574 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003575 }
3576 }else
3577
3578 {
shane9bd1b442009-10-23 01:27:39 +00003579 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003580 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003581 rc = 1;
drh75897232000-05-29 14:26:00 +00003582 }
drh67505e72002-04-19 12:34:06 +00003583
drhc2ce0be2014-05-29 12:36:14 +00003584meta_command_exit:
3585 if( p->outCount ){
3586 p->outCount--;
3587 if( p->outCount==0 ) output_reset(p);
3588 }
drh67505e72002-04-19 12:34:06 +00003589 return rc;
drh75897232000-05-29 14:26:00 +00003590}
3591
drh67505e72002-04-19 12:34:06 +00003592/*
drh91a66392007-09-07 01:12:32 +00003593** Return TRUE if a semicolon occurs anywhere in the first N characters
3594** of string z[].
drh324ccef2003-02-05 14:06:20 +00003595*/
drh9f099fd2013-08-06 14:01:46 +00003596static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003597 int i;
3598 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3599 return 0;
drh324ccef2003-02-05 14:06:20 +00003600}
3601
3602/*
drh70c7a4b2003-04-26 03:03:06 +00003603** Test to see if a line consists entirely of whitespace.
3604*/
3605static int _all_whitespace(const char *z){
3606 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003607 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003608 if( *z=='/' && z[1]=='*' ){
3609 z += 2;
3610 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3611 if( *z==0 ) return 0;
3612 z++;
3613 continue;
3614 }
3615 if( *z=='-' && z[1]=='-' ){
3616 z += 2;
3617 while( *z && *z!='\n' ){ z++; }
3618 if( *z==0 ) return 1;
3619 continue;
3620 }
3621 return 0;
3622 }
3623 return 1;
3624}
3625
3626/*
drha9b17162003-04-29 18:01:28 +00003627** Return TRUE if the line typed in is an SQL command terminator other
3628** than a semi-colon. The SQL Server style "go" command is understood
3629** as is the Oracle "/".
3630*/
drh9f099fd2013-08-06 14:01:46 +00003631static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003632 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003633 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3634 return 1; /* Oracle */
3635 }
drhf0693c82011-10-11 20:41:54 +00003636 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003637 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003638 return 1; /* SQL Server */
3639 }
3640 return 0;
3641}
3642
3643/*
drh233a5312008-12-18 22:25:13 +00003644** Return true if zSql is a complete SQL statement. Return false if it
3645** ends in the middle of a string literal or C-style comment.
3646*/
drh9f099fd2013-08-06 14:01:46 +00003647static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003648 int rc;
3649 if( zSql==0 ) return 1;
3650 zSql[nSql] = ';';
3651 zSql[nSql+1] = 0;
3652 rc = sqlite3_complete(zSql);
3653 zSql[nSql] = 0;
3654 return rc;
3655}
3656
3657/*
drh67505e72002-04-19 12:34:06 +00003658** Read input from *in and process it. If *in==0 then input
3659** is interactive - the user is typing it it. Otherwise, input
3660** is coming from a file or device. A prompt is issued and history
3661** is saved only if input is interactive. An interrupt signal will
3662** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003663**
3664** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003665*/
drhdcd87a92014-08-18 13:45:42 +00003666static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003667 char *zLine = 0; /* A single input line */
3668 char *zSql = 0; /* Accumulated SQL text */
3669 int nLine; /* Length of current line */
3670 int nSql = 0; /* Bytes of zSql[] used */
3671 int nAlloc = 0; /* Allocated zSql[] space */
3672 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3673 char *zErrMsg; /* Error message returned */
3674 int rc; /* Error code */
3675 int errCnt = 0; /* Number of errors seen */
3676 int lineno = 0; /* Current line number */
3677 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003678
3679 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3680 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003681 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003682 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003683 /* End of input */
3684 if( stdin_is_interactive ) printf("\n");
3685 break;
drhc49f44e2006-10-26 18:15:42 +00003686 }
drh67505e72002-04-19 12:34:06 +00003687 if( seenInterrupt ){
3688 if( in!=0 ) break;
3689 seenInterrupt = 0;
3690 }
drhc28490c2006-10-26 14:25:58 +00003691 lineno++;
drh849a9d92013-12-21 15:46:06 +00003692 if( nSql==0 && _all_whitespace(zLine) ){
3693 if( p->echoOn ) printf("%s\n", zLine);
3694 continue;
3695 }
drh2af0b2d2002-02-21 02:25:02 +00003696 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003697 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003698 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003699 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003700 break;
3701 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003702 errCnt++;
3703 }
drhdaffd0e2001-04-11 14:28:42 +00003704 continue;
3705 }
drh9f099fd2013-08-06 14:01:46 +00003706 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003707 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003708 }
drh9f099fd2013-08-06 14:01:46 +00003709 nLine = strlen30(zLine);
3710 if( nSql+nLine+2>=nAlloc ){
3711 nAlloc = nSql+nLine+100;
3712 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003713 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003714 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003715 exit(1);
3716 }
drhdaffd0e2001-04-11 14:28:42 +00003717 }
drh9f099fd2013-08-06 14:01:46 +00003718 nSqlPrior = nSql;
3719 if( nSql==0 ){
3720 int i;
3721 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003722 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003723 memcpy(zSql, zLine+i, nLine+1-i);
3724 startline = lineno;
3725 nSql = nLine-i;
3726 }else{
3727 zSql[nSql++] = '\n';
3728 memcpy(zSql+nSql, zLine, nLine+1);
3729 nSql += nLine;
3730 }
3731 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003732 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003733 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003734 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003735 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003736 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003737 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003738 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003739 char zPrefix[100];
3740 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003741 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003742 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003743 }else{
shane9bd1b442009-10-23 01:27:39 +00003744 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003745 }
drh7f953e22002-07-13 17:33:45 +00003746 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003747 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003748 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003749 zErrMsg = 0;
3750 }else{
shaned2bed1c2009-10-21 03:56:54 +00003751 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003752 }
drhc49f44e2006-10-26 18:15:42 +00003753 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003754 }
drhdaffd0e2001-04-11 14:28:42 +00003755 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003756 if( p->outCount ){
3757 output_reset(p);
3758 p->outCount = 0;
3759 }
drh9f099fd2013-08-06 14:01:46 +00003760 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003761 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003762 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003763 }
3764 }
drh9f099fd2013-08-06 14:01:46 +00003765 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003766 if( !_all_whitespace(zSql) ){
3767 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00003768 errCnt++;
drhd416fe72011-03-17 16:45:50 +00003769 }
drhdaffd0e2001-04-11 14:28:42 +00003770 free(zSql);
3771 }
danielk19772ac27622007-07-03 05:31:16 +00003772 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003773 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003774}
3775
drh67505e72002-04-19 12:34:06 +00003776/*
3777** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003778** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003779*/
3780static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003781 static char *home_dir = NULL;
3782 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003783
drh83905c92012-06-21 13:00:37 +00003784#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003785 {
3786 struct passwd *pwent;
3787 uid_t uid = getuid();
3788 if( (pwent=getpwuid(uid)) != NULL) {
3789 home_dir = pwent->pw_dir;
3790 }
drh67505e72002-04-19 12:34:06 +00003791 }
3792#endif
3793
chw65d3c132007-11-12 21:09:10 +00003794#if defined(_WIN32_WCE)
3795 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3796 */
drh85e72432012-04-11 11:38:53 +00003797 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003798#else
3799
drh83905c92012-06-21 13:00:37 +00003800#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003801 if (!home_dir) {
3802 home_dir = getenv("USERPROFILE");
3803 }
3804#endif
3805
drh67505e72002-04-19 12:34:06 +00003806 if (!home_dir) {
3807 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003808 }
3809
drh83905c92012-06-21 13:00:37 +00003810#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003811 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003812 char *zDrive, *zPath;
3813 int n;
3814 zDrive = getenv("HOMEDRIVE");
3815 zPath = getenv("HOMEPATH");
3816 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003817 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003818 home_dir = malloc( n );
3819 if( home_dir==0 ) return 0;
3820 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3821 return home_dir;
3822 }
3823 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003824 }
3825#endif
3826
chw65d3c132007-11-12 21:09:10 +00003827#endif /* !_WIN32_WCE */
3828
drh67505e72002-04-19 12:34:06 +00003829 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003830 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003831 char *z = malloc( n );
3832 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003833 home_dir = z;
3834 }
drhe98d4fa2002-04-21 19:06:22 +00003835
drh67505e72002-04-19 12:34:06 +00003836 return home_dir;
3837}
3838
3839/*
3840** Read input from the file given by sqliterc_override. Or if that
3841** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003842**
3843** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003844*/
shane9bd1b442009-10-23 01:27:39 +00003845static int process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00003846 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00003847 const char *sqliterc_override /* Name of config file. NULL to use default */
3848){
persicom7e2dfdd2002-04-18 02:46:52 +00003849 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003850 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003851 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003852 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003853 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003854
3855 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003856 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003857 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003858#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003859 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003860#endif
shane9bd1b442009-10-23 01:27:39 +00003861 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003862 }
drh2f3de322012-06-27 16:41:31 +00003863 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003864 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3865 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003866 }
drha1f9b5e2004-02-14 16:31:02 +00003867 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003868 if( in ){
drhc28490c2006-10-26 14:25:58 +00003869 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003870 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003871 }
shane9bd1b442009-10-23 01:27:39 +00003872 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003873 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003874 }
drh85e72432012-04-11 11:38:53 +00003875 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003876 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003877}
3878
drh67505e72002-04-19 12:34:06 +00003879/*
drhe1e38c42003-05-04 18:30:59 +00003880** Show available command line options
3881*/
3882static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003883 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003884 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003885 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003886 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003887 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003888 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003889 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003890 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003891#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3892 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3893#endif
drhcc3b4f82012-02-07 14:13:50 +00003894 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003895 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003896 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003897 " -line set output mode to 'line'\n"
3898 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00003899 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00003900 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003901#ifdef SQLITE_ENABLE_MULTIPLEX
3902 " -multiplex enable the multiplexor VFS\n"
3903#endif
drh6976c212014-07-24 12:09:47 +00003904 " -newline SEP set newline character(s) for CSV\n"
drh98d312f2012-10-25 15:23:14 +00003905 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00003906 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
3907 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
drh98d312f2012-10-25 15:23:14 +00003908 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003909 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003910 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003911 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003912#ifdef SQLITE_ENABLE_VFSTRACE
3913 " -vfstrace enable tracing of all VFS calls\n"
3914#endif
drhe1e38c42003-05-04 18:30:59 +00003915;
3916static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003917 fprintf(stderr,
3918 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3919 "FILENAME is the name of an SQLite database. A new database is created\n"
3920 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003921 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003922 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003923 }else{
3924 fprintf(stderr, "Use the -help option for additional information\n");
3925 }
3926 exit(1);
3927}
3928
3929/*
drh67505e72002-04-19 12:34:06 +00003930** Initialize the state information in data
3931*/
drhdcd87a92014-08-18 13:45:42 +00003932static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003933 memset(data, 0, sizeof(*data));
3934 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003935 memcpy(data->separator,"|", 2);
drh6976c212014-07-24 12:09:47 +00003936 memcpy(data->newline,"\r\n", 3);
persicom7e2dfdd2002-04-18 02:46:52 +00003937 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00003938 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00003939 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003940 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00003941 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00003942 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3943 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00003944}
3945
drh98d312f2012-10-25 15:23:14 +00003946/*
drh5c7976f2014-02-10 19:59:27 +00003947** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003948*/
3949#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003950static void printBold(const char *zText){
3951 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3952 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3953 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3954 SetConsoleTextAttribute(out,
3955 FOREGROUND_RED|FOREGROUND_INTENSITY
3956 );
3957 printf("%s", zText);
3958 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003959}
3960#else
drh5c7976f2014-02-10 19:59:27 +00003961static void printBold(const char *zText){
3962 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003963}
3964#endif
3965
3966/*
drh98d312f2012-10-25 15:23:14 +00003967** Get the argument to an --option. Throw an error and die if no argument
3968** is available.
3969*/
3970static char *cmdline_option_value(int argc, char **argv, int i){
3971 if( i==argc ){
3972 fprintf(stderr, "%s: Error: missing argument to %s\n",
3973 argv[0], argv[argc-1]);
3974 exit(1);
3975 }
3976 return argv[i];
3977}
3978
drh75897232000-05-29 14:26:00 +00003979int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003980 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00003981 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00003982 const char *zInitFile = 0;
3983 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003984 int i;
drhc28490c2006-10-26 14:25:58 +00003985 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003986 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003987
drh69b30ab2014-02-27 15:11:52 +00003988#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003989 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3990 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3991 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3992 exit(1);
3993 }
drhc7181902014-02-27 15:04:13 +00003994#endif
drhdaffd0e2001-04-11 14:28:42 +00003995 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003996 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003997 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003998
drh44c2eb12003-04-30 11:38:26 +00003999 /* Make sure we have a valid signal handler early, before anything
4000 ** else is done.
4001 */
drh4c504392000-10-16 22:06:40 +00004002#ifdef SIGINT
4003 signal(SIGINT, interrupt_handler);
4004#endif
drh44c2eb12003-04-30 11:38:26 +00004005
drh22fbcb82004-02-01 01:22:50 +00004006 /* Do an initial pass through the command-line argument to locate
4007 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004008 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004009 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004010 */
drh98d312f2012-10-25 15:23:14 +00004011 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004012 char *z;
drhc28490c2006-10-26 14:25:58 +00004013 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004014 if( z[0]!='-' ){
4015 if( data.zDbFilename==0 ){
4016 data.zDbFilename = z;
4017 continue;
4018 }
4019 if( zFirstCmd==0 ){
4020 zFirstCmd = z;
4021 continue;
4022 }
4023 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
4024 fprintf(stderr,"Use -help for a list of options.\n");
4025 return 1;
4026 }
drhcc3b4f82012-02-07 14:13:50 +00004027 if( z[1]=='-' ) z++;
4028 if( strcmp(z,"-separator")==0
4029 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004030 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004031 || strcmp(z,"-cmd")==0
4032 ){
drh98d312f2012-10-25 15:23:14 +00004033 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004034 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004035 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004036 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004037 /* Need to check for batch mode here to so we can avoid printing
4038 ** informational messages (like from process_sqliterc) before
4039 ** we do the actual processing of arguments later in a second pass.
4040 */
shanef69573d2009-10-24 02:06:14 +00004041 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004042 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004043#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004044 const char *zSize;
4045 sqlite3_int64 szHeap;
4046
drh98d312f2012-10-25 15:23:14 +00004047 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004048 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004049 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004050 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4051#endif
drh44dec872014-08-30 15:49:25 +00004052 }else if( strcmp(z,"-scratch")==0 ){
4053 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004054 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004055 if( sz>400000 ) sz = 400000;
4056 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004057 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004058 if( n>10 ) n = 10;
4059 if( n<1 ) n = 1;
4060 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4061 data.shellFlgs |= SHFLG_Scratch;
4062 }else if( strcmp(z,"-pagecache")==0 ){
4063 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004064 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004065 if( sz>70000 ) sz = 70000;
4066 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004067 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004068 if( n<10 ) n = 10;
4069 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4070 data.shellFlgs |= SHFLG_Pagecache;
4071 }else if( strcmp(z,"-lookaside")==0 ){
4072 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004073 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004074 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004075 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004076 if( n<0 ) n = 0;
4077 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4078 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004079#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004080 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004081 extern int vfstrace_register(
4082 const char *zTraceName,
4083 const char *zOldVfsName,
4084 int (*xOut)(const char*,void*),
4085 void *pOutArg,
4086 int makeDefault
4087 );
drh2b625e22011-03-16 17:05:28 +00004088 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004089#endif
drh6f25e892011-07-08 17:02:57 +00004090#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004091 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004092 extern int sqlite3_multiple_initialize(const char*,int);
4093 sqlite3_multiplex_initialize(0, 1);
4094#endif
drh7d9f3942013-04-03 01:26:54 +00004095 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004096 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4097 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004098 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004099 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004100 if( pVfs ){
4101 sqlite3_vfs_register(pVfs, 1);
4102 }else{
4103 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4104 exit(1);
4105 }
drh44c2eb12003-04-30 11:38:26 +00004106 }
4107 }
drh98d312f2012-10-25 15:23:14 +00004108 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004109#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004110 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004111 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004112#else
shane86f5bdb2009-10-24 02:00:07 +00004113 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4114 return 1;
drh01b41712005-08-29 23:06:23 +00004115#endif
drhc7181902014-02-27 15:04:13 +00004116#ifdef SQLITE_SHELL_DBNAME_PROC
4117 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4118 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4119 warnInmemoryDb = 0; }
4120#endif
drh98d312f2012-10-25 15:23:14 +00004121 }
4122 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004123
drh44c2eb12003-04-30 11:38:26 +00004124 /* Go ahead and open the database file if it already exists. If the
4125 ** file does not exist, delay opening it. This prevents empty database
4126 ** files from being created if a user mistypes the database name argument
4127 ** to the sqlite command-line tool.
4128 */
drhc8d74412004-08-31 23:41:26 +00004129 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004130 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004131 }
4132
drh22fbcb82004-02-01 01:22:50 +00004133 /* Process the initialization file if there is one. If no -init option
4134 ** is given on the command line, look for a file named ~/.sqliterc and
4135 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004136 */
shane86f5bdb2009-10-24 02:00:07 +00004137 rc = process_sqliterc(&data,zInitFile);
4138 if( rc>0 ){
4139 return rc;
4140 }
drh44c2eb12003-04-30 11:38:26 +00004141
drh22fbcb82004-02-01 01:22:50 +00004142 /* Make a second pass through the command-line argument and set
4143 ** options. This second pass is delayed until after the initialization
4144 ** file is processed so that the command-line arguments will override
4145 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004146 */
drh98d312f2012-10-25 15:23:14 +00004147 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004148 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004149 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004150 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004151 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004152 i++;
4153 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004154 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004155 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004156 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004157 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004158 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004159 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004160 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004161 }else if( strcmp(z,"-csv")==0 ){
4162 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00004163 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00004164 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004165 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00004166 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004167 }else if( strcmp(z,"-newline")==0 ){
4168 sqlite3_snprintf(sizeof(data.newline), data.newline,
4169 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004170 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004171 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004172 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004173 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004174 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004175 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004176 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004177 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004178 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004179 }else if( strcmp(z,"-eqp")==0 ){
4180 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004181 }else if( strcmp(z,"-stats")==0 ){
4182 data.statsOn = 1;
danf533dbe2014-10-23 17:26:22 +00004183 }else if( strcmp(z,"-loopcounters")==0 ){
4184 data.loopCountersOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004185 }else if( strcmp(z,"-bail")==0 ){
4186 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004187 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004188 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004189 return 0;
drhc28490c2006-10-26 14:25:58 +00004190 }else if( strcmp(z,"-interactive")==0 ){
4191 stdin_is_interactive = 1;
4192 }else if( strcmp(z,"-batch")==0 ){
4193 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004194 }else if( strcmp(z,"-heap")==0 ){
4195 i++;
drh44dec872014-08-30 15:49:25 +00004196 }else if( strcmp(z,"-scratch")==0 ){
4197 i+=2;
4198 }else if( strcmp(z,"-pagecache")==0 ){
4199 i+=2;
4200 }else if( strcmp(z,"-lookaside")==0 ){
4201 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004202 }else if( strcmp(z,"-mmap")==0 ){
4203 i++;
drha7e61d82011-03-12 17:02:57 +00004204 }else if( strcmp(z,"-vfs")==0 ){
4205 i++;
drh6f25e892011-07-08 17:02:57 +00004206#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004207 }else if( strcmp(z,"-vfstrace")==0 ){
4208 i++;
drh6f25e892011-07-08 17:02:57 +00004209#endif
4210#ifdef SQLITE_ENABLE_MULTIPLEX
4211 }else if( strcmp(z,"-multiplex")==0 ){
4212 i++;
4213#endif
drhcc3b4f82012-02-07 14:13:50 +00004214 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004215 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004216 }else if( strcmp(z,"-cmd")==0 ){
4217 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004218 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004219 if( z[0]=='.' ){
4220 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004221 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004222 }else{
drh05782482013-10-24 15:20:20 +00004223 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004224 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4225 if( zErrMsg!=0 ){
4226 fprintf(stderr,"Error: %s\n", zErrMsg);
4227 if( bail_on_error ) return rc!=0 ? rc : 1;
4228 }else if( rc!=0 ){
4229 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4230 if( bail_on_error ) return rc;
4231 }
4232 }
drh1e5d0e92000-05-31 23:33:17 +00004233 }else{
shane86f5bdb2009-10-24 02:00:07 +00004234 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004235 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004236 return 1;
4237 }
4238 }
drh44c2eb12003-04-30 11:38:26 +00004239
drh22fbcb82004-02-01 01:22:50 +00004240 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00004241 /* Run just the command that follows the database name
4242 */
drh22fbcb82004-02-01 01:22:50 +00004243 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00004244 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00004245 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00004246 }else{
drh05782482013-10-24 15:20:20 +00004247 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00004248 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00004249 if( zErrMsg!=0 ){
4250 fprintf(stderr,"Error: %s\n", zErrMsg);
4251 return rc!=0 ? rc : 1;
4252 }else if( rc!=0 ){
4253 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4254 return rc;
drh6ff13852001-11-25 13:18:23 +00004255 }
drh75897232000-05-29 14:26:00 +00004256 }
4257 }else{
drh44c2eb12003-04-30 11:38:26 +00004258 /* Run commands received from standard input
4259 */
drhc28490c2006-10-26 14:25:58 +00004260 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004261 char *zHome;
4262 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004263 int nHistory;
drh75897232000-05-29 14:26:00 +00004264 printf(
drh743e0032011-12-12 16:51:50 +00004265 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004266 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004267 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004268 );
drhb3735912014-02-10 16:13:42 +00004269 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004270 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004271 printBold("transient in-memory database");
4272 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004273 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004274 }
drh67505e72002-04-19 12:34:06 +00004275 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004276 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004277 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004278 if( (zHistory = malloc(nHistory))!=0 ){
4279 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4280 }
drh67505e72002-04-19 12:34:06 +00004281 }
drhaaa21b42014-02-11 14:37:51 +00004282#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004283 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004284#endif
drhc28490c2006-10-26 14:25:58 +00004285 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004286 if( zHistory ){
4287 stifle_history(100);
4288 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004289 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004290 }
drhdaffd0e2001-04-11 14:28:42 +00004291 }else{
drhc28490c2006-10-26 14:25:58 +00004292 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004293 }
4294 }
drh33048c02001-10-01 14:29:22 +00004295 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004296 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004297 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004298 }
drh05782482013-10-24 15:20:20 +00004299 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004300 return rc;
drh75897232000-05-29 14:26:00 +00004301}