blob: 68f2ef2afcceffce6fa2f237ab34e063261d9911 [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"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drh81d7fd12010-12-08 00:02:26 +000048#ifdef HAVE_EDITLINE
49# include <editline/editline.h>
50#endif
drh16e59552000-07-31 11:57:37 +000051#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000052# include <readline/readline.h>
53# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000054#endif
55#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
persicom1d0b8722002-04-18 02:53:04 +000056# define add_history(X)
drh67505e72002-04-19 12:34:06 +000057# define read_history(X)
58# define write_history(X)
59# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000060#endif
61
adamd2e8464a2006-09-06 21:39:40 +000062#if defined(_WIN32) || defined(WIN32)
63# include <io.h>
shane18e526c2008-12-10 22:30:24 +000064#define isatty(h) _isatty(h)
65#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000066#undef popen
drh53371f92013-07-25 17:07:03 +000067#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000068#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000069#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000070#else
drh4328c8b2003-04-26 02:50:11 +000071/* Make sure isatty() has a prototype.
72*/
drhb2acc3b2011-10-13 16:36:29 +000073extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000074
drh53371f92013-07-25 17:07:03 +000075/* popen and pclose are not C89 functions and so are sometimes omitted from
76** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000077extern FILE *popen(const char*,const char*);
78extern int pclose(FILE*);
79#endif
drh53371f92013-07-25 17:07:03 +000080
chw65d3c132007-11-12 21:09:10 +000081#if defined(_WIN32_WCE)
82/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
83 * thus we always assume that we have a console. That can be
84 * overridden with the -batch command line option.
85 */
86#define isatty(x) 1
87#endif
88
drhf0693c82011-10-11 20:41:54 +000089/* ctype macros that work with signed characters */
90#define IsSpace(X) isspace((unsigned char)X)
91#define IsDigit(X) isdigit((unsigned char)X)
92#define ToLower(X) (char)tolower((unsigned char)X)
93
drh43408312013-10-30 12:43:36 +000094
95/* True if the timer is enabled */
96static int enableTimer = 0;
97
98/* Return the current wall-clock time */
99static sqlite3_int64 timeOfDay(void){
100 static sqlite3_vfs *clockVfs = 0;
101 sqlite3_int64 t;
102 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
103 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
104 clockVfs->xCurrentTimeInt64(clockVfs, &t);
105 }else{
106 double r;
107 clockVfs->xCurrentTime(clockVfs, &r);
108 t = (sqlite3_int64)(r*86400000.0);
109 }
110 return t;
111}
112
drhd5d0f642013-02-20 00:54:21 +0000113#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
114 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000115#include <sys/time.h>
116#include <sys/resource.h>
117
drhda108222009-02-25 19:07:24 +0000118/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000119static struct rusage sBegin; /* CPU time at start */
120static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000121
drhda108222009-02-25 19:07:24 +0000122/*
123** Begin timing an operation
124*/
125static void beginTimer(void){
126 if( enableTimer ){
127 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000128 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000129 }
130}
131
132/* Return the difference of two time_structs in seconds */
133static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
134 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
135 (double)(pEnd->tv_sec - pStart->tv_sec);
136}
137
138/*
139** Print the timing results.
140*/
141static void endTimer(void){
142 if( enableTimer ){
143 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000144 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000145 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000146 printf("Run Time: real %.3f user %f sys %f\n",
147 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000148 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
149 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
150 }
151}
shaneb320ccd2009-10-21 03:42:58 +0000152
drhda108222009-02-25 19:07:24 +0000153#define BEGIN_TIMER beginTimer()
154#define END_TIMER endTimer()
155#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000156
157#elif (defined(_WIN32) || defined(WIN32))
158
159#include <windows.h>
160
161/* Saved resource information for the beginning of an operation */
162static HANDLE hProcess;
163static FILETIME ftKernelBegin;
164static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000165static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000166typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
167static GETPROCTIMES getProcessTimesAddr = NULL;
168
shaneb320ccd2009-10-21 03:42:58 +0000169/*
170** Check to see if we have timer support. Return 1 if necessary
171** support found (or found previously).
172*/
173static int hasTimer(void){
174 if( getProcessTimesAddr ){
175 return 1;
176 } else {
177 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
178 ** See if the version we are running on has it, and if it does, save off
179 ** a pointer to it and the current process handle.
180 */
181 hProcess = GetCurrentProcess();
182 if( hProcess ){
183 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
184 if( NULL != hinstLib ){
185 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
186 if( NULL != getProcessTimesAddr ){
187 return 1;
188 }
189 FreeLibrary(hinstLib);
190 }
191 }
192 }
193 return 0;
194}
195
196/*
197** Begin timing an operation
198*/
199static void beginTimer(void){
200 if( enableTimer && getProcessTimesAddr ){
201 FILETIME ftCreation, ftExit;
202 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000203 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000204 }
205}
206
207/* Return the difference of two FILETIME structs in seconds */
208static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
209 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
210 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
211 return (double) ((i64End - i64Start) / 10000000.0);
212}
213
214/*
215** Print the timing results.
216*/
217static void endTimer(void){
218 if( enableTimer && getProcessTimesAddr){
219 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000220 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000221 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000222 printf("Run Time: real %.3f user %f sys %f\n",
223 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000224 timeDiff(&ftUserBegin, &ftUserEnd),
225 timeDiff(&ftKernelBegin, &ftKernelEnd));
226 }
227}
228
229#define BEGIN_TIMER beginTimer()
230#define END_TIMER endTimer()
231#define HAS_TIMER hasTimer()
232
drhda108222009-02-25 19:07:24 +0000233#else
234#define BEGIN_TIMER
235#define END_TIMER
236#define HAS_TIMER 0
237#endif
238
shanec0688ea2009-03-05 03:48:06 +0000239/*
240** Used to prevent warnings about unused parameters
241*/
242#define UNUSED_PARAMETER(x) (void)(x)
243
drhe91d16b2008-12-08 18:27:31 +0000244/*
drhc49f44e2006-10-26 18:15:42 +0000245** If the following flag is set, then command execution stops
246** at an error if we are not interactive.
247*/
248static int bail_on_error = 0;
249
250/*
drhc28490c2006-10-26 14:25:58 +0000251** Threat stdin as an interactive input if the following variable
252** is true. Otherwise, assume stdin is connected to a file or pipe.
253*/
254static int stdin_is_interactive = 1;
255
256/*
drh4c504392000-10-16 22:06:40 +0000257** The following is the open SQLite database. We make a pointer
258** to this database a static variable so that it can be accessed
259** by the SIGINT handler to interrupt database processing.
260*/
danielk197792f9a1b2004-06-19 09:08:16 +0000261static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000262
263/*
drh67505e72002-04-19 12:34:06 +0000264** True if an interrupt (Control-C) has been received.
265*/
drh43617e92006-03-06 20:55:46 +0000266static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000267
268/*
persicom7e2dfdd2002-04-18 02:46:52 +0000269** This is the name of our program. It is set in main(), used
270** in a number of other places, mostly for error messages.
271*/
272static char *Argv0;
273
274/*
275** Prompt strings. Initialized in main. Settable with
276** .prompt main continue
277*/
278static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
279static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
280
drhb0603412007-02-28 04:47:26 +0000281/*
282** Write I/O traces to the following stream.
283*/
rsebe0a9092007-07-30 18:24:38 +0000284#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000285static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000286#endif
drhb0603412007-02-28 04:47:26 +0000287
288/*
289** This routine works like printf in that its first argument is a
290** format string and subsequent arguments are values to be substituted
291** in place of % fields. The result of formatting this string
292** is written to iotrace.
293*/
rsebe0a9092007-07-30 18:24:38 +0000294#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000295static void iotracePrintf(const char *zFormat, ...){
296 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000297 char *z;
drhb0603412007-02-28 04:47:26 +0000298 if( iotrace==0 ) return;
299 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000300 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000301 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000302 fprintf(iotrace, "%s", z);
303 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000304}
rsebe0a9092007-07-30 18:24:38 +0000305#endif
drhb0603412007-02-28 04:47:26 +0000306
drh44c2eb12003-04-30 11:38:26 +0000307
persicom7e2dfdd2002-04-18 02:46:52 +0000308/*
drh83965662003-04-17 02:54:13 +0000309** Determines if a string is a number of not.
310*/
danielk19772e588c72005-12-09 14:25:08 +0000311static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000312 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000313 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000314 return 0;
315 }
316 z++;
317 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000318 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000319 if( *z=='.' ){
320 z++;
drhf0693c82011-10-11 20:41:54 +0000321 if( !IsDigit(*z) ) return 0;
322 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000323 if( realnum ) *realnum = 1;
324 }
325 if( *z=='e' || *z=='E' ){
326 z++;
327 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000328 if( !IsDigit(*z) ) return 0;
329 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000330 if( realnum ) *realnum = 1;
331 }
332 return *z==0;
333}
drh83965662003-04-17 02:54:13 +0000334
335/*
danielk1977bc6ada42004-06-30 08:20:16 +0000336** A global char* and an SQL function to access its current value
337** from within an SQL statement. This program used to use the
338** sqlite_exec_printf() API to substitue a string into an SQL statement.
339** The correct way to do this with sqlite3 is to use the bind API, but
340** since the shell is built around the callback paradigm it would be a lot
341** of work. Instead just use this hack, which is quite harmless.
342*/
343static const char *zShellStatic = 0;
344static void shellstaticFunc(
345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
349 assert( 0==argc );
350 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000351 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000352 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000353 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
354}
355
356
357/*
drhfeac5f82004-08-01 00:10:45 +0000358** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000359** the text in memory obtained from malloc() and returns a pointer
360** to the text. NULL is returned at end of file, or if malloc()
361** fails.
362**
drh9f099fd2013-08-06 14:01:46 +0000363** If zLine is not NULL then it is a malloced buffer returned from
364** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000365*/
drh9f099fd2013-08-06 14:01:46 +0000366static char *local_getline(char *zLine, FILE *in){
367 int nLine = zLine==0 ? 0 : 100;
368 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000369
drhb07028f2011-10-14 21:49:18 +0000370 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000371 if( n+100>nLine ){
372 nLine = nLine*2 + 100;
373 zLine = realloc(zLine, nLine);
374 if( zLine==0 ) return 0;
375 }
drhdaffd0e2001-04-11 14:28:42 +0000376 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000377 if( n==0 ){
378 free(zLine);
379 return 0;
380 }
381 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000382 break;
383 }
drh9f099fd2013-08-06 14:01:46 +0000384 while( zLine[n] ) n++;
385 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000386 n--;
shaneh13b36022009-12-17 21:07:15 +0000387 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000388 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000389 break;
drh8e7e7a22000-05-30 18:45:23 +0000390 }
391 }
drh8e7e7a22000-05-30 18:45:23 +0000392 return zLine;
393}
394
395/*
drhc28490c2006-10-26 14:25:58 +0000396** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000397**
drh9f099fd2013-08-06 14:01:46 +0000398** If in==0 then read from standard input and prompt before each line.
399** If isContinuation is true, then a continuation prompt is appropriate.
400** If isContinuation is zero, then the main prompt should be used.
401**
402** If zPrior is not NULL then it is a buffer from a prior call to this
403** routine that can be reused.
404**
405** The result is stored in space obtained from malloc() and must either
406** be freed by the caller or else passed back into this routine via the
407** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000408*/
drh9f099fd2013-08-06 14:01:46 +0000409static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000410 char *zPrompt;
411 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000412 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000413 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000414 }else{
drh9f099fd2013-08-06 14:01:46 +0000415 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danielk19774af00c62005-01-23 23:43:21 +0000416#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh9f099fd2013-08-06 14:01:46 +0000417 free(zPrior);
418 zResult = readline(zPrompt);
419 if( zResult && *zResult ) add_history(zResult);
420#else
421 printf("%s", zPrompt);
422 fflush(stdout);
423 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000424#endif
drh9f099fd2013-08-06 14:01:46 +0000425 }
drh8e7e7a22000-05-30 18:45:23 +0000426 return zResult;
427}
428
persicom7e2dfdd2002-04-18 02:46:52 +0000429struct previous_mode_data {
430 int valid; /* Is there legit data in here? */
431 int mode;
432 int showHeader;
433 int colWidth[100];
434};
drh45e29d82006-11-20 16:21:10 +0000435
drh8e7e7a22000-05-30 18:45:23 +0000436/*
drh75897232000-05-29 14:26:00 +0000437** An pointer to an instance of this structure is passed from
438** the main program to the callback. This is used to communicate
439** state and mode information.
440*/
441struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000442 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000443 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000444 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000445 int cnt; /* Number of records displayed so far */
446 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000447 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000448 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000449 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000450 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000451 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000452 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000453 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000454 int colWidth[100]; /* Requested width of each column when in column mode*/
455 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000456 char nullvalue[20]; /* The text to print when a NULL comes back from
457 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000458 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000459 /* Holds the mode information just before
460 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000461 char outfile[FILENAME_MAX]; /* Filename for *out */
462 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000463 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000464 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000465 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000466 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000467 int *aiIndent; /* Array of indents used in MODE_Explain */
468 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000469 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000470};
471
472/*
473** These are the allowed modes.
474*/
drh967e8b72000-06-21 13:59:10 +0000475#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000476#define MODE_Column 1 /* One record per line in neat columns */
477#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000478#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
479#define MODE_Html 4 /* Generate an XHTML table */
480#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000481#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000482#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000483#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000484
drh66ce4d02008-02-15 17:38:06 +0000485static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000486 "line",
487 "column",
488 "list",
489 "semi",
490 "html",
drhfeac5f82004-08-01 00:10:45 +0000491 "insert",
492 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000493 "csv",
drh66ce4d02008-02-15 17:38:06 +0000494 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000495};
drh75897232000-05-29 14:26:00 +0000496
497/*
498** Number of elements in an array
499*/
drh902b9ee2008-12-05 17:17:07 +0000500#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000501
502/*
drhea678832008-12-10 19:26:22 +0000503** Compute a string length that is limited to what can be stored in
504** lower 30 bits of a 32-bit signed integer.
505*/
drh4f21c4a2008-12-10 22:15:00 +0000506static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000507 const char *z2 = z;
508 while( *z2 ){ z2++; }
509 return 0x3fffffff & (int)(z2 - z);
510}
511
512/*
drh127f9d72010-02-23 01:47:00 +0000513** A callback for the sqlite3_log() interface.
514*/
515static void shellLog(void *pArg, int iErrCode, const char *zMsg){
516 struct callback_data *p = (struct callback_data*)pArg;
517 if( p->pLog==0 ) return;
518 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
519 fflush(p->pLog);
520}
521
522/*
shane626a6e42009-10-22 17:30:15 +0000523** Output the given string as a hex-encoded blob (eg. X'1234' )
524*/
525static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
526 int i;
527 char *zBlob = (char *)pBlob;
528 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000529 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000530 fprintf(out,"'");
531}
532
533/*
drh28bd4bc2000-06-15 15:57:22 +0000534** Output the given string as a quoted string using SQL quoting conventions.
535*/
536static void output_quoted_string(FILE *out, const char *z){
537 int i;
538 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000539 for(i=0; z[i]; i++){
540 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000541 }
542 if( nSingle==0 ){
543 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000544 }else{
545 fprintf(out,"'");
546 while( *z ){
547 for(i=0; z[i] && z[i]!='\''; i++){}
548 if( i==0 ){
549 fprintf(out,"''");
550 z++;
551 }else if( z[i]=='\'' ){
552 fprintf(out,"%.*s''",i,z);
553 z += i+1;
554 }else{
drhcd7d2732002-02-26 23:24:26 +0000555 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000556 break;
557 }
558 }
drhcd7d2732002-02-26 23:24:26 +0000559 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000560 }
561}
562
563/*
drhfeac5f82004-08-01 00:10:45 +0000564** Output the given string as a quoted according to C or TCL quoting rules.
565*/
566static void output_c_string(FILE *out, const char *z){
567 unsigned int c;
568 fputc('"', out);
569 while( (c = *(z++))!=0 ){
570 if( c=='\\' ){
571 fputc(c, out);
572 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000573 }else if( c=='"' ){
574 fputc('\\', out);
575 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000576 }else if( c=='\t' ){
577 fputc('\\', out);
578 fputc('t', out);
579 }else if( c=='\n' ){
580 fputc('\\', out);
581 fputc('n', out);
582 }else if( c=='\r' ){
583 fputc('\\', out);
584 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000585 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000586 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000587 }else{
588 fputc(c, out);
589 }
590 }
591 fputc('"', out);
592}
593
594/*
drhc08a4f12000-06-15 16:49:48 +0000595** Output the given string with characters that are special to
596** HTML escaped.
597*/
598static void output_html_string(FILE *out, const char *z){
599 int i;
drhc3d6ba42014-01-13 20:38:35 +0000600 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000601 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000602 for(i=0; z[i]
603 && z[i]!='<'
604 && z[i]!='&'
605 && z[i]!='>'
606 && z[i]!='\"'
607 && z[i]!='\'';
608 i++){}
drhc08a4f12000-06-15 16:49:48 +0000609 if( i>0 ){
610 fprintf(out,"%.*s",i,z);
611 }
612 if( z[i]=='<' ){
613 fprintf(out,"&lt;");
614 }else if( z[i]=='&' ){
615 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000616 }else if( z[i]=='>' ){
617 fprintf(out,"&gt;");
618 }else if( z[i]=='\"' ){
619 fprintf(out,"&quot;");
620 }else if( z[i]=='\'' ){
621 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000622 }else{
623 break;
624 }
625 z += i + 1;
626 }
627}
628
629/*
drhc49f44e2006-10-26 18:15:42 +0000630** If a field contains any character identified by a 1 in the following
631** array, then the string must be quoted for CSV.
632*/
633static const char needCsvQuote[] = {
634 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
635 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
636 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650};
651
652/*
drh8e64d1c2004-10-07 00:32:39 +0000653** Output a single term of CSV. Actually, p->separator is used for
654** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000655** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000656*/
657static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000658 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000659 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000660 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000661 }else{
drhc49f44e2006-10-26 18:15:42 +0000662 int i;
drh4f21c4a2008-12-10 22:15:00 +0000663 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000664 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000665 if( needCsvQuote[((unsigned char*)z)[i]]
666 || (z[i]==p->separator[0] &&
667 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000668 i = 0;
669 break;
670 }
671 }
672 if( i==0 ){
673 putc('"', out);
674 for(i=0; z[i]; i++){
675 if( z[i]=='"' ) putc('"', out);
676 putc(z[i], out);
677 }
678 putc('"', out);
679 }else{
680 fprintf(out, "%s", z);
681 }
drh8e64d1c2004-10-07 00:32:39 +0000682 }
683 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000684 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000685 }
686}
687
danielk19774af00c62005-01-23 23:43:21 +0000688#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000689/*
drh4c504392000-10-16 22:06:40 +0000690** This routine runs when the user presses Ctrl-C
691*/
692static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000693 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000694 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000695 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000696}
danielk19774af00c62005-01-23 23:43:21 +0000697#endif
drh4c504392000-10-16 22:06:40 +0000698
699/*
shane626a6e42009-10-22 17:30:15 +0000700** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000701** invokes for each row of a query result.
702*/
shane626a6e42009-10-22 17:30:15 +0000703static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000704 int i;
705 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000706
drh75897232000-05-29 14:26:00 +0000707 switch( p->mode ){
708 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000709 int w = 5;
drh6a535342001-10-19 16:44:56 +0000710 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000711 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000712 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000713 if( len>w ) w = len;
714 }
drh75897232000-05-29 14:26:00 +0000715 if( p->cnt++>0 ) fprintf(p->out,"\n");
716 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000717 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000718 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000719 }
720 break;
721 }
danielk19770d78bae2008-01-03 07:09:48 +0000722 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000723 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000724 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000725 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000726 int w, n;
727 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000728 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000729 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000730 w = 0;
drh75897232000-05-29 14:26:00 +0000731 }
drh078b1fd2012-09-21 13:40:02 +0000732 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000733 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000734 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000735 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000736 if( w<n ) w = n;
737 }
738 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000739 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000740 }
741 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000742 if( w<0 ){
743 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
744 }else{
745 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
746 }
drha0c66f52000-07-29 13:20:21 +0000747 }
748 }
749 if( p->showHeader ){
750 for(i=0; i<nArg; i++){
751 int w;
752 if( i<ArraySize(p->actualWidth) ){
753 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000754 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000755 }else{
756 w = 10;
757 }
758 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
759 "----------------------------------------------------------",
760 i==nArg-1 ? "\n": " ");
761 }
drh75897232000-05-29 14:26:00 +0000762 }
763 }
drh6a535342001-10-19 16:44:56 +0000764 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000765 for(i=0; i<nArg; i++){
766 int w;
drha0c66f52000-07-29 13:20:21 +0000767 if( i<ArraySize(p->actualWidth) ){
768 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000769 }else{
770 w = 10;
771 }
dana98bf362013-11-13 18:35:01 +0000772 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000773 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000774 }
dana98bf362013-11-13 18:35:01 +0000775 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000776 if( p->iIndent<p->nIndent ){
777 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000778 }
danc4650bb2013-11-18 08:41:06 +0000779 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000780 }
drh078b1fd2012-09-21 13:40:02 +0000781 if( w<0 ){
782 fprintf(p->out,"%*.*s%s",-w,-w,
783 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
784 }else{
785 fprintf(p->out,"%-*.*s%s",w,w,
786 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
787 }
drh75897232000-05-29 14:26:00 +0000788 }
789 break;
790 }
drhe3710332000-09-29 13:30:53 +0000791 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000792 case MODE_List: {
793 if( p->cnt++==0 && p->showHeader ){
794 for(i=0; i<nArg; i++){
795 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
796 }
797 }
drh6a535342001-10-19 16:44:56 +0000798 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000799 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000800 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000801 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000802 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000803 if( i<nArg-1 ){
804 fprintf(p->out, "%s", p->separator);
805 }else if( p->mode==MODE_Semi ){
806 fprintf(p->out, ";\n");
807 }else{
808 fprintf(p->out, "\n");
809 }
drh75897232000-05-29 14:26:00 +0000810 }
811 break;
812 }
drh1e5d0e92000-05-31 23:33:17 +0000813 case MODE_Html: {
814 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000815 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000816 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000817 fprintf(p->out,"<TH>");
818 output_html_string(p->out, azCol[i]);
819 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000820 }
mihailim57c591a2008-06-23 21:26:05 +0000821 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000822 }
drh6a535342001-10-19 16:44:56 +0000823 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000825 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000826 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000827 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000828 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000829 }
mihailim57c591a2008-06-23 21:26:05 +0000830 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000831 break;
832 }
drhfeac5f82004-08-01 00:10:45 +0000833 case MODE_Tcl: {
834 if( p->cnt++==0 && p->showHeader ){
835 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000836 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000837 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000838 }
839 fprintf(p->out,"\n");
840 }
841 if( azArg==0 ) break;
842 for(i=0; i<nArg; i++){
843 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000844 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000845 }
846 fprintf(p->out,"\n");
847 break;
848 }
drh8e64d1c2004-10-07 00:32:39 +0000849 case MODE_Csv: {
850 if( p->cnt++==0 && p->showHeader ){
851 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000852 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000853 }
854 fprintf(p->out,"\n");
855 }
856 if( azArg==0 ) break;
857 for(i=0; i<nArg; i++){
858 output_csv(p, azArg[i], i<nArg-1);
859 }
860 fprintf(p->out,"\n");
861 break;
862 }
drh28bd4bc2000-06-15 15:57:22 +0000863 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000864 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000865 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000866 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000867 for(i=0; i<nArg; i++){
868 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000869 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000870 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000871 }else if( aiType && aiType[i]==SQLITE_TEXT ){
872 if( zSep[0] ) fprintf(p->out,"%s",zSep);
873 output_quoted_string(p->out, azArg[i]);
874 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
875 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000876 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
877 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
878 int nBlob = sqlite3_column_bytes(p->pStmt, i);
879 if( zSep[0] ) fprintf(p->out,"%s",zSep);
880 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000881 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000882 fprintf(p->out,"%s%s",zSep, azArg[i]);
883 }else{
884 if( zSep[0] ) fprintf(p->out,"%s",zSep);
885 output_quoted_string(p->out, azArg[i]);
886 }
887 }
888 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000889 break;
drh28bd4bc2000-06-15 15:57:22 +0000890 }
persicom1d0b8722002-04-18 02:53:04 +0000891 }
drh75897232000-05-29 14:26:00 +0000892 return 0;
893}
894
895/*
shane626a6e42009-10-22 17:30:15 +0000896** This is the callback routine that the SQLite library
897** invokes for each row of a query result.
898*/
899static int callback(void *pArg, int nArg, char **azArg, char **azCol){
900 /* since we don't have type info, call the shell_callback with a NULL value */
901 return shell_callback(pArg, nArg, azArg, azCol, NULL);
902}
903
904/*
drh33048c02001-10-01 14:29:22 +0000905** Set the destination table field of the callback_data structure to
906** the name of the table given. Escape any quote characters in the
907** table name.
908*/
909static void set_table_name(struct callback_data *p, const char *zName){
910 int i, n;
911 int needQuote;
912 char *z;
913
914 if( p->zDestTable ){
915 free(p->zDestTable);
916 p->zDestTable = 0;
917 }
918 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000919 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000920 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000921 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000922 needQuote = 1;
923 if( zName[i]=='\'' ) n++;
924 }
925 }
926 if( needQuote ) n += 2;
927 z = p->zDestTable = malloc( n+1 );
928 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000929 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000930 exit(1);
931 }
932 n = 0;
933 if( needQuote ) z[n++] = '\'';
934 for(i=0; zName[i]; i++){
935 z[n++] = zName[i];
936 if( zName[i]=='\'' ) z[n++] = '\'';
937 }
938 if( needQuote ) z[n++] = '\'';
939 z[n] = 0;
940}
941
danielk19772a02e332004-06-05 08:04:36 +0000942/* zIn is either a pointer to a NULL-terminated string in memory obtained
943** from malloc(), or a NULL pointer. The string pointed to by zAppend is
944** added to zIn, and the result returned in memory obtained from malloc().
945** zIn, if it was not NULL, is freed.
946**
947** If the third argument, quote, is not '\0', then it is used as a
948** quote character for zAppend.
949*/
drhc28490c2006-10-26 14:25:58 +0000950static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000951 int len;
952 int i;
drh4f21c4a2008-12-10 22:15:00 +0000953 int nAppend = strlen30(zAppend);
954 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000955
956 len = nAppend+nIn+1;
957 if( quote ){
958 len += 2;
959 for(i=0; i<nAppend; i++){
960 if( zAppend[i]==quote ) len++;
961 }
962 }
963
964 zIn = (char *)realloc(zIn, len);
965 if( !zIn ){
966 return 0;
967 }
968
969 if( quote ){
970 char *zCsr = &zIn[nIn];
971 *zCsr++ = quote;
972 for(i=0; i<nAppend; i++){
973 *zCsr++ = zAppend[i];
974 if( zAppend[i]==quote ) *zCsr++ = quote;
975 }
976 *zCsr++ = quote;
977 *zCsr++ = '\0';
978 assert( (zCsr-zIn)==len );
979 }else{
980 memcpy(&zIn[nIn], zAppend, nAppend);
981 zIn[len-1] = '\0';
982 }
983
984 return zIn;
985}
986
drhdd3d4592004-08-30 01:54:05 +0000987
988/*
drhb21a8e42012-01-28 21:08:51 +0000989** Execute a query statement that will generate SQL output. Print
990** the result columns, comma-separated, on a line and then add a
991** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000992**
drhb21a8e42012-01-28 21:08:51 +0000993** If the number of columns is 1 and that column contains text "--"
994** then write the semicolon on a separate line. That way, if a
995** "--" comment occurs at the end of the statement, the comment
996** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +0000997*/
drh157e29a2009-05-21 15:15:00 +0000998static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000999 struct callback_data *p, /* Query context */
1000 const char *zSelect, /* SELECT statement to extract content */
1001 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001002){
drhdd3d4592004-08-30 01:54:05 +00001003 sqlite3_stmt *pSelect;
1004 int rc;
drhb21a8e42012-01-28 21:08:51 +00001005 int nResult;
1006 int i;
1007 const char *z;
drh2f464a02011-10-13 00:41:49 +00001008 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001009 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001010 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001011 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001012 return rc;
1013 }
1014 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001015 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001016 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001017 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001018 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001019 zFirstRow = 0;
1020 }
drhb21a8e42012-01-28 21:08:51 +00001021 z = (const char*)sqlite3_column_text(pSelect, 0);
1022 fprintf(p->out, "%s", z);
1023 for(i=1; i<nResult; i++){
1024 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1025 }
1026 if( z==0 ) z = "";
1027 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1028 if( z[0] ){
1029 fprintf(p->out, "\n;\n");
1030 }else{
1031 fprintf(p->out, ";\n");
1032 }
drhdd3d4592004-08-30 01:54:05 +00001033 rc = sqlite3_step(pSelect);
1034 }
drh2f464a02011-10-13 00:41:49 +00001035 rc = sqlite3_finalize(pSelect);
1036 if( rc!=SQLITE_OK ){
1037 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001038 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001039 }
1040 return rc;
drhdd3d4592004-08-30 01:54:05 +00001041}
1042
shane626a6e42009-10-22 17:30:15 +00001043/*
1044** Allocate space and save off current error string.
1045*/
1046static char *save_err_msg(
1047 sqlite3 *db /* Database to query */
1048){
1049 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1050 char *zErrMsg = sqlite3_malloc(nErrMsg);
1051 if( zErrMsg ){
1052 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1053 }
1054 return zErrMsg;
1055}
1056
1057/*
shaneh642d8b82010-07-28 16:05:34 +00001058** Display memory stats.
1059*/
1060static int display_stats(
1061 sqlite3 *db, /* Database to query */
1062 struct callback_data *pArg, /* Pointer to struct callback_data */
1063 int bReset /* True to reset the stats */
1064){
1065 int iCur;
1066 int iHiwtr;
1067
1068 if( pArg && pArg->out ){
1069
1070 iHiwtr = iCur = -1;
1071 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001072 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001073 iHiwtr = iCur = -1;
1074 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001075 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001076/*
1077** Not currently used by the CLI.
1078** iHiwtr = iCur = -1;
1079** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1080** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1081*/
1082 iHiwtr = iCur = -1;
1083 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1084 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1085/*
1086** Not currently used by the CLI.
1087** iHiwtr = iCur = -1;
1088** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1089** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1090*/
1091 iHiwtr = iCur = -1;
1092 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1093 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1094 iHiwtr = iCur = -1;
1095 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1096 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1103#ifdef YYTRACKMAXSTACKDEPTH
1104 iHiwtr = iCur = -1;
1105 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1106 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1107#endif
1108 }
1109
1110 if( pArg && pArg->out && db ){
1111 iHiwtr = iCur = -1;
1112 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1113 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001114 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1116 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1117 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1118 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001120 iHiwtr = iCur = -1;
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001122 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1123 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1124 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1125 iHiwtr = iCur = -1;
1126 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1127 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001128 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1131 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001132 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1133 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1134 iHiwtr = iCur = -1;
1135 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1137 }
1138
1139 if( pArg && pArg->out && db && pArg->pStmt ){
1140 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1141 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1142 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1143 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1144 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1145 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001146 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1147 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001148 }
1149
1150 return 0;
1151}
1152
1153/*
dana98bf362013-11-13 18:35:01 +00001154** Parameter azArray points to a zero-terminated array of strings. zStr
1155** points to a single nul-terminated string. Return non-zero if zStr
1156** is equal, according to strcmp(), to any of the strings in the array.
1157** Otherwise, return zero.
1158*/
1159static int str_in_array(const char *zStr, const char **azArray){
1160 int i;
1161 for(i=0; azArray[i]; i++){
1162 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1163 }
1164 return 0;
1165}
1166
1167/*
1168** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1169** and populate the callback_data.aiIndent[] array with the number of
1170** spaces each opcode should be indented before it is output.
1171**
1172** The indenting rules are:
1173**
1174** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1175** all opcodes that occur between the p2 jump destination and the opcode
1176** itself by 2 spaces.
1177**
drh01752bc2013-11-14 23:59:33 +00001178** * For each "Goto", if the jump destination is earlier in the program
1179** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001180** Yield SeekGt SeekLt RowSetRead Rewind
drh01752bc2013-11-14 23:59:33 +00001181** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001182** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001183*/
1184static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1185 const char *zSql; /* The text of the SQL statement */
1186 const char *z; /* Used to check if this is an EXPLAIN */
1187 int *abYield = 0; /* True if op is an OP_Yield */
1188 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001189 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001190
drh602320e2013-11-15 03:16:34 +00001191 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001192 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001193 const char *azGoto[] = { "Goto", 0 };
1194
1195 /* Try to figure out if this is really an EXPLAIN statement. If this
1196 ** cannot be verified, return early. */
1197 zSql = sqlite3_sql(pSql);
1198 if( zSql==0 ) return;
1199 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1200 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1201
1202 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1203 int i;
danc4650bb2013-11-18 08:41:06 +00001204 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001205 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001206
1207 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1208 ** p2 is an instruction address, set variable p2op to the index of that
1209 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1210 ** the current instruction is part of a sub-program generated by an
1211 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001212 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001213 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001214
1215 /* Grow the p->aiIndent array as required */
1216 if( iOp>=nAlloc ){
1217 nAlloc += 100;
1218 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1219 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1220 }
1221 abYield[iOp] = str_in_array(zOp, azYield);
1222 p->aiIndent[iOp] = 0;
1223 p->nIndent = iOp+1;
1224
1225 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001226 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001227 }
danc4650bb2013-11-18 08:41:06 +00001228 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
drhe73f0592014-01-21 22:25:45 +00001229 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001230 }
1231 }
1232
danc4650bb2013-11-18 08:41:06 +00001233 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001234 sqlite3_free(abYield);
1235 sqlite3_reset(pSql);
1236}
1237
1238/*
1239** Free the array allocated by explain_data_prepare().
1240*/
1241static void explain_data_delete(struct callback_data *p){
1242 sqlite3_free(p->aiIndent);
1243 p->aiIndent = 0;
1244 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001245 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001246}
1247
1248/*
shane626a6e42009-10-22 17:30:15 +00001249** Execute a statement or set of statements. Print
1250** any result rows/columns depending on the current mode
1251** set via the supplied callback.
1252**
1253** This is very similar to SQLite's built-in sqlite3_exec()
1254** function except it takes a slightly different callback
1255** and callback data argument.
1256*/
1257static int shell_exec(
1258 sqlite3 *db, /* An open database */
1259 const char *zSql, /* SQL to be evaluated */
1260 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1261 /* (not the same as sqlite3_exec) */
1262 struct callback_data *pArg, /* Pointer to struct callback_data */
1263 char **pzErrMsg /* Error msg written here */
1264){
dan4564ced2010-01-05 04:59:56 +00001265 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1266 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001267 int rc2;
dan4564ced2010-01-05 04:59:56 +00001268 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001269
1270 if( pzErrMsg ){
1271 *pzErrMsg = NULL;
1272 }
1273
shaneb9fc17d2009-10-22 21:23:35 +00001274 while( zSql[0] && (SQLITE_OK == rc) ){
1275 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1276 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001277 if( pzErrMsg ){
1278 *pzErrMsg = save_err_msg(db);
1279 }
1280 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001281 if( !pStmt ){
1282 /* this happens for a comment or white-space */
1283 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001284 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001285 continue;
1286 }
shane626a6e42009-10-22 17:30:15 +00001287
shaneh642d8b82010-07-28 16:05:34 +00001288 /* save off the prepared statment handle and reset row count */
1289 if( pArg ){
1290 pArg->pStmt = pStmt;
1291 pArg->cnt = 0;
1292 }
1293
shanehb7977c52010-01-18 18:17:10 +00001294 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001295 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001296 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001297 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001298 }
shanehb7977c52010-01-18 18:17:10 +00001299
drh7e02e5e2011-12-06 19:44:51 +00001300 /* Output TESTCTRL_EXPLAIN text of requested */
1301 if( pArg && pArg->mode==MODE_Explain ){
1302 const char *zExplain = 0;
1303 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1304 if( zExplain && zExplain[0] ){
1305 fprintf(pArg->out, "%s", zExplain);
1306 }
1307 }
1308
dana98bf362013-11-13 18:35:01 +00001309 /* If the shell is currently in ".explain" mode, gather the extra
1310 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001311 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001312 explain_data_prepare(pArg, pStmt);
1313 }
1314
shaneb9fc17d2009-10-22 21:23:35 +00001315 /* perform the first step. this will tell us if we
1316 ** have a result set or not and how wide it is.
1317 */
1318 rc = sqlite3_step(pStmt);
1319 /* if we have a result set... */
1320 if( SQLITE_ROW == rc ){
1321 /* if we have a callback... */
1322 if( xCallback ){
1323 /* allocate space for col name ptr, value ptr, and type */
1324 int nCol = sqlite3_column_count(pStmt);
1325 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1326 if( !pData ){
1327 rc = SQLITE_NOMEM;
1328 }else{
1329 char **azCols = (char **)pData; /* Names of result columns */
1330 char **azVals = &azCols[nCol]; /* Results */
1331 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001332 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001333 assert(sizeof(int) <= sizeof(char *));
1334 /* save off ptrs to column names */
1335 for(i=0; i<nCol; i++){
1336 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1337 }
shaneb9fc17d2009-10-22 21:23:35 +00001338 do{
1339 /* extract the data and data types */
1340 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001341 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001342 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001343 azVals[i] = "";
1344 }else{
1345 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1346 }
shaneb9fc17d2009-10-22 21:23:35 +00001347 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1348 rc = SQLITE_NOMEM;
1349 break; /* from for */
1350 }
1351 } /* end for */
1352
1353 /* if data and types extracted successfully... */
1354 if( SQLITE_ROW == rc ){
1355 /* call the supplied callback with the result row data */
1356 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1357 rc = SQLITE_ABORT;
1358 }else{
1359 rc = sqlite3_step(pStmt);
1360 }
1361 }
1362 } while( SQLITE_ROW == rc );
1363 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001364 }
1365 }else{
1366 do{
1367 rc = sqlite3_step(pStmt);
1368 } while( rc == SQLITE_ROW );
1369 }
1370 }
1371
dana98bf362013-11-13 18:35:01 +00001372 explain_data_delete(pArg);
1373
shaneh642d8b82010-07-28 16:05:34 +00001374 /* print usage stats if stats on */
1375 if( pArg && pArg->statsOn ){
1376 display_stats(db, pArg, 0);
1377 }
1378
dan4564ced2010-01-05 04:59:56 +00001379 /* Finalize the statement just executed. If this fails, save a
1380 ** copy of the error message. Otherwise, set zSql to point to the
1381 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001382 rc2 = sqlite3_finalize(pStmt);
1383 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001384 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001385 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001386 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001387 }else if( pzErrMsg ){
1388 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001389 }
shaneh642d8b82010-07-28 16:05:34 +00001390
1391 /* clear saved stmt handle */
1392 if( pArg ){
1393 pArg->pStmt = NULL;
1394 }
shane626a6e42009-10-22 17:30:15 +00001395 }
shaneb9fc17d2009-10-22 21:23:35 +00001396 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001397
1398 return rc;
1399}
1400
drhdd3d4592004-08-30 01:54:05 +00001401
drh33048c02001-10-01 14:29:22 +00001402/*
drh4c653a02000-06-07 01:27:47 +00001403** This is a different callback routine used for dumping the database.
1404** Each row received by this callback consists of a table name,
1405** the table type ("index" or "table") and SQL to create the table.
1406** This routine should print text sufficient to recreate the table.
1407*/
1408static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001409 int rc;
1410 const char *zTable;
1411 const char *zType;
1412 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001413 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001414 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001415
drh902b9ee2008-12-05 17:17:07 +00001416 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001417 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001418 zTable = azArg[0];
1419 zType = azArg[1];
1420 zSql = azArg[2];
1421
drh00b950d2005-09-11 02:03:03 +00001422 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001423 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001424 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001425 fprintf(p->out, "ANALYZE sqlite_master;\n");
1426 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1427 return 0;
drh45e29d82006-11-20 16:21:10 +00001428 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1429 char *zIns;
1430 if( !p->writableSchema ){
1431 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1432 p->writableSchema = 1;
1433 }
1434 zIns = sqlite3_mprintf(
1435 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1436 "VALUES('table','%q','%q',0,'%q');",
1437 zTable, zTable, zSql);
1438 fprintf(p->out, "%s\n", zIns);
1439 sqlite3_free(zIns);
1440 return 0;
drh00b950d2005-09-11 02:03:03 +00001441 }else{
1442 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001443 }
danielk19772a02e332004-06-05 08:04:36 +00001444
1445 if( strcmp(zType, "table")==0 ){
1446 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001447 char *zSelect = 0;
1448 char *zTableInfo = 0;
1449 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001450 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001451
1452 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1453 zTableInfo = appendText(zTableInfo, zTable, '"');
1454 zTableInfo = appendText(zTableInfo, ");", 0);
1455
1456 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001457 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001458 if( rc!=SQLITE_OK || !pTableInfo ){
1459 return 1;
1460 }
1461
1462 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001463 /* Always quote the table name, even if it appears to be pure ascii,
1464 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1465 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001466 if( zTmp ){
1467 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001468 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001469 }
1470 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1471 rc = sqlite3_step(pTableInfo);
1472 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001473 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001474 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001475 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001476 rc = sqlite3_step(pTableInfo);
1477 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001478 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001479 }else{
1480 zSelect = appendText(zSelect, ") ", 0);
1481 }
drh157e29a2009-05-21 15:15:00 +00001482 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001483 }
1484 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001485 if( rc!=SQLITE_OK || nRow==0 ){
1486 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001487 return 1;
1488 }
1489 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1490 zSelect = appendText(zSelect, zTable, '"');
1491
drh2f464a02011-10-13 00:41:49 +00001492 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001493 if( rc==SQLITE_CORRUPT ){
1494 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001495 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001496 }
drh85e72432012-04-11 11:38:53 +00001497 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001498 }
drh4c653a02000-06-07 01:27:47 +00001499 return 0;
1500}
1501
1502/*
drh45e29d82006-11-20 16:21:10 +00001503** Run zQuery. Use dump_callback() as the callback routine so that
1504** the contents of the query are output as SQL statements.
1505**
drhdd3d4592004-08-30 01:54:05 +00001506** If we get a SQLITE_CORRUPT error, rerun the query after appending
1507** "ORDER BY rowid DESC" to the end.
1508*/
1509static int run_schema_dump_query(
1510 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001511 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001512){
1513 int rc;
drh2f464a02011-10-13 00:41:49 +00001514 char *zErr = 0;
1515 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001516 if( rc==SQLITE_CORRUPT ){
1517 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001518 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001519 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1520 if( zErr ){
1521 fprintf(p->out, "/****** %s ******/\n", zErr);
1522 sqlite3_free(zErr);
1523 zErr = 0;
1524 }
drhdd3d4592004-08-30 01:54:05 +00001525 zQ2 = malloc( len+100 );
1526 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001527 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001528 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1529 if( rc ){
1530 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1531 }else{
1532 rc = SQLITE_CORRUPT;
1533 }
1534 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001535 free(zQ2);
1536 }
1537 return rc;
1538}
1539
1540/*
drh75897232000-05-29 14:26:00 +00001541** Text of a help message
1542*/
persicom1d0b8722002-04-18 02:53:04 +00001543static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001544 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001545 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001546 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001547 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001548 " If TABLE specified, only dump tables matching\n"
1549 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001550 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001551 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001552 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1553 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001554 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001555 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001556 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001557 ".indices ?TABLE? Show names of all indices\n"
1558 " If TABLE specified, only show indices for tables\n"
1559 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001560#ifdef SQLITE_ENABLE_IOTRACE
1561 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1562#endif
drh70df4fe2006-06-13 15:12:21 +00001563#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001564 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001565#endif
drh127f9d72010-02-23 01:47:00 +00001566 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001567 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001568 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001569 " column Left-aligned columns. (See .width)\n"
1570 " html HTML <table> code\n"
1571 " insert SQL insert statements for TABLE\n"
1572 " line One value per line\n"
1573 " list Values delimited by .separator string\n"
1574 " tabs Tab-separated values\n"
1575 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001576 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001577 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001578 ".output FILENAME Send output to FILENAME\n"
1579 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001580 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001581 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001582 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001583 ".read FILENAME Execute SQL in FILENAME\n"
drh3350ce92014-02-06 00:49:12 +00001584 ".repair NEWDB Recover data into NEWDB from a corrupt database\n"
drh9ff849f2009-02-04 20:55:57 +00001585 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001586 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001587 " If TABLE specified, only show tables matching\n"
1588 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001589 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001590 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001591 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001592 ".tables ?TABLE? List names of tables\n"
1593 " If TABLE specified, only list tables matching\n"
1594 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001595 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001596 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001597 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001598 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001599;
1600
shaneb320ccd2009-10-21 03:42:58 +00001601static char zTimerHelp[] =
1602 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1603;
1604
drhdaffd0e2001-04-11 14:28:42 +00001605/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001606static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001607
drh75897232000-05-29 14:26:00 +00001608/*
drh44c2eb12003-04-30 11:38:26 +00001609** Make sure the database is open. If it is not, then open it. If
1610** the database fails to open, print an error message and exit.
1611*/
drh05782482013-10-24 15:20:20 +00001612static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001613 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001614 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001615 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001616 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001617 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1618 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1619 shellstaticFunc, 0, 0);
1620 }
1621 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001622 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001623 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001624 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001625 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001626 }
drhc2e87a32006-06-27 15:16:14 +00001627#ifndef SQLITE_OMIT_LOAD_EXTENSION
1628 sqlite3_enable_load_extension(p->db, 1);
1629#endif
drh44c2eb12003-04-30 11:38:26 +00001630 }
1631}
1632
1633/*
drhfeac5f82004-08-01 00:10:45 +00001634** Do C-language style dequoting.
1635**
1636** \t -> tab
1637** \n -> newline
1638** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001639** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001640** \NNN -> ascii character NNN in octal
1641** \\ -> backslash
1642*/
1643static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001644 int i, j;
1645 char c;
drhfeac5f82004-08-01 00:10:45 +00001646 for(i=j=0; (c = z[i])!=0; i++, j++){
1647 if( c=='\\' ){
1648 c = z[++i];
1649 if( c=='n' ){
1650 c = '\n';
1651 }else if( c=='t' ){
1652 c = '\t';
1653 }else if( c=='r' ){
1654 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001655 }else if( c=='\\' ){
1656 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001657 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001658 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001659 if( z[i+1]>='0' && z[i+1]<='7' ){
1660 i++;
1661 c = (c<<3) + z[i] - '0';
1662 if( z[i+1]>='0' && z[i+1]<='7' ){
1663 i++;
1664 c = (c<<3) + z[i] - '0';
1665 }
1666 }
1667 }
1668 }
1669 z[j] = c;
1670 }
1671 z[j] = 0;
1672}
1673
1674/*
drh348d19c2013-06-03 12:47:43 +00001675** Return the value of a hexadecimal digit. Return -1 if the input
1676** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001677*/
drh348d19c2013-06-03 12:47:43 +00001678static int hexDigitValue(char c){
1679 if( c>='0' && c<='9' ) return c - '0';
1680 if( c>='a' && c<='f' ) return c - 'a' + 10;
1681 if( c>='A' && c<='F' ) return c - 'A' + 10;
1682 return -1;
drhc28490c2006-10-26 14:25:58 +00001683}
1684
1685/*
drh7d9f3942013-04-03 01:26:54 +00001686** Interpret zArg as an integer value, possibly with suffixes.
1687*/
1688static sqlite3_int64 integerValue(const char *zArg){
1689 sqlite3_int64 v = 0;
1690 static const struct { char *zSuffix; int iMult; } aMult[] = {
1691 { "KiB", 1024 },
1692 { "MiB", 1024*1024 },
1693 { "GiB", 1024*1024*1024 },
1694 { "KB", 1000 },
1695 { "MB", 1000000 },
1696 { "GB", 1000000000 },
1697 { "K", 1000 },
1698 { "M", 1000000 },
1699 { "G", 1000000000 },
1700 };
1701 int i;
1702 int isNeg = 0;
1703 if( zArg[0]=='-' ){
1704 isNeg = 1;
1705 zArg++;
1706 }else if( zArg[0]=='+' ){
1707 zArg++;
1708 }
drh348d19c2013-06-03 12:47:43 +00001709 if( zArg[0]=='0' && zArg[1]=='x' ){
1710 int x;
1711 zArg += 2;
1712 while( (x = hexDigitValue(zArg[0]))>=0 ){
1713 v = (v<<4) + x;
1714 zArg++;
1715 }
1716 }else{
1717 while( IsDigit(zArg[0]) ){
1718 v = v*10 + zArg[0] - '0';
1719 zArg++;
1720 }
drh7d9f3942013-04-03 01:26:54 +00001721 }
drhc2bed0a2013-05-24 11:57:50 +00001722 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001723 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1724 v *= aMult[i].iMult;
1725 break;
1726 }
1727 }
1728 return isNeg? -v : v;
1729}
1730
1731/*
drh348d19c2013-06-03 12:47:43 +00001732** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1733** for TRUE and FALSE. Return the integer value if appropriate.
1734*/
1735static int booleanValue(char *zArg){
1736 int i;
1737 if( zArg[0]=='0' && zArg[1]=='x' ){
1738 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1739 }else{
1740 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1741 }
1742 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1743 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1744 return 1;
1745 }
1746 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1747 return 0;
1748 }
1749 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1750 zArg);
1751 return 0;
1752}
1753
1754/*
drh42f64e52012-04-04 16:56:23 +00001755** Close an output file, assuming it is not stderr or stdout
1756*/
1757static void output_file_close(FILE *f){
1758 if( f && f!=stdout && f!=stderr ) fclose(f);
1759}
1760
1761/*
1762** Try to open an output file. The names "stdout" and "stderr" are
1763** recognized and do the right thing. NULL is returned if the output
1764** filename is "off".
1765*/
1766static FILE *output_file_open(const char *zFile){
1767 FILE *f;
1768 if( strcmp(zFile,"stdout")==0 ){
1769 f = stdout;
1770 }else if( strcmp(zFile, "stderr")==0 ){
1771 f = stderr;
1772 }else if( strcmp(zFile, "off")==0 ){
1773 f = 0;
1774 }else{
1775 f = fopen(zFile, "wb");
1776 if( f==0 ){
1777 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1778 }
1779 }
1780 return f;
1781}
1782
1783/*
1784** A routine for handling output from sqlite3_trace().
1785*/
1786static void sql_trace_callback(void *pArg, const char *z){
1787 FILE *f = (FILE*)pArg;
1788 if( f ) fprintf(f, "%s\n", z);
1789}
1790
1791/*
drhd8621b92012-04-17 09:09:33 +00001792** A no-op routine that runs with the ".breakpoint" doc-command. This is
1793** a useful spot to set a debugger breakpoint.
1794*/
1795static void test_breakpoint(void){
1796 static int nCall = 0;
1797 nCall++;
1798}
1799
1800/*
drhdb95f682013-06-26 22:46:00 +00001801** An object used to read a CSV file
1802*/
1803typedef struct CSVReader CSVReader;
1804struct CSVReader {
1805 const char *zFile; /* Name of the input file */
1806 FILE *in; /* Read the CSV text from this input stream */
1807 char *z; /* Accumulated text for a field */
1808 int n; /* Number of bytes in z */
1809 int nAlloc; /* Space allocated for z[] */
1810 int nLine; /* Current line number */
1811 int cTerm; /* Character that terminated the most recent field */
1812 int cSeparator; /* The separator character. (Usually ",") */
1813};
1814
1815/* Append a single byte to z[] */
1816static void csv_append_char(CSVReader *p, int c){
1817 if( p->n+1>=p->nAlloc ){
1818 p->nAlloc += p->nAlloc + 100;
1819 p->z = sqlite3_realloc(p->z, p->nAlloc);
1820 if( p->z==0 ){
1821 fprintf(stderr, "out of memory\n");
1822 exit(1);
1823 }
1824 }
1825 p->z[p->n++] = (char)c;
1826}
1827
1828/* Read a single field of CSV text. Compatible with rfc4180 and extended
1829** with the option of having a separator other than ",".
1830**
1831** + Input comes from p->in.
1832** + Store results in p->z of length p->n. Space to hold p->z comes
1833** from sqlite3_malloc().
1834** + Use p->cSep as the separator. The default is ",".
1835** + Keep track of the line number in p->nLine.
1836** + Store the character that terminates the field in p->cTerm. Store
1837** EOF on end-of-file.
1838** + Report syntax errors on stderr
1839*/
1840static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001841 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001842 int cSep = p->cSeparator;
1843 p->n = 0;
1844 c = fgetc(p->in);
1845 if( c==EOF || seenInterrupt ){
1846 p->cTerm = EOF;
1847 return 0;
1848 }
1849 if( c=='"' ){
1850 int startLine = p->nLine;
1851 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001852 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001853 while( 1 ){
1854 c = fgetc(p->in);
1855 if( c=='\n' ) p->nLine++;
1856 if( c==cQuote ){
1857 if( pc==cQuote ){
1858 pc = 0;
1859 continue;
1860 }
1861 }
1862 if( (c==cSep && pc==cQuote)
1863 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001864 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001865 || (c==EOF && pc==cQuote)
1866 ){
1867 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001868 p->cTerm = c;
1869 break;
1870 }
1871 if( pc==cQuote && c!='\r' ){
1872 fprintf(stderr, "%s:%d: unescaped %c character\n",
1873 p->zFile, p->nLine, cQuote);
1874 }
1875 if( c==EOF ){
1876 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1877 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001878 p->cTerm = EOF;
1879 break;
1880 }
1881 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001882 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001883 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001884 }
drhdb95f682013-06-26 22:46:00 +00001885 }else{
drhd0a64dc2013-06-30 20:24:26 +00001886 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001887 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001888 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001889 }
1890 if( c=='\n' ){
1891 p->nLine++;
1892 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1893 }
drhdb95f682013-06-26 22:46:00 +00001894 p->cTerm = c;
1895 }
drh8dd675e2013-07-12 21:09:24 +00001896 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001897 return p->z;
1898}
1899
1900/*
drh3350ce92014-02-06 00:49:12 +00001901** Try to transfer data for table zTable
1902*/
1903static void tryToRepairData(
1904 struct callback_data *p,
1905 sqlite3 *newDb,
1906 const char *zTable
1907){
1908 sqlite3_stmt *pQuery = 0;
1909 sqlite3_stmt *pInsert = 0;
1910 char *zQuery = 0;
1911 char *zInsert = 0;
1912 int rc;
1913 int i, j, n;
1914 int nTable = (int)strlen(zTable);
1915 int k = 0;
1916
1917 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1918 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1919 if( rc ){
1920 fprintf(stderr, "Error: (%d) %s on [%s]\n",
1921 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1922 zQuery);
1923 goto end_data_xfer;
1924 }
1925 n = sqlite3_column_count(pQuery);
1926 zInsert = sqlite3_malloc(200 + nTable + n*3);
1927 if( zInsert==0 ){
1928 fprintf(stderr, "out of memory\n");
1929 goto end_data_xfer;
1930 }
1931 sqlite3_snprintf(200+nTable,zInsert,
1932 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1933 i = (int)strlen(zInsert);
1934 for(j=1; j<n; j++){
1935 memcpy(zInsert+i, ",?", 2);
1936 i += 2;
1937 }
1938 memcpy(zInsert+i, ");", 3);
1939 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1940 if( rc ){
1941 fprintf(stderr, "Error: (%d) %s on [%s]\n",
1942 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1943 zQuery);
1944 goto end_data_xfer;
1945 }
1946 for(k=0; k<2; k++){
1947 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1948 for(i=0; i<n; i++){
1949 switch( sqlite3_column_type(pQuery, i) ){
1950 case SQLITE_NULL: {
1951 sqlite3_bind_null(pInsert, i+1);
1952 break;
1953 }
1954 case SQLITE_INTEGER: {
1955 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1956 break;
1957 }
1958 case SQLITE_FLOAT: {
1959 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1960 break;
1961 }
1962 case SQLITE_TEXT: {
1963 sqlite3_bind_text(pInsert, i+1,
1964 (const char*)sqlite3_column_text(pQuery,i),
1965 -1, SQLITE_STATIC);
1966 break;
1967 }
1968 case SQLITE_BLOB: {
1969 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1970 sqlite3_column_bytes(pQuery,i),
1971 SQLITE_STATIC);
1972 break;
1973 }
1974 }
1975 } /* End for */
1976 sqlite3_step(pInsert);
1977 sqlite3_reset(pInsert);
1978 } /* End while */
1979 if( rc==SQLITE_DONE ) break;
1980 sqlite3_finalize(pQuery);
1981 sqlite3_free(zQuery);
1982 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
1983 zTable);
1984 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1985 if( rc ){
1986 fprintf(stderr, "Error: (%d) %s on [%s]\n",
1987 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1988 zQuery);
1989 goto end_data_xfer;
1990 }
1991 } /* End for(k=0...) */
1992
1993end_data_xfer:
1994 sqlite3_finalize(pQuery);
1995 sqlite3_finalize(pInsert);
1996 sqlite3_free(zQuery);
1997 sqlite3_free(zInsert);
1998}
1999
2000
2001/*
2002** Try to transfer all rows of the schema that match zWhere. For
2003** each row, invoke xForEach() on the object defined by that row.
2004*/
2005static void tryToRepairSchema(
2006 struct callback_data *p,
2007 sqlite3 *newDb,
2008 const char *zWhere,
2009 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2010){
2011 sqlite3_stmt *pQuery = 0;
2012 char *zQuery = 0;
2013 int rc;
2014 const unsigned char *zName;
2015 const unsigned char *zSql;
2016
2017 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2018 " WHERE %s", zWhere);
2019 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2020 if( rc ){
2021 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2022 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2023 zQuery);
2024 goto end_schema_xfer;
2025 }
2026 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2027 zName = sqlite3_column_text(pQuery, 0);
2028 zSql = sqlite3_column_text(pQuery, 1);
2029 printf("%s... ", zName); fflush(stdout);
2030 sqlite3_exec(newDb, (const char*)zSql, 0, 0, 0);
2031 if( xForEach ){
2032 xForEach(p, newDb, (const char*)zName);
2033 }
2034 printf("done\n");
2035 }
2036 if( rc!=SQLITE_DONE ){
2037 sqlite3_finalize(pQuery);
2038 sqlite3_free(zQuery);
2039 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2040 " WHERE %s ORDER BY rowid DESC", zWhere);
2041 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2042 if( rc ){
2043 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2044 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2045 zQuery);
2046 goto end_schema_xfer;
2047 }
2048 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2049 zName = sqlite3_column_text(pQuery, 0);
2050 zSql = sqlite3_column_text(pQuery, 1);
2051 printf("%s... ", zName); fflush(stdout);
2052 sqlite3_exec(newDb, (const char*)zSql, 0, 0, 0);
2053 if( xForEach ){
2054 xForEach(p, newDb, (const char*)zName);
2055 }
2056 printf("done\n");
2057 }
2058 }
2059end_schema_xfer:
2060 sqlite3_finalize(pQuery);
2061 sqlite3_free(zQuery);
2062}
2063
2064/*
2065** Open a new database file named "zNewDb". Try to recover as much information
2066** as possible out of the main database (which might be corrupt) and write it
2067** into zNewDb.
2068*/
2069static void tryToRepair(struct callback_data *p, const char *zNewDb){
2070 int rc;
2071 sqlite3 *newDb = 0;
2072 if( access(zNewDb,0)==0 ){
2073 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2074 return;
2075 }
2076 rc = sqlite3_open(zNewDb, &newDb);
2077 if( rc ){
2078 fprintf(stderr, "Cannot create output database: %s\n",
2079 sqlite3_errmsg(newDb));
2080 }else{
2081 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
2082 tryToRepairSchema(p, newDb, "type='table'", tryToRepairData);
2083 tryToRepairSchema(p, newDb, "type!='table'", 0);
2084 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2085 }
2086 sqlite3_close(newDb);
2087}
2088
2089/*
drh75897232000-05-29 14:26:00 +00002090** If an input line begins with "." then invoke this routine to
2091** process that line.
drh67505e72002-04-19 12:34:06 +00002092**
drh47ad6842006-11-08 12:25:42 +00002093** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002094*/
drh44c2eb12003-04-30 11:38:26 +00002095static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002096 int i = 1;
2097 int nArg = 0;
2098 int n, c;
drh67505e72002-04-19 12:34:06 +00002099 int rc = 0;
drh75897232000-05-29 14:26:00 +00002100 char *azArg[50];
2101
2102 /* Parse the input line into tokens.
2103 */
2104 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002105 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002106 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002107 if( zLine[i]=='\'' || zLine[i]=='"' ){
2108 int delim = zLine[i++];
2109 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002110 while( zLine[i] && zLine[i]!=delim ){
2111 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2112 i++;
2113 }
drh75897232000-05-29 14:26:00 +00002114 if( zLine[i]==delim ){
2115 zLine[i++] = 0;
2116 }
drhfeac5f82004-08-01 00:10:45 +00002117 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002118 }else{
2119 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002120 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002121 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002122 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002123 }
2124 }
2125
2126 /* Process the input line.
2127 */
shane9bd1b442009-10-23 01:27:39 +00002128 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002129 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002130 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00002131 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
2132 const char *zDestFile = 0;
2133 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002134 sqlite3 *pDest;
2135 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002136 int j;
2137 for(j=1; j<nArg; j++){
2138 const char *z = azArg[j];
2139 if( z[0]=='-' ){
2140 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002141 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002142 {
2143 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2144 return 1;
2145 }
2146 }else if( zDestFile==0 ){
2147 zDestFile = azArg[j];
2148 }else if( zDb==0 ){
2149 zDb = zDestFile;
2150 zDestFile = azArg[j];
2151 }else{
2152 fprintf(stderr, "too many arguments to .backup\n");
2153 return 1;
2154 }
drh9ff849f2009-02-04 20:55:57 +00002155 }
drhbc46f022013-01-23 18:53:23 +00002156 if( zDestFile==0 ){
2157 fprintf(stderr, "missing FILENAME argument on .backup\n");
2158 return 1;
2159 }
2160 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002161 rc = sqlite3_open(zDestFile, &pDest);
2162 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002163 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002164 sqlite3_close(pDest);
2165 return 1;
2166 }
drh05782482013-10-24 15:20:20 +00002167 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002168 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2169 if( pBackup==0 ){
2170 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2171 sqlite3_close(pDest);
2172 return 1;
2173 }
2174 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2175 sqlite3_backup_finish(pBackup);
2176 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002177 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002178 }else{
2179 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002180 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002181 }
2182 sqlite3_close(pDest);
2183 }else
2184
shanehe2aa9d72009-11-06 17:20:17 +00002185 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002186 bail_on_error = booleanValue(azArg[1]);
2187 }else
2188
drhd8621b92012-04-17 09:09:33 +00002189 /* The undocumented ".breakpoint" command causes a call to the no-op
2190 ** routine named test_breakpoint().
2191 */
2192 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2193 test_breakpoint();
2194 }else
2195
shanehe2aa9d72009-11-06 17:20:17 +00002196 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002197 struct callback_data data;
2198 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002199 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002200 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002201 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002202 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002203 data.colWidth[0] = 3;
2204 data.colWidth[1] = 15;
2205 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002206 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002207 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002208 if( zErrMsg ){
2209 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002210 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002211 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002212 }
2213 }else
2214
shanehe2aa9d72009-11-06 17:20:17 +00002215 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002216 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002217 /* When playing back a "dump", the content might appear in an order
2218 ** which causes immediate foreign key constraints to be violated.
2219 ** So disable foreign-key constraint enforcement to prevent problems. */
2220 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002221 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002222 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002223 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002224 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002225 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002226 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002227 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002228 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002229 );
2230 run_schema_dump_query(p,
2231 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002232 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002233 );
drh2f464a02011-10-13 00:41:49 +00002234 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002235 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002236 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002237 );
drh4c653a02000-06-07 01:27:47 +00002238 }else{
2239 int i;
drhdd3d4592004-08-30 01:54:05 +00002240 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002241 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002242 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002243 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002244 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002245 " AND sql NOT NULL");
2246 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002247 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002248 "WHERE sql NOT NULL"
2249 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002250 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002251 );
danielk1977bc6ada42004-06-30 08:20:16 +00002252 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002253 }
2254 }
drh45e29d82006-11-20 16:21:10 +00002255 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002256 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002257 p->writableSchema = 0;
2258 }
drh56197952011-10-13 16:30:13 +00002259 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2260 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002261 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002262 }else
drh75897232000-05-29 14:26:00 +00002263
shanehe2aa9d72009-11-06 17:20:17 +00002264 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002265 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002266 }else
2267
drhd3ac7d92013-01-25 18:33:43 +00002268 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002269 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002270 rc = 2;
drh75897232000-05-29 14:26:00 +00002271 }else
2272
shanehe2aa9d72009-11-06 17:20:17 +00002273 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002274 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002275 if(val == 1) {
2276 if(!p->explainPrev.valid) {
2277 p->explainPrev.valid = 1;
2278 p->explainPrev.mode = p->mode;
2279 p->explainPrev.showHeader = p->showHeader;
2280 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2281 }
2282 /* We could put this code under the !p->explainValid
2283 ** condition so that it does not execute if we are already in
2284 ** explain mode. However, always executing it allows us an easy
2285 ** was to reset to explain mode in case the user previously
2286 ** did an .explain followed by a .width, .mode or .header
2287 ** command.
2288 */
danielk19770d78bae2008-01-03 07:09:48 +00002289 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002290 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002291 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002292 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002293 p->colWidth[1] = 13; /* opcode */
2294 p->colWidth[2] = 4; /* P1 */
2295 p->colWidth[3] = 4; /* P2 */
2296 p->colWidth[4] = 4; /* P3 */
2297 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002298 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002299 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002300 }else if (p->explainPrev.valid) {
2301 p->explainPrev.valid = 0;
2302 p->mode = p->explainPrev.mode;
2303 p->showHeader = p->explainPrev.showHeader;
2304 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2305 }
drh75897232000-05-29 14:26:00 +00002306 }else
2307
drhc28490c2006-10-26 14:25:58 +00002308 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002309 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002310 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002311 }else
2312
2313 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002314 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002315 if( HAS_TIMER ){
2316 fprintf(stderr,"%s",zTimerHelp);
2317 }
drh75897232000-05-29 14:26:00 +00002318 }else
2319
shanehe2aa9d72009-11-06 17:20:17 +00002320 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002321 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002322 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002323 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002324 int nCol; /* Number of columns in the table */
2325 int nByte; /* Number of bytes in an SQL string */
2326 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002327 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002328 int nSep; /* Number of bytes in p->separator[] */
2329 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002330 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002331 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002332
drhdb95f682013-06-26 22:46:00 +00002333 seenInterrupt = 0;
2334 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002335 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002336 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002337 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002338 fprintf(stderr, "Error: non-null separator required for import\n");
2339 return 1;
drhfeac5f82004-08-01 00:10:45 +00002340 }
drhdb95f682013-06-26 22:46:00 +00002341 if( nSep>1 ){
2342 fprintf(stderr, "Error: multi-character separators not allowed"
2343 " for import\n");
2344 return 1;
2345 }
drh5bde8162013-06-27 14:07:53 +00002346 sCsv.zFile = zFile;
2347 sCsv.nLine = 1;
2348 if( sCsv.zFile[0]=='|' ){
2349 sCsv.in = popen(sCsv.zFile+1, "r");
2350 sCsv.zFile = "<pipe>";
2351 xCloser = pclose;
2352 }else{
2353 sCsv.in = fopen(sCsv.zFile, "rb");
2354 xCloser = fclose;
2355 }
drhdb95f682013-06-26 22:46:00 +00002356 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002357 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002358 return 1;
2359 }
2360 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002361 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002362 if( zSql==0 ){
2363 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002364 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002365 return 1;
2366 }
drh4f21c4a2008-12-10 22:15:00 +00002367 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002368 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002369 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2370 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2371 char cSep = '(';
2372 while( csv_read_one_field(&sCsv) ){
2373 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2374 cSep = ',';
2375 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2376 }
drh5bde8162013-06-27 14:07:53 +00002377 if( cSep=='(' ){
2378 sqlite3_free(zCreate);
2379 sqlite3_free(sCsv.z);
2380 xCloser(sCsv.in);
2381 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2382 return 1;
2383 }
drhdb95f682013-06-26 22:46:00 +00002384 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2385 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2386 sqlite3_free(zCreate);
2387 if( rc ){
2388 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2389 sqlite3_errmsg(db));
2390 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002391 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002392 return 1;
2393 }
2394 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2395 }
drhfeac5f82004-08-01 00:10:45 +00002396 sqlite3_free(zSql);
2397 if( rc ){
shane916f9612009-10-23 00:37:15 +00002398 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002399 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002400 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002401 return 1;
drhfeac5f82004-08-01 00:10:45 +00002402 }
shane916f9612009-10-23 00:37:15 +00002403 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002404 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002405 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002406 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002407 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002408 if( zSql==0 ){
2409 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002410 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002411 return 1;
2412 }
drhdb95f682013-06-26 22:46:00 +00002413 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002414 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002415 for(i=1; i<nCol; i++){
2416 zSql[j++] = ',';
2417 zSql[j++] = '?';
2418 }
2419 zSql[j++] = ')';
2420 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002421 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002422 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002423 if( rc ){
2424 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002425 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002426 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002427 return 1;
drhfeac5f82004-08-01 00:10:45 +00002428 }
drh2d463112013-08-06 14:36:36 +00002429 needCommit = sqlite3_get_autocommit(db);
2430 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002431 do{
2432 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002433 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002434 char *z = csv_read_one_field(&sCsv);
2435 if( z==0 && i==0 ) break;
2436 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2437 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2438 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2439 "filling the rest with NULL\n",
2440 sCsv.zFile, startLine, nCol, i+1);
2441 i++;
2442 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002443 }
drhfeac5f82004-08-01 00:10:45 +00002444 }
drhdb95f682013-06-26 22:46:00 +00002445 if( sCsv.cTerm==sCsv.cSeparator ){
2446 do{
2447 csv_read_one_field(&sCsv);
2448 i++;
2449 }while( sCsv.cTerm==sCsv.cSeparator );
2450 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2451 "extras ignored\n",
2452 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002453 }
drhdb95f682013-06-26 22:46:00 +00002454 if( i>=nCol ){
2455 sqlite3_step(pStmt);
2456 rc = sqlite3_reset(pStmt);
2457 if( rc!=SQLITE_OK ){
2458 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2459 sqlite3_errmsg(db));
2460 }
2461 }
2462 }while( sCsv.cTerm!=EOF );
2463
drh5bde8162013-06-27 14:07:53 +00002464 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002465 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002466 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002467 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002468 }else
2469
shanehe2aa9d72009-11-06 17:20:17 +00002470 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002471 struct callback_data data;
2472 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002473 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002474 memcpy(&data, p, sizeof(data));
2475 data.showHeader = 0;
2476 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002477 if( nArg==1 ){
2478 rc = sqlite3_exec(p->db,
2479 "SELECT name FROM sqlite_master "
2480 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2481 "UNION ALL "
2482 "SELECT name FROM sqlite_temp_master "
2483 "WHERE type='index' "
2484 "ORDER BY 1",
2485 callback, &data, &zErrMsg
2486 );
2487 }else{
2488 zShellStatic = azArg[1];
2489 rc = sqlite3_exec(p->db,
2490 "SELECT name FROM sqlite_master "
2491 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2492 "UNION ALL "
2493 "SELECT name FROM sqlite_temp_master "
2494 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2495 "ORDER BY 1",
2496 callback, &data, &zErrMsg
2497 );
2498 zShellStatic = 0;
2499 }
drh75897232000-05-29 14:26:00 +00002500 if( zErrMsg ){
2501 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002502 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002503 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002504 }else if( rc != SQLITE_OK ){
2505 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2506 rc = 1;
drh75897232000-05-29 14:26:00 +00002507 }
2508 }else
2509
drhae5e4452007-05-03 17:18:36 +00002510#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002511 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002512 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002513 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2514 iotrace = 0;
2515 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002516 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002517 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002518 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002519 iotrace = stdout;
2520 }else{
2521 iotrace = fopen(azArg[1], "w");
2522 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002523 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002524 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002525 rc = 1;
drhb0603412007-02-28 04:47:26 +00002526 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002527 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002528 }
2529 }
2530 }else
drhae5e4452007-05-03 17:18:36 +00002531#endif
drhb0603412007-02-28 04:47:26 +00002532
drh70df4fe2006-06-13 15:12:21 +00002533#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002534 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2535 const char *zFile, *zProc;
2536 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002537 zFile = azArg[1];
2538 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002539 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002540 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2541 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002542 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002543 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002544 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002545 }
2546 }else
drh70df4fe2006-06-13 15:12:21 +00002547#endif
drh1e397f82006-06-08 15:28:43 +00002548
drhc8ba2122011-03-23 11:16:22 +00002549 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002550 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002551 output_file_close(p->pLog);
2552 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002553 }else
2554
shanehe2aa9d72009-11-06 17:20:17 +00002555 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002556 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002557 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002558 ||
shanehe2aa9d72009-11-06 17:20:17 +00002559 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002560 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002561 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002562 ||
shanehe2aa9d72009-11-06 17:20:17 +00002563 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002564 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002565 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002566 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002567 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002568 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002569 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002570 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002571 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002572 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002573 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002574 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002575 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002576 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002577 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002578 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002579 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002580 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002581 }else {
shane9bd1b442009-10-23 01:27:39 +00002582 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002583 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002584 rc = 1;
drh75897232000-05-29 14:26:00 +00002585 }
2586 }else
2587
shanehe2aa9d72009-11-06 17:20:17 +00002588 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2589 int n2 = strlen30(azArg[1]);
2590 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2591 p->mode = MODE_Insert;
2592 set_table_name(p, azArg[2]);
2593 }else {
2594 fprintf(stderr, "Error: invalid arguments: "
2595 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2596 rc = 1;
2597 }
2598 }else
2599
persicom7e2dfdd2002-04-18 02:46:52 +00002600 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002601 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2602 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002603 }else
2604
drh05782482013-10-24 15:20:20 +00002605 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2606 sqlite3 *savedDb = p->db;
2607 const char *zSavedFilename = p->zDbFilename;
2608 char *zNewFilename = 0;
2609 p->db = 0;
2610 if( nArg>=2 ){
2611 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2612 }
2613 open_db(p, 1);
2614 if( p->db!=0 ){
2615 sqlite3_close(savedDb);
2616 sqlite3_free(p->zFreeOnClose);
2617 p->zFreeOnClose = zNewFilename;
2618 }else{
2619 sqlite3_free(zNewFilename);
2620 p->db = savedDb;
2621 p->zDbFilename = zSavedFilename;
2622 }
2623 }else
2624
drh75897232000-05-29 14:26:00 +00002625 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002626 if( p->outfile[0]=='|' ){
2627 pclose(p->out);
2628 }else{
2629 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002630 }
drh42f64e52012-04-04 16:56:23 +00002631 p->outfile[0] = 0;
2632 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002633 p->out = popen(&azArg[1][1], "w");
2634 if( p->out==0 ){
2635 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2636 p->out = stdout;
2637 rc = 1;
2638 }else{
2639 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2640 }
drh75897232000-05-29 14:26:00 +00002641 }else{
drh42f64e52012-04-04 16:56:23 +00002642 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002643 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002644 if( strcmp(azArg[1],"off")!=0 ){
2645 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2646 }
drh75897232000-05-29 14:26:00 +00002647 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002648 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002649 } else {
drh42f64e52012-04-04 16:56:23 +00002650 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002651 }
2652 }
2653 }else
2654
drh078b1fd2012-09-21 13:40:02 +00002655 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2656 int i;
2657 for(i=1; i<nArg; i++){
2658 if( i>1 ) fprintf(p->out, " ");
2659 fprintf(p->out, "%s", azArg[i]);
2660 }
2661 fprintf(p->out, "\n");
2662 }else
2663
drhdd45df82002-04-18 12:39:03 +00002664 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002665 if( nArg >= 2) {
2666 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2667 }
2668 if( nArg >= 3) {
2669 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2670 }
2671 }else
2672
shanehe2aa9d72009-11-06 17:20:17 +00002673 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002674 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002675 }else
2676
drh9ff849f2009-02-04 20:55:57 +00002677 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002678 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002679 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002680 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2681 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002682 }else{
shane9bd1b442009-10-23 01:27:39 +00002683 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002684 fclose(alt);
2685 }
2686 }else
2687
drh3350ce92014-02-06 00:49:12 +00002688 if( c=='r' && strncmp(azArg[0], "repair", n)==0 && nArg>1 && nArg<3 ){
2689 tryToRepair(p, azArg[1]);
2690 }else
2691
shanehe2aa9d72009-11-06 17:20:17 +00002692 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002693 const char *zSrcFile;
2694 const char *zDb;
2695 sqlite3 *pSrc;
2696 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002697 int nTimeout = 0;
2698
drh9ff849f2009-02-04 20:55:57 +00002699 if( nArg==2 ){
2700 zSrcFile = azArg[1];
2701 zDb = "main";
2702 }else{
2703 zSrcFile = azArg[2];
2704 zDb = azArg[1];
2705 }
2706 rc = sqlite3_open(zSrcFile, &pSrc);
2707 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002708 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002709 sqlite3_close(pSrc);
2710 return 1;
2711 }
drh05782482013-10-24 15:20:20 +00002712 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002713 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2714 if( pBackup==0 ){
2715 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2716 sqlite3_close(pSrc);
2717 return 1;
2718 }
drhdc2c4912009-02-04 22:46:47 +00002719 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2720 || rc==SQLITE_BUSY ){
2721 if( rc==SQLITE_BUSY ){
2722 if( nTimeout++ >= 3 ) break;
2723 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002724 }
2725 }
2726 sqlite3_backup_finish(pBackup);
2727 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002728 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002729 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002730 fprintf(stderr, "Error: source database is busy\n");
2731 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002732 }else{
2733 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002734 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002735 }
2736 sqlite3_close(pSrc);
2737 }else
2738
shanehe2aa9d72009-11-06 17:20:17 +00002739 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002740 struct callback_data data;
2741 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002742 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002743 memcpy(&data, p, sizeof(data));
2744 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002745 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002746 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002747 int i;
drhf0693c82011-10-11 20:41:54 +00002748 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002749 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002750 char *new_argv[2], *new_colv[2];
2751 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2752 " type text,\n"
2753 " name text,\n"
2754 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002755 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002756 " sql text\n"
2757 ")";
2758 new_argv[1] = 0;
2759 new_colv[0] = "sql";
2760 new_colv[1] = 0;
2761 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002762 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002763 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002764 char *new_argv[2], *new_colv[2];
2765 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2766 " type text,\n"
2767 " name text,\n"
2768 " tbl_name text,\n"
2769 " rootpage integer,\n"
2770 " sql text\n"
2771 ")";
2772 new_argv[1] = 0;
2773 new_colv[0] = "sql";
2774 new_colv[1] = 0;
2775 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002776 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002777 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002778 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002779 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002780 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002781 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002782 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002783 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002784 "WHERE lower(tbl_name) LIKE shellstatic()"
2785 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002786 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002787 callback, &data, &zErrMsg);
2788 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002789 }
drh75897232000-05-29 14:26:00 +00002790 }else{
shane9bd1b442009-10-23 01:27:39 +00002791 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002792 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002793 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002794 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002795 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002796 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002797 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002798 callback, &data, &zErrMsg
2799 );
drh75897232000-05-29 14:26:00 +00002800 }
drh75897232000-05-29 14:26:00 +00002801 if( zErrMsg ){
2802 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002803 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002804 rc = 1;
2805 }else if( rc != SQLITE_OK ){
2806 fprintf(stderr,"Error: querying schema information\n");
2807 rc = 1;
2808 }else{
2809 rc = 0;
drh75897232000-05-29 14:26:00 +00002810 }
2811 }else
2812
drh340f5822013-06-27 13:01:21 +00002813#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002814 /* Undocumented commands for internal testing. Subject to change
2815 ** without notice. */
2816 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2817 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2818 int i, v;
2819 for(i=1; i<nArg; i++){
2820 v = booleanValue(azArg[i]);
2821 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2822 }
2823 }
2824 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2825 int i; sqlite3_int64 v;
2826 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002827 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002828 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002829 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2830 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002831 }
2832 }
2833 }else
drh340f5822013-06-27 13:01:21 +00002834#endif
drh348d19c2013-06-03 12:47:43 +00002835
drh75897232000-05-29 14:26:00 +00002836 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002837 sqlite3_snprintf(sizeof(p->separator), p->separator,
2838 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002839 }else
2840
shanehe2aa9d72009-11-06 17:20:17 +00002841 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002842 int i;
2843 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002844 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002845 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002846 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002847 fprintf(p->out,"%9.9s: ", "nullvalue");
2848 output_c_string(p->out, p->nullvalue);
2849 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002850 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002851 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002852 fprintf(p->out,"%9.9s: ", "separator");
2853 output_c_string(p->out, p->separator);
2854 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002855 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002856 fprintf(p->out,"%9.9s: ","width");
2857 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002858 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002859 }
drhfeac5f82004-08-01 00:10:45 +00002860 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002861 }else
2862
shaneh642d8b82010-07-28 16:05:34 +00002863 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2864 p->statsOn = booleanValue(azArg[1]);
2865 }else
2866
shanehe2aa9d72009-11-06 17:20:17 +00002867 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002868 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002869 char **azResult;
drh98781232012-04-23 12:38:05 +00002870 int nRow, nAlloc;
2871 char *zSql = 0;
2872 int ii;
drh05782482013-10-24 15:20:20 +00002873 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002874 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2875 if( rc ) return rc;
2876 zSql = sqlite3_mprintf(
2877 "SELECT name FROM sqlite_master"
2878 " WHERE type IN ('table','view')"
2879 " AND name NOT LIKE 'sqlite_%%'"
2880 " AND name LIKE ?1");
2881 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2882 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2883 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2884 if( strcmp(zDbName,"temp")==0 ){
2885 zSql = sqlite3_mprintf(
2886 "%z UNION ALL "
2887 "SELECT 'temp.' || name FROM sqlite_temp_master"
2888 " WHERE type IN ('table','view')"
2889 " AND name NOT LIKE 'sqlite_%%'"
2890 " AND name LIKE ?1", zSql);
2891 }else{
2892 zSql = sqlite3_mprintf(
2893 "%z UNION ALL "
2894 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2895 " WHERE type IN ('table','view')"
2896 " AND name NOT LIKE 'sqlite_%%'"
2897 " AND name LIKE ?1", zSql, zDbName, zDbName);
2898 }
drha50da102000-08-08 20:19:09 +00002899 }
drh98781232012-04-23 12:38:05 +00002900 sqlite3_finalize(pStmt);
2901 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2902 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2903 sqlite3_free(zSql);
2904 if( rc ) return rc;
2905 nRow = nAlloc = 0;
2906 azResult = 0;
2907 if( nArg>1 ){
2908 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002909 }else{
drh98781232012-04-23 12:38:05 +00002910 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2911 }
2912 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2913 if( nRow>=nAlloc ){
2914 char **azNew;
2915 int n = nAlloc*2 + 10;
2916 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2917 if( azNew==0 ){
2918 fprintf(stderr, "Error: out of memory\n");
2919 break;
2920 }
2921 nAlloc = n;
2922 azResult = azNew;
2923 }
2924 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2925 if( azResult[nRow] ) nRow++;
2926 }
2927 sqlite3_finalize(pStmt);
2928 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002929 int len, maxlen = 0;
2930 int i, j;
2931 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002932 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002933 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002934 if( len>maxlen ) maxlen = len;
2935 }
2936 nPrintCol = 80/(maxlen+2);
2937 if( nPrintCol<1 ) nPrintCol = 1;
2938 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2939 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002940 for(j=i; j<nRow; j+=nPrintRow){
2941 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002942 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002943 }
drh151b7d52013-05-06 20:28:54 +00002944 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002945 }
2946 }
drh98781232012-04-23 12:38:05 +00002947 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2948 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002949 }else
2950
shaneh96887e12011-02-10 21:08:58 +00002951 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002952 static const struct {
2953 const char *zCtrlName; /* Name of a test-control option */
2954 int ctrlCode; /* Integer code for that option */
2955 } aCtrl[] = {
2956 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2957 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2958 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2959 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2960 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2961 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2962 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2963 { "assert", SQLITE_TESTCTRL_ASSERT },
2964 { "always", SQLITE_TESTCTRL_ALWAYS },
2965 { "reserve", SQLITE_TESTCTRL_RESERVE },
2966 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2967 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002968 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2969 };
shaneh96887e12011-02-10 21:08:58 +00002970 int testctrl = -1;
2971 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002972 int i, n;
drh05782482013-10-24 15:20:20 +00002973 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00002974
drhd416fe72011-03-17 16:45:50 +00002975 /* convert testctrl text option to value. allow any unique prefix
2976 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002977 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002978 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002979 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2980 if( testctrl<0 ){
2981 testctrl = aCtrl[i].ctrlCode;
2982 }else{
drhb07028f2011-10-14 21:49:18 +00002983 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00002984 testctrl = -1;
2985 break;
2986 }
2987 }
2988 }
drh348d19c2013-06-03 12:47:43 +00002989 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002990 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2991 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2992 }else{
2993 switch(testctrl){
2994
2995 /* sqlite3_test_control(int, db, int) */
2996 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2997 case SQLITE_TESTCTRL_RESERVE:
2998 if( nArg==3 ){
2999 int opt = (int)strtol(azArg[2], 0, 0);
3000 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003001 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003002 } else {
drhd416fe72011-03-17 16:45:50 +00003003 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3004 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003005 }
3006 break;
3007
3008 /* sqlite3_test_control(int) */
3009 case SQLITE_TESTCTRL_PRNG_SAVE:
3010 case SQLITE_TESTCTRL_PRNG_RESTORE:
3011 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003012 if( nArg==2 ){
3013 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003014 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003015 } else {
3016 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3017 }
3018 break;
3019
3020 /* sqlite3_test_control(int, uint) */
3021 case SQLITE_TESTCTRL_PENDING_BYTE:
3022 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003023 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003024 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003025 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003026 } else {
drhd416fe72011-03-17 16:45:50 +00003027 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3028 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003029 }
3030 break;
3031
3032 /* sqlite3_test_control(int, int) */
3033 case SQLITE_TESTCTRL_ASSERT:
3034 case SQLITE_TESTCTRL_ALWAYS:
3035 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003036 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003037 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003038 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003039 } else {
drhd416fe72011-03-17 16:45:50 +00003040 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3041 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003042 }
3043 break;
3044
3045 /* sqlite3_test_control(int, char *) */
3046#ifdef SQLITE_N_KEYWORD
3047 case SQLITE_TESTCTRL_ISKEYWORD:
3048 if( nArg==3 ){
3049 const char *opt = azArg[2];
3050 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003051 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003052 } else {
drhd416fe72011-03-17 16:45:50 +00003053 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3054 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003055 }
3056 break;
3057#endif
3058
3059 case SQLITE_TESTCTRL_BITVEC_TEST:
3060 case SQLITE_TESTCTRL_FAULT_INSTALL:
3061 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3062 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3063 default:
drhd416fe72011-03-17 16:45:50 +00003064 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3065 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003066 break;
3067 }
3068 }
3069 }else
3070
shanehe2aa9d72009-11-06 17:20:17 +00003071 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003072 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003073 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003074 }else
3075
drhd416fe72011-03-17 16:45:50 +00003076 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3077 && nArg==2
3078 ){
drh3b1a9882007-11-02 12:53:03 +00003079 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003080 }else
3081
drh42f64e52012-04-04 16:56:23 +00003082 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003083 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003084 output_file_close(p->traceOut);
3085 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003086#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003087 if( p->traceOut==0 ){
3088 sqlite3_trace(p->db, 0, 0);
3089 }else{
3090 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3091 }
3092#endif
3093 }else
3094
drh9fd301b2011-06-03 13:28:22 +00003095 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003096 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003097 sqlite3_libversion(), sqlite3_sourceid());
3098 }else
3099
drhde60fc22011-12-14 17:53:36 +00003100 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3101 const char *zDbName = nArg==2 ? azArg[1] : "main";
3102 char *zVfsName = 0;
3103 if( p->db ){
3104 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3105 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003106 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003107 sqlite3_free(zVfsName);
3108 }
3109 }
3110 }else
3111
drhcef4fc82012-09-21 22:50:45 +00003112#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3113 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3114 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003115 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003116 }else
3117#endif
3118
shanehe2aa9d72009-11-06 17:20:17 +00003119 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003120 int j;
drh43617e92006-03-06 20:55:46 +00003121 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003122 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003123 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003124 }
3125 }else
3126
3127 {
shane9bd1b442009-10-23 01:27:39 +00003128 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003129 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003130 rc = 1;
drh75897232000-05-29 14:26:00 +00003131 }
drh67505e72002-04-19 12:34:06 +00003132
3133 return rc;
drh75897232000-05-29 14:26:00 +00003134}
3135
drh67505e72002-04-19 12:34:06 +00003136/*
drh91a66392007-09-07 01:12:32 +00003137** Return TRUE if a semicolon occurs anywhere in the first N characters
3138** of string z[].
drh324ccef2003-02-05 14:06:20 +00003139*/
drh9f099fd2013-08-06 14:01:46 +00003140static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003141 int i;
3142 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3143 return 0;
drh324ccef2003-02-05 14:06:20 +00003144}
3145
3146/*
drh70c7a4b2003-04-26 03:03:06 +00003147** Test to see if a line consists entirely of whitespace.
3148*/
3149static int _all_whitespace(const char *z){
3150 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003151 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003152 if( *z=='/' && z[1]=='*' ){
3153 z += 2;
3154 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3155 if( *z==0 ) return 0;
3156 z++;
3157 continue;
3158 }
3159 if( *z=='-' && z[1]=='-' ){
3160 z += 2;
3161 while( *z && *z!='\n' ){ z++; }
3162 if( *z==0 ) return 1;
3163 continue;
3164 }
3165 return 0;
3166 }
3167 return 1;
3168}
3169
3170/*
drha9b17162003-04-29 18:01:28 +00003171** Return TRUE if the line typed in is an SQL command terminator other
3172** than a semi-colon. The SQL Server style "go" command is understood
3173** as is the Oracle "/".
3174*/
drh9f099fd2013-08-06 14:01:46 +00003175static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003176 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003177 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3178 return 1; /* Oracle */
3179 }
drhf0693c82011-10-11 20:41:54 +00003180 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003181 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003182 return 1; /* SQL Server */
3183 }
3184 return 0;
3185}
3186
3187/*
drh233a5312008-12-18 22:25:13 +00003188** Return true if zSql is a complete SQL statement. Return false if it
3189** ends in the middle of a string literal or C-style comment.
3190*/
drh9f099fd2013-08-06 14:01:46 +00003191static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003192 int rc;
3193 if( zSql==0 ) return 1;
3194 zSql[nSql] = ';';
3195 zSql[nSql+1] = 0;
3196 rc = sqlite3_complete(zSql);
3197 zSql[nSql] = 0;
3198 return rc;
3199}
3200
3201/*
drh67505e72002-04-19 12:34:06 +00003202** Read input from *in and process it. If *in==0 then input
3203** is interactive - the user is typing it it. Otherwise, input
3204** is coming from a file or device. A prompt is issued and history
3205** is saved only if input is interactive. An interrupt signal will
3206** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003207**
3208** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003209*/
drhc28490c2006-10-26 14:25:58 +00003210static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003211 char *zLine = 0; /* A single input line */
3212 char *zSql = 0; /* Accumulated SQL text */
3213 int nLine; /* Length of current line */
3214 int nSql = 0; /* Bytes of zSql[] used */
3215 int nAlloc = 0; /* Allocated zSql[] space */
3216 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3217 char *zErrMsg; /* Error message returned */
3218 int rc; /* Error code */
3219 int errCnt = 0; /* Number of errors seen */
3220 int lineno = 0; /* Current line number */
3221 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003222
3223 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3224 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003225 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003226 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003227 /* End of input */
3228 if( stdin_is_interactive ) printf("\n");
3229 break;
drhc49f44e2006-10-26 18:15:42 +00003230 }
drh67505e72002-04-19 12:34:06 +00003231 if( seenInterrupt ){
3232 if( in!=0 ) break;
3233 seenInterrupt = 0;
3234 }
drhc28490c2006-10-26 14:25:58 +00003235 lineno++;
drh849a9d92013-12-21 15:46:06 +00003236 if( nSql==0 && _all_whitespace(zLine) ){
3237 if( p->echoOn ) printf("%s\n", zLine);
3238 continue;
3239 }
drh2af0b2d2002-02-21 02:25:02 +00003240 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003241 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003242 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003243 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003244 break;
3245 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003246 errCnt++;
3247 }
drhdaffd0e2001-04-11 14:28:42 +00003248 continue;
3249 }
drh9f099fd2013-08-06 14:01:46 +00003250 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003251 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003252 }
drh9f099fd2013-08-06 14:01:46 +00003253 nLine = strlen30(zLine);
3254 if( nSql+nLine+2>=nAlloc ){
3255 nAlloc = nSql+nLine+100;
3256 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003257 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003258 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003259 exit(1);
3260 }
drhdaffd0e2001-04-11 14:28:42 +00003261 }
drh9f099fd2013-08-06 14:01:46 +00003262 nSqlPrior = nSql;
3263 if( nSql==0 ){
3264 int i;
3265 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003266 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003267 memcpy(zSql, zLine+i, nLine+1-i);
3268 startline = lineno;
3269 nSql = nLine-i;
3270 }else{
3271 zSql[nSql++] = '\n';
3272 memcpy(zSql+nSql, zLine, nLine+1);
3273 nSql += nLine;
3274 }
3275 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003276 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003277 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003278 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003279 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003280 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003281 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003282 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003283 char zPrefix[100];
3284 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003285 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003286 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003287 }else{
shane9bd1b442009-10-23 01:27:39 +00003288 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003289 }
drh7f953e22002-07-13 17:33:45 +00003290 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003291 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003292 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003293 zErrMsg = 0;
3294 }else{
shaned2bed1c2009-10-21 03:56:54 +00003295 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003296 }
drhc49f44e2006-10-26 18:15:42 +00003297 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003298 }
drhdaffd0e2001-04-11 14:28:42 +00003299 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003300 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003301 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003302 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003303 }
3304 }
drh9f099fd2013-08-06 14:01:46 +00003305 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003306 if( !_all_whitespace(zSql) ){
3307 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3308 }
drhdaffd0e2001-04-11 14:28:42 +00003309 free(zSql);
3310 }
danielk19772ac27622007-07-03 05:31:16 +00003311 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003312 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003313}
3314
drh67505e72002-04-19 12:34:06 +00003315/*
3316** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003317** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003318*/
3319static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003320 static char *home_dir = NULL;
3321 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003322
drh83905c92012-06-21 13:00:37 +00003323#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003324 {
3325 struct passwd *pwent;
3326 uid_t uid = getuid();
3327 if( (pwent=getpwuid(uid)) != NULL) {
3328 home_dir = pwent->pw_dir;
3329 }
drh67505e72002-04-19 12:34:06 +00003330 }
3331#endif
3332
chw65d3c132007-11-12 21:09:10 +00003333#if defined(_WIN32_WCE)
3334 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3335 */
drh85e72432012-04-11 11:38:53 +00003336 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003337#else
3338
drh83905c92012-06-21 13:00:37 +00003339#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003340 if (!home_dir) {
3341 home_dir = getenv("USERPROFILE");
3342 }
3343#endif
3344
drh67505e72002-04-19 12:34:06 +00003345 if (!home_dir) {
3346 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003347 }
3348
drh83905c92012-06-21 13:00:37 +00003349#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003350 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003351 char *zDrive, *zPath;
3352 int n;
3353 zDrive = getenv("HOMEDRIVE");
3354 zPath = getenv("HOMEPATH");
3355 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003356 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003357 home_dir = malloc( n );
3358 if( home_dir==0 ) return 0;
3359 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3360 return home_dir;
3361 }
3362 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003363 }
3364#endif
3365
chw65d3c132007-11-12 21:09:10 +00003366#endif /* !_WIN32_WCE */
3367
drh67505e72002-04-19 12:34:06 +00003368 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003369 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003370 char *z = malloc( n );
3371 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003372 home_dir = z;
3373 }
drhe98d4fa2002-04-21 19:06:22 +00003374
drh67505e72002-04-19 12:34:06 +00003375 return home_dir;
3376}
3377
3378/*
3379** Read input from the file given by sqliterc_override. Or if that
3380** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003381**
3382** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003383*/
shane9bd1b442009-10-23 01:27:39 +00003384static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003385 struct callback_data *p, /* Configuration data */
3386 const char *sqliterc_override /* Name of config file. NULL to use default */
3387){
persicom7e2dfdd2002-04-18 02:46:52 +00003388 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003389 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003390 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003391 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003392 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003393
3394 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003395 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003396 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003397#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003398 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003399#endif
shane9bd1b442009-10-23 01:27:39 +00003400 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003401 }
drh2f3de322012-06-27 16:41:31 +00003402 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003403 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3404 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003405 }
drha1f9b5e2004-02-14 16:31:02 +00003406 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003407 if( in ){
drhc28490c2006-10-26 14:25:58 +00003408 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003409 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003410 }
shane9bd1b442009-10-23 01:27:39 +00003411 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003412 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003413 }
drh85e72432012-04-11 11:38:53 +00003414 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003415 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003416}
3417
drh67505e72002-04-19 12:34:06 +00003418/*
drhe1e38c42003-05-04 18:30:59 +00003419** Show available command line options
3420*/
3421static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003422 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003423 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003424 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003425 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003426 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003427 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003428 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003429 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003430#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3431 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3432#endif
drhcc3b4f82012-02-07 14:13:50 +00003433 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003434 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003435 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003436 " -line set output mode to 'line'\n"
3437 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003438 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003439#ifdef SQLITE_ENABLE_MULTIPLEX
3440 " -multiplex enable the multiplexor VFS\n"
3441#endif
drh98d312f2012-10-25 15:23:14 +00003442 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3443 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003444 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003445 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003446 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003447#ifdef SQLITE_ENABLE_VFSTRACE
3448 " -vfstrace enable tracing of all VFS calls\n"
3449#endif
drhe1e38c42003-05-04 18:30:59 +00003450;
3451static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003452 fprintf(stderr,
3453 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3454 "FILENAME is the name of an SQLite database. A new database is created\n"
3455 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003456 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003457 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003458 }else{
3459 fprintf(stderr, "Use the -help option for additional information\n");
3460 }
3461 exit(1);
3462}
3463
3464/*
drh67505e72002-04-19 12:34:06 +00003465** Initialize the state information in data
3466*/
drh0850b532006-01-31 19:31:43 +00003467static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003468 memset(data, 0, sizeof(*data));
3469 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003470 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003471 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003472 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003473 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003474 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3475 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003476 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003477}
3478
drh98d312f2012-10-25 15:23:14 +00003479/*
3480** Get the argument to an --option. Throw an error and die if no argument
3481** is available.
3482*/
3483static char *cmdline_option_value(int argc, char **argv, int i){
3484 if( i==argc ){
3485 fprintf(stderr, "%s: Error: missing argument to %s\n",
3486 argv[0], argv[argc-1]);
3487 exit(1);
3488 }
3489 return argv[i];
3490}
3491
drh75897232000-05-29 14:26:00 +00003492int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003493 char *zErrMsg = 0;
3494 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003495 const char *zInitFile = 0;
3496 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003497 int i;
drhc28490c2006-10-26 14:25:58 +00003498 int rc = 0;
drh75897232000-05-29 14:26:00 +00003499
drh52784bd2011-05-18 17:15:06 +00003500 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3501 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3502 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3503 exit(1);
3504 }
drhdaffd0e2001-04-11 14:28:42 +00003505 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003506 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003507 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003508
drh44c2eb12003-04-30 11:38:26 +00003509 /* Make sure we have a valid signal handler early, before anything
3510 ** else is done.
3511 */
drh4c504392000-10-16 22:06:40 +00003512#ifdef SIGINT
3513 signal(SIGINT, interrupt_handler);
3514#endif
drh44c2eb12003-04-30 11:38:26 +00003515
drh22fbcb82004-02-01 01:22:50 +00003516 /* Do an initial pass through the command-line argument to locate
3517 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003518 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003519 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003520 */
drh98d312f2012-10-25 15:23:14 +00003521 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003522 char *z;
drhc28490c2006-10-26 14:25:58 +00003523 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003524 if( z[0]!='-' ){
3525 if( data.zDbFilename==0 ){
3526 data.zDbFilename = z;
3527 continue;
3528 }
3529 if( zFirstCmd==0 ){
3530 zFirstCmd = z;
3531 continue;
3532 }
3533 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3534 fprintf(stderr,"Use -help for a list of options.\n");
3535 return 1;
3536 }
drhcc3b4f82012-02-07 14:13:50 +00003537 if( z[1]=='-' ) z++;
3538 if( strcmp(z,"-separator")==0
3539 || strcmp(z,"-nullvalue")==0
3540 || strcmp(z,"-cmd")==0
3541 ){
drh98d312f2012-10-25 15:23:14 +00003542 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003543 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003544 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003545 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003546 /* Need to check for batch mode here to so we can avoid printing
3547 ** informational messages (like from process_sqliterc) before
3548 ** we do the actual processing of arguments later in a second pass.
3549 */
shanef69573d2009-10-24 02:06:14 +00003550 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003551 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003552#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003553 const char *zSize;
3554 sqlite3_int64 szHeap;
3555
drh98d312f2012-10-25 15:23:14 +00003556 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003557 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003558 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003559 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3560#endif
drh97ae8ff2011-03-16 16:56:29 +00003561#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003562 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003563 extern int vfstrace_register(
3564 const char *zTraceName,
3565 const char *zOldVfsName,
3566 int (*xOut)(const char*,void*),
3567 void *pOutArg,
3568 int makeDefault
3569 );
drh2b625e22011-03-16 17:05:28 +00003570 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003571#endif
drh6f25e892011-07-08 17:02:57 +00003572#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003573 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003574 extern int sqlite3_multiple_initialize(const char*,int);
3575 sqlite3_multiplex_initialize(0, 1);
3576#endif
drh7d9f3942013-04-03 01:26:54 +00003577 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003578 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3579 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003580 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003581 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003582 if( pVfs ){
3583 sqlite3_vfs_register(pVfs, 1);
3584 }else{
3585 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3586 exit(1);
3587 }
drh44c2eb12003-04-30 11:38:26 +00003588 }
3589 }
drh98d312f2012-10-25 15:23:14 +00003590 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003591#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003592 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003593#else
shane86f5bdb2009-10-24 02:00:07 +00003594 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3595 return 1;
drh01b41712005-08-29 23:06:23 +00003596#endif
drh98d312f2012-10-25 15:23:14 +00003597 }
3598 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003599
drh44c2eb12003-04-30 11:38:26 +00003600 /* Go ahead and open the database file if it already exists. If the
3601 ** file does not exist, delay opening it. This prevents empty database
3602 ** files from being created if a user mistypes the database name argument
3603 ** to the sqlite command-line tool.
3604 */
drhc8d74412004-08-31 23:41:26 +00003605 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003606 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003607 }
3608
drh22fbcb82004-02-01 01:22:50 +00003609 /* Process the initialization file if there is one. If no -init option
3610 ** is given on the command line, look for a file named ~/.sqliterc and
3611 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003612 */
shane86f5bdb2009-10-24 02:00:07 +00003613 rc = process_sqliterc(&data,zInitFile);
3614 if( rc>0 ){
3615 return rc;
3616 }
drh44c2eb12003-04-30 11:38:26 +00003617
drh22fbcb82004-02-01 01:22:50 +00003618 /* Make a second pass through the command-line argument and set
3619 ** options. This second pass is delayed until after the initialization
3620 ** file is processed so that the command-line arguments will override
3621 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003622 */
drh98d312f2012-10-25 15:23:14 +00003623 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003624 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003625 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003626 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003627 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003628 i++;
3629 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003630 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003631 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003632 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003633 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003634 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003635 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003636 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003637 }else if( strcmp(z,"-csv")==0 ){
3638 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003639 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003640 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003641 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003642 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003643 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003644 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003645 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003646 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003647 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003648 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003649 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003650 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003651 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003652 }else if( strcmp(z,"-stats")==0 ){
3653 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003654 }else if( strcmp(z,"-bail")==0 ){
3655 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003656 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003657 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003658 return 0;
drhc28490c2006-10-26 14:25:58 +00003659 }else if( strcmp(z,"-interactive")==0 ){
3660 stdin_is_interactive = 1;
3661 }else if( strcmp(z,"-batch")==0 ){
3662 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003663 }else if( strcmp(z,"-heap")==0 ){
3664 i++;
drh7d9f3942013-04-03 01:26:54 +00003665 }else if( strcmp(z,"-mmap")==0 ){
3666 i++;
drha7e61d82011-03-12 17:02:57 +00003667 }else if( strcmp(z,"-vfs")==0 ){
3668 i++;
drh6f25e892011-07-08 17:02:57 +00003669#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003670 }else if( strcmp(z,"-vfstrace")==0 ){
3671 i++;
drh6f25e892011-07-08 17:02:57 +00003672#endif
3673#ifdef SQLITE_ENABLE_MULTIPLEX
3674 }else if( strcmp(z,"-multiplex")==0 ){
3675 i++;
3676#endif
drhcc3b4f82012-02-07 14:13:50 +00003677 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003678 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003679 }else if( strcmp(z,"-cmd")==0 ){
3680 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003681 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003682 if( z[0]=='.' ){
3683 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003684 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003685 }else{
drh05782482013-10-24 15:20:20 +00003686 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003687 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3688 if( zErrMsg!=0 ){
3689 fprintf(stderr,"Error: %s\n", zErrMsg);
3690 if( bail_on_error ) return rc!=0 ? rc : 1;
3691 }else if( rc!=0 ){
3692 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3693 if( bail_on_error ) return rc;
3694 }
3695 }
drh1e5d0e92000-05-31 23:33:17 +00003696 }else{
shane86f5bdb2009-10-24 02:00:07 +00003697 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003698 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003699 return 1;
3700 }
3701 }
drh44c2eb12003-04-30 11:38:26 +00003702
drh22fbcb82004-02-01 01:22:50 +00003703 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003704 /* Run just the command that follows the database name
3705 */
drh22fbcb82004-02-01 01:22:50 +00003706 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003707 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003708 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003709 }else{
drh05782482013-10-24 15:20:20 +00003710 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003711 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003712 if( zErrMsg!=0 ){
3713 fprintf(stderr,"Error: %s\n", zErrMsg);
3714 return rc!=0 ? rc : 1;
3715 }else if( rc!=0 ){
3716 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3717 return rc;
drh6ff13852001-11-25 13:18:23 +00003718 }
drh75897232000-05-29 14:26:00 +00003719 }
3720 }else{
drh44c2eb12003-04-30 11:38:26 +00003721 /* Run commands received from standard input
3722 */
drhc28490c2006-10-26 14:25:58 +00003723 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003724 char *zHome;
3725 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003726 int nHistory;
drh75897232000-05-29 14:26:00 +00003727 printf(
drh743e0032011-12-12 16:51:50 +00003728 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003729 "Enter \".help\" for instructions\n"
3730 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003731 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003732 );
drh67505e72002-04-19 12:34:06 +00003733 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003734 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003735 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003736 if( (zHistory = malloc(nHistory))!=0 ){
3737 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3738 }
drh67505e72002-04-19 12:34:06 +00003739 }
danielk19774af00c62005-01-23 23:43:21 +00003740#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003741 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003742#endif
drhc28490c2006-10-26 14:25:58 +00003743 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003744 if( zHistory ){
3745 stifle_history(100);
3746 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003747 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003748 }
drhdaffd0e2001-04-11 14:28:42 +00003749 }else{
drhc28490c2006-10-26 14:25:58 +00003750 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003751 }
3752 }
drh33048c02001-10-01 14:29:22 +00003753 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003754 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003755 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003756 }
drh05782482013-10-24 15:20:20 +00003757 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003758 return rc;
drh75897232000-05-29 14:26:00 +00003759}