blob: 8fa32105d97e960d876ee73bed16c5fdd672a9d3 [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"
drh4bbcf102014-02-06 02:46:08 +00001546 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001547 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001548 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001549 " If TABLE specified, only dump tables matching\n"
1550 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001551 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001552 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001553 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1554 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001555 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001556 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001557 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001558 ".indices ?TABLE? Show names of all indices\n"
1559 " If TABLE specified, only show indices for tables\n"
1560 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001561#ifdef SQLITE_ENABLE_IOTRACE
1562 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1563#endif
drh70df4fe2006-06-13 15:12:21 +00001564#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001565 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001566#endif
drh127f9d72010-02-23 01:47:00 +00001567 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001568 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001569 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001570 " column Left-aligned columns. (See .width)\n"
1571 " html HTML <table> code\n"
1572 " insert SQL insert statements for TABLE\n"
1573 " line One value per line\n"
1574 " list Values delimited by .separator string\n"
1575 " tabs Tab-separated values\n"
1576 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001577 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001578 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001579 ".output FILENAME Send output to FILENAME\n"
1580 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001581 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001582 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001583 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001584 ".read FILENAME Execute SQL in FILENAME\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/*
drh4bbcf102014-02-06 02:46:08 +00001901** Try to transfer data for table zTable. If an error is seen while
1902** moving forward, try to go backwards. The backwards movement won't
1903** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001904*/
mistachkine31ae902014-02-06 01:15:29 +00001905static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001906 struct callback_data *p,
1907 sqlite3 *newDb,
1908 const char *zTable
1909){
1910 sqlite3_stmt *pQuery = 0;
1911 sqlite3_stmt *pInsert = 0;
1912 char *zQuery = 0;
1913 char *zInsert = 0;
1914 int rc;
1915 int i, j, n;
1916 int nTable = (int)strlen(zTable);
1917 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001918 int cnt = 0;
1919 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001920
1921 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1922 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1923 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001924 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001925 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1926 zQuery);
1927 goto end_data_xfer;
1928 }
1929 n = sqlite3_column_count(pQuery);
1930 zInsert = sqlite3_malloc(200 + nTable + n*3);
1931 if( zInsert==0 ){
1932 fprintf(stderr, "out of memory\n");
1933 goto end_data_xfer;
1934 }
1935 sqlite3_snprintf(200+nTable,zInsert,
1936 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1937 i = (int)strlen(zInsert);
1938 for(j=1; j<n; j++){
1939 memcpy(zInsert+i, ",?", 2);
1940 i += 2;
1941 }
1942 memcpy(zInsert+i, ");", 3);
1943 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1944 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001945 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001946 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1947 zQuery);
1948 goto end_data_xfer;
1949 }
1950 for(k=0; k<2; k++){
1951 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1952 for(i=0; i<n; i++){
1953 switch( sqlite3_column_type(pQuery, i) ){
1954 case SQLITE_NULL: {
1955 sqlite3_bind_null(pInsert, i+1);
1956 break;
1957 }
1958 case SQLITE_INTEGER: {
1959 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1960 break;
1961 }
1962 case SQLITE_FLOAT: {
1963 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1964 break;
1965 }
1966 case SQLITE_TEXT: {
1967 sqlite3_bind_text(pInsert, i+1,
1968 (const char*)sqlite3_column_text(pQuery,i),
1969 -1, SQLITE_STATIC);
1970 break;
1971 }
1972 case SQLITE_BLOB: {
1973 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1974 sqlite3_column_bytes(pQuery,i),
1975 SQLITE_STATIC);
1976 break;
1977 }
1978 }
1979 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00001980 rc = sqlite3_step(pInsert);
1981 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
1982 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
1983 sqlite3_errmsg(newDb));
1984 }
drh3350ce92014-02-06 00:49:12 +00001985 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00001986 cnt++;
1987 if( (cnt%spinRate)==0 ){
1988 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
1989 fflush(stdout);
1990 }
drh3350ce92014-02-06 00:49:12 +00001991 } /* End while */
1992 if( rc==SQLITE_DONE ) break;
1993 sqlite3_finalize(pQuery);
1994 sqlite3_free(zQuery);
1995 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
1996 zTable);
1997 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1998 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001999 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2000 break;
drh3350ce92014-02-06 00:49:12 +00002001 }
2002 } /* End for(k=0...) */
2003
2004end_data_xfer:
2005 sqlite3_finalize(pQuery);
2006 sqlite3_finalize(pInsert);
2007 sqlite3_free(zQuery);
2008 sqlite3_free(zInsert);
2009}
2010
2011
2012/*
2013** Try to transfer all rows of the schema that match zWhere. For
2014** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002015** If an error is encountered while moving forward through the
2016** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002017*/
mistachkine31ae902014-02-06 01:15:29 +00002018static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002019 struct callback_data *p,
2020 sqlite3 *newDb,
2021 const char *zWhere,
2022 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2023){
2024 sqlite3_stmt *pQuery = 0;
2025 char *zQuery = 0;
2026 int rc;
2027 const unsigned char *zName;
2028 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002029 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002030
2031 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2032 " WHERE %s", zWhere);
2033 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2034 if( rc ){
2035 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2036 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2037 zQuery);
2038 goto end_schema_xfer;
2039 }
2040 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2041 zName = sqlite3_column_text(pQuery, 0);
2042 zSql = sqlite3_column_text(pQuery, 1);
2043 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002044 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2045 if( zErrMsg ){
2046 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2047 sqlite3_free(zErrMsg);
2048 zErrMsg = 0;
2049 }
drh3350ce92014-02-06 00:49:12 +00002050 if( xForEach ){
2051 xForEach(p, newDb, (const char*)zName);
2052 }
2053 printf("done\n");
2054 }
2055 if( rc!=SQLITE_DONE ){
2056 sqlite3_finalize(pQuery);
2057 sqlite3_free(zQuery);
2058 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2059 " WHERE %s ORDER BY rowid DESC", zWhere);
2060 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2061 if( rc ){
2062 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2063 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2064 zQuery);
2065 goto end_schema_xfer;
2066 }
2067 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2068 zName = sqlite3_column_text(pQuery, 0);
2069 zSql = sqlite3_column_text(pQuery, 1);
2070 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002071 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2072 if( zErrMsg ){
2073 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2074 sqlite3_free(zErrMsg);
2075 zErrMsg = 0;
2076 }
drh3350ce92014-02-06 00:49:12 +00002077 if( xForEach ){
2078 xForEach(p, newDb, (const char*)zName);
2079 }
2080 printf("done\n");
2081 }
2082 }
2083end_schema_xfer:
2084 sqlite3_finalize(pQuery);
2085 sqlite3_free(zQuery);
2086}
2087
2088/*
2089** Open a new database file named "zNewDb". Try to recover as much information
2090** as possible out of the main database (which might be corrupt) and write it
2091** into zNewDb.
2092*/
mistachkine31ae902014-02-06 01:15:29 +00002093static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002094 int rc;
2095 sqlite3 *newDb = 0;
2096 if( access(zNewDb,0)==0 ){
2097 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2098 return;
2099 }
2100 rc = sqlite3_open(zNewDb, &newDb);
2101 if( rc ){
2102 fprintf(stderr, "Cannot create output database: %s\n",
2103 sqlite3_errmsg(newDb));
2104 }else{
2105 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002106 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2107 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002108 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2109 }
2110 sqlite3_close(newDb);
2111}
2112
2113/*
drh75897232000-05-29 14:26:00 +00002114** If an input line begins with "." then invoke this routine to
2115** process that line.
drh67505e72002-04-19 12:34:06 +00002116**
drh47ad6842006-11-08 12:25:42 +00002117** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002118*/
drh44c2eb12003-04-30 11:38:26 +00002119static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002120 int i = 1;
2121 int nArg = 0;
2122 int n, c;
drh67505e72002-04-19 12:34:06 +00002123 int rc = 0;
drh75897232000-05-29 14:26:00 +00002124 char *azArg[50];
2125
2126 /* Parse the input line into tokens.
2127 */
2128 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002129 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002130 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002131 if( zLine[i]=='\'' || zLine[i]=='"' ){
2132 int delim = zLine[i++];
2133 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002134 while( zLine[i] && zLine[i]!=delim ){
2135 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2136 i++;
2137 }
drh75897232000-05-29 14:26:00 +00002138 if( zLine[i]==delim ){
2139 zLine[i++] = 0;
2140 }
drhfeac5f82004-08-01 00:10:45 +00002141 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002142 }else{
2143 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002144 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002145 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002146 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002147 }
2148 }
2149
2150 /* Process the input line.
2151 */
shane9bd1b442009-10-23 01:27:39 +00002152 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002153 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002154 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00002155 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
2156 const char *zDestFile = 0;
2157 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002158 sqlite3 *pDest;
2159 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002160 int j;
2161 for(j=1; j<nArg; j++){
2162 const char *z = azArg[j];
2163 if( z[0]=='-' ){
2164 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002165 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002166 {
2167 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2168 return 1;
2169 }
2170 }else if( zDestFile==0 ){
2171 zDestFile = azArg[j];
2172 }else if( zDb==0 ){
2173 zDb = zDestFile;
2174 zDestFile = azArg[j];
2175 }else{
2176 fprintf(stderr, "too many arguments to .backup\n");
2177 return 1;
2178 }
drh9ff849f2009-02-04 20:55:57 +00002179 }
drhbc46f022013-01-23 18:53:23 +00002180 if( zDestFile==0 ){
2181 fprintf(stderr, "missing FILENAME argument on .backup\n");
2182 return 1;
2183 }
2184 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002185 rc = sqlite3_open(zDestFile, &pDest);
2186 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002187 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002188 sqlite3_close(pDest);
2189 return 1;
2190 }
drh05782482013-10-24 15:20:20 +00002191 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002192 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2193 if( pBackup==0 ){
2194 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2195 sqlite3_close(pDest);
2196 return 1;
2197 }
2198 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2199 sqlite3_backup_finish(pBackup);
2200 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002201 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002202 }else{
2203 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002204 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002205 }
2206 sqlite3_close(pDest);
2207 }else
2208
shanehe2aa9d72009-11-06 17:20:17 +00002209 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002210 bail_on_error = booleanValue(azArg[1]);
2211 }else
2212
drhd8621b92012-04-17 09:09:33 +00002213 /* The undocumented ".breakpoint" command causes a call to the no-op
2214 ** routine named test_breakpoint().
2215 */
2216 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2217 test_breakpoint();
2218 }else
2219
mistachkine31ae902014-02-06 01:15:29 +00002220 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2221 tryToClone(p, azArg[1]);
2222 }else
2223
shanehe2aa9d72009-11-06 17:20:17 +00002224 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002225 struct callback_data data;
2226 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002227 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002228 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002229 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002230 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002231 data.colWidth[0] = 3;
2232 data.colWidth[1] = 15;
2233 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002234 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002235 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002236 if( zErrMsg ){
2237 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002238 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002239 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002240 }
2241 }else
2242
shanehe2aa9d72009-11-06 17:20:17 +00002243 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002244 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002245 /* When playing back a "dump", the content might appear in an order
2246 ** which causes immediate foreign key constraints to be violated.
2247 ** So disable foreign-key constraint enforcement to prevent problems. */
2248 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002249 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002250 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002251 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002252 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002253 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002254 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002255 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002256 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002257 );
2258 run_schema_dump_query(p,
2259 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002260 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002261 );
drh2f464a02011-10-13 00:41:49 +00002262 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002263 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002264 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002265 );
drh4c653a02000-06-07 01:27:47 +00002266 }else{
2267 int i;
drhdd3d4592004-08-30 01:54:05 +00002268 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002269 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002270 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002271 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002272 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002273 " AND sql NOT NULL");
2274 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002275 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002276 "WHERE sql NOT NULL"
2277 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002278 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002279 );
danielk1977bc6ada42004-06-30 08:20:16 +00002280 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002281 }
2282 }
drh45e29d82006-11-20 16:21:10 +00002283 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002284 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002285 p->writableSchema = 0;
2286 }
drh56197952011-10-13 16:30:13 +00002287 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2288 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002289 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002290 }else
drh75897232000-05-29 14:26:00 +00002291
shanehe2aa9d72009-11-06 17:20:17 +00002292 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002293 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002294 }else
2295
drhd3ac7d92013-01-25 18:33:43 +00002296 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002297 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002298 rc = 2;
drh75897232000-05-29 14:26:00 +00002299 }else
2300
shanehe2aa9d72009-11-06 17:20:17 +00002301 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002302 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002303 if(val == 1) {
2304 if(!p->explainPrev.valid) {
2305 p->explainPrev.valid = 1;
2306 p->explainPrev.mode = p->mode;
2307 p->explainPrev.showHeader = p->showHeader;
2308 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2309 }
2310 /* We could put this code under the !p->explainValid
2311 ** condition so that it does not execute if we are already in
2312 ** explain mode. However, always executing it allows us an easy
2313 ** was to reset to explain mode in case the user previously
2314 ** did an .explain followed by a .width, .mode or .header
2315 ** command.
2316 */
danielk19770d78bae2008-01-03 07:09:48 +00002317 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002318 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002319 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002320 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002321 p->colWidth[1] = 13; /* opcode */
2322 p->colWidth[2] = 4; /* P1 */
2323 p->colWidth[3] = 4; /* P2 */
2324 p->colWidth[4] = 4; /* P3 */
2325 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002326 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002327 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002328 }else if (p->explainPrev.valid) {
2329 p->explainPrev.valid = 0;
2330 p->mode = p->explainPrev.mode;
2331 p->showHeader = p->explainPrev.showHeader;
2332 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2333 }
drh75897232000-05-29 14:26:00 +00002334 }else
2335
drhc28490c2006-10-26 14:25:58 +00002336 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002337 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002338 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002339 }else
2340
2341 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002342 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002343 if( HAS_TIMER ){
2344 fprintf(stderr,"%s",zTimerHelp);
2345 }
drh75897232000-05-29 14:26:00 +00002346 }else
2347
shanehe2aa9d72009-11-06 17:20:17 +00002348 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002349 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002350 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002351 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002352 int nCol; /* Number of columns in the table */
2353 int nByte; /* Number of bytes in an SQL string */
2354 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002355 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002356 int nSep; /* Number of bytes in p->separator[] */
2357 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002358 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002359 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002360
drhdb95f682013-06-26 22:46:00 +00002361 seenInterrupt = 0;
2362 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002363 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002364 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002365 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002366 fprintf(stderr, "Error: non-null separator required for import\n");
2367 return 1;
drhfeac5f82004-08-01 00:10:45 +00002368 }
drhdb95f682013-06-26 22:46:00 +00002369 if( nSep>1 ){
2370 fprintf(stderr, "Error: multi-character separators not allowed"
2371 " for import\n");
2372 return 1;
2373 }
drh5bde8162013-06-27 14:07:53 +00002374 sCsv.zFile = zFile;
2375 sCsv.nLine = 1;
2376 if( sCsv.zFile[0]=='|' ){
2377 sCsv.in = popen(sCsv.zFile+1, "r");
2378 sCsv.zFile = "<pipe>";
2379 xCloser = pclose;
2380 }else{
2381 sCsv.in = fopen(sCsv.zFile, "rb");
2382 xCloser = fclose;
2383 }
drhdb95f682013-06-26 22:46:00 +00002384 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002385 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002386 return 1;
2387 }
2388 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002389 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002390 if( zSql==0 ){
2391 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002392 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002393 return 1;
2394 }
drh4f21c4a2008-12-10 22:15:00 +00002395 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002396 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002397 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2398 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2399 char cSep = '(';
2400 while( csv_read_one_field(&sCsv) ){
2401 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2402 cSep = ',';
2403 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2404 }
drh5bde8162013-06-27 14:07:53 +00002405 if( cSep=='(' ){
2406 sqlite3_free(zCreate);
2407 sqlite3_free(sCsv.z);
2408 xCloser(sCsv.in);
2409 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2410 return 1;
2411 }
drhdb95f682013-06-26 22:46:00 +00002412 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2413 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2414 sqlite3_free(zCreate);
2415 if( rc ){
2416 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2417 sqlite3_errmsg(db));
2418 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002419 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002420 return 1;
2421 }
2422 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2423 }
drhfeac5f82004-08-01 00:10:45 +00002424 sqlite3_free(zSql);
2425 if( rc ){
shane916f9612009-10-23 00:37:15 +00002426 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002427 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002428 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002429 return 1;
drhfeac5f82004-08-01 00:10:45 +00002430 }
shane916f9612009-10-23 00:37:15 +00002431 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002432 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002433 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002434 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002435 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002436 if( zSql==0 ){
2437 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002438 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002439 return 1;
2440 }
drhdb95f682013-06-26 22:46:00 +00002441 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002442 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002443 for(i=1; i<nCol; i++){
2444 zSql[j++] = ',';
2445 zSql[j++] = '?';
2446 }
2447 zSql[j++] = ')';
2448 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002449 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002450 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002451 if( rc ){
2452 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002453 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002454 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002455 return 1;
drhfeac5f82004-08-01 00:10:45 +00002456 }
drh2d463112013-08-06 14:36:36 +00002457 needCommit = sqlite3_get_autocommit(db);
2458 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002459 do{
2460 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002461 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002462 char *z = csv_read_one_field(&sCsv);
2463 if( z==0 && i==0 ) break;
2464 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2465 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2466 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2467 "filling the rest with NULL\n",
2468 sCsv.zFile, startLine, nCol, i+1);
2469 i++;
2470 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002471 }
drhfeac5f82004-08-01 00:10:45 +00002472 }
drhdb95f682013-06-26 22:46:00 +00002473 if( sCsv.cTerm==sCsv.cSeparator ){
2474 do{
2475 csv_read_one_field(&sCsv);
2476 i++;
2477 }while( sCsv.cTerm==sCsv.cSeparator );
2478 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2479 "extras ignored\n",
2480 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002481 }
drhdb95f682013-06-26 22:46:00 +00002482 if( i>=nCol ){
2483 sqlite3_step(pStmt);
2484 rc = sqlite3_reset(pStmt);
2485 if( rc!=SQLITE_OK ){
2486 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2487 sqlite3_errmsg(db));
2488 }
2489 }
2490 }while( sCsv.cTerm!=EOF );
2491
drh5bde8162013-06-27 14:07:53 +00002492 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002493 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002494 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002495 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002496 }else
2497
shanehe2aa9d72009-11-06 17:20:17 +00002498 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002499 struct callback_data data;
2500 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002501 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002502 memcpy(&data, p, sizeof(data));
2503 data.showHeader = 0;
2504 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002505 if( nArg==1 ){
2506 rc = sqlite3_exec(p->db,
2507 "SELECT name FROM sqlite_master "
2508 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2509 "UNION ALL "
2510 "SELECT name FROM sqlite_temp_master "
2511 "WHERE type='index' "
2512 "ORDER BY 1",
2513 callback, &data, &zErrMsg
2514 );
2515 }else{
2516 zShellStatic = azArg[1];
2517 rc = sqlite3_exec(p->db,
2518 "SELECT name FROM sqlite_master "
2519 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2520 "UNION ALL "
2521 "SELECT name FROM sqlite_temp_master "
2522 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2523 "ORDER BY 1",
2524 callback, &data, &zErrMsg
2525 );
2526 zShellStatic = 0;
2527 }
drh75897232000-05-29 14:26:00 +00002528 if( zErrMsg ){
2529 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002530 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002531 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002532 }else if( rc != SQLITE_OK ){
2533 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2534 rc = 1;
drh75897232000-05-29 14:26:00 +00002535 }
2536 }else
2537
drhae5e4452007-05-03 17:18:36 +00002538#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002539 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002540 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002541 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2542 iotrace = 0;
2543 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002544 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002545 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002546 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002547 iotrace = stdout;
2548 }else{
2549 iotrace = fopen(azArg[1], "w");
2550 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002551 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002552 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002553 rc = 1;
drhb0603412007-02-28 04:47:26 +00002554 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002555 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002556 }
2557 }
2558 }else
drhae5e4452007-05-03 17:18:36 +00002559#endif
drhb0603412007-02-28 04:47:26 +00002560
drh70df4fe2006-06-13 15:12:21 +00002561#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002562 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2563 const char *zFile, *zProc;
2564 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002565 zFile = azArg[1];
2566 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002567 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002568 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2569 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002570 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002571 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002572 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002573 }
2574 }else
drh70df4fe2006-06-13 15:12:21 +00002575#endif
drh1e397f82006-06-08 15:28:43 +00002576
drhc8ba2122011-03-23 11:16:22 +00002577 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002578 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002579 output_file_close(p->pLog);
2580 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002581 }else
2582
shanehe2aa9d72009-11-06 17:20:17 +00002583 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002584 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002585 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002586 ||
shanehe2aa9d72009-11-06 17:20:17 +00002587 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002588 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002589 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002590 ||
shanehe2aa9d72009-11-06 17:20:17 +00002591 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002592 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002593 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002594 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002595 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002596 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002597 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002598 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002599 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002600 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002601 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002602 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002603 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002604 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002605 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002606 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002607 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002608 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002609 }else {
shane9bd1b442009-10-23 01:27:39 +00002610 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002611 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002612 rc = 1;
drh75897232000-05-29 14:26:00 +00002613 }
2614 }else
2615
shanehe2aa9d72009-11-06 17:20:17 +00002616 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2617 int n2 = strlen30(azArg[1]);
2618 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2619 p->mode = MODE_Insert;
2620 set_table_name(p, azArg[2]);
2621 }else {
2622 fprintf(stderr, "Error: invalid arguments: "
2623 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2624 rc = 1;
2625 }
2626 }else
2627
persicom7e2dfdd2002-04-18 02:46:52 +00002628 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002629 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2630 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002631 }else
2632
drh05782482013-10-24 15:20:20 +00002633 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2634 sqlite3 *savedDb = p->db;
2635 const char *zSavedFilename = p->zDbFilename;
2636 char *zNewFilename = 0;
2637 p->db = 0;
2638 if( nArg>=2 ){
2639 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2640 }
2641 open_db(p, 1);
2642 if( p->db!=0 ){
2643 sqlite3_close(savedDb);
2644 sqlite3_free(p->zFreeOnClose);
2645 p->zFreeOnClose = zNewFilename;
2646 }else{
2647 sqlite3_free(zNewFilename);
2648 p->db = savedDb;
2649 p->zDbFilename = zSavedFilename;
2650 }
2651 }else
2652
drh75897232000-05-29 14:26:00 +00002653 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002654 if( p->outfile[0]=='|' ){
2655 pclose(p->out);
2656 }else{
2657 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002658 }
drh42f64e52012-04-04 16:56:23 +00002659 p->outfile[0] = 0;
2660 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002661 p->out = popen(&azArg[1][1], "w");
2662 if( p->out==0 ){
2663 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2664 p->out = stdout;
2665 rc = 1;
2666 }else{
2667 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2668 }
drh75897232000-05-29 14:26:00 +00002669 }else{
drh42f64e52012-04-04 16:56:23 +00002670 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002671 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002672 if( strcmp(azArg[1],"off")!=0 ){
2673 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2674 }
drh75897232000-05-29 14:26:00 +00002675 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002676 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002677 } else {
drh42f64e52012-04-04 16:56:23 +00002678 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002679 }
2680 }
2681 }else
2682
drh078b1fd2012-09-21 13:40:02 +00002683 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2684 int i;
2685 for(i=1; i<nArg; i++){
2686 if( i>1 ) fprintf(p->out, " ");
2687 fprintf(p->out, "%s", azArg[i]);
2688 }
2689 fprintf(p->out, "\n");
2690 }else
2691
drhdd45df82002-04-18 12:39:03 +00002692 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002693 if( nArg >= 2) {
2694 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2695 }
2696 if( nArg >= 3) {
2697 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2698 }
2699 }else
2700
shanehe2aa9d72009-11-06 17:20:17 +00002701 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002702 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002703 }else
2704
drh9ff849f2009-02-04 20:55:57 +00002705 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002706 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002707 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002708 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2709 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002710 }else{
shane9bd1b442009-10-23 01:27:39 +00002711 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002712 fclose(alt);
2713 }
2714 }else
2715
shanehe2aa9d72009-11-06 17:20:17 +00002716 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002717 const char *zSrcFile;
2718 const char *zDb;
2719 sqlite3 *pSrc;
2720 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002721 int nTimeout = 0;
2722
drh9ff849f2009-02-04 20:55:57 +00002723 if( nArg==2 ){
2724 zSrcFile = azArg[1];
2725 zDb = "main";
2726 }else{
2727 zSrcFile = azArg[2];
2728 zDb = azArg[1];
2729 }
2730 rc = sqlite3_open(zSrcFile, &pSrc);
2731 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002732 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002733 sqlite3_close(pSrc);
2734 return 1;
2735 }
drh05782482013-10-24 15:20:20 +00002736 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002737 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2738 if( pBackup==0 ){
2739 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2740 sqlite3_close(pSrc);
2741 return 1;
2742 }
drhdc2c4912009-02-04 22:46:47 +00002743 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2744 || rc==SQLITE_BUSY ){
2745 if( rc==SQLITE_BUSY ){
2746 if( nTimeout++ >= 3 ) break;
2747 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002748 }
2749 }
2750 sqlite3_backup_finish(pBackup);
2751 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002752 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002753 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002754 fprintf(stderr, "Error: source database is busy\n");
2755 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002756 }else{
2757 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002758 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002759 }
2760 sqlite3_close(pSrc);
2761 }else
2762
shanehe2aa9d72009-11-06 17:20:17 +00002763 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002764 struct callback_data data;
2765 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002766 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002767 memcpy(&data, p, sizeof(data));
2768 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002769 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002770 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002771 int i;
drhf0693c82011-10-11 20:41:54 +00002772 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002773 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002774 char *new_argv[2], *new_colv[2];
2775 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2776 " type text,\n"
2777 " name text,\n"
2778 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002779 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002780 " sql text\n"
2781 ")";
2782 new_argv[1] = 0;
2783 new_colv[0] = "sql";
2784 new_colv[1] = 0;
2785 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002786 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002787 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002788 char *new_argv[2], *new_colv[2];
2789 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2790 " type text,\n"
2791 " name text,\n"
2792 " tbl_name text,\n"
2793 " rootpage integer,\n"
2794 " sql text\n"
2795 ")";
2796 new_argv[1] = 0;
2797 new_colv[0] = "sql";
2798 new_colv[1] = 0;
2799 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002800 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002801 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002802 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002803 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002804 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002805 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002806 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002807 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002808 "WHERE lower(tbl_name) LIKE shellstatic()"
2809 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002810 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002811 callback, &data, &zErrMsg);
2812 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002813 }
drh75897232000-05-29 14:26:00 +00002814 }else{
shane9bd1b442009-10-23 01:27:39 +00002815 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002816 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002817 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002818 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002819 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002820 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002821 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002822 callback, &data, &zErrMsg
2823 );
drh75897232000-05-29 14:26:00 +00002824 }
drh75897232000-05-29 14:26:00 +00002825 if( zErrMsg ){
2826 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002827 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002828 rc = 1;
2829 }else if( rc != SQLITE_OK ){
2830 fprintf(stderr,"Error: querying schema information\n");
2831 rc = 1;
2832 }else{
2833 rc = 0;
drh75897232000-05-29 14:26:00 +00002834 }
2835 }else
2836
drh340f5822013-06-27 13:01:21 +00002837#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002838 /* Undocumented commands for internal testing. Subject to change
2839 ** without notice. */
2840 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2841 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2842 int i, v;
2843 for(i=1; i<nArg; i++){
2844 v = booleanValue(azArg[i]);
2845 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2846 }
2847 }
2848 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2849 int i; sqlite3_int64 v;
2850 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002851 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002852 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002853 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2854 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002855 }
2856 }
2857 }else
drh340f5822013-06-27 13:01:21 +00002858#endif
drh348d19c2013-06-03 12:47:43 +00002859
drh75897232000-05-29 14:26:00 +00002860 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002861 sqlite3_snprintf(sizeof(p->separator), p->separator,
2862 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002863 }else
2864
shanehe2aa9d72009-11-06 17:20:17 +00002865 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002866 int i;
2867 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002868 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002869 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002870 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002871 fprintf(p->out,"%9.9s: ", "nullvalue");
2872 output_c_string(p->out, p->nullvalue);
2873 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002874 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002875 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002876 fprintf(p->out,"%9.9s: ", "separator");
2877 output_c_string(p->out, p->separator);
2878 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002879 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002880 fprintf(p->out,"%9.9s: ","width");
2881 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002882 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002883 }
drhfeac5f82004-08-01 00:10:45 +00002884 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002885 }else
2886
shaneh642d8b82010-07-28 16:05:34 +00002887 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2888 p->statsOn = booleanValue(azArg[1]);
2889 }else
2890
shanehe2aa9d72009-11-06 17:20:17 +00002891 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002892 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002893 char **azResult;
drh98781232012-04-23 12:38:05 +00002894 int nRow, nAlloc;
2895 char *zSql = 0;
2896 int ii;
drh05782482013-10-24 15:20:20 +00002897 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002898 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2899 if( rc ) return rc;
2900 zSql = sqlite3_mprintf(
2901 "SELECT name FROM sqlite_master"
2902 " WHERE type IN ('table','view')"
2903 " AND name NOT LIKE 'sqlite_%%'"
2904 " AND name LIKE ?1");
2905 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2906 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2907 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2908 if( strcmp(zDbName,"temp")==0 ){
2909 zSql = sqlite3_mprintf(
2910 "%z UNION ALL "
2911 "SELECT 'temp.' || name FROM sqlite_temp_master"
2912 " WHERE type IN ('table','view')"
2913 " AND name NOT LIKE 'sqlite_%%'"
2914 " AND name LIKE ?1", zSql);
2915 }else{
2916 zSql = sqlite3_mprintf(
2917 "%z UNION ALL "
2918 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2919 " WHERE type IN ('table','view')"
2920 " AND name NOT LIKE 'sqlite_%%'"
2921 " AND name LIKE ?1", zSql, zDbName, zDbName);
2922 }
drha50da102000-08-08 20:19:09 +00002923 }
drh98781232012-04-23 12:38:05 +00002924 sqlite3_finalize(pStmt);
2925 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2926 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2927 sqlite3_free(zSql);
2928 if( rc ) return rc;
2929 nRow = nAlloc = 0;
2930 azResult = 0;
2931 if( nArg>1 ){
2932 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002933 }else{
drh98781232012-04-23 12:38:05 +00002934 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2935 }
2936 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2937 if( nRow>=nAlloc ){
2938 char **azNew;
2939 int n = nAlloc*2 + 10;
2940 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2941 if( azNew==0 ){
2942 fprintf(stderr, "Error: out of memory\n");
2943 break;
2944 }
2945 nAlloc = n;
2946 azResult = azNew;
2947 }
2948 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2949 if( azResult[nRow] ) nRow++;
2950 }
2951 sqlite3_finalize(pStmt);
2952 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002953 int len, maxlen = 0;
2954 int i, j;
2955 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002956 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002957 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002958 if( len>maxlen ) maxlen = len;
2959 }
2960 nPrintCol = 80/(maxlen+2);
2961 if( nPrintCol<1 ) nPrintCol = 1;
2962 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2963 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002964 for(j=i; j<nRow; j+=nPrintRow){
2965 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002966 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002967 }
drh151b7d52013-05-06 20:28:54 +00002968 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002969 }
2970 }
drh98781232012-04-23 12:38:05 +00002971 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2972 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002973 }else
2974
shaneh96887e12011-02-10 21:08:58 +00002975 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002976 static const struct {
2977 const char *zCtrlName; /* Name of a test-control option */
2978 int ctrlCode; /* Integer code for that option */
2979 } aCtrl[] = {
2980 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2981 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2982 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2983 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2984 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2985 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2986 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2987 { "assert", SQLITE_TESTCTRL_ASSERT },
2988 { "always", SQLITE_TESTCTRL_ALWAYS },
2989 { "reserve", SQLITE_TESTCTRL_RESERVE },
2990 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2991 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002992 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2993 };
shaneh96887e12011-02-10 21:08:58 +00002994 int testctrl = -1;
2995 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002996 int i, n;
drh05782482013-10-24 15:20:20 +00002997 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00002998
drhd416fe72011-03-17 16:45:50 +00002999 /* convert testctrl text option to value. allow any unique prefix
3000 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003001 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003002 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003003 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3004 if( testctrl<0 ){
3005 testctrl = aCtrl[i].ctrlCode;
3006 }else{
drhb07028f2011-10-14 21:49:18 +00003007 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003008 testctrl = -1;
3009 break;
3010 }
3011 }
3012 }
drh348d19c2013-06-03 12:47:43 +00003013 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003014 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3015 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3016 }else{
3017 switch(testctrl){
3018
3019 /* sqlite3_test_control(int, db, int) */
3020 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3021 case SQLITE_TESTCTRL_RESERVE:
3022 if( nArg==3 ){
3023 int opt = (int)strtol(azArg[2], 0, 0);
3024 rc = sqlite3_test_control(testctrl, p->db, 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 int option\n",
3028 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003029 }
3030 break;
3031
3032 /* sqlite3_test_control(int) */
3033 case SQLITE_TESTCTRL_PRNG_SAVE:
3034 case SQLITE_TESTCTRL_PRNG_RESTORE:
3035 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003036 if( nArg==2 ){
3037 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003038 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003039 } else {
3040 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3041 }
3042 break;
3043
3044 /* sqlite3_test_control(int, uint) */
3045 case SQLITE_TESTCTRL_PENDING_BYTE:
3046 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003047 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003048 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003049 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003050 } else {
drhd416fe72011-03-17 16:45:50 +00003051 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3052 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003053 }
3054 break;
3055
3056 /* sqlite3_test_control(int, int) */
3057 case SQLITE_TESTCTRL_ASSERT:
3058 case SQLITE_TESTCTRL_ALWAYS:
3059 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003060 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003061 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003062 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003063 } else {
drhd416fe72011-03-17 16:45:50 +00003064 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3065 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003066 }
3067 break;
3068
3069 /* sqlite3_test_control(int, char *) */
3070#ifdef SQLITE_N_KEYWORD
3071 case SQLITE_TESTCTRL_ISKEYWORD:
3072 if( nArg==3 ){
3073 const char *opt = azArg[2];
3074 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003075 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003076 } else {
drhd416fe72011-03-17 16:45:50 +00003077 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3078 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003079 }
3080 break;
3081#endif
3082
3083 case SQLITE_TESTCTRL_BITVEC_TEST:
3084 case SQLITE_TESTCTRL_FAULT_INSTALL:
3085 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3086 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3087 default:
drhd416fe72011-03-17 16:45:50 +00003088 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3089 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003090 break;
3091 }
3092 }
3093 }else
3094
shanehe2aa9d72009-11-06 17:20:17 +00003095 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003096 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003097 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003098 }else
3099
drhd416fe72011-03-17 16:45:50 +00003100 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3101 && nArg==2
3102 ){
drh3b1a9882007-11-02 12:53:03 +00003103 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003104 }else
3105
drh42f64e52012-04-04 16:56:23 +00003106 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003107 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003108 output_file_close(p->traceOut);
3109 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003110#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003111 if( p->traceOut==0 ){
3112 sqlite3_trace(p->db, 0, 0);
3113 }else{
3114 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3115 }
3116#endif
3117 }else
3118
drh9fd301b2011-06-03 13:28:22 +00003119 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003120 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003121 sqlite3_libversion(), sqlite3_sourceid());
3122 }else
3123
drhde60fc22011-12-14 17:53:36 +00003124 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3125 const char *zDbName = nArg==2 ? azArg[1] : "main";
3126 char *zVfsName = 0;
3127 if( p->db ){
3128 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3129 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003130 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003131 sqlite3_free(zVfsName);
3132 }
3133 }
3134 }else
3135
drhcef4fc82012-09-21 22:50:45 +00003136#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3137 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3138 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003139 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003140 }else
3141#endif
3142
shanehe2aa9d72009-11-06 17:20:17 +00003143 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003144 int j;
drh43617e92006-03-06 20:55:46 +00003145 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003146 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003147 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003148 }
3149 }else
3150
3151 {
shane9bd1b442009-10-23 01:27:39 +00003152 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003153 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003154 rc = 1;
drh75897232000-05-29 14:26:00 +00003155 }
drh67505e72002-04-19 12:34:06 +00003156
3157 return rc;
drh75897232000-05-29 14:26:00 +00003158}
3159
drh67505e72002-04-19 12:34:06 +00003160/*
drh91a66392007-09-07 01:12:32 +00003161** Return TRUE if a semicolon occurs anywhere in the first N characters
3162** of string z[].
drh324ccef2003-02-05 14:06:20 +00003163*/
drh9f099fd2013-08-06 14:01:46 +00003164static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003165 int i;
3166 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3167 return 0;
drh324ccef2003-02-05 14:06:20 +00003168}
3169
3170/*
drh70c7a4b2003-04-26 03:03:06 +00003171** Test to see if a line consists entirely of whitespace.
3172*/
3173static int _all_whitespace(const char *z){
3174 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003175 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003176 if( *z=='/' && z[1]=='*' ){
3177 z += 2;
3178 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3179 if( *z==0 ) return 0;
3180 z++;
3181 continue;
3182 }
3183 if( *z=='-' && z[1]=='-' ){
3184 z += 2;
3185 while( *z && *z!='\n' ){ z++; }
3186 if( *z==0 ) return 1;
3187 continue;
3188 }
3189 return 0;
3190 }
3191 return 1;
3192}
3193
3194/*
drha9b17162003-04-29 18:01:28 +00003195** Return TRUE if the line typed in is an SQL command terminator other
3196** than a semi-colon. The SQL Server style "go" command is understood
3197** as is the Oracle "/".
3198*/
drh9f099fd2013-08-06 14:01:46 +00003199static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003200 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003201 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3202 return 1; /* Oracle */
3203 }
drhf0693c82011-10-11 20:41:54 +00003204 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003205 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003206 return 1; /* SQL Server */
3207 }
3208 return 0;
3209}
3210
3211/*
drh233a5312008-12-18 22:25:13 +00003212** Return true if zSql is a complete SQL statement. Return false if it
3213** ends in the middle of a string literal or C-style comment.
3214*/
drh9f099fd2013-08-06 14:01:46 +00003215static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003216 int rc;
3217 if( zSql==0 ) return 1;
3218 zSql[nSql] = ';';
3219 zSql[nSql+1] = 0;
3220 rc = sqlite3_complete(zSql);
3221 zSql[nSql] = 0;
3222 return rc;
3223}
3224
3225/*
drh67505e72002-04-19 12:34:06 +00003226** Read input from *in and process it. If *in==0 then input
3227** is interactive - the user is typing it it. Otherwise, input
3228** is coming from a file or device. A prompt is issued and history
3229** is saved only if input is interactive. An interrupt signal will
3230** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003231**
3232** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003233*/
drhc28490c2006-10-26 14:25:58 +00003234static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003235 char *zLine = 0; /* A single input line */
3236 char *zSql = 0; /* Accumulated SQL text */
3237 int nLine; /* Length of current line */
3238 int nSql = 0; /* Bytes of zSql[] used */
3239 int nAlloc = 0; /* Allocated zSql[] space */
3240 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3241 char *zErrMsg; /* Error message returned */
3242 int rc; /* Error code */
3243 int errCnt = 0; /* Number of errors seen */
3244 int lineno = 0; /* Current line number */
3245 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003246
3247 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3248 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003249 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003250 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003251 /* End of input */
3252 if( stdin_is_interactive ) printf("\n");
3253 break;
drhc49f44e2006-10-26 18:15:42 +00003254 }
drh67505e72002-04-19 12:34:06 +00003255 if( seenInterrupt ){
3256 if( in!=0 ) break;
3257 seenInterrupt = 0;
3258 }
drhc28490c2006-10-26 14:25:58 +00003259 lineno++;
drh849a9d92013-12-21 15:46:06 +00003260 if( nSql==0 && _all_whitespace(zLine) ){
3261 if( p->echoOn ) printf("%s\n", zLine);
3262 continue;
3263 }
drh2af0b2d2002-02-21 02:25:02 +00003264 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003265 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003266 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003267 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003268 break;
3269 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003270 errCnt++;
3271 }
drhdaffd0e2001-04-11 14:28:42 +00003272 continue;
3273 }
drh9f099fd2013-08-06 14:01:46 +00003274 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003275 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003276 }
drh9f099fd2013-08-06 14:01:46 +00003277 nLine = strlen30(zLine);
3278 if( nSql+nLine+2>=nAlloc ){
3279 nAlloc = nSql+nLine+100;
3280 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003281 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003282 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003283 exit(1);
3284 }
drhdaffd0e2001-04-11 14:28:42 +00003285 }
drh9f099fd2013-08-06 14:01:46 +00003286 nSqlPrior = nSql;
3287 if( nSql==0 ){
3288 int i;
3289 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003290 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003291 memcpy(zSql, zLine+i, nLine+1-i);
3292 startline = lineno;
3293 nSql = nLine-i;
3294 }else{
3295 zSql[nSql++] = '\n';
3296 memcpy(zSql+nSql, zLine, nLine+1);
3297 nSql += nLine;
3298 }
3299 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003300 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003301 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003302 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003303 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003304 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003305 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003306 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003307 char zPrefix[100];
3308 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003309 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003310 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003311 }else{
shane9bd1b442009-10-23 01:27:39 +00003312 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003313 }
drh7f953e22002-07-13 17:33:45 +00003314 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003315 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003316 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003317 zErrMsg = 0;
3318 }else{
shaned2bed1c2009-10-21 03:56:54 +00003319 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003320 }
drhc49f44e2006-10-26 18:15:42 +00003321 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003322 }
drhdaffd0e2001-04-11 14:28:42 +00003323 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003324 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003325 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003326 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003327 }
3328 }
drh9f099fd2013-08-06 14:01:46 +00003329 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003330 if( !_all_whitespace(zSql) ){
3331 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3332 }
drhdaffd0e2001-04-11 14:28:42 +00003333 free(zSql);
3334 }
danielk19772ac27622007-07-03 05:31:16 +00003335 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003336 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003337}
3338
drh67505e72002-04-19 12:34:06 +00003339/*
3340** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003341** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003342*/
3343static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003344 static char *home_dir = NULL;
3345 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003346
drh83905c92012-06-21 13:00:37 +00003347#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003348 {
3349 struct passwd *pwent;
3350 uid_t uid = getuid();
3351 if( (pwent=getpwuid(uid)) != NULL) {
3352 home_dir = pwent->pw_dir;
3353 }
drh67505e72002-04-19 12:34:06 +00003354 }
3355#endif
3356
chw65d3c132007-11-12 21:09:10 +00003357#if defined(_WIN32_WCE)
3358 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3359 */
drh85e72432012-04-11 11:38:53 +00003360 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003361#else
3362
drh83905c92012-06-21 13:00:37 +00003363#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003364 if (!home_dir) {
3365 home_dir = getenv("USERPROFILE");
3366 }
3367#endif
3368
drh67505e72002-04-19 12:34:06 +00003369 if (!home_dir) {
3370 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003371 }
3372
drh83905c92012-06-21 13:00:37 +00003373#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003374 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003375 char *zDrive, *zPath;
3376 int n;
3377 zDrive = getenv("HOMEDRIVE");
3378 zPath = getenv("HOMEPATH");
3379 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003380 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003381 home_dir = malloc( n );
3382 if( home_dir==0 ) return 0;
3383 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3384 return home_dir;
3385 }
3386 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003387 }
3388#endif
3389
chw65d3c132007-11-12 21:09:10 +00003390#endif /* !_WIN32_WCE */
3391
drh67505e72002-04-19 12:34:06 +00003392 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003393 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003394 char *z = malloc( n );
3395 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003396 home_dir = z;
3397 }
drhe98d4fa2002-04-21 19:06:22 +00003398
drh67505e72002-04-19 12:34:06 +00003399 return home_dir;
3400}
3401
3402/*
3403** Read input from the file given by sqliterc_override. Or if that
3404** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003405**
3406** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003407*/
shane9bd1b442009-10-23 01:27:39 +00003408static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003409 struct callback_data *p, /* Configuration data */
3410 const char *sqliterc_override /* Name of config file. NULL to use default */
3411){
persicom7e2dfdd2002-04-18 02:46:52 +00003412 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003413 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003414 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003415 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003416 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003417
3418 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003419 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003420 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003421#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003422 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003423#endif
shane9bd1b442009-10-23 01:27:39 +00003424 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003425 }
drh2f3de322012-06-27 16:41:31 +00003426 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003427 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3428 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003429 }
drha1f9b5e2004-02-14 16:31:02 +00003430 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003431 if( in ){
drhc28490c2006-10-26 14:25:58 +00003432 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003433 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003434 }
shane9bd1b442009-10-23 01:27:39 +00003435 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003436 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003437 }
drh85e72432012-04-11 11:38:53 +00003438 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003439 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003440}
3441
drh67505e72002-04-19 12:34:06 +00003442/*
drhe1e38c42003-05-04 18:30:59 +00003443** Show available command line options
3444*/
3445static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003446 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003447 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003448 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003449 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003450 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003451 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003452 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003453 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003454#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3455 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3456#endif
drhcc3b4f82012-02-07 14:13:50 +00003457 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003458 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003459 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003460 " -line set output mode to 'line'\n"
3461 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003462 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003463#ifdef SQLITE_ENABLE_MULTIPLEX
3464 " -multiplex enable the multiplexor VFS\n"
3465#endif
drh98d312f2012-10-25 15:23:14 +00003466 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3467 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003468 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003469 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003470 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003471#ifdef SQLITE_ENABLE_VFSTRACE
3472 " -vfstrace enable tracing of all VFS calls\n"
3473#endif
drhe1e38c42003-05-04 18:30:59 +00003474;
3475static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003476 fprintf(stderr,
3477 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3478 "FILENAME is the name of an SQLite database. A new database is created\n"
3479 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003480 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003481 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003482 }else{
3483 fprintf(stderr, "Use the -help option for additional information\n");
3484 }
3485 exit(1);
3486}
3487
3488/*
drh67505e72002-04-19 12:34:06 +00003489** Initialize the state information in data
3490*/
drh0850b532006-01-31 19:31:43 +00003491static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003492 memset(data, 0, sizeof(*data));
3493 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003494 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003495 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003496 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003497 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003498 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3499 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003500 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003501}
3502
drh98d312f2012-10-25 15:23:14 +00003503/*
3504** Get the argument to an --option. Throw an error and die if no argument
3505** is available.
3506*/
3507static char *cmdline_option_value(int argc, char **argv, int i){
3508 if( i==argc ){
3509 fprintf(stderr, "%s: Error: missing argument to %s\n",
3510 argv[0], argv[argc-1]);
3511 exit(1);
3512 }
3513 return argv[i];
3514}
3515
drh75897232000-05-29 14:26:00 +00003516int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003517 char *zErrMsg = 0;
3518 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003519 const char *zInitFile = 0;
3520 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003521 int i;
drhc28490c2006-10-26 14:25:58 +00003522 int rc = 0;
drh75897232000-05-29 14:26:00 +00003523
drh52784bd2011-05-18 17:15:06 +00003524 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3525 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3526 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3527 exit(1);
3528 }
drhdaffd0e2001-04-11 14:28:42 +00003529 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003530 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003531 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003532
drh44c2eb12003-04-30 11:38:26 +00003533 /* Make sure we have a valid signal handler early, before anything
3534 ** else is done.
3535 */
drh4c504392000-10-16 22:06:40 +00003536#ifdef SIGINT
3537 signal(SIGINT, interrupt_handler);
3538#endif
drh44c2eb12003-04-30 11:38:26 +00003539
drh22fbcb82004-02-01 01:22:50 +00003540 /* Do an initial pass through the command-line argument to locate
3541 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003542 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003543 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003544 */
drh98d312f2012-10-25 15:23:14 +00003545 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003546 char *z;
drhc28490c2006-10-26 14:25:58 +00003547 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003548 if( z[0]!='-' ){
3549 if( data.zDbFilename==0 ){
3550 data.zDbFilename = z;
3551 continue;
3552 }
3553 if( zFirstCmd==0 ){
3554 zFirstCmd = z;
3555 continue;
3556 }
3557 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3558 fprintf(stderr,"Use -help for a list of options.\n");
3559 return 1;
3560 }
drhcc3b4f82012-02-07 14:13:50 +00003561 if( z[1]=='-' ) z++;
3562 if( strcmp(z,"-separator")==0
3563 || strcmp(z,"-nullvalue")==0
3564 || strcmp(z,"-cmd")==0
3565 ){
drh98d312f2012-10-25 15:23:14 +00003566 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003567 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003568 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003569 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003570 /* Need to check for batch mode here to so we can avoid printing
3571 ** informational messages (like from process_sqliterc) before
3572 ** we do the actual processing of arguments later in a second pass.
3573 */
shanef69573d2009-10-24 02:06:14 +00003574 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003575 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003576#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003577 const char *zSize;
3578 sqlite3_int64 szHeap;
3579
drh98d312f2012-10-25 15:23:14 +00003580 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003581 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003582 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003583 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3584#endif
drh97ae8ff2011-03-16 16:56:29 +00003585#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003586 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003587 extern int vfstrace_register(
3588 const char *zTraceName,
3589 const char *zOldVfsName,
3590 int (*xOut)(const char*,void*),
3591 void *pOutArg,
3592 int makeDefault
3593 );
drh2b625e22011-03-16 17:05:28 +00003594 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003595#endif
drh6f25e892011-07-08 17:02:57 +00003596#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003597 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003598 extern int sqlite3_multiple_initialize(const char*,int);
3599 sqlite3_multiplex_initialize(0, 1);
3600#endif
drh7d9f3942013-04-03 01:26:54 +00003601 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003602 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3603 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003604 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003605 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003606 if( pVfs ){
3607 sqlite3_vfs_register(pVfs, 1);
3608 }else{
3609 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3610 exit(1);
3611 }
drh44c2eb12003-04-30 11:38:26 +00003612 }
3613 }
drh98d312f2012-10-25 15:23:14 +00003614 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003615#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003616 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003617#else
shane86f5bdb2009-10-24 02:00:07 +00003618 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3619 return 1;
drh01b41712005-08-29 23:06:23 +00003620#endif
drh98d312f2012-10-25 15:23:14 +00003621 }
3622 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003623
drh44c2eb12003-04-30 11:38:26 +00003624 /* Go ahead and open the database file if it already exists. If the
3625 ** file does not exist, delay opening it. This prevents empty database
3626 ** files from being created if a user mistypes the database name argument
3627 ** to the sqlite command-line tool.
3628 */
drhc8d74412004-08-31 23:41:26 +00003629 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003630 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003631 }
3632
drh22fbcb82004-02-01 01:22:50 +00003633 /* Process the initialization file if there is one. If no -init option
3634 ** is given on the command line, look for a file named ~/.sqliterc and
3635 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003636 */
shane86f5bdb2009-10-24 02:00:07 +00003637 rc = process_sqliterc(&data,zInitFile);
3638 if( rc>0 ){
3639 return rc;
3640 }
drh44c2eb12003-04-30 11:38:26 +00003641
drh22fbcb82004-02-01 01:22:50 +00003642 /* Make a second pass through the command-line argument and set
3643 ** options. This second pass is delayed until after the initialization
3644 ** file is processed so that the command-line arguments will override
3645 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003646 */
drh98d312f2012-10-25 15:23:14 +00003647 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003648 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003649 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003650 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003651 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003652 i++;
3653 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003654 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003655 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003656 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003657 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003658 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003659 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003660 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003661 }else if( strcmp(z,"-csv")==0 ){
3662 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003663 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003664 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003665 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003666 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003667 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003668 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003669 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003670 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003671 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003672 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003673 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003674 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003675 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003676 }else if( strcmp(z,"-stats")==0 ){
3677 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003678 }else if( strcmp(z,"-bail")==0 ){
3679 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003680 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003681 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003682 return 0;
drhc28490c2006-10-26 14:25:58 +00003683 }else if( strcmp(z,"-interactive")==0 ){
3684 stdin_is_interactive = 1;
3685 }else if( strcmp(z,"-batch")==0 ){
3686 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003687 }else if( strcmp(z,"-heap")==0 ){
3688 i++;
drh7d9f3942013-04-03 01:26:54 +00003689 }else if( strcmp(z,"-mmap")==0 ){
3690 i++;
drha7e61d82011-03-12 17:02:57 +00003691 }else if( strcmp(z,"-vfs")==0 ){
3692 i++;
drh6f25e892011-07-08 17:02:57 +00003693#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003694 }else if( strcmp(z,"-vfstrace")==0 ){
3695 i++;
drh6f25e892011-07-08 17:02:57 +00003696#endif
3697#ifdef SQLITE_ENABLE_MULTIPLEX
3698 }else if( strcmp(z,"-multiplex")==0 ){
3699 i++;
3700#endif
drhcc3b4f82012-02-07 14:13:50 +00003701 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003702 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003703 }else if( strcmp(z,"-cmd")==0 ){
3704 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003705 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003706 if( z[0]=='.' ){
3707 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003708 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003709 }else{
drh05782482013-10-24 15:20:20 +00003710 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003711 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3712 if( zErrMsg!=0 ){
3713 fprintf(stderr,"Error: %s\n", zErrMsg);
3714 if( bail_on_error ) return rc!=0 ? rc : 1;
3715 }else if( rc!=0 ){
3716 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3717 if( bail_on_error ) return rc;
3718 }
3719 }
drh1e5d0e92000-05-31 23:33:17 +00003720 }else{
shane86f5bdb2009-10-24 02:00:07 +00003721 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003722 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003723 return 1;
3724 }
3725 }
drh44c2eb12003-04-30 11:38:26 +00003726
drh22fbcb82004-02-01 01:22:50 +00003727 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003728 /* Run just the command that follows the database name
3729 */
drh22fbcb82004-02-01 01:22:50 +00003730 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003731 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003732 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003733 }else{
drh05782482013-10-24 15:20:20 +00003734 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003735 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003736 if( zErrMsg!=0 ){
3737 fprintf(stderr,"Error: %s\n", zErrMsg);
3738 return rc!=0 ? rc : 1;
3739 }else if( rc!=0 ){
3740 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3741 return rc;
drh6ff13852001-11-25 13:18:23 +00003742 }
drh75897232000-05-29 14:26:00 +00003743 }
3744 }else{
drh44c2eb12003-04-30 11:38:26 +00003745 /* Run commands received from standard input
3746 */
drhc28490c2006-10-26 14:25:58 +00003747 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003748 char *zHome;
3749 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003750 int nHistory;
drh75897232000-05-29 14:26:00 +00003751 printf(
drh743e0032011-12-12 16:51:50 +00003752 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003753 "Enter \".help\" for instructions\n"
3754 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003755 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003756 );
drh67505e72002-04-19 12:34:06 +00003757 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003758 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003759 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003760 if( (zHistory = malloc(nHistory))!=0 ){
3761 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3762 }
drh67505e72002-04-19 12:34:06 +00003763 }
danielk19774af00c62005-01-23 23:43:21 +00003764#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003765 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003766#endif
drhc28490c2006-10-26 14:25:58 +00003767 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003768 if( zHistory ){
3769 stifle_history(100);
3770 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003771 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003772 }
drhdaffd0e2001-04-11 14:28:42 +00003773 }else{
drhc28490c2006-10-26 14:25:58 +00003774 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003775 }
3776 }
drh33048c02001-10-01 14:29:22 +00003777 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003778 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003779 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003780 }
drh05782482013-10-24 15:20:20 +00003781 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003782 return rc;
drh75897232000-05-29 14:26:00 +00003783}