blob: 6485fad7b92c1deb50448b644e3b50b0a5c2f382 [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[] */
drh75897232000-05-29 14:26:00 +0000469};
470
471/*
472** These are the allowed modes.
473*/
drh967e8b72000-06-21 13:59:10 +0000474#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000475#define MODE_Column 1 /* One record per line in neat columns */
476#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000477#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
478#define MODE_Html 4 /* Generate an XHTML table */
479#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000480#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000481#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000482#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000483
drh66ce4d02008-02-15 17:38:06 +0000484static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000485 "line",
486 "column",
487 "list",
488 "semi",
489 "html",
drhfeac5f82004-08-01 00:10:45 +0000490 "insert",
491 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000492 "csv",
drh66ce4d02008-02-15 17:38:06 +0000493 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000494};
drh75897232000-05-29 14:26:00 +0000495
496/*
497** Number of elements in an array
498*/
drh902b9ee2008-12-05 17:17:07 +0000499#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000500
501/*
drhea678832008-12-10 19:26:22 +0000502** Compute a string length that is limited to what can be stored in
503** lower 30 bits of a 32-bit signed integer.
504*/
drh4f21c4a2008-12-10 22:15:00 +0000505static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000506 const char *z2 = z;
507 while( *z2 ){ z2++; }
508 return 0x3fffffff & (int)(z2 - z);
509}
510
511/*
drh127f9d72010-02-23 01:47:00 +0000512** A callback for the sqlite3_log() interface.
513*/
514static void shellLog(void *pArg, int iErrCode, const char *zMsg){
515 struct callback_data *p = (struct callback_data*)pArg;
516 if( p->pLog==0 ) return;
517 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
518 fflush(p->pLog);
519}
520
521/*
shane626a6e42009-10-22 17:30:15 +0000522** Output the given string as a hex-encoded blob (eg. X'1234' )
523*/
524static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
525 int i;
526 char *zBlob = (char *)pBlob;
527 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000528 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000529 fprintf(out,"'");
530}
531
532/*
drh28bd4bc2000-06-15 15:57:22 +0000533** Output the given string as a quoted string using SQL quoting conventions.
534*/
535static void output_quoted_string(FILE *out, const char *z){
536 int i;
537 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000538 for(i=0; z[i]; i++){
539 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000540 }
541 if( nSingle==0 ){
542 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000543 }else{
544 fprintf(out,"'");
545 while( *z ){
546 for(i=0; z[i] && z[i]!='\''; i++){}
547 if( i==0 ){
548 fprintf(out,"''");
549 z++;
550 }else if( z[i]=='\'' ){
551 fprintf(out,"%.*s''",i,z);
552 z += i+1;
553 }else{
drhcd7d2732002-02-26 23:24:26 +0000554 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000555 break;
556 }
557 }
drhcd7d2732002-02-26 23:24:26 +0000558 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000559 }
560}
561
562/*
drhfeac5f82004-08-01 00:10:45 +0000563** Output the given string as a quoted according to C or TCL quoting rules.
564*/
565static void output_c_string(FILE *out, const char *z){
566 unsigned int c;
567 fputc('"', out);
568 while( (c = *(z++))!=0 ){
569 if( c=='\\' ){
570 fputc(c, out);
571 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000572 }else if( c=='"' ){
573 fputc('\\', out);
574 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000575 }else if( c=='\t' ){
576 fputc('\\', out);
577 fputc('t', out);
578 }else if( c=='\n' ){
579 fputc('\\', out);
580 fputc('n', out);
581 }else if( c=='\r' ){
582 fputc('\\', out);
583 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000584 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000585 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000586 }else{
587 fputc(c, out);
588 }
589 }
590 fputc('"', out);
591}
592
593/*
drhc08a4f12000-06-15 16:49:48 +0000594** Output the given string with characters that are special to
595** HTML escaped.
596*/
597static void output_html_string(FILE *out, const char *z){
598 int i;
599 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000600 for(i=0; z[i]
601 && z[i]!='<'
602 && z[i]!='&'
603 && z[i]!='>'
604 && z[i]!='\"'
605 && z[i]!='\'';
606 i++){}
drhc08a4f12000-06-15 16:49:48 +0000607 if( i>0 ){
608 fprintf(out,"%.*s",i,z);
609 }
610 if( z[i]=='<' ){
611 fprintf(out,"&lt;");
612 }else if( z[i]=='&' ){
613 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000614 }else if( z[i]=='>' ){
615 fprintf(out,"&gt;");
616 }else if( z[i]=='\"' ){
617 fprintf(out,"&quot;");
618 }else if( z[i]=='\'' ){
619 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000620 }else{
621 break;
622 }
623 z += i + 1;
624 }
625}
626
627/*
drhc49f44e2006-10-26 18:15:42 +0000628** If a field contains any character identified by a 1 in the following
629** array, then the string must be quoted for CSV.
630*/
631static const char needCsvQuote[] = {
632 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
633 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
634 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
635 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
636 0, 0, 0, 0, 0, 0, 0, 0, 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, 1,
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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};
649
650/*
drh8e64d1c2004-10-07 00:32:39 +0000651** Output a single term of CSV. Actually, p->separator is used for
652** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000653** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000654*/
655static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000656 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000657 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000658 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000659 }else{
drhc49f44e2006-10-26 18:15:42 +0000660 int i;
drh4f21c4a2008-12-10 22:15:00 +0000661 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000662 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000663 if( needCsvQuote[((unsigned char*)z)[i]]
664 || (z[i]==p->separator[0] &&
665 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000666 i = 0;
667 break;
668 }
669 }
670 if( i==0 ){
671 putc('"', out);
672 for(i=0; z[i]; i++){
673 if( z[i]=='"' ) putc('"', out);
674 putc(z[i], out);
675 }
676 putc('"', out);
677 }else{
678 fprintf(out, "%s", z);
679 }
drh8e64d1c2004-10-07 00:32:39 +0000680 }
681 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000682 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000683 }
684}
685
danielk19774af00c62005-01-23 23:43:21 +0000686#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000687/*
drh4c504392000-10-16 22:06:40 +0000688** This routine runs when the user presses Ctrl-C
689*/
690static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000691 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000692 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000693 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000694}
danielk19774af00c62005-01-23 23:43:21 +0000695#endif
drh4c504392000-10-16 22:06:40 +0000696
697/*
shane626a6e42009-10-22 17:30:15 +0000698** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000699** invokes for each row of a query result.
700*/
shane626a6e42009-10-22 17:30:15 +0000701static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000702 int i;
703 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000704
drh75897232000-05-29 14:26:00 +0000705 switch( p->mode ){
706 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000707 int w = 5;
drh6a535342001-10-19 16:44:56 +0000708 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000709 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000710 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000711 if( len>w ) w = len;
712 }
drh75897232000-05-29 14:26:00 +0000713 if( p->cnt++>0 ) fprintf(p->out,"\n");
714 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000715 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000716 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000717 }
718 break;
719 }
danielk19770d78bae2008-01-03 07:09:48 +0000720 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000721 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000722 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000723 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000724 int w, n;
725 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000726 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000727 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000728 w = 0;
drh75897232000-05-29 14:26:00 +0000729 }
drh078b1fd2012-09-21 13:40:02 +0000730 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000731 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000732 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000733 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000734 if( w<n ) w = n;
735 }
736 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000737 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000738 }
739 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000740 if( w<0 ){
741 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
742 }else{
743 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
744 }
drha0c66f52000-07-29 13:20:21 +0000745 }
746 }
747 if( p->showHeader ){
748 for(i=0; i<nArg; i++){
749 int w;
750 if( i<ArraySize(p->actualWidth) ){
751 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000752 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000753 }else{
754 w = 10;
755 }
756 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
757 "----------------------------------------------------------",
758 i==nArg-1 ? "\n": " ");
759 }
drh75897232000-05-29 14:26:00 +0000760 }
761 }
drh6a535342001-10-19 16:44:56 +0000762 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000763 for(i=0; i<nArg; i++){
764 int w;
drha0c66f52000-07-29 13:20:21 +0000765 if( i<ArraySize(p->actualWidth) ){
766 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000767 }else{
768 w = 10;
769 }
dana98bf362013-11-13 18:35:01 +0000770 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000771 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000772 }
dana98bf362013-11-13 18:35:01 +0000773 if( i==1 && p->aiIndent && p->pStmt ){
774 int iOp = sqlite3_column_int(p->pStmt, 0);
775 if( iOp<p->nIndent ){
776 fprintf(p->out, "%*.s", p->aiIndent[iOp], "");
777 }
778 }
drh078b1fd2012-09-21 13:40:02 +0000779 if( w<0 ){
780 fprintf(p->out,"%*.*s%s",-w,-w,
781 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
782 }else{
783 fprintf(p->out,"%-*.*s%s",w,w,
784 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
785 }
drh75897232000-05-29 14:26:00 +0000786 }
787 break;
788 }
drhe3710332000-09-29 13:30:53 +0000789 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000790 case MODE_List: {
791 if( p->cnt++==0 && p->showHeader ){
792 for(i=0; i<nArg; i++){
793 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
794 }
795 }
drh6a535342001-10-19 16:44:56 +0000796 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000797 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000798 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000799 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000800 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000801 if( i<nArg-1 ){
802 fprintf(p->out, "%s", p->separator);
803 }else if( p->mode==MODE_Semi ){
804 fprintf(p->out, ";\n");
805 }else{
806 fprintf(p->out, "\n");
807 }
drh75897232000-05-29 14:26:00 +0000808 }
809 break;
810 }
drh1e5d0e92000-05-31 23:33:17 +0000811 case MODE_Html: {
812 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000813 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000814 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000815 fprintf(p->out,"<TH>");
816 output_html_string(p->out, azCol[i]);
817 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000818 }
mihailim57c591a2008-06-23 21:26:05 +0000819 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000820 }
drh6a535342001-10-19 16:44:56 +0000821 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000822 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000823 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000825 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000826 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000827 }
mihailim57c591a2008-06-23 21:26:05 +0000828 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000829 break;
830 }
drhfeac5f82004-08-01 00:10:45 +0000831 case MODE_Tcl: {
832 if( p->cnt++==0 && p->showHeader ){
833 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000834 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000835 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000836 }
837 fprintf(p->out,"\n");
838 }
839 if( azArg==0 ) break;
840 for(i=0; i<nArg; i++){
841 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000842 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000843 }
844 fprintf(p->out,"\n");
845 break;
846 }
drh8e64d1c2004-10-07 00:32:39 +0000847 case MODE_Csv: {
848 if( p->cnt++==0 && p->showHeader ){
849 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000850 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000851 }
852 fprintf(p->out,"\n");
853 }
854 if( azArg==0 ) break;
855 for(i=0; i<nArg; i++){
856 output_csv(p, azArg[i], i<nArg-1);
857 }
858 fprintf(p->out,"\n");
859 break;
860 }
drh28bd4bc2000-06-15 15:57:22 +0000861 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000862 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000863 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000864 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000865 for(i=0; i<nArg; i++){
866 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000867 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000868 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000869 }else if( aiType && aiType[i]==SQLITE_TEXT ){
870 if( zSep[0] ) fprintf(p->out,"%s",zSep);
871 output_quoted_string(p->out, azArg[i]);
872 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
873 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000874 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
875 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
876 int nBlob = sqlite3_column_bytes(p->pStmt, i);
877 if( zSep[0] ) fprintf(p->out,"%s",zSep);
878 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000879 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000880 fprintf(p->out,"%s%s",zSep, azArg[i]);
881 }else{
882 if( zSep[0] ) fprintf(p->out,"%s",zSep);
883 output_quoted_string(p->out, azArg[i]);
884 }
885 }
886 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000887 break;
drh28bd4bc2000-06-15 15:57:22 +0000888 }
persicom1d0b8722002-04-18 02:53:04 +0000889 }
drh75897232000-05-29 14:26:00 +0000890 return 0;
891}
892
893/*
shane626a6e42009-10-22 17:30:15 +0000894** This is the callback routine that the SQLite library
895** invokes for each row of a query result.
896*/
897static int callback(void *pArg, int nArg, char **azArg, char **azCol){
898 /* since we don't have type info, call the shell_callback with a NULL value */
899 return shell_callback(pArg, nArg, azArg, azCol, NULL);
900}
901
902/*
drh33048c02001-10-01 14:29:22 +0000903** Set the destination table field of the callback_data structure to
904** the name of the table given. Escape any quote characters in the
905** table name.
906*/
907static void set_table_name(struct callback_data *p, const char *zName){
908 int i, n;
909 int needQuote;
910 char *z;
911
912 if( p->zDestTable ){
913 free(p->zDestTable);
914 p->zDestTable = 0;
915 }
916 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000917 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000918 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000919 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000920 needQuote = 1;
921 if( zName[i]=='\'' ) n++;
922 }
923 }
924 if( needQuote ) n += 2;
925 z = p->zDestTable = malloc( n+1 );
926 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000927 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000928 exit(1);
929 }
930 n = 0;
931 if( needQuote ) z[n++] = '\'';
932 for(i=0; zName[i]; i++){
933 z[n++] = zName[i];
934 if( zName[i]=='\'' ) z[n++] = '\'';
935 }
936 if( needQuote ) z[n++] = '\'';
937 z[n] = 0;
938}
939
danielk19772a02e332004-06-05 08:04:36 +0000940/* zIn is either a pointer to a NULL-terminated string in memory obtained
941** from malloc(), or a NULL pointer. The string pointed to by zAppend is
942** added to zIn, and the result returned in memory obtained from malloc().
943** zIn, if it was not NULL, is freed.
944**
945** If the third argument, quote, is not '\0', then it is used as a
946** quote character for zAppend.
947*/
drhc28490c2006-10-26 14:25:58 +0000948static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000949 int len;
950 int i;
drh4f21c4a2008-12-10 22:15:00 +0000951 int nAppend = strlen30(zAppend);
952 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000953
954 len = nAppend+nIn+1;
955 if( quote ){
956 len += 2;
957 for(i=0; i<nAppend; i++){
958 if( zAppend[i]==quote ) len++;
959 }
960 }
961
962 zIn = (char *)realloc(zIn, len);
963 if( !zIn ){
964 return 0;
965 }
966
967 if( quote ){
968 char *zCsr = &zIn[nIn];
969 *zCsr++ = quote;
970 for(i=0; i<nAppend; i++){
971 *zCsr++ = zAppend[i];
972 if( zAppend[i]==quote ) *zCsr++ = quote;
973 }
974 *zCsr++ = quote;
975 *zCsr++ = '\0';
976 assert( (zCsr-zIn)==len );
977 }else{
978 memcpy(&zIn[nIn], zAppend, nAppend);
979 zIn[len-1] = '\0';
980 }
981
982 return zIn;
983}
984
drhdd3d4592004-08-30 01:54:05 +0000985
986/*
drhb21a8e42012-01-28 21:08:51 +0000987** Execute a query statement that will generate SQL output. Print
988** the result columns, comma-separated, on a line and then add a
989** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000990**
drhb21a8e42012-01-28 21:08:51 +0000991** If the number of columns is 1 and that column contains text "--"
992** then write the semicolon on a separate line. That way, if a
993** "--" comment occurs at the end of the statement, the comment
994** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +0000995*/
drh157e29a2009-05-21 15:15:00 +0000996static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000997 struct callback_data *p, /* Query context */
998 const char *zSelect, /* SELECT statement to extract content */
999 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001000){
drhdd3d4592004-08-30 01:54:05 +00001001 sqlite3_stmt *pSelect;
1002 int rc;
drhb21a8e42012-01-28 21:08:51 +00001003 int nResult;
1004 int i;
1005 const char *z;
drh2f464a02011-10-13 00:41:49 +00001006 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001007 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001008 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001009 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001010 return rc;
1011 }
1012 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001013 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001014 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001015 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001016 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001017 zFirstRow = 0;
1018 }
drhb21a8e42012-01-28 21:08:51 +00001019 z = (const char*)sqlite3_column_text(pSelect, 0);
1020 fprintf(p->out, "%s", z);
1021 for(i=1; i<nResult; i++){
1022 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1023 }
1024 if( z==0 ) z = "";
1025 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1026 if( z[0] ){
1027 fprintf(p->out, "\n;\n");
1028 }else{
1029 fprintf(p->out, ";\n");
1030 }
drhdd3d4592004-08-30 01:54:05 +00001031 rc = sqlite3_step(pSelect);
1032 }
drh2f464a02011-10-13 00:41:49 +00001033 rc = sqlite3_finalize(pSelect);
1034 if( rc!=SQLITE_OK ){
1035 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001036 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001037 }
1038 return rc;
drhdd3d4592004-08-30 01:54:05 +00001039}
1040
shane626a6e42009-10-22 17:30:15 +00001041/*
1042** Allocate space and save off current error string.
1043*/
1044static char *save_err_msg(
1045 sqlite3 *db /* Database to query */
1046){
1047 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1048 char *zErrMsg = sqlite3_malloc(nErrMsg);
1049 if( zErrMsg ){
1050 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1051 }
1052 return zErrMsg;
1053}
1054
1055/*
shaneh642d8b82010-07-28 16:05:34 +00001056** Display memory stats.
1057*/
1058static int display_stats(
1059 sqlite3 *db, /* Database to query */
1060 struct callback_data *pArg, /* Pointer to struct callback_data */
1061 int bReset /* True to reset the stats */
1062){
1063 int iCur;
1064 int iHiwtr;
1065
1066 if( pArg && pArg->out ){
1067
1068 iHiwtr = iCur = -1;
1069 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001070 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001071 iHiwtr = iCur = -1;
1072 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001073 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001074/*
1075** Not currently used by the CLI.
1076** iHiwtr = iCur = -1;
1077** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1078** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1079*/
1080 iHiwtr = iCur = -1;
1081 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1082 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1083/*
1084** Not currently used by the CLI.
1085** iHiwtr = iCur = -1;
1086** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1087** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1088*/
1089 iHiwtr = iCur = -1;
1090 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1091 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1092 iHiwtr = iCur = -1;
1093 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1094 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1095 iHiwtr = iCur = -1;
1096 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1097 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1098 iHiwtr = iCur = -1;
1099 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1100 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1101#ifdef YYTRACKMAXSTACKDEPTH
1102 iHiwtr = iCur = -1;
1103 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1104 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1105#endif
1106 }
1107
1108 if( pArg && pArg->out && db ){
1109 iHiwtr = iCur = -1;
1110 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1111 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001112 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1113 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1114 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1116 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1117 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001118 iHiwtr = iCur = -1;
1119 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001120 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1122 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1123 iHiwtr = iCur = -1;
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1125 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001126 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001127 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1128 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1129 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001130 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1131 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1132 iHiwtr = iCur = -1;
1133 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1134 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1135 }
1136
1137 if( pArg && pArg->out && db && pArg->pStmt ){
1138 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1139 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1140 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1141 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1142 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1143 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001144 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1145 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001146 }
1147
1148 return 0;
1149}
1150
1151/*
dana98bf362013-11-13 18:35:01 +00001152** Parameter azArray points to a zero-terminated array of strings. zStr
1153** points to a single nul-terminated string. Return non-zero if zStr
1154** is equal, according to strcmp(), to any of the strings in the array.
1155** Otherwise, return zero.
1156*/
1157static int str_in_array(const char *zStr, const char **azArray){
1158 int i;
1159 for(i=0; azArray[i]; i++){
1160 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1161 }
1162 return 0;
1163}
1164
1165/*
1166** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1167** and populate the callback_data.aiIndent[] array with the number of
1168** spaces each opcode should be indented before it is output.
1169**
1170** The indenting rules are:
1171**
1172** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1173** all opcodes that occur between the p2 jump destination and the opcode
1174** itself by 2 spaces.
1175**
drh01752bc2013-11-14 23:59:33 +00001176** * For each "Goto", if the jump destination is earlier in the program
1177** and ends on one of:
1178** Yield SeekGt SeekLt RowSetRead
1179** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001180** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001181*/
1182static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1183 const char *zSql; /* The text of the SQL statement */
1184 const char *z; /* Used to check if this is an EXPLAIN */
1185 int *abYield = 0; /* True if op is an OP_Yield */
1186 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
1187 int iOp;
1188
1189 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", 0 };
drh01752bc2013-11-14 23:59:33 +00001190 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", 0 };
dana98bf362013-11-13 18:35:01 +00001191 const char *azGoto[] = { "Goto", 0 };
1192
1193 /* Try to figure out if this is really an EXPLAIN statement. If this
1194 ** cannot be verified, return early. */
1195 zSql = sqlite3_sql(pSql);
1196 if( zSql==0 ) return;
1197 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1198 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1199
1200 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1201 int i;
1202 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1203 int p2 = sqlite3_column_int(pSql, 3);
1204
1205 /* Grow the p->aiIndent array as required */
1206 if( iOp>=nAlloc ){
1207 nAlloc += 100;
1208 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1209 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1210 }
1211 abYield[iOp] = str_in_array(zOp, azYield);
1212 p->aiIndent[iOp] = 0;
1213 p->nIndent = iOp+1;
1214
1215 if( str_in_array(zOp, azNext) ){
1216 for(i=p2; i<iOp; i++) p->aiIndent[i] += 2;
1217 }
1218 if( str_in_array(zOp, azGoto) && p2<p->nIndent && abYield[p2] ){
1219 for(i=p2+1; i<iOp; i++) p->aiIndent[i] += 2;
1220 }
1221 }
1222
1223 sqlite3_free(abYield);
1224 sqlite3_reset(pSql);
1225}
1226
1227/*
1228** Free the array allocated by explain_data_prepare().
1229*/
1230static void explain_data_delete(struct callback_data *p){
1231 sqlite3_free(p->aiIndent);
1232 p->aiIndent = 0;
1233 p->nIndent = 0;
1234}
1235
1236/*
shane626a6e42009-10-22 17:30:15 +00001237** Execute a statement or set of statements. Print
1238** any result rows/columns depending on the current mode
1239** set via the supplied callback.
1240**
1241** This is very similar to SQLite's built-in sqlite3_exec()
1242** function except it takes a slightly different callback
1243** and callback data argument.
1244*/
1245static int shell_exec(
1246 sqlite3 *db, /* An open database */
1247 const char *zSql, /* SQL to be evaluated */
1248 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1249 /* (not the same as sqlite3_exec) */
1250 struct callback_data *pArg, /* Pointer to struct callback_data */
1251 char **pzErrMsg /* Error msg written here */
1252){
dan4564ced2010-01-05 04:59:56 +00001253 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1254 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001255 int rc2;
dan4564ced2010-01-05 04:59:56 +00001256 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001257
1258 if( pzErrMsg ){
1259 *pzErrMsg = NULL;
1260 }
1261
shaneb9fc17d2009-10-22 21:23:35 +00001262 while( zSql[0] && (SQLITE_OK == rc) ){
1263 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1264 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001265 if( pzErrMsg ){
1266 *pzErrMsg = save_err_msg(db);
1267 }
1268 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001269 if( !pStmt ){
1270 /* this happens for a comment or white-space */
1271 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001272 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001273 continue;
1274 }
shane626a6e42009-10-22 17:30:15 +00001275
shaneh642d8b82010-07-28 16:05:34 +00001276 /* save off the prepared statment handle and reset row count */
1277 if( pArg ){
1278 pArg->pStmt = pStmt;
1279 pArg->cnt = 0;
1280 }
1281
shanehb7977c52010-01-18 18:17:10 +00001282 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001283 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001284 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001285 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001286 }
shanehb7977c52010-01-18 18:17:10 +00001287
drh7e02e5e2011-12-06 19:44:51 +00001288 /* Output TESTCTRL_EXPLAIN text of requested */
1289 if( pArg && pArg->mode==MODE_Explain ){
1290 const char *zExplain = 0;
1291 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1292 if( zExplain && zExplain[0] ){
1293 fprintf(pArg->out, "%s", zExplain);
1294 }
1295 }
1296
dana98bf362013-11-13 18:35:01 +00001297 /* If the shell is currently in ".explain" mode, gather the extra
1298 ** data required to add indents to the output.*/
1299 if( pArg->mode==MODE_Explain ){
1300 explain_data_prepare(pArg, pStmt);
1301 }
1302
shaneb9fc17d2009-10-22 21:23:35 +00001303 /* perform the first step. this will tell us if we
1304 ** have a result set or not and how wide it is.
1305 */
1306 rc = sqlite3_step(pStmt);
1307 /* if we have a result set... */
1308 if( SQLITE_ROW == rc ){
1309 /* if we have a callback... */
1310 if( xCallback ){
1311 /* allocate space for col name ptr, value ptr, and type */
1312 int nCol = sqlite3_column_count(pStmt);
1313 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1314 if( !pData ){
1315 rc = SQLITE_NOMEM;
1316 }else{
1317 char **azCols = (char **)pData; /* Names of result columns */
1318 char **azVals = &azCols[nCol]; /* Results */
1319 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001320 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001321 assert(sizeof(int) <= sizeof(char *));
1322 /* save off ptrs to column names */
1323 for(i=0; i<nCol; i++){
1324 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1325 }
shaneb9fc17d2009-10-22 21:23:35 +00001326 do{
1327 /* extract the data and data types */
1328 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001329 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001330 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001331 azVals[i] = "";
1332 }else{
1333 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1334 }
shaneb9fc17d2009-10-22 21:23:35 +00001335 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1336 rc = SQLITE_NOMEM;
1337 break; /* from for */
1338 }
1339 } /* end for */
1340
1341 /* if data and types extracted successfully... */
1342 if( SQLITE_ROW == rc ){
1343 /* call the supplied callback with the result row data */
1344 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1345 rc = SQLITE_ABORT;
1346 }else{
1347 rc = sqlite3_step(pStmt);
1348 }
1349 }
1350 } while( SQLITE_ROW == rc );
1351 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001352 }
1353 }else{
1354 do{
1355 rc = sqlite3_step(pStmt);
1356 } while( rc == SQLITE_ROW );
1357 }
1358 }
1359
dana98bf362013-11-13 18:35:01 +00001360 explain_data_delete(pArg);
1361
shaneh642d8b82010-07-28 16:05:34 +00001362 /* print usage stats if stats on */
1363 if( pArg && pArg->statsOn ){
1364 display_stats(db, pArg, 0);
1365 }
1366
dan4564ced2010-01-05 04:59:56 +00001367 /* Finalize the statement just executed. If this fails, save a
1368 ** copy of the error message. Otherwise, set zSql to point to the
1369 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001370 rc2 = sqlite3_finalize(pStmt);
1371 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001372 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001373 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001374 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001375 }else if( pzErrMsg ){
1376 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001377 }
shaneh642d8b82010-07-28 16:05:34 +00001378
1379 /* clear saved stmt handle */
1380 if( pArg ){
1381 pArg->pStmt = NULL;
1382 }
shane626a6e42009-10-22 17:30:15 +00001383 }
shaneb9fc17d2009-10-22 21:23:35 +00001384 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001385
1386 return rc;
1387}
1388
drhdd3d4592004-08-30 01:54:05 +00001389
drh33048c02001-10-01 14:29:22 +00001390/*
drh4c653a02000-06-07 01:27:47 +00001391** This is a different callback routine used for dumping the database.
1392** Each row received by this callback consists of a table name,
1393** the table type ("index" or "table") and SQL to create the table.
1394** This routine should print text sufficient to recreate the table.
1395*/
1396static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001397 int rc;
1398 const char *zTable;
1399 const char *zType;
1400 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001401 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001402 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001403
drh902b9ee2008-12-05 17:17:07 +00001404 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001405 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001406 zTable = azArg[0];
1407 zType = azArg[1];
1408 zSql = azArg[2];
1409
drh00b950d2005-09-11 02:03:03 +00001410 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001411 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001412 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001413 fprintf(p->out, "ANALYZE sqlite_master;\n");
1414 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1415 return 0;
drh45e29d82006-11-20 16:21:10 +00001416 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1417 char *zIns;
1418 if( !p->writableSchema ){
1419 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1420 p->writableSchema = 1;
1421 }
1422 zIns = sqlite3_mprintf(
1423 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1424 "VALUES('table','%q','%q',0,'%q');",
1425 zTable, zTable, zSql);
1426 fprintf(p->out, "%s\n", zIns);
1427 sqlite3_free(zIns);
1428 return 0;
drh00b950d2005-09-11 02:03:03 +00001429 }else{
1430 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001431 }
danielk19772a02e332004-06-05 08:04:36 +00001432
1433 if( strcmp(zType, "table")==0 ){
1434 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001435 char *zSelect = 0;
1436 char *zTableInfo = 0;
1437 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001438 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001439
1440 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1441 zTableInfo = appendText(zTableInfo, zTable, '"');
1442 zTableInfo = appendText(zTableInfo, ");", 0);
1443
1444 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001445 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001446 if( rc!=SQLITE_OK || !pTableInfo ){
1447 return 1;
1448 }
1449
1450 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001451 /* Always quote the table name, even if it appears to be pure ascii,
1452 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1453 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001454 if( zTmp ){
1455 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001456 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001457 }
1458 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1459 rc = sqlite3_step(pTableInfo);
1460 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001461 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001462 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001463 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001464 rc = sqlite3_step(pTableInfo);
1465 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001466 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001467 }else{
1468 zSelect = appendText(zSelect, ") ", 0);
1469 }
drh157e29a2009-05-21 15:15:00 +00001470 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001471 }
1472 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001473 if( rc!=SQLITE_OK || nRow==0 ){
1474 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001475 return 1;
1476 }
1477 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1478 zSelect = appendText(zSelect, zTable, '"');
1479
drh2f464a02011-10-13 00:41:49 +00001480 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001481 if( rc==SQLITE_CORRUPT ){
1482 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001483 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001484 }
drh85e72432012-04-11 11:38:53 +00001485 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001486 }
drh4c653a02000-06-07 01:27:47 +00001487 return 0;
1488}
1489
1490/*
drh45e29d82006-11-20 16:21:10 +00001491** Run zQuery. Use dump_callback() as the callback routine so that
1492** the contents of the query are output as SQL statements.
1493**
drhdd3d4592004-08-30 01:54:05 +00001494** If we get a SQLITE_CORRUPT error, rerun the query after appending
1495** "ORDER BY rowid DESC" to the end.
1496*/
1497static int run_schema_dump_query(
1498 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001499 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001500){
1501 int rc;
drh2f464a02011-10-13 00:41:49 +00001502 char *zErr = 0;
1503 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001504 if( rc==SQLITE_CORRUPT ){
1505 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001506 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001507 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1508 if( zErr ){
1509 fprintf(p->out, "/****** %s ******/\n", zErr);
1510 sqlite3_free(zErr);
1511 zErr = 0;
1512 }
drhdd3d4592004-08-30 01:54:05 +00001513 zQ2 = malloc( len+100 );
1514 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001515 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001516 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1517 if( rc ){
1518 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1519 }else{
1520 rc = SQLITE_CORRUPT;
1521 }
1522 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001523 free(zQ2);
1524 }
1525 return rc;
1526}
1527
1528/*
drh75897232000-05-29 14:26:00 +00001529** Text of a help message
1530*/
persicom1d0b8722002-04-18 02:53:04 +00001531static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001532 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001533 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001534 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001535 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001536 " If TABLE specified, only dump tables matching\n"
1537 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001538 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001539 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001540 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1541 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001542 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001543 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001544 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001545 ".indices ?TABLE? Show names of all indices\n"
1546 " If TABLE specified, only show indices for tables\n"
1547 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001548#ifdef SQLITE_ENABLE_IOTRACE
1549 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1550#endif
drh70df4fe2006-06-13 15:12:21 +00001551#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001552 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001553#endif
drh127f9d72010-02-23 01:47:00 +00001554 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001555 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001556 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001557 " column Left-aligned columns. (See .width)\n"
1558 " html HTML <table> code\n"
1559 " insert SQL insert statements for TABLE\n"
1560 " line One value per line\n"
1561 " list Values delimited by .separator string\n"
1562 " tabs Tab-separated values\n"
1563 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001564 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001565 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001566 ".output FILENAME Send output to FILENAME\n"
1567 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001568 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001569 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001570 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001571 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001572 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001573 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001574 " If TABLE specified, only show tables matching\n"
1575 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001576 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001577 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001578 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001579 ".tables ?TABLE? List names of tables\n"
1580 " If TABLE specified, only list tables matching\n"
1581 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001582 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001583 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001584 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001585 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001586;
1587
shaneb320ccd2009-10-21 03:42:58 +00001588static char zTimerHelp[] =
1589 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1590;
1591
drhdaffd0e2001-04-11 14:28:42 +00001592/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001593static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001594
drh75897232000-05-29 14:26:00 +00001595/*
drh44c2eb12003-04-30 11:38:26 +00001596** Make sure the database is open. If it is not, then open it. If
1597** the database fails to open, print an error message and exit.
1598*/
drh05782482013-10-24 15:20:20 +00001599static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001600 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001601 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001602 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001603 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001604 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1605 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1606 shellstaticFunc, 0, 0);
1607 }
1608 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001609 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001610 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001611 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001612 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001613 }
drhc2e87a32006-06-27 15:16:14 +00001614#ifndef SQLITE_OMIT_LOAD_EXTENSION
1615 sqlite3_enable_load_extension(p->db, 1);
1616#endif
drh44c2eb12003-04-30 11:38:26 +00001617 }
1618}
1619
1620/*
drhfeac5f82004-08-01 00:10:45 +00001621** Do C-language style dequoting.
1622**
1623** \t -> tab
1624** \n -> newline
1625** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001626** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001627** \NNN -> ascii character NNN in octal
1628** \\ -> backslash
1629*/
1630static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001631 int i, j;
1632 char c;
drhfeac5f82004-08-01 00:10:45 +00001633 for(i=j=0; (c = z[i])!=0; i++, j++){
1634 if( c=='\\' ){
1635 c = z[++i];
1636 if( c=='n' ){
1637 c = '\n';
1638 }else if( c=='t' ){
1639 c = '\t';
1640 }else if( c=='r' ){
1641 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001642 }else if( c=='\\' ){
1643 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001644 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001645 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001646 if( z[i+1]>='0' && z[i+1]<='7' ){
1647 i++;
1648 c = (c<<3) + z[i] - '0';
1649 if( z[i+1]>='0' && z[i+1]<='7' ){
1650 i++;
1651 c = (c<<3) + z[i] - '0';
1652 }
1653 }
1654 }
1655 }
1656 z[j] = c;
1657 }
1658 z[j] = 0;
1659}
1660
1661/*
drh348d19c2013-06-03 12:47:43 +00001662** Return the value of a hexadecimal digit. Return -1 if the input
1663** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001664*/
drh348d19c2013-06-03 12:47:43 +00001665static int hexDigitValue(char c){
1666 if( c>='0' && c<='9' ) return c - '0';
1667 if( c>='a' && c<='f' ) return c - 'a' + 10;
1668 if( c>='A' && c<='F' ) return c - 'A' + 10;
1669 return -1;
drhc28490c2006-10-26 14:25:58 +00001670}
1671
1672/*
drh7d9f3942013-04-03 01:26:54 +00001673** Interpret zArg as an integer value, possibly with suffixes.
1674*/
1675static sqlite3_int64 integerValue(const char *zArg){
1676 sqlite3_int64 v = 0;
1677 static const struct { char *zSuffix; int iMult; } aMult[] = {
1678 { "KiB", 1024 },
1679 { "MiB", 1024*1024 },
1680 { "GiB", 1024*1024*1024 },
1681 { "KB", 1000 },
1682 { "MB", 1000000 },
1683 { "GB", 1000000000 },
1684 { "K", 1000 },
1685 { "M", 1000000 },
1686 { "G", 1000000000 },
1687 };
1688 int i;
1689 int isNeg = 0;
1690 if( zArg[0]=='-' ){
1691 isNeg = 1;
1692 zArg++;
1693 }else if( zArg[0]=='+' ){
1694 zArg++;
1695 }
drh348d19c2013-06-03 12:47:43 +00001696 if( zArg[0]=='0' && zArg[1]=='x' ){
1697 int x;
1698 zArg += 2;
1699 while( (x = hexDigitValue(zArg[0]))>=0 ){
1700 v = (v<<4) + x;
1701 zArg++;
1702 }
1703 }else{
1704 while( IsDigit(zArg[0]) ){
1705 v = v*10 + zArg[0] - '0';
1706 zArg++;
1707 }
drh7d9f3942013-04-03 01:26:54 +00001708 }
drhc2bed0a2013-05-24 11:57:50 +00001709 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001710 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1711 v *= aMult[i].iMult;
1712 break;
1713 }
1714 }
1715 return isNeg? -v : v;
1716}
1717
1718/*
drh348d19c2013-06-03 12:47:43 +00001719** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1720** for TRUE and FALSE. Return the integer value if appropriate.
1721*/
1722static int booleanValue(char *zArg){
1723 int i;
1724 if( zArg[0]=='0' && zArg[1]=='x' ){
1725 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1726 }else{
1727 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1728 }
1729 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1730 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1731 return 1;
1732 }
1733 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1734 return 0;
1735 }
1736 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1737 zArg);
1738 return 0;
1739}
1740
1741/*
drh42f64e52012-04-04 16:56:23 +00001742** Close an output file, assuming it is not stderr or stdout
1743*/
1744static void output_file_close(FILE *f){
1745 if( f && f!=stdout && f!=stderr ) fclose(f);
1746}
1747
1748/*
1749** Try to open an output file. The names "stdout" and "stderr" are
1750** recognized and do the right thing. NULL is returned if the output
1751** filename is "off".
1752*/
1753static FILE *output_file_open(const char *zFile){
1754 FILE *f;
1755 if( strcmp(zFile,"stdout")==0 ){
1756 f = stdout;
1757 }else if( strcmp(zFile, "stderr")==0 ){
1758 f = stderr;
1759 }else if( strcmp(zFile, "off")==0 ){
1760 f = 0;
1761 }else{
1762 f = fopen(zFile, "wb");
1763 if( f==0 ){
1764 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1765 }
1766 }
1767 return f;
1768}
1769
1770/*
1771** A routine for handling output from sqlite3_trace().
1772*/
1773static void sql_trace_callback(void *pArg, const char *z){
1774 FILE *f = (FILE*)pArg;
1775 if( f ) fprintf(f, "%s\n", z);
1776}
1777
1778/*
drhd8621b92012-04-17 09:09:33 +00001779** A no-op routine that runs with the ".breakpoint" doc-command. This is
1780** a useful spot to set a debugger breakpoint.
1781*/
1782static void test_breakpoint(void){
1783 static int nCall = 0;
1784 nCall++;
1785}
1786
1787/*
drhdb95f682013-06-26 22:46:00 +00001788** An object used to read a CSV file
1789*/
1790typedef struct CSVReader CSVReader;
1791struct CSVReader {
1792 const char *zFile; /* Name of the input file */
1793 FILE *in; /* Read the CSV text from this input stream */
1794 char *z; /* Accumulated text for a field */
1795 int n; /* Number of bytes in z */
1796 int nAlloc; /* Space allocated for z[] */
1797 int nLine; /* Current line number */
1798 int cTerm; /* Character that terminated the most recent field */
1799 int cSeparator; /* The separator character. (Usually ",") */
1800};
1801
1802/* Append a single byte to z[] */
1803static void csv_append_char(CSVReader *p, int c){
1804 if( p->n+1>=p->nAlloc ){
1805 p->nAlloc += p->nAlloc + 100;
1806 p->z = sqlite3_realloc(p->z, p->nAlloc);
1807 if( p->z==0 ){
1808 fprintf(stderr, "out of memory\n");
1809 exit(1);
1810 }
1811 }
1812 p->z[p->n++] = (char)c;
1813}
1814
1815/* Read a single field of CSV text. Compatible with rfc4180 and extended
1816** with the option of having a separator other than ",".
1817**
1818** + Input comes from p->in.
1819** + Store results in p->z of length p->n. Space to hold p->z comes
1820** from sqlite3_malloc().
1821** + Use p->cSep as the separator. The default is ",".
1822** + Keep track of the line number in p->nLine.
1823** + Store the character that terminates the field in p->cTerm. Store
1824** EOF on end-of-file.
1825** + Report syntax errors on stderr
1826*/
1827static char *csv_read_one_field(CSVReader *p){
1828 int c, pc;
1829 int cSep = p->cSeparator;
1830 p->n = 0;
1831 c = fgetc(p->in);
1832 if( c==EOF || seenInterrupt ){
1833 p->cTerm = EOF;
1834 return 0;
1835 }
1836 if( c=='"' ){
1837 int startLine = p->nLine;
1838 int cQuote = c;
1839 pc = 0;
1840 while( 1 ){
1841 c = fgetc(p->in);
1842 if( c=='\n' ) p->nLine++;
1843 if( c==cQuote ){
1844 if( pc==cQuote ){
1845 pc = 0;
1846 continue;
1847 }
1848 }
1849 if( (c==cSep && pc==cQuote)
1850 || (c=='\n' && pc==cQuote)
drh868ccf22013-08-28 13:33:40 +00001851 || (c=='\n' && pc=='\r' && p->n>=2 && p->z[p->n-2]==cQuote)
drhdb95f682013-06-26 22:46:00 +00001852 || (c==EOF && pc==cQuote)
1853 ){
1854 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001855 p->cTerm = c;
1856 break;
1857 }
1858 if( pc==cQuote && c!='\r' ){
1859 fprintf(stderr, "%s:%d: unescaped %c character\n",
1860 p->zFile, p->nLine, cQuote);
1861 }
1862 if( c==EOF ){
1863 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1864 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001865 p->cTerm = EOF;
1866 break;
1867 }
1868 csv_append_char(p, c);
1869 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001870 }
drhdb95f682013-06-26 22:46:00 +00001871 }else{
drhd0a64dc2013-06-30 20:24:26 +00001872 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001873 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001874 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001875 }
1876 if( c=='\n' ){
1877 p->nLine++;
1878 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1879 }
drhdb95f682013-06-26 22:46:00 +00001880 p->cTerm = c;
1881 }
drh8dd675e2013-07-12 21:09:24 +00001882 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001883 return p->z;
1884}
1885
1886/*
drh75897232000-05-29 14:26:00 +00001887** If an input line begins with "." then invoke this routine to
1888** process that line.
drh67505e72002-04-19 12:34:06 +00001889**
drh47ad6842006-11-08 12:25:42 +00001890** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00001891*/
drh44c2eb12003-04-30 11:38:26 +00001892static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00001893 int i = 1;
1894 int nArg = 0;
1895 int n, c;
drh67505e72002-04-19 12:34:06 +00001896 int rc = 0;
drh75897232000-05-29 14:26:00 +00001897 char *azArg[50];
1898
1899 /* Parse the input line into tokens.
1900 */
1901 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00001902 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00001903 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00001904 if( zLine[i]=='\'' || zLine[i]=='"' ){
1905 int delim = zLine[i++];
1906 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00001907 while( zLine[i] && zLine[i]!=delim ){
1908 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
1909 i++;
1910 }
drh75897232000-05-29 14:26:00 +00001911 if( zLine[i]==delim ){
1912 zLine[i++] = 0;
1913 }
drhfeac5f82004-08-01 00:10:45 +00001914 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001915 }else{
1916 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00001917 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00001918 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00001919 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001920 }
1921 }
1922
1923 /* Process the input line.
1924 */
shane9bd1b442009-10-23 01:27:39 +00001925 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00001926 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00001927 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00001928 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
1929 const char *zDestFile = 0;
1930 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00001931 sqlite3 *pDest;
1932 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00001933 int j;
1934 for(j=1; j<nArg; j++){
1935 const char *z = azArg[j];
1936 if( z[0]=='-' ){
1937 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00001938 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00001939 {
1940 fprintf(stderr, "unknown option: %s\n", azArg[j]);
1941 return 1;
1942 }
1943 }else if( zDestFile==0 ){
1944 zDestFile = azArg[j];
1945 }else if( zDb==0 ){
1946 zDb = zDestFile;
1947 zDestFile = azArg[j];
1948 }else{
1949 fprintf(stderr, "too many arguments to .backup\n");
1950 return 1;
1951 }
drh9ff849f2009-02-04 20:55:57 +00001952 }
drhbc46f022013-01-23 18:53:23 +00001953 if( zDestFile==0 ){
1954 fprintf(stderr, "missing FILENAME argument on .backup\n");
1955 return 1;
1956 }
1957 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00001958 rc = sqlite3_open(zDestFile, &pDest);
1959 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001960 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00001961 sqlite3_close(pDest);
1962 return 1;
1963 }
drh05782482013-10-24 15:20:20 +00001964 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00001965 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
1966 if( pBackup==0 ){
1967 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1968 sqlite3_close(pDest);
1969 return 1;
1970 }
1971 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
1972 sqlite3_backup_finish(pBackup);
1973 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00001974 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00001975 }else{
1976 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00001977 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00001978 }
1979 sqlite3_close(pDest);
1980 }else
1981
shanehe2aa9d72009-11-06 17:20:17 +00001982 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00001983 bail_on_error = booleanValue(azArg[1]);
1984 }else
1985
drhd8621b92012-04-17 09:09:33 +00001986 /* The undocumented ".breakpoint" command causes a call to the no-op
1987 ** routine named test_breakpoint().
1988 */
1989 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
1990 test_breakpoint();
1991 }else
1992
shanehe2aa9d72009-11-06 17:20:17 +00001993 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00001994 struct callback_data data;
1995 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00001996 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00001997 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00001998 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00001999 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002000 data.colWidth[0] = 3;
2001 data.colWidth[1] = 15;
2002 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002003 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002004 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002005 if( zErrMsg ){
2006 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002007 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002008 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002009 }
2010 }else
2011
shanehe2aa9d72009-11-06 17:20:17 +00002012 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002013 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002014 /* When playing back a "dump", the content might appear in an order
2015 ** which causes immediate foreign key constraints to be violated.
2016 ** So disable foreign-key constraint enforcement to prevent problems. */
2017 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002018 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002019 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002020 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002021 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002022 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002023 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002024 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002025 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002026 );
2027 run_schema_dump_query(p,
2028 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002029 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002030 );
drh2f464a02011-10-13 00:41:49 +00002031 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002032 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002033 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002034 );
drh4c653a02000-06-07 01:27:47 +00002035 }else{
2036 int i;
drhdd3d4592004-08-30 01:54:05 +00002037 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002038 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002039 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002040 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002041 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002042 " AND sql NOT NULL");
2043 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002044 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002045 "WHERE sql NOT NULL"
2046 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002047 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002048 );
danielk1977bc6ada42004-06-30 08:20:16 +00002049 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002050 }
2051 }
drh45e29d82006-11-20 16:21:10 +00002052 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002053 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002054 p->writableSchema = 0;
2055 }
drh56197952011-10-13 16:30:13 +00002056 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2057 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002058 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002059 }else
drh75897232000-05-29 14:26:00 +00002060
shanehe2aa9d72009-11-06 17:20:17 +00002061 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002062 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002063 }else
2064
drhd3ac7d92013-01-25 18:33:43 +00002065 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002066 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002067 rc = 2;
drh75897232000-05-29 14:26:00 +00002068 }else
2069
shanehe2aa9d72009-11-06 17:20:17 +00002070 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002071 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002072 if(val == 1) {
2073 if(!p->explainPrev.valid) {
2074 p->explainPrev.valid = 1;
2075 p->explainPrev.mode = p->mode;
2076 p->explainPrev.showHeader = p->showHeader;
2077 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2078 }
2079 /* We could put this code under the !p->explainValid
2080 ** condition so that it does not execute if we are already in
2081 ** explain mode. However, always executing it allows us an easy
2082 ** was to reset to explain mode in case the user previously
2083 ** did an .explain followed by a .width, .mode or .header
2084 ** command.
2085 */
danielk19770d78bae2008-01-03 07:09:48 +00002086 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002087 p->showHeader = 1;
2088 memset(p->colWidth,0,ArraySize(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002089 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002090 p->colWidth[1] = 13; /* opcode */
2091 p->colWidth[2] = 4; /* P1 */
2092 p->colWidth[3] = 4; /* P2 */
2093 p->colWidth[4] = 4; /* P3 */
2094 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002095 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002096 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002097 }else if (p->explainPrev.valid) {
2098 p->explainPrev.valid = 0;
2099 p->mode = p->explainPrev.mode;
2100 p->showHeader = p->explainPrev.showHeader;
2101 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2102 }
drh75897232000-05-29 14:26:00 +00002103 }else
2104
drhc28490c2006-10-26 14:25:58 +00002105 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002106 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002107 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002108 }else
2109
2110 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002111 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002112 if( HAS_TIMER ){
2113 fprintf(stderr,"%s",zTimerHelp);
2114 }
drh75897232000-05-29 14:26:00 +00002115 }else
2116
shanehe2aa9d72009-11-06 17:20:17 +00002117 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002118 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002119 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002120 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002121 int nCol; /* Number of columns in the table */
2122 int nByte; /* Number of bytes in an SQL string */
2123 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002124 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002125 int nSep; /* Number of bytes in p->separator[] */
2126 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002127 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002128 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002129
drhdb95f682013-06-26 22:46:00 +00002130 seenInterrupt = 0;
2131 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002132 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002133 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002134 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002135 fprintf(stderr, "Error: non-null separator required for import\n");
2136 return 1;
drhfeac5f82004-08-01 00:10:45 +00002137 }
drhdb95f682013-06-26 22:46:00 +00002138 if( nSep>1 ){
2139 fprintf(stderr, "Error: multi-character separators not allowed"
2140 " for import\n");
2141 return 1;
2142 }
drh5bde8162013-06-27 14:07:53 +00002143 sCsv.zFile = zFile;
2144 sCsv.nLine = 1;
2145 if( sCsv.zFile[0]=='|' ){
2146 sCsv.in = popen(sCsv.zFile+1, "r");
2147 sCsv.zFile = "<pipe>";
2148 xCloser = pclose;
2149 }else{
2150 sCsv.in = fopen(sCsv.zFile, "rb");
2151 xCloser = fclose;
2152 }
drhdb95f682013-06-26 22:46:00 +00002153 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002154 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002155 return 1;
2156 }
2157 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002158 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002159 if( zSql==0 ){
2160 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002161 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002162 return 1;
2163 }
drh4f21c4a2008-12-10 22:15:00 +00002164 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002165 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002166 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2167 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2168 char cSep = '(';
2169 while( csv_read_one_field(&sCsv) ){
2170 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2171 cSep = ',';
2172 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2173 }
drh5bde8162013-06-27 14:07:53 +00002174 if( cSep=='(' ){
2175 sqlite3_free(zCreate);
2176 sqlite3_free(sCsv.z);
2177 xCloser(sCsv.in);
2178 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2179 return 1;
2180 }
drhdb95f682013-06-26 22:46:00 +00002181 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2182 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2183 sqlite3_free(zCreate);
2184 if( rc ){
2185 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2186 sqlite3_errmsg(db));
2187 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002188 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002189 return 1;
2190 }
2191 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2192 }
drhfeac5f82004-08-01 00:10:45 +00002193 sqlite3_free(zSql);
2194 if( rc ){
shane916f9612009-10-23 00:37:15 +00002195 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002196 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002197 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002198 return 1;
drhfeac5f82004-08-01 00:10:45 +00002199 }
shane916f9612009-10-23 00:37:15 +00002200 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002201 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002202 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002203 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002204 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002205 if( zSql==0 ){
2206 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002207 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002208 return 1;
2209 }
drhdb95f682013-06-26 22:46:00 +00002210 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002211 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002212 for(i=1; i<nCol; i++){
2213 zSql[j++] = ',';
2214 zSql[j++] = '?';
2215 }
2216 zSql[j++] = ')';
2217 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002218 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002219 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002220 if( rc ){
2221 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002222 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002223 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002224 return 1;
drhfeac5f82004-08-01 00:10:45 +00002225 }
drh2d463112013-08-06 14:36:36 +00002226 needCommit = sqlite3_get_autocommit(db);
2227 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002228 do{
2229 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002230 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002231 char *z = csv_read_one_field(&sCsv);
2232 if( z==0 && i==0 ) break;
2233 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2234 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2235 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2236 "filling the rest with NULL\n",
2237 sCsv.zFile, startLine, nCol, i+1);
2238 i++;
2239 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002240 }
drhfeac5f82004-08-01 00:10:45 +00002241 }
drhdb95f682013-06-26 22:46:00 +00002242 if( sCsv.cTerm==sCsv.cSeparator ){
2243 do{
2244 csv_read_one_field(&sCsv);
2245 i++;
2246 }while( sCsv.cTerm==sCsv.cSeparator );
2247 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2248 "extras ignored\n",
2249 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002250 }
drhdb95f682013-06-26 22:46:00 +00002251 if( i>=nCol ){
2252 sqlite3_step(pStmt);
2253 rc = sqlite3_reset(pStmt);
2254 if( rc!=SQLITE_OK ){
2255 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2256 sqlite3_errmsg(db));
2257 }
2258 }
2259 }while( sCsv.cTerm!=EOF );
2260
drh5bde8162013-06-27 14:07:53 +00002261 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002262 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002263 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002264 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002265 }else
2266
shanehe2aa9d72009-11-06 17:20:17 +00002267 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002268 struct callback_data data;
2269 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002270 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002271 memcpy(&data, p, sizeof(data));
2272 data.showHeader = 0;
2273 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002274 if( nArg==1 ){
2275 rc = sqlite3_exec(p->db,
2276 "SELECT name FROM sqlite_master "
2277 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2278 "UNION ALL "
2279 "SELECT name FROM sqlite_temp_master "
2280 "WHERE type='index' "
2281 "ORDER BY 1",
2282 callback, &data, &zErrMsg
2283 );
2284 }else{
2285 zShellStatic = azArg[1];
2286 rc = sqlite3_exec(p->db,
2287 "SELECT name FROM sqlite_master "
2288 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2289 "UNION ALL "
2290 "SELECT name FROM sqlite_temp_master "
2291 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2292 "ORDER BY 1",
2293 callback, &data, &zErrMsg
2294 );
2295 zShellStatic = 0;
2296 }
drh75897232000-05-29 14:26:00 +00002297 if( zErrMsg ){
2298 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002299 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002300 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002301 }else if( rc != SQLITE_OK ){
2302 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2303 rc = 1;
drh75897232000-05-29 14:26:00 +00002304 }
2305 }else
2306
drhae5e4452007-05-03 17:18:36 +00002307#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002308 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002309 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002310 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2311 iotrace = 0;
2312 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002313 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002314 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002315 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002316 iotrace = stdout;
2317 }else{
2318 iotrace = fopen(azArg[1], "w");
2319 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002320 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002321 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002322 rc = 1;
drhb0603412007-02-28 04:47:26 +00002323 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002324 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002325 }
2326 }
2327 }else
drhae5e4452007-05-03 17:18:36 +00002328#endif
drhb0603412007-02-28 04:47:26 +00002329
drh70df4fe2006-06-13 15:12:21 +00002330#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002331 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2332 const char *zFile, *zProc;
2333 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002334 zFile = azArg[1];
2335 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002336 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002337 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2338 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002339 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002340 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002341 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002342 }
2343 }else
drh70df4fe2006-06-13 15:12:21 +00002344#endif
drh1e397f82006-06-08 15:28:43 +00002345
drhc8ba2122011-03-23 11:16:22 +00002346 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002347 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002348 output_file_close(p->pLog);
2349 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002350 }else
2351
shanehe2aa9d72009-11-06 17:20:17 +00002352 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002353 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002354 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002355 ||
shanehe2aa9d72009-11-06 17:20:17 +00002356 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002357 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002358 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002359 ||
shanehe2aa9d72009-11-06 17:20:17 +00002360 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002361 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002362 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002363 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002364 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002365 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002366 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002367 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002368 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002369 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002370 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002371 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002372 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002373 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002374 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002375 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002376 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002377 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002378 }else {
shane9bd1b442009-10-23 01:27:39 +00002379 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002380 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002381 rc = 1;
drh75897232000-05-29 14:26:00 +00002382 }
2383 }else
2384
shanehe2aa9d72009-11-06 17:20:17 +00002385 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2386 int n2 = strlen30(azArg[1]);
2387 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2388 p->mode = MODE_Insert;
2389 set_table_name(p, azArg[2]);
2390 }else {
2391 fprintf(stderr, "Error: invalid arguments: "
2392 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2393 rc = 1;
2394 }
2395 }else
2396
persicom7e2dfdd2002-04-18 02:46:52 +00002397 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002398 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2399 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002400 }else
2401
drh05782482013-10-24 15:20:20 +00002402 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2403 sqlite3 *savedDb = p->db;
2404 const char *zSavedFilename = p->zDbFilename;
2405 char *zNewFilename = 0;
2406 p->db = 0;
2407 if( nArg>=2 ){
2408 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2409 }
2410 open_db(p, 1);
2411 if( p->db!=0 ){
2412 sqlite3_close(savedDb);
2413 sqlite3_free(p->zFreeOnClose);
2414 p->zFreeOnClose = zNewFilename;
2415 }else{
2416 sqlite3_free(zNewFilename);
2417 p->db = savedDb;
2418 p->zDbFilename = zSavedFilename;
2419 }
2420 }else
2421
drh75897232000-05-29 14:26:00 +00002422 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002423 if( p->outfile[0]=='|' ){
2424 pclose(p->out);
2425 }else{
2426 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002427 }
drh42f64e52012-04-04 16:56:23 +00002428 p->outfile[0] = 0;
2429 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002430 p->out = popen(&azArg[1][1], "w");
2431 if( p->out==0 ){
2432 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2433 p->out = stdout;
2434 rc = 1;
2435 }else{
2436 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2437 }
drh75897232000-05-29 14:26:00 +00002438 }else{
drh42f64e52012-04-04 16:56:23 +00002439 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002440 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002441 if( strcmp(azArg[1],"off")!=0 ){
2442 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2443 }
drh75897232000-05-29 14:26:00 +00002444 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002445 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002446 } else {
drh42f64e52012-04-04 16:56:23 +00002447 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002448 }
2449 }
2450 }else
2451
drh078b1fd2012-09-21 13:40:02 +00002452 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2453 int i;
2454 for(i=1; i<nArg; i++){
2455 if( i>1 ) fprintf(p->out, " ");
2456 fprintf(p->out, "%s", azArg[i]);
2457 }
2458 fprintf(p->out, "\n");
2459 }else
2460
drhdd45df82002-04-18 12:39:03 +00002461 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002462 if( nArg >= 2) {
2463 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2464 }
2465 if( nArg >= 3) {
2466 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2467 }
2468 }else
2469
shanehe2aa9d72009-11-06 17:20:17 +00002470 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002471 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002472 }else
2473
drh9ff849f2009-02-04 20:55:57 +00002474 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002475 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002476 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002477 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2478 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002479 }else{
shane9bd1b442009-10-23 01:27:39 +00002480 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002481 fclose(alt);
2482 }
2483 }else
2484
shanehe2aa9d72009-11-06 17:20:17 +00002485 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002486 const char *zSrcFile;
2487 const char *zDb;
2488 sqlite3 *pSrc;
2489 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002490 int nTimeout = 0;
2491
drh9ff849f2009-02-04 20:55:57 +00002492 if( nArg==2 ){
2493 zSrcFile = azArg[1];
2494 zDb = "main";
2495 }else{
2496 zSrcFile = azArg[2];
2497 zDb = azArg[1];
2498 }
2499 rc = sqlite3_open(zSrcFile, &pSrc);
2500 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002501 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002502 sqlite3_close(pSrc);
2503 return 1;
2504 }
drh05782482013-10-24 15:20:20 +00002505 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002506 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2507 if( pBackup==0 ){
2508 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2509 sqlite3_close(pSrc);
2510 return 1;
2511 }
drhdc2c4912009-02-04 22:46:47 +00002512 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2513 || rc==SQLITE_BUSY ){
2514 if( rc==SQLITE_BUSY ){
2515 if( nTimeout++ >= 3 ) break;
2516 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002517 }
2518 }
2519 sqlite3_backup_finish(pBackup);
2520 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002521 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002522 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002523 fprintf(stderr, "Error: source database is busy\n");
2524 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002525 }else{
2526 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002527 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002528 }
2529 sqlite3_close(pSrc);
2530 }else
2531
shanehe2aa9d72009-11-06 17:20:17 +00002532 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002533 struct callback_data data;
2534 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002535 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002536 memcpy(&data, p, sizeof(data));
2537 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002538 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002539 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002540 int i;
drhf0693c82011-10-11 20:41:54 +00002541 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002542 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002543 char *new_argv[2], *new_colv[2];
2544 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2545 " type text,\n"
2546 " name text,\n"
2547 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002548 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002549 " sql text\n"
2550 ")";
2551 new_argv[1] = 0;
2552 new_colv[0] = "sql";
2553 new_colv[1] = 0;
2554 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002555 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002556 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002557 char *new_argv[2], *new_colv[2];
2558 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2559 " type text,\n"
2560 " name text,\n"
2561 " tbl_name text,\n"
2562 " rootpage integer,\n"
2563 " sql text\n"
2564 ")";
2565 new_argv[1] = 0;
2566 new_colv[0] = "sql";
2567 new_colv[1] = 0;
2568 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002569 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002570 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002571 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002572 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002573 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002574 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002575 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002576 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002577 "WHERE lower(tbl_name) LIKE shellstatic()"
2578 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002579 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002580 callback, &data, &zErrMsg);
2581 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002582 }
drh75897232000-05-29 14:26:00 +00002583 }else{
shane9bd1b442009-10-23 01:27:39 +00002584 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002585 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002586 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002587 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002588 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002589 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002590 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002591 callback, &data, &zErrMsg
2592 );
drh75897232000-05-29 14:26:00 +00002593 }
drh75897232000-05-29 14:26:00 +00002594 if( zErrMsg ){
2595 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002596 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002597 rc = 1;
2598 }else if( rc != SQLITE_OK ){
2599 fprintf(stderr,"Error: querying schema information\n");
2600 rc = 1;
2601 }else{
2602 rc = 0;
drh75897232000-05-29 14:26:00 +00002603 }
2604 }else
2605
drh340f5822013-06-27 13:01:21 +00002606#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002607 /* Undocumented commands for internal testing. Subject to change
2608 ** without notice. */
2609 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2610 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2611 int i, v;
2612 for(i=1; i<nArg; i++){
2613 v = booleanValue(azArg[i]);
2614 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2615 }
2616 }
2617 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2618 int i; sqlite3_int64 v;
2619 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002620 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002621 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002622 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2623 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002624 }
2625 }
2626 }else
drh340f5822013-06-27 13:01:21 +00002627#endif
drh348d19c2013-06-03 12:47:43 +00002628
drh75897232000-05-29 14:26:00 +00002629 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002630 sqlite3_snprintf(sizeof(p->separator), p->separator,
2631 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002632 }else
2633
shanehe2aa9d72009-11-06 17:20:17 +00002634 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002635 int i;
2636 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002637 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002638 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002639 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002640 fprintf(p->out,"%9.9s: ", "nullvalue");
2641 output_c_string(p->out, p->nullvalue);
2642 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002643 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002644 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002645 fprintf(p->out,"%9.9s: ", "separator");
2646 output_c_string(p->out, p->separator);
2647 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002648 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002649 fprintf(p->out,"%9.9s: ","width");
2650 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002651 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002652 }
drhfeac5f82004-08-01 00:10:45 +00002653 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002654 }else
2655
shaneh642d8b82010-07-28 16:05:34 +00002656 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2657 p->statsOn = booleanValue(azArg[1]);
2658 }else
2659
shanehe2aa9d72009-11-06 17:20:17 +00002660 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002661 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002662 char **azResult;
drh98781232012-04-23 12:38:05 +00002663 int nRow, nAlloc;
2664 char *zSql = 0;
2665 int ii;
drh05782482013-10-24 15:20:20 +00002666 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002667 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2668 if( rc ) return rc;
2669 zSql = sqlite3_mprintf(
2670 "SELECT name FROM sqlite_master"
2671 " WHERE type IN ('table','view')"
2672 " AND name NOT LIKE 'sqlite_%%'"
2673 " AND name LIKE ?1");
2674 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2675 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2676 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2677 if( strcmp(zDbName,"temp")==0 ){
2678 zSql = sqlite3_mprintf(
2679 "%z UNION ALL "
2680 "SELECT 'temp.' || name FROM sqlite_temp_master"
2681 " WHERE type IN ('table','view')"
2682 " AND name NOT LIKE 'sqlite_%%'"
2683 " AND name LIKE ?1", zSql);
2684 }else{
2685 zSql = sqlite3_mprintf(
2686 "%z UNION ALL "
2687 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2688 " WHERE type IN ('table','view')"
2689 " AND name NOT LIKE 'sqlite_%%'"
2690 " AND name LIKE ?1", zSql, zDbName, zDbName);
2691 }
drha50da102000-08-08 20:19:09 +00002692 }
drh98781232012-04-23 12:38:05 +00002693 sqlite3_finalize(pStmt);
2694 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2695 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2696 sqlite3_free(zSql);
2697 if( rc ) return rc;
2698 nRow = nAlloc = 0;
2699 azResult = 0;
2700 if( nArg>1 ){
2701 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002702 }else{
drh98781232012-04-23 12:38:05 +00002703 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2704 }
2705 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2706 if( nRow>=nAlloc ){
2707 char **azNew;
2708 int n = nAlloc*2 + 10;
2709 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2710 if( azNew==0 ){
2711 fprintf(stderr, "Error: out of memory\n");
2712 break;
2713 }
2714 nAlloc = n;
2715 azResult = azNew;
2716 }
2717 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2718 if( azResult[nRow] ) nRow++;
2719 }
2720 sqlite3_finalize(pStmt);
2721 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002722 int len, maxlen = 0;
2723 int i, j;
2724 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002725 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002726 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002727 if( len>maxlen ) maxlen = len;
2728 }
2729 nPrintCol = 80/(maxlen+2);
2730 if( nPrintCol<1 ) nPrintCol = 1;
2731 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2732 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002733 for(j=i; j<nRow; j+=nPrintRow){
2734 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002735 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002736 }
drh151b7d52013-05-06 20:28:54 +00002737 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002738 }
2739 }
drh98781232012-04-23 12:38:05 +00002740 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2741 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002742 }else
2743
shaneh96887e12011-02-10 21:08:58 +00002744 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002745 static const struct {
2746 const char *zCtrlName; /* Name of a test-control option */
2747 int ctrlCode; /* Integer code for that option */
2748 } aCtrl[] = {
2749 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2750 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2751 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2752 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2753 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2754 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2755 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2756 { "assert", SQLITE_TESTCTRL_ASSERT },
2757 { "always", SQLITE_TESTCTRL_ALWAYS },
2758 { "reserve", SQLITE_TESTCTRL_RESERVE },
2759 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2760 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002761 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2762 };
shaneh96887e12011-02-10 21:08:58 +00002763 int testctrl = -1;
2764 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002765 int i, n;
drh05782482013-10-24 15:20:20 +00002766 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00002767
drhd416fe72011-03-17 16:45:50 +00002768 /* convert testctrl text option to value. allow any unique prefix
2769 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002770 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002771 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002772 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2773 if( testctrl<0 ){
2774 testctrl = aCtrl[i].ctrlCode;
2775 }else{
drhb07028f2011-10-14 21:49:18 +00002776 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00002777 testctrl = -1;
2778 break;
2779 }
2780 }
2781 }
drh348d19c2013-06-03 12:47:43 +00002782 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002783 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2784 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2785 }else{
2786 switch(testctrl){
2787
2788 /* sqlite3_test_control(int, db, int) */
2789 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2790 case SQLITE_TESTCTRL_RESERVE:
2791 if( nArg==3 ){
2792 int opt = (int)strtol(azArg[2], 0, 0);
2793 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00002794 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002795 } else {
drhd416fe72011-03-17 16:45:50 +00002796 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2797 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002798 }
2799 break;
2800
2801 /* sqlite3_test_control(int) */
2802 case SQLITE_TESTCTRL_PRNG_SAVE:
2803 case SQLITE_TESTCTRL_PRNG_RESTORE:
2804 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00002805 if( nArg==2 ){
2806 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00002807 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002808 } else {
2809 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2810 }
2811 break;
2812
2813 /* sqlite3_test_control(int, uint) */
2814 case SQLITE_TESTCTRL_PENDING_BYTE:
2815 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00002816 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002817 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002818 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002819 } else {
drhd416fe72011-03-17 16:45:50 +00002820 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2821 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002822 }
2823 break;
2824
2825 /* sqlite3_test_control(int, int) */
2826 case SQLITE_TESTCTRL_ASSERT:
2827 case SQLITE_TESTCTRL_ALWAYS:
2828 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00002829 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002830 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002831 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002832 } else {
drhd416fe72011-03-17 16:45:50 +00002833 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2834 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002835 }
2836 break;
2837
2838 /* sqlite3_test_control(int, char *) */
2839#ifdef SQLITE_N_KEYWORD
2840 case SQLITE_TESTCTRL_ISKEYWORD:
2841 if( nArg==3 ){
2842 const char *opt = azArg[2];
2843 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002844 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002845 } else {
drhd416fe72011-03-17 16:45:50 +00002846 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2847 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002848 }
2849 break;
2850#endif
2851
2852 case SQLITE_TESTCTRL_BITVEC_TEST:
2853 case SQLITE_TESTCTRL_FAULT_INSTALL:
2854 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2855 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2856 default:
drhd416fe72011-03-17 16:45:50 +00002857 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2858 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002859 break;
2860 }
2861 }
2862 }else
2863
shanehe2aa9d72009-11-06 17:20:17 +00002864 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00002865 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00002866 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00002867 }else
2868
drhd416fe72011-03-17 16:45:50 +00002869 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2870 && nArg==2
2871 ){
drh3b1a9882007-11-02 12:53:03 +00002872 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002873 }else
2874
drh42f64e52012-04-04 16:56:23 +00002875 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00002876 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00002877 output_file_close(p->traceOut);
2878 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00002879#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00002880 if( p->traceOut==0 ){
2881 sqlite3_trace(p->db, 0, 0);
2882 }else{
2883 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
2884 }
2885#endif
2886 }else
2887
drh9fd301b2011-06-03 13:28:22 +00002888 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00002889 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00002890 sqlite3_libversion(), sqlite3_sourceid());
2891 }else
2892
drhde60fc22011-12-14 17:53:36 +00002893 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
2894 const char *zDbName = nArg==2 ? azArg[1] : "main";
2895 char *zVfsName = 0;
2896 if( p->db ){
2897 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
2898 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00002899 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00002900 sqlite3_free(zVfsName);
2901 }
2902 }
2903 }else
2904
drhcef4fc82012-09-21 22:50:45 +00002905#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2906 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
2907 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00002908 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00002909 }else
2910#endif
2911
shanehe2aa9d72009-11-06 17:20:17 +00002912 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00002913 int j;
drh43617e92006-03-06 20:55:46 +00002914 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002915 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00002916 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00002917 }
2918 }else
2919
2920 {
shane9bd1b442009-10-23 01:27:39 +00002921 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00002922 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00002923 rc = 1;
drh75897232000-05-29 14:26:00 +00002924 }
drh67505e72002-04-19 12:34:06 +00002925
2926 return rc;
drh75897232000-05-29 14:26:00 +00002927}
2928
drh67505e72002-04-19 12:34:06 +00002929/*
drh91a66392007-09-07 01:12:32 +00002930** Return TRUE if a semicolon occurs anywhere in the first N characters
2931** of string z[].
drh324ccef2003-02-05 14:06:20 +00002932*/
drh9f099fd2013-08-06 14:01:46 +00002933static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00002934 int i;
2935 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2936 return 0;
drh324ccef2003-02-05 14:06:20 +00002937}
2938
2939/*
drh70c7a4b2003-04-26 03:03:06 +00002940** Test to see if a line consists entirely of whitespace.
2941*/
2942static int _all_whitespace(const char *z){
2943 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00002944 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002945 if( *z=='/' && z[1]=='*' ){
2946 z += 2;
2947 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2948 if( *z==0 ) return 0;
2949 z++;
2950 continue;
2951 }
2952 if( *z=='-' && z[1]=='-' ){
2953 z += 2;
2954 while( *z && *z!='\n' ){ z++; }
2955 if( *z==0 ) return 1;
2956 continue;
2957 }
2958 return 0;
2959 }
2960 return 1;
2961}
2962
2963/*
drha9b17162003-04-29 18:01:28 +00002964** Return TRUE if the line typed in is an SQL command terminator other
2965** than a semi-colon. The SQL Server style "go" command is understood
2966** as is the Oracle "/".
2967*/
drh9f099fd2013-08-06 14:01:46 +00002968static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00002969 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002970 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2971 return 1; /* Oracle */
2972 }
drhf0693c82011-10-11 20:41:54 +00002973 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00002974 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002975 return 1; /* SQL Server */
2976 }
2977 return 0;
2978}
2979
2980/*
drh233a5312008-12-18 22:25:13 +00002981** Return true if zSql is a complete SQL statement. Return false if it
2982** ends in the middle of a string literal or C-style comment.
2983*/
drh9f099fd2013-08-06 14:01:46 +00002984static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00002985 int rc;
2986 if( zSql==0 ) return 1;
2987 zSql[nSql] = ';';
2988 zSql[nSql+1] = 0;
2989 rc = sqlite3_complete(zSql);
2990 zSql[nSql] = 0;
2991 return rc;
2992}
2993
2994/*
drh67505e72002-04-19 12:34:06 +00002995** Read input from *in and process it. If *in==0 then input
2996** is interactive - the user is typing it it. Otherwise, input
2997** is coming from a file or device. A prompt is issued and history
2998** is saved only if input is interactive. An interrupt signal will
2999** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003000**
3001** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003002*/
drhc28490c2006-10-26 14:25:58 +00003003static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003004 char *zLine = 0; /* A single input line */
3005 char *zSql = 0; /* Accumulated SQL text */
3006 int nLine; /* Length of current line */
3007 int nSql = 0; /* Bytes of zSql[] used */
3008 int nAlloc = 0; /* Allocated zSql[] space */
3009 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3010 char *zErrMsg; /* Error message returned */
3011 int rc; /* Error code */
3012 int errCnt = 0; /* Number of errors seen */
3013 int lineno = 0; /* Current line number */
3014 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003015
3016 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3017 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003018 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003019 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003020 /* End of input */
3021 if( stdin_is_interactive ) printf("\n");
3022 break;
drhc49f44e2006-10-26 18:15:42 +00003023 }
drh67505e72002-04-19 12:34:06 +00003024 if( seenInterrupt ){
3025 if( in!=0 ) break;
3026 seenInterrupt = 0;
3027 }
drhc28490c2006-10-26 14:25:58 +00003028 lineno++;
drh9f099fd2013-08-06 14:01:46 +00003029 if( nSql==0 && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00003030 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003031 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003032 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003033 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003034 break;
3035 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003036 errCnt++;
3037 }
drhdaffd0e2001-04-11 14:28:42 +00003038 continue;
3039 }
drh9f099fd2013-08-06 14:01:46 +00003040 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003041 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003042 }
drh9f099fd2013-08-06 14:01:46 +00003043 nLine = strlen30(zLine);
3044 if( nSql+nLine+2>=nAlloc ){
3045 nAlloc = nSql+nLine+100;
3046 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003047 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003048 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003049 exit(1);
3050 }
drhdaffd0e2001-04-11 14:28:42 +00003051 }
drh9f099fd2013-08-06 14:01:46 +00003052 nSqlPrior = nSql;
3053 if( nSql==0 ){
3054 int i;
3055 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003056 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003057 memcpy(zSql, zLine+i, nLine+1-i);
3058 startline = lineno;
3059 nSql = nLine-i;
3060 }else{
3061 zSql[nSql++] = '\n';
3062 memcpy(zSql+nSql, zLine, nLine+1);
3063 nSql += nLine;
3064 }
3065 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003066 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003067 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003068 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003069 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003070 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003071 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003072 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003073 char zPrefix[100];
3074 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003075 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003076 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003077 }else{
shane9bd1b442009-10-23 01:27:39 +00003078 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003079 }
drh7f953e22002-07-13 17:33:45 +00003080 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003081 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003082 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003083 zErrMsg = 0;
3084 }else{
shaned2bed1c2009-10-21 03:56:54 +00003085 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003086 }
drhc49f44e2006-10-26 18:15:42 +00003087 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003088 }
drhdaffd0e2001-04-11 14:28:42 +00003089 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003090 }else if( nSql && _all_whitespace(zSql) ){
drh7a411f42013-04-17 17:33:17 +00003091 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003092 }
3093 }
drh9f099fd2013-08-06 14:01:46 +00003094 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003095 if( !_all_whitespace(zSql) ){
3096 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3097 }
drhdaffd0e2001-04-11 14:28:42 +00003098 free(zSql);
3099 }
danielk19772ac27622007-07-03 05:31:16 +00003100 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003101 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003102}
3103
drh67505e72002-04-19 12:34:06 +00003104/*
3105** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003106** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003107*/
3108static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003109 static char *home_dir = NULL;
3110 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003111
drh83905c92012-06-21 13:00:37 +00003112#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003113 {
3114 struct passwd *pwent;
3115 uid_t uid = getuid();
3116 if( (pwent=getpwuid(uid)) != NULL) {
3117 home_dir = pwent->pw_dir;
3118 }
drh67505e72002-04-19 12:34:06 +00003119 }
3120#endif
3121
chw65d3c132007-11-12 21:09:10 +00003122#if defined(_WIN32_WCE)
3123 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3124 */
drh85e72432012-04-11 11:38:53 +00003125 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003126#else
3127
drh83905c92012-06-21 13:00:37 +00003128#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003129 if (!home_dir) {
3130 home_dir = getenv("USERPROFILE");
3131 }
3132#endif
3133
drh67505e72002-04-19 12:34:06 +00003134 if (!home_dir) {
3135 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003136 }
3137
drh83905c92012-06-21 13:00:37 +00003138#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003139 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003140 char *zDrive, *zPath;
3141 int n;
3142 zDrive = getenv("HOMEDRIVE");
3143 zPath = getenv("HOMEPATH");
3144 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003145 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003146 home_dir = malloc( n );
3147 if( home_dir==0 ) return 0;
3148 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3149 return home_dir;
3150 }
3151 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003152 }
3153#endif
3154
chw65d3c132007-11-12 21:09:10 +00003155#endif /* !_WIN32_WCE */
3156
drh67505e72002-04-19 12:34:06 +00003157 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003158 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003159 char *z = malloc( n );
3160 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003161 home_dir = z;
3162 }
drhe98d4fa2002-04-21 19:06:22 +00003163
drh67505e72002-04-19 12:34:06 +00003164 return home_dir;
3165}
3166
3167/*
3168** Read input from the file given by sqliterc_override. Or if that
3169** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003170**
3171** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003172*/
shane9bd1b442009-10-23 01:27:39 +00003173static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003174 struct callback_data *p, /* Configuration data */
3175 const char *sqliterc_override /* Name of config file. NULL to use default */
3176){
persicom7e2dfdd2002-04-18 02:46:52 +00003177 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003178 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003179 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003180 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003181 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003182
3183 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003184 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003185 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003186#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003187 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003188#endif
shane9bd1b442009-10-23 01:27:39 +00003189 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003190 }
drh2f3de322012-06-27 16:41:31 +00003191 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003192 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3193 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003194 }
drha1f9b5e2004-02-14 16:31:02 +00003195 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003196 if( in ){
drhc28490c2006-10-26 14:25:58 +00003197 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003198 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003199 }
shane9bd1b442009-10-23 01:27:39 +00003200 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003201 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003202 }
drh85e72432012-04-11 11:38:53 +00003203 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003204 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003205}
3206
drh67505e72002-04-19 12:34:06 +00003207/*
drhe1e38c42003-05-04 18:30:59 +00003208** Show available command line options
3209*/
3210static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003211 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003212 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003213 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003214 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003215 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003216 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003217 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003218 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003219#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3220 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3221#endif
drhcc3b4f82012-02-07 14:13:50 +00003222 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003223 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003224 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003225 " -line set output mode to 'line'\n"
3226 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003227 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003228#ifdef SQLITE_ENABLE_MULTIPLEX
3229 " -multiplex enable the multiplexor VFS\n"
3230#endif
drh98d312f2012-10-25 15:23:14 +00003231 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3232 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003233 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003234 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003235 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003236#ifdef SQLITE_ENABLE_VFSTRACE
3237 " -vfstrace enable tracing of all VFS calls\n"
3238#endif
drhe1e38c42003-05-04 18:30:59 +00003239;
3240static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003241 fprintf(stderr,
3242 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3243 "FILENAME is the name of an SQLite database. A new database is created\n"
3244 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003245 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003246 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003247 }else{
3248 fprintf(stderr, "Use the -help option for additional information\n");
3249 }
3250 exit(1);
3251}
3252
3253/*
drh67505e72002-04-19 12:34:06 +00003254** Initialize the state information in data
3255*/
drh0850b532006-01-31 19:31:43 +00003256static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003257 memset(data, 0, sizeof(*data));
3258 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003259 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003260 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003261 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003262 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003263 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3264 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003265 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003266}
3267
drh98d312f2012-10-25 15:23:14 +00003268/*
3269** Get the argument to an --option. Throw an error and die if no argument
3270** is available.
3271*/
3272static char *cmdline_option_value(int argc, char **argv, int i){
3273 if( i==argc ){
3274 fprintf(stderr, "%s: Error: missing argument to %s\n",
3275 argv[0], argv[argc-1]);
3276 exit(1);
3277 }
3278 return argv[i];
3279}
3280
drh75897232000-05-29 14:26:00 +00003281int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003282 char *zErrMsg = 0;
3283 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003284 const char *zInitFile = 0;
3285 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003286 int i;
drhc28490c2006-10-26 14:25:58 +00003287 int rc = 0;
drh75897232000-05-29 14:26:00 +00003288
drh52784bd2011-05-18 17:15:06 +00003289 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3290 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3291 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3292 exit(1);
3293 }
drhdaffd0e2001-04-11 14:28:42 +00003294 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003295 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003296 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003297
drh44c2eb12003-04-30 11:38:26 +00003298 /* Make sure we have a valid signal handler early, before anything
3299 ** else is done.
3300 */
drh4c504392000-10-16 22:06:40 +00003301#ifdef SIGINT
3302 signal(SIGINT, interrupt_handler);
3303#endif
drh44c2eb12003-04-30 11:38:26 +00003304
drh22fbcb82004-02-01 01:22:50 +00003305 /* Do an initial pass through the command-line argument to locate
3306 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003307 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003308 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003309 */
drh98d312f2012-10-25 15:23:14 +00003310 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003311 char *z;
drhc28490c2006-10-26 14:25:58 +00003312 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003313 if( z[0]!='-' ){
3314 if( data.zDbFilename==0 ){
3315 data.zDbFilename = z;
3316 continue;
3317 }
3318 if( zFirstCmd==0 ){
3319 zFirstCmd = z;
3320 continue;
3321 }
3322 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3323 fprintf(stderr,"Use -help for a list of options.\n");
3324 return 1;
3325 }
drhcc3b4f82012-02-07 14:13:50 +00003326 if( z[1]=='-' ) z++;
3327 if( strcmp(z,"-separator")==0
3328 || strcmp(z,"-nullvalue")==0
3329 || strcmp(z,"-cmd")==0
3330 ){
drh98d312f2012-10-25 15:23:14 +00003331 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003332 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003333 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003334 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003335 /* Need to check for batch mode here to so we can avoid printing
3336 ** informational messages (like from process_sqliterc) before
3337 ** we do the actual processing of arguments later in a second pass.
3338 */
shanef69573d2009-10-24 02:06:14 +00003339 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003340 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003341#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003342 const char *zSize;
3343 sqlite3_int64 szHeap;
3344
drh98d312f2012-10-25 15:23:14 +00003345 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003346 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003347 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003348 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3349#endif
drh97ae8ff2011-03-16 16:56:29 +00003350#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003351 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003352 extern int vfstrace_register(
3353 const char *zTraceName,
3354 const char *zOldVfsName,
3355 int (*xOut)(const char*,void*),
3356 void *pOutArg,
3357 int makeDefault
3358 );
drh2b625e22011-03-16 17:05:28 +00003359 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003360#endif
drh6f25e892011-07-08 17:02:57 +00003361#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003362 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003363 extern int sqlite3_multiple_initialize(const char*,int);
3364 sqlite3_multiplex_initialize(0, 1);
3365#endif
drh7d9f3942013-04-03 01:26:54 +00003366 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003367 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3368 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003369 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003370 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003371 if( pVfs ){
3372 sqlite3_vfs_register(pVfs, 1);
3373 }else{
3374 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3375 exit(1);
3376 }
drh44c2eb12003-04-30 11:38:26 +00003377 }
3378 }
drh98d312f2012-10-25 15:23:14 +00003379 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003380#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003381 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003382#else
shane86f5bdb2009-10-24 02:00:07 +00003383 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3384 return 1;
drh01b41712005-08-29 23:06:23 +00003385#endif
drh98d312f2012-10-25 15:23:14 +00003386 }
3387 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003388
drh44c2eb12003-04-30 11:38:26 +00003389 /* Go ahead and open the database file if it already exists. If the
3390 ** file does not exist, delay opening it. This prevents empty database
3391 ** files from being created if a user mistypes the database name argument
3392 ** to the sqlite command-line tool.
3393 */
drhc8d74412004-08-31 23:41:26 +00003394 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003395 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003396 }
3397
drh22fbcb82004-02-01 01:22:50 +00003398 /* Process the initialization file if there is one. If no -init option
3399 ** is given on the command line, look for a file named ~/.sqliterc and
3400 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003401 */
shane86f5bdb2009-10-24 02:00:07 +00003402 rc = process_sqliterc(&data,zInitFile);
3403 if( rc>0 ){
3404 return rc;
3405 }
drh44c2eb12003-04-30 11:38:26 +00003406
drh22fbcb82004-02-01 01:22:50 +00003407 /* Make a second pass through the command-line argument and set
3408 ** options. This second pass is delayed until after the initialization
3409 ** file is processed so that the command-line arguments will override
3410 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003411 */
drh98d312f2012-10-25 15:23:14 +00003412 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003413 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003414 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003415 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003416 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003417 i++;
3418 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003419 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003420 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003421 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003422 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003423 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003424 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003425 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003426 }else if( strcmp(z,"-csv")==0 ){
3427 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003428 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003429 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003430 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003431 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003432 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003433 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003434 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003435 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003436 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003437 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003438 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003439 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003440 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003441 }else if( strcmp(z,"-stats")==0 ){
3442 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003443 }else if( strcmp(z,"-bail")==0 ){
3444 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003445 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003446 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003447 return 0;
drhc28490c2006-10-26 14:25:58 +00003448 }else if( strcmp(z,"-interactive")==0 ){
3449 stdin_is_interactive = 1;
3450 }else if( strcmp(z,"-batch")==0 ){
3451 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003452 }else if( strcmp(z,"-heap")==0 ){
3453 i++;
drh7d9f3942013-04-03 01:26:54 +00003454 }else if( strcmp(z,"-mmap")==0 ){
3455 i++;
drha7e61d82011-03-12 17:02:57 +00003456 }else if( strcmp(z,"-vfs")==0 ){
3457 i++;
drh6f25e892011-07-08 17:02:57 +00003458#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003459 }else if( strcmp(z,"-vfstrace")==0 ){
3460 i++;
drh6f25e892011-07-08 17:02:57 +00003461#endif
3462#ifdef SQLITE_ENABLE_MULTIPLEX
3463 }else if( strcmp(z,"-multiplex")==0 ){
3464 i++;
3465#endif
drhcc3b4f82012-02-07 14:13:50 +00003466 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003467 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003468 }else if( strcmp(z,"-cmd")==0 ){
3469 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003470 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003471 if( z[0]=='.' ){
3472 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003473 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003474 }else{
drh05782482013-10-24 15:20:20 +00003475 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003476 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3477 if( zErrMsg!=0 ){
3478 fprintf(stderr,"Error: %s\n", zErrMsg);
3479 if( bail_on_error ) return rc!=0 ? rc : 1;
3480 }else if( rc!=0 ){
3481 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3482 if( bail_on_error ) return rc;
3483 }
3484 }
drh1e5d0e92000-05-31 23:33:17 +00003485 }else{
shane86f5bdb2009-10-24 02:00:07 +00003486 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003487 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003488 return 1;
3489 }
3490 }
drh44c2eb12003-04-30 11:38:26 +00003491
drh22fbcb82004-02-01 01:22:50 +00003492 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003493 /* Run just the command that follows the database name
3494 */
drh22fbcb82004-02-01 01:22:50 +00003495 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003496 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003497 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003498 }else{
drh05782482013-10-24 15:20:20 +00003499 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003500 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003501 if( zErrMsg!=0 ){
3502 fprintf(stderr,"Error: %s\n", zErrMsg);
3503 return rc!=0 ? rc : 1;
3504 }else if( rc!=0 ){
3505 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3506 return rc;
drh6ff13852001-11-25 13:18:23 +00003507 }
drh75897232000-05-29 14:26:00 +00003508 }
3509 }else{
drh44c2eb12003-04-30 11:38:26 +00003510 /* Run commands received from standard input
3511 */
drhc28490c2006-10-26 14:25:58 +00003512 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003513 char *zHome;
3514 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003515 int nHistory;
drh75897232000-05-29 14:26:00 +00003516 printf(
drh743e0032011-12-12 16:51:50 +00003517 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003518 "Enter \".help\" for instructions\n"
3519 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003520 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003521 );
drh67505e72002-04-19 12:34:06 +00003522 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003523 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003524 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003525 if( (zHistory = malloc(nHistory))!=0 ){
3526 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3527 }
drh67505e72002-04-19 12:34:06 +00003528 }
danielk19774af00c62005-01-23 23:43:21 +00003529#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003530 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003531#endif
drhc28490c2006-10-26 14:25:58 +00003532 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003533 if( zHistory ){
3534 stifle_history(100);
3535 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003536 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003537 }
drhdaffd0e2001-04-11 14:28:42 +00003538 }else{
drhc28490c2006-10-26 14:25:58 +00003539 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003540 }
3541 }
drh33048c02001-10-01 14:29:22 +00003542 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003543 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003544 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003545 }
drh05782482013-10-24 15:20:20 +00003546 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003547 return rc;
drh75897232000-05-29 14:26:00 +00003548}