blob: 7826fdf204bdb1390fd5f0e2fe34add00eab4b5b [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drh81d7fd12010-12-08 00:02:26 +000048#ifdef HAVE_EDITLINE
49# include <editline/editline.h>
50#endif
drh16e59552000-07-31 11:57:37 +000051#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000052# include <readline/readline.h>
53# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000054#endif
55#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
persicom1d0b8722002-04-18 02:53:04 +000056# define add_history(X)
drh67505e72002-04-19 12:34:06 +000057# define read_history(X)
58# define write_history(X)
59# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000060#endif
61
adamd2e8464a2006-09-06 21:39:40 +000062#if defined(_WIN32) || defined(WIN32)
63# include <io.h>
shane18e526c2008-12-10 22:30:24 +000064#define isatty(h) _isatty(h)
65#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000066#undef popen
drh53371f92013-07-25 17:07:03 +000067#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000068#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000069#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000070#else
drh4328c8b2003-04-26 02:50:11 +000071/* Make sure isatty() has a prototype.
72*/
drhb2acc3b2011-10-13 16:36:29 +000073extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000074
drh53371f92013-07-25 17:07:03 +000075/* popen and pclose are not C89 functions and so are sometimes omitted from
76** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000077extern FILE *popen(const char*,const char*);
78extern int pclose(FILE*);
79#endif
drh53371f92013-07-25 17:07:03 +000080
chw65d3c132007-11-12 21:09:10 +000081#if defined(_WIN32_WCE)
82/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
83 * thus we always assume that we have a console. That can be
84 * overridden with the -batch command line option.
85 */
86#define isatty(x) 1
87#endif
88
drhf0693c82011-10-11 20:41:54 +000089/* ctype macros that work with signed characters */
90#define IsSpace(X) isspace((unsigned char)X)
91#define IsDigit(X) isdigit((unsigned char)X)
92#define ToLower(X) (char)tolower((unsigned char)X)
93
drh43408312013-10-30 12:43:36 +000094
95/* True if the timer is enabled */
96static int enableTimer = 0;
97
98/* Return the current wall-clock time */
99static sqlite3_int64 timeOfDay(void){
100 static sqlite3_vfs *clockVfs = 0;
101 sqlite3_int64 t;
102 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
103 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
104 clockVfs->xCurrentTimeInt64(clockVfs, &t);
105 }else{
106 double r;
107 clockVfs->xCurrentTime(clockVfs, &r);
108 t = (sqlite3_int64)(r*86400000.0);
109 }
110 return t;
111}
112
drhd5d0f642013-02-20 00:54:21 +0000113#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
114 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000115#include <sys/time.h>
116#include <sys/resource.h>
117
drhda108222009-02-25 19:07:24 +0000118/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000119static struct rusage sBegin; /* CPU time at start */
120static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000121
drhda108222009-02-25 19:07:24 +0000122/*
123** Begin timing an operation
124*/
125static void beginTimer(void){
126 if( enableTimer ){
127 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000128 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000129 }
130}
131
132/* Return the difference of two time_structs in seconds */
133static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
134 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
135 (double)(pEnd->tv_sec - pStart->tv_sec);
136}
137
138/*
139** Print the timing results.
140*/
141static void endTimer(void){
142 if( enableTimer ){
143 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000144 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000145 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000146 printf("Run Time: real %.3f user %f sys %f\n",
147 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000148 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
149 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
150 }
151}
shaneb320ccd2009-10-21 03:42:58 +0000152
drhda108222009-02-25 19:07:24 +0000153#define BEGIN_TIMER beginTimer()
154#define END_TIMER endTimer()
155#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000156
157#elif (defined(_WIN32) || defined(WIN32))
158
159#include <windows.h>
160
161/* Saved resource information for the beginning of an operation */
162static HANDLE hProcess;
163static FILETIME ftKernelBegin;
164static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000165static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000166typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
167static GETPROCTIMES getProcessTimesAddr = NULL;
168
shaneb320ccd2009-10-21 03:42:58 +0000169/*
170** Check to see if we have timer support. Return 1 if necessary
171** support found (or found previously).
172*/
173static int hasTimer(void){
174 if( getProcessTimesAddr ){
175 return 1;
176 } else {
177 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
178 ** See if the version we are running on has it, and if it does, save off
179 ** a pointer to it and the current process handle.
180 */
181 hProcess = GetCurrentProcess();
182 if( hProcess ){
183 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
184 if( NULL != hinstLib ){
185 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
186 if( NULL != getProcessTimesAddr ){
187 return 1;
188 }
189 FreeLibrary(hinstLib);
190 }
191 }
192 }
193 return 0;
194}
195
196/*
197** Begin timing an operation
198*/
199static void beginTimer(void){
200 if( enableTimer && getProcessTimesAddr ){
201 FILETIME ftCreation, ftExit;
202 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000203 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000204 }
205}
206
207/* Return the difference of two FILETIME structs in seconds */
208static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
209 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
210 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
211 return (double) ((i64End - i64Start) / 10000000.0);
212}
213
214/*
215** Print the timing results.
216*/
217static void endTimer(void){
218 if( enableTimer && getProcessTimesAddr){
219 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000220 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000221 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000222 printf("Run Time: real %.3f user %f sys %f\n",
223 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000224 timeDiff(&ftUserBegin, &ftUserEnd),
225 timeDiff(&ftKernelBegin, &ftKernelEnd));
226 }
227}
228
229#define BEGIN_TIMER beginTimer()
230#define END_TIMER endTimer()
231#define HAS_TIMER hasTimer()
232
drhda108222009-02-25 19:07:24 +0000233#else
234#define BEGIN_TIMER
235#define END_TIMER
236#define HAS_TIMER 0
237#endif
238
shanec0688ea2009-03-05 03:48:06 +0000239/*
240** Used to prevent warnings about unused parameters
241*/
242#define UNUSED_PARAMETER(x) (void)(x)
243
drhe91d16b2008-12-08 18:27:31 +0000244/*
drhc49f44e2006-10-26 18:15:42 +0000245** If the following flag is set, then command execution stops
246** at an error if we are not interactive.
247*/
248static int bail_on_error = 0;
249
250/*
drhc28490c2006-10-26 14:25:58 +0000251** Threat stdin as an interactive input if the following variable
252** is true. Otherwise, assume stdin is connected to a file or pipe.
253*/
254static int stdin_is_interactive = 1;
255
256/*
drh4c504392000-10-16 22:06:40 +0000257** The following is the open SQLite database. We make a pointer
258** to this database a static variable so that it can be accessed
259** by the SIGINT handler to interrupt database processing.
260*/
danielk197792f9a1b2004-06-19 09:08:16 +0000261static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000262
263/*
drh67505e72002-04-19 12:34:06 +0000264** True if an interrupt (Control-C) has been received.
265*/
drh43617e92006-03-06 20:55:46 +0000266static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000267
268/*
persicom7e2dfdd2002-04-18 02:46:52 +0000269** This is the name of our program. It is set in main(), used
270** in a number of other places, mostly for error messages.
271*/
272static char *Argv0;
273
274/*
275** Prompt strings. Initialized in main. Settable with
276** .prompt main continue
277*/
278static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
279static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
280
drhb0603412007-02-28 04:47:26 +0000281/*
282** Write I/O traces to the following stream.
283*/
rsebe0a9092007-07-30 18:24:38 +0000284#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000285static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000286#endif
drhb0603412007-02-28 04:47:26 +0000287
288/*
289** This routine works like printf in that its first argument is a
290** format string and subsequent arguments are values to be substituted
291** in place of % fields. The result of formatting this string
292** is written to iotrace.
293*/
rsebe0a9092007-07-30 18:24:38 +0000294#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000295static void iotracePrintf(const char *zFormat, ...){
296 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000297 char *z;
drhb0603412007-02-28 04:47:26 +0000298 if( iotrace==0 ) return;
299 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000300 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000301 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000302 fprintf(iotrace, "%s", z);
303 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000304}
rsebe0a9092007-07-30 18:24:38 +0000305#endif
drhb0603412007-02-28 04:47:26 +0000306
drh44c2eb12003-04-30 11:38:26 +0000307
persicom7e2dfdd2002-04-18 02:46:52 +0000308/*
drh83965662003-04-17 02:54:13 +0000309** Determines if a string is a number of not.
310*/
danielk19772e588c72005-12-09 14:25:08 +0000311static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000312 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000313 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000314 return 0;
315 }
316 z++;
317 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000318 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000319 if( *z=='.' ){
320 z++;
drhf0693c82011-10-11 20:41:54 +0000321 if( !IsDigit(*z) ) return 0;
322 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000323 if( realnum ) *realnum = 1;
324 }
325 if( *z=='e' || *z=='E' ){
326 z++;
327 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000328 if( !IsDigit(*z) ) return 0;
329 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000330 if( realnum ) *realnum = 1;
331 }
332 return *z==0;
333}
drh83965662003-04-17 02:54:13 +0000334
335/*
danielk1977bc6ada42004-06-30 08:20:16 +0000336** A global char* and an SQL function to access its current value
337** from within an SQL statement. This program used to use the
338** sqlite_exec_printf() API to substitue a string into an SQL statement.
339** The correct way to do this with sqlite3 is to use the bind API, but
340** since the shell is built around the callback paradigm it would be a lot
341** of work. Instead just use this hack, which is quite harmless.
342*/
343static const char *zShellStatic = 0;
344static void shellstaticFunc(
345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
349 assert( 0==argc );
350 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000351 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000352 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000353 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
354}
355
356
357/*
drhfeac5f82004-08-01 00:10:45 +0000358** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000359** the text in memory obtained from malloc() and returns a pointer
360** to the text. NULL is returned at end of file, or if malloc()
361** fails.
362**
drh9f099fd2013-08-06 14:01:46 +0000363** If zLine is not NULL then it is a malloced buffer returned from
364** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000365*/
drh9f099fd2013-08-06 14:01:46 +0000366static char *local_getline(char *zLine, FILE *in){
367 int nLine = zLine==0 ? 0 : 100;
368 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000369
drhb07028f2011-10-14 21:49:18 +0000370 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000371 if( n+100>nLine ){
372 nLine = nLine*2 + 100;
373 zLine = realloc(zLine, nLine);
374 if( zLine==0 ) return 0;
375 }
drhdaffd0e2001-04-11 14:28:42 +0000376 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000377 if( n==0 ){
378 free(zLine);
379 return 0;
380 }
381 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000382 break;
383 }
drh9f099fd2013-08-06 14:01:46 +0000384 while( zLine[n] ) n++;
385 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000386 n--;
shaneh13b36022009-12-17 21:07:15 +0000387 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000388 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000389 break;
drh8e7e7a22000-05-30 18:45:23 +0000390 }
391 }
drh8e7e7a22000-05-30 18:45:23 +0000392 return zLine;
393}
394
395/*
drhc28490c2006-10-26 14:25:58 +0000396** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000397**
drh9f099fd2013-08-06 14:01:46 +0000398** If in==0 then read from standard input and prompt before each line.
399** If isContinuation is true, then a continuation prompt is appropriate.
400** If isContinuation is zero, then the main prompt should be used.
401**
402** If zPrior is not NULL then it is a buffer from a prior call to this
403** routine that can be reused.
404**
405** The result is stored in space obtained from malloc() and must either
406** be freed by the caller or else passed back into this routine via the
407** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000408*/
drh9f099fd2013-08-06 14:01:46 +0000409static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000410 char *zPrompt;
411 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000412 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000413 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000414 }else{
drh9f099fd2013-08-06 14:01:46 +0000415 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danielk19774af00c62005-01-23 23:43:21 +0000416#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh9f099fd2013-08-06 14:01:46 +0000417 free(zPrior);
418 zResult = readline(zPrompt);
419 if( zResult && *zResult ) add_history(zResult);
420#else
421 printf("%s", zPrompt);
422 fflush(stdout);
423 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000424#endif
drh9f099fd2013-08-06 14:01:46 +0000425 }
drh8e7e7a22000-05-30 18:45:23 +0000426 return zResult;
427}
428
persicom7e2dfdd2002-04-18 02:46:52 +0000429struct previous_mode_data {
430 int valid; /* Is there legit data in here? */
431 int mode;
432 int showHeader;
433 int colWidth[100];
434};
drh45e29d82006-11-20 16:21:10 +0000435
drh8e7e7a22000-05-30 18:45:23 +0000436/*
drh75897232000-05-29 14:26:00 +0000437** An pointer to an instance of this structure is passed from
438** the main program to the callback. This is used to communicate
439** state and mode information.
440*/
441struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000442 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000443 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000444 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000445 int cnt; /* Number of records displayed so far */
446 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000447 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000448 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000449 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000450 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000451 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000452 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000453 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000454 int colWidth[100]; /* Requested width of each column when in column mode*/
455 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000456 char nullvalue[20]; /* The text to print when a NULL comes back from
457 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000458 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000459 /* Holds the mode information just before
460 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000461 char outfile[FILENAME_MAX]; /* Filename for *out */
462 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000463 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000464 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000465 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000466 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000467 int *aiIndent; /* Array of indents used in MODE_Explain */
468 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000469 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000470};
471
472/*
473** These are the allowed modes.
474*/
drh967e8b72000-06-21 13:59:10 +0000475#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000476#define MODE_Column 1 /* One record per line in neat columns */
477#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000478#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
479#define MODE_Html 4 /* Generate an XHTML table */
480#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000481#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000482#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000483#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000484
drh66ce4d02008-02-15 17:38:06 +0000485static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000486 "line",
487 "column",
488 "list",
489 "semi",
490 "html",
drhfeac5f82004-08-01 00:10:45 +0000491 "insert",
492 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000493 "csv",
drh66ce4d02008-02-15 17:38:06 +0000494 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000495};
drh75897232000-05-29 14:26:00 +0000496
497/*
498** Number of elements in an array
499*/
drh902b9ee2008-12-05 17:17:07 +0000500#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000501
502/*
drhea678832008-12-10 19:26:22 +0000503** Compute a string length that is limited to what can be stored in
504** lower 30 bits of a 32-bit signed integer.
505*/
drh4f21c4a2008-12-10 22:15:00 +0000506static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000507 const char *z2 = z;
508 while( *z2 ){ z2++; }
509 return 0x3fffffff & (int)(z2 - z);
510}
511
512/*
drh127f9d72010-02-23 01:47:00 +0000513** A callback for the sqlite3_log() interface.
514*/
515static void shellLog(void *pArg, int iErrCode, const char *zMsg){
516 struct callback_data *p = (struct callback_data*)pArg;
517 if( p->pLog==0 ) return;
518 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
519 fflush(p->pLog);
520}
521
522/*
shane626a6e42009-10-22 17:30:15 +0000523** Output the given string as a hex-encoded blob (eg. X'1234' )
524*/
525static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
526 int i;
527 char *zBlob = (char *)pBlob;
528 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000529 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000530 fprintf(out,"'");
531}
532
533/*
drh28bd4bc2000-06-15 15:57:22 +0000534** Output the given string as a quoted string using SQL quoting conventions.
535*/
536static void output_quoted_string(FILE *out, const char *z){
537 int i;
538 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000539 for(i=0; z[i]; i++){
540 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000541 }
542 if( nSingle==0 ){
543 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000544 }else{
545 fprintf(out,"'");
546 while( *z ){
547 for(i=0; z[i] && z[i]!='\''; i++){}
548 if( i==0 ){
549 fprintf(out,"''");
550 z++;
551 }else if( z[i]=='\'' ){
552 fprintf(out,"%.*s''",i,z);
553 z += i+1;
554 }else{
drhcd7d2732002-02-26 23:24:26 +0000555 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000556 break;
557 }
558 }
drhcd7d2732002-02-26 23:24:26 +0000559 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000560 }
561}
562
563/*
drhfeac5f82004-08-01 00:10:45 +0000564** Output the given string as a quoted according to C or TCL quoting rules.
565*/
566static void output_c_string(FILE *out, const char *z){
567 unsigned int c;
568 fputc('"', out);
569 while( (c = *(z++))!=0 ){
570 if( c=='\\' ){
571 fputc(c, out);
572 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000573 }else if( c=='"' ){
574 fputc('\\', out);
575 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000576 }else if( c=='\t' ){
577 fputc('\\', out);
578 fputc('t', out);
579 }else if( c=='\n' ){
580 fputc('\\', out);
581 fputc('n', out);
582 }else if( c=='\r' ){
583 fputc('\\', out);
584 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000585 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000586 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000587 }else{
588 fputc(c, out);
589 }
590 }
591 fputc('"', out);
592}
593
594/*
drhc08a4f12000-06-15 16:49:48 +0000595** Output the given string with characters that are special to
596** HTML escaped.
597*/
598static void output_html_string(FILE *out, const char *z){
599 int i;
600 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000601 for(i=0; z[i]
602 && z[i]!='<'
603 && z[i]!='&'
604 && z[i]!='>'
605 && z[i]!='\"'
606 && z[i]!='\'';
607 i++){}
drhc08a4f12000-06-15 16:49:48 +0000608 if( i>0 ){
609 fprintf(out,"%.*s",i,z);
610 }
611 if( z[i]=='<' ){
612 fprintf(out,"&lt;");
613 }else if( z[i]=='&' ){
614 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000615 }else if( z[i]=='>' ){
616 fprintf(out,"&gt;");
617 }else if( z[i]=='\"' ){
618 fprintf(out,"&quot;");
619 }else if( z[i]=='\'' ){
620 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000621 }else{
622 break;
623 }
624 z += i + 1;
625 }
626}
627
628/*
drhc49f44e2006-10-26 18:15:42 +0000629** If a field contains any character identified by a 1 in the following
630** array, then the string must be quoted for CSV.
631*/
632static const char needCsvQuote[] = {
633 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
634 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
635 1, 0, 1, 0, 0, 0, 0, 1, 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, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649};
650
651/*
drh8e64d1c2004-10-07 00:32:39 +0000652** Output a single term of CSV. Actually, p->separator is used for
653** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000654** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000655*/
656static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000657 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000658 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000659 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000660 }else{
drhc49f44e2006-10-26 18:15:42 +0000661 int i;
drh4f21c4a2008-12-10 22:15:00 +0000662 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000663 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000664 if( needCsvQuote[((unsigned char*)z)[i]]
665 || (z[i]==p->separator[0] &&
666 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000667 i = 0;
668 break;
669 }
670 }
671 if( i==0 ){
672 putc('"', out);
673 for(i=0; z[i]; i++){
674 if( z[i]=='"' ) putc('"', out);
675 putc(z[i], out);
676 }
677 putc('"', out);
678 }else{
679 fprintf(out, "%s", z);
680 }
drh8e64d1c2004-10-07 00:32:39 +0000681 }
682 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000683 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000684 }
685}
686
danielk19774af00c62005-01-23 23:43:21 +0000687#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000688/*
drh4c504392000-10-16 22:06:40 +0000689** This routine runs when the user presses Ctrl-C
690*/
691static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000692 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000693 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000694 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000695}
danielk19774af00c62005-01-23 23:43:21 +0000696#endif
drh4c504392000-10-16 22:06:40 +0000697
698/*
shane626a6e42009-10-22 17:30:15 +0000699** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000700** invokes for each row of a query result.
701*/
shane626a6e42009-10-22 17:30:15 +0000702static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000703 int i;
704 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000705
drh75897232000-05-29 14:26:00 +0000706 switch( p->mode ){
707 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000708 int w = 5;
drh6a535342001-10-19 16:44:56 +0000709 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000710 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000711 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000712 if( len>w ) w = len;
713 }
drh75897232000-05-29 14:26:00 +0000714 if( p->cnt++>0 ) fprintf(p->out,"\n");
715 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000716 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000717 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000718 }
719 break;
720 }
danielk19770d78bae2008-01-03 07:09:48 +0000721 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000722 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000723 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000724 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000725 int w, n;
726 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000727 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000728 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000729 w = 0;
drh75897232000-05-29 14:26:00 +0000730 }
drh078b1fd2012-09-21 13:40:02 +0000731 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000732 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000733 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000734 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000735 if( w<n ) w = n;
736 }
737 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000738 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000739 }
740 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000741 if( w<0 ){
742 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
743 }else{
744 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
745 }
drha0c66f52000-07-29 13:20:21 +0000746 }
747 }
748 if( p->showHeader ){
749 for(i=0; i<nArg; i++){
750 int w;
751 if( i<ArraySize(p->actualWidth) ){
752 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000753 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000754 }else{
755 w = 10;
756 }
757 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
758 "----------------------------------------------------------",
759 i==nArg-1 ? "\n": " ");
760 }
drh75897232000-05-29 14:26:00 +0000761 }
762 }
drh6a535342001-10-19 16:44:56 +0000763 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000764 for(i=0; i<nArg; i++){
765 int w;
drha0c66f52000-07-29 13:20:21 +0000766 if( i<ArraySize(p->actualWidth) ){
767 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000768 }else{
769 w = 10;
770 }
dana98bf362013-11-13 18:35:01 +0000771 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000772 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000773 }
dana98bf362013-11-13 18:35:01 +0000774 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000775 if( p->iIndent<p->nIndent ){
776 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000777 }
danc4650bb2013-11-18 08:41:06 +0000778 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000779 }
drh078b1fd2012-09-21 13:40:02 +0000780 if( w<0 ){
781 fprintf(p->out,"%*.*s%s",-w,-w,
782 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
783 }else{
784 fprintf(p->out,"%-*.*s%s",w,w,
785 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
786 }
drh75897232000-05-29 14:26:00 +0000787 }
788 break;
789 }
drhe3710332000-09-29 13:30:53 +0000790 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000791 case MODE_List: {
792 if( p->cnt++==0 && p->showHeader ){
793 for(i=0; i<nArg; i++){
794 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
795 }
796 }
drh6a535342001-10-19 16:44:56 +0000797 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000798 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000799 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000800 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000801 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000802 if( i<nArg-1 ){
803 fprintf(p->out, "%s", p->separator);
804 }else if( p->mode==MODE_Semi ){
805 fprintf(p->out, ";\n");
806 }else{
807 fprintf(p->out, "\n");
808 }
drh75897232000-05-29 14:26:00 +0000809 }
810 break;
811 }
drh1e5d0e92000-05-31 23:33:17 +0000812 case MODE_Html: {
813 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000814 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000815 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000816 fprintf(p->out,"<TH>");
817 output_html_string(p->out, azCol[i]);
818 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000819 }
mihailim57c591a2008-06-23 21:26:05 +0000820 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000821 }
drh6a535342001-10-19 16:44:56 +0000822 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000823 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000824 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000825 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000826 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000828 }
mihailim57c591a2008-06-23 21:26:05 +0000829 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000830 break;
831 }
drhfeac5f82004-08-01 00:10:45 +0000832 case MODE_Tcl: {
833 if( p->cnt++==0 && p->showHeader ){
834 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000835 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000836 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000837 }
838 fprintf(p->out,"\n");
839 }
840 if( azArg==0 ) break;
841 for(i=0; i<nArg; i++){
842 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000843 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000844 }
845 fprintf(p->out,"\n");
846 break;
847 }
drh8e64d1c2004-10-07 00:32:39 +0000848 case MODE_Csv: {
849 if( p->cnt++==0 && p->showHeader ){
850 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000851 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000852 }
853 fprintf(p->out,"\n");
854 }
855 if( azArg==0 ) break;
856 for(i=0; i<nArg; i++){
857 output_csv(p, azArg[i], i<nArg-1);
858 }
859 fprintf(p->out,"\n");
860 break;
861 }
drh28bd4bc2000-06-15 15:57:22 +0000862 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000863 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000864 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000865 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000866 for(i=0; i<nArg; i++){
867 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000868 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000869 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000870 }else if( aiType && aiType[i]==SQLITE_TEXT ){
871 if( zSep[0] ) fprintf(p->out,"%s",zSep);
872 output_quoted_string(p->out, azArg[i]);
873 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
874 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000875 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
876 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
877 int nBlob = sqlite3_column_bytes(p->pStmt, i);
878 if( zSep[0] ) fprintf(p->out,"%s",zSep);
879 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000880 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000881 fprintf(p->out,"%s%s",zSep, azArg[i]);
882 }else{
883 if( zSep[0] ) fprintf(p->out,"%s",zSep);
884 output_quoted_string(p->out, azArg[i]);
885 }
886 }
887 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000888 break;
drh28bd4bc2000-06-15 15:57:22 +0000889 }
persicom1d0b8722002-04-18 02:53:04 +0000890 }
drh75897232000-05-29 14:26:00 +0000891 return 0;
892}
893
894/*
shane626a6e42009-10-22 17:30:15 +0000895** This is the callback routine that the SQLite library
896** invokes for each row of a query result.
897*/
898static int callback(void *pArg, int nArg, char **azArg, char **azCol){
899 /* since we don't have type info, call the shell_callback with a NULL value */
900 return shell_callback(pArg, nArg, azArg, azCol, NULL);
901}
902
903/*
drh33048c02001-10-01 14:29:22 +0000904** Set the destination table field of the callback_data structure to
905** the name of the table given. Escape any quote characters in the
906** table name.
907*/
908static void set_table_name(struct callback_data *p, const char *zName){
909 int i, n;
910 int needQuote;
911 char *z;
912
913 if( p->zDestTable ){
914 free(p->zDestTable);
915 p->zDestTable = 0;
916 }
917 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000918 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000919 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000920 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000921 needQuote = 1;
922 if( zName[i]=='\'' ) n++;
923 }
924 }
925 if( needQuote ) n += 2;
926 z = p->zDestTable = malloc( n+1 );
927 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000928 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000929 exit(1);
930 }
931 n = 0;
932 if( needQuote ) z[n++] = '\'';
933 for(i=0; zName[i]; i++){
934 z[n++] = zName[i];
935 if( zName[i]=='\'' ) z[n++] = '\'';
936 }
937 if( needQuote ) z[n++] = '\'';
938 z[n] = 0;
939}
940
danielk19772a02e332004-06-05 08:04:36 +0000941/* zIn is either a pointer to a NULL-terminated string in memory obtained
942** from malloc(), or a NULL pointer. The string pointed to by zAppend is
943** added to zIn, and the result returned in memory obtained from malloc().
944** zIn, if it was not NULL, is freed.
945**
946** If the third argument, quote, is not '\0', then it is used as a
947** quote character for zAppend.
948*/
drhc28490c2006-10-26 14:25:58 +0000949static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000950 int len;
951 int i;
drh4f21c4a2008-12-10 22:15:00 +0000952 int nAppend = strlen30(zAppend);
953 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000954
955 len = nAppend+nIn+1;
956 if( quote ){
957 len += 2;
958 for(i=0; i<nAppend; i++){
959 if( zAppend[i]==quote ) len++;
960 }
961 }
962
963 zIn = (char *)realloc(zIn, len);
964 if( !zIn ){
965 return 0;
966 }
967
968 if( quote ){
969 char *zCsr = &zIn[nIn];
970 *zCsr++ = quote;
971 for(i=0; i<nAppend; i++){
972 *zCsr++ = zAppend[i];
973 if( zAppend[i]==quote ) *zCsr++ = quote;
974 }
975 *zCsr++ = quote;
976 *zCsr++ = '\0';
977 assert( (zCsr-zIn)==len );
978 }else{
979 memcpy(&zIn[nIn], zAppend, nAppend);
980 zIn[len-1] = '\0';
981 }
982
983 return zIn;
984}
985
drhdd3d4592004-08-30 01:54:05 +0000986
987/*
drhb21a8e42012-01-28 21:08:51 +0000988** Execute a query statement that will generate SQL output. Print
989** the result columns, comma-separated, on a line and then add a
990** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000991**
drhb21a8e42012-01-28 21:08:51 +0000992** If the number of columns is 1 and that column contains text "--"
993** then write the semicolon on a separate line. That way, if a
994** "--" comment occurs at the end of the statement, the comment
995** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +0000996*/
drh157e29a2009-05-21 15:15:00 +0000997static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000998 struct callback_data *p, /* Query context */
999 const char *zSelect, /* SELECT statement to extract content */
1000 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001001){
drhdd3d4592004-08-30 01:54:05 +00001002 sqlite3_stmt *pSelect;
1003 int rc;
drhb21a8e42012-01-28 21:08:51 +00001004 int nResult;
1005 int i;
1006 const char *z;
drh2f464a02011-10-13 00:41:49 +00001007 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001008 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001009 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001010 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001011 return rc;
1012 }
1013 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001014 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001015 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001016 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001017 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001018 zFirstRow = 0;
1019 }
drhb21a8e42012-01-28 21:08:51 +00001020 z = (const char*)sqlite3_column_text(pSelect, 0);
1021 fprintf(p->out, "%s", z);
1022 for(i=1; i<nResult; i++){
1023 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1024 }
1025 if( z==0 ) z = "";
1026 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1027 if( z[0] ){
1028 fprintf(p->out, "\n;\n");
1029 }else{
1030 fprintf(p->out, ";\n");
1031 }
drhdd3d4592004-08-30 01:54:05 +00001032 rc = sqlite3_step(pSelect);
1033 }
drh2f464a02011-10-13 00:41:49 +00001034 rc = sqlite3_finalize(pSelect);
1035 if( rc!=SQLITE_OK ){
1036 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001037 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001038 }
1039 return rc;
drhdd3d4592004-08-30 01:54:05 +00001040}
1041
shane626a6e42009-10-22 17:30:15 +00001042/*
1043** Allocate space and save off current error string.
1044*/
1045static char *save_err_msg(
1046 sqlite3 *db /* Database to query */
1047){
1048 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1049 char *zErrMsg = sqlite3_malloc(nErrMsg);
1050 if( zErrMsg ){
1051 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1052 }
1053 return zErrMsg;
1054}
1055
1056/*
shaneh642d8b82010-07-28 16:05:34 +00001057** Display memory stats.
1058*/
1059static int display_stats(
1060 sqlite3 *db, /* Database to query */
1061 struct callback_data *pArg, /* Pointer to struct callback_data */
1062 int bReset /* True to reset the stats */
1063){
1064 int iCur;
1065 int iHiwtr;
1066
1067 if( pArg && pArg->out ){
1068
1069 iHiwtr = iCur = -1;
1070 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001071 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001072 iHiwtr = iCur = -1;
1073 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001074 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001075/*
1076** Not currently used by the CLI.
1077** iHiwtr = iCur = -1;
1078** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1079** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1080*/
1081 iHiwtr = iCur = -1;
1082 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1083 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1084/*
1085** Not currently used by the CLI.
1086** iHiwtr = iCur = -1;
1087** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1088** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1089*/
1090 iHiwtr = iCur = -1;
1091 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1092 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1093 iHiwtr = iCur = -1;
1094 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1095 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1096 iHiwtr = iCur = -1;
1097 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1098 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1099 iHiwtr = iCur = -1;
1100 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1101 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1102#ifdef YYTRACKMAXSTACKDEPTH
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1106#endif
1107 }
1108
1109 if( pArg && pArg->out && db ){
1110 iHiwtr = iCur = -1;
1111 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1112 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001113 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1114 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1115 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1116 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1117 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1118 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001119 iHiwtr = iCur = -1;
1120 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001121 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1122 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1123 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1124 iHiwtr = iCur = -1;
1125 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1126 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001127 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001128 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1129 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1130 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001131 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1132 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1133 iHiwtr = iCur = -1;
1134 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1135 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1136 }
1137
1138 if( pArg && pArg->out && db && pArg->pStmt ){
1139 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1140 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1141 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1142 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1143 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1144 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001145 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1146 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001147 }
1148
1149 return 0;
1150}
1151
1152/*
dana98bf362013-11-13 18:35:01 +00001153** Parameter azArray points to a zero-terminated array of strings. zStr
1154** points to a single nul-terminated string. Return non-zero if zStr
1155** is equal, according to strcmp(), to any of the strings in the array.
1156** Otherwise, return zero.
1157*/
1158static int str_in_array(const char *zStr, const char **azArray){
1159 int i;
1160 for(i=0; azArray[i]; i++){
1161 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1162 }
1163 return 0;
1164}
1165
1166/*
1167** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1168** and populate the callback_data.aiIndent[] array with the number of
1169** spaces each opcode should be indented before it is output.
1170**
1171** The indenting rules are:
1172**
1173** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1174** all opcodes that occur between the p2 jump destination and the opcode
1175** itself by 2 spaces.
1176**
drh01752bc2013-11-14 23:59:33 +00001177** * For each "Goto", if the jump destination is earlier in the program
1178** and ends on one of:
1179** Yield SeekGt SeekLt RowSetRead
1180** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001181** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001182*/
1183static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1184 const char *zSql; /* The text of the SQL statement */
1185 const char *z; /* Used to check if this is an EXPLAIN */
1186 int *abYield = 0; /* True if op is an OP_Yield */
1187 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001188 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001189
drh602320e2013-11-15 03:16:34 +00001190 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drh01752bc2013-11-14 23:59:33 +00001191 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", 0 };
dana98bf362013-11-13 18:35:01 +00001192 const char *azGoto[] = { "Goto", 0 };
1193
1194 /* Try to figure out if this is really an EXPLAIN statement. If this
1195 ** cannot be verified, return early. */
1196 zSql = sqlite3_sql(pSql);
1197 if( zSql==0 ) return;
1198 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1199 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1200
1201 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1202 int i;
danc4650bb2013-11-18 08:41:06 +00001203 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001204 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001205
1206 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1207 ** p2 is an instruction address, set variable p2op to the index of that
1208 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1209 ** the current instruction is part of a sub-program generated by an
1210 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001211 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001212 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001213
1214 /* Grow the p->aiIndent array as required */
1215 if( iOp>=nAlloc ){
1216 nAlloc += 100;
1217 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1218 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1219 }
1220 abYield[iOp] = str_in_array(zOp, azYield);
1221 p->aiIndent[iOp] = 0;
1222 p->nIndent = iOp+1;
1223
1224 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001225 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001226 }
danc4650bb2013-11-18 08:41:06 +00001227 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
1228 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001229 }
1230 }
1231
danc4650bb2013-11-18 08:41:06 +00001232 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001233 sqlite3_free(abYield);
1234 sqlite3_reset(pSql);
1235}
1236
1237/*
1238** Free the array allocated by explain_data_prepare().
1239*/
1240static void explain_data_delete(struct callback_data *p){
1241 sqlite3_free(p->aiIndent);
1242 p->aiIndent = 0;
1243 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001244 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001245}
1246
1247/*
shane626a6e42009-10-22 17:30:15 +00001248** Execute a statement or set of statements. Print
1249** any result rows/columns depending on the current mode
1250** set via the supplied callback.
1251**
1252** This is very similar to SQLite's built-in sqlite3_exec()
1253** function except it takes a slightly different callback
1254** and callback data argument.
1255*/
1256static int shell_exec(
1257 sqlite3 *db, /* An open database */
1258 const char *zSql, /* SQL to be evaluated */
1259 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1260 /* (not the same as sqlite3_exec) */
1261 struct callback_data *pArg, /* Pointer to struct callback_data */
1262 char **pzErrMsg /* Error msg written here */
1263){
dan4564ced2010-01-05 04:59:56 +00001264 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1265 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001266 int rc2;
dan4564ced2010-01-05 04:59:56 +00001267 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001268
1269 if( pzErrMsg ){
1270 *pzErrMsg = NULL;
1271 }
1272
shaneb9fc17d2009-10-22 21:23:35 +00001273 while( zSql[0] && (SQLITE_OK == rc) ){
1274 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1275 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001276 if( pzErrMsg ){
1277 *pzErrMsg = save_err_msg(db);
1278 }
1279 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001280 if( !pStmt ){
1281 /* this happens for a comment or white-space */
1282 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001283 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001284 continue;
1285 }
shane626a6e42009-10-22 17:30:15 +00001286
shaneh642d8b82010-07-28 16:05:34 +00001287 /* save off the prepared statment handle and reset row count */
1288 if( pArg ){
1289 pArg->pStmt = pStmt;
1290 pArg->cnt = 0;
1291 }
1292
shanehb7977c52010-01-18 18:17:10 +00001293 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001294 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001295 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001296 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001297 }
shanehb7977c52010-01-18 18:17:10 +00001298
drh7e02e5e2011-12-06 19:44:51 +00001299 /* Output TESTCTRL_EXPLAIN text of requested */
1300 if( pArg && pArg->mode==MODE_Explain ){
1301 const char *zExplain = 0;
1302 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1303 if( zExplain && zExplain[0] ){
1304 fprintf(pArg->out, "%s", zExplain);
1305 }
1306 }
1307
dana98bf362013-11-13 18:35:01 +00001308 /* If the shell is currently in ".explain" mode, gather the extra
1309 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001310 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001311 explain_data_prepare(pArg, pStmt);
1312 }
1313
shaneb9fc17d2009-10-22 21:23:35 +00001314 /* perform the first step. this will tell us if we
1315 ** have a result set or not and how wide it is.
1316 */
1317 rc = sqlite3_step(pStmt);
1318 /* if we have a result set... */
1319 if( SQLITE_ROW == rc ){
1320 /* if we have a callback... */
1321 if( xCallback ){
1322 /* allocate space for col name ptr, value ptr, and type */
1323 int nCol = sqlite3_column_count(pStmt);
1324 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1325 if( !pData ){
1326 rc = SQLITE_NOMEM;
1327 }else{
1328 char **azCols = (char **)pData; /* Names of result columns */
1329 char **azVals = &azCols[nCol]; /* Results */
1330 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001331 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001332 assert(sizeof(int) <= sizeof(char *));
1333 /* save off ptrs to column names */
1334 for(i=0; i<nCol; i++){
1335 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1336 }
shaneb9fc17d2009-10-22 21:23:35 +00001337 do{
1338 /* extract the data and data types */
1339 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001340 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001341 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001342 azVals[i] = "";
1343 }else{
1344 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1345 }
shaneb9fc17d2009-10-22 21:23:35 +00001346 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1347 rc = SQLITE_NOMEM;
1348 break; /* from for */
1349 }
1350 } /* end for */
1351
1352 /* if data and types extracted successfully... */
1353 if( SQLITE_ROW == rc ){
1354 /* call the supplied callback with the result row data */
1355 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1356 rc = SQLITE_ABORT;
1357 }else{
1358 rc = sqlite3_step(pStmt);
1359 }
1360 }
1361 } while( SQLITE_ROW == rc );
1362 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001363 }
1364 }else{
1365 do{
1366 rc = sqlite3_step(pStmt);
1367 } while( rc == SQLITE_ROW );
1368 }
1369 }
1370
dana98bf362013-11-13 18:35:01 +00001371 explain_data_delete(pArg);
1372
shaneh642d8b82010-07-28 16:05:34 +00001373 /* print usage stats if stats on */
1374 if( pArg && pArg->statsOn ){
1375 display_stats(db, pArg, 0);
1376 }
1377
dan4564ced2010-01-05 04:59:56 +00001378 /* Finalize the statement just executed. If this fails, save a
1379 ** copy of the error message. Otherwise, set zSql to point to the
1380 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001381 rc2 = sqlite3_finalize(pStmt);
1382 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001383 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001384 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001385 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001386 }else if( pzErrMsg ){
1387 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001388 }
shaneh642d8b82010-07-28 16:05:34 +00001389
1390 /* clear saved stmt handle */
1391 if( pArg ){
1392 pArg->pStmt = NULL;
1393 }
shane626a6e42009-10-22 17:30:15 +00001394 }
shaneb9fc17d2009-10-22 21:23:35 +00001395 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001396
1397 return rc;
1398}
1399
drhdd3d4592004-08-30 01:54:05 +00001400
drh33048c02001-10-01 14:29:22 +00001401/*
drh4c653a02000-06-07 01:27:47 +00001402** This is a different callback routine used for dumping the database.
1403** Each row received by this callback consists of a table name,
1404** the table type ("index" or "table") and SQL to create the table.
1405** This routine should print text sufficient to recreate the table.
1406*/
1407static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001408 int rc;
1409 const char *zTable;
1410 const char *zType;
1411 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001412 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001413 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001414
drh902b9ee2008-12-05 17:17:07 +00001415 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001416 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001417 zTable = azArg[0];
1418 zType = azArg[1];
1419 zSql = azArg[2];
1420
drh00b950d2005-09-11 02:03:03 +00001421 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001422 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001423 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001424 fprintf(p->out, "ANALYZE sqlite_master;\n");
1425 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1426 return 0;
drh45e29d82006-11-20 16:21:10 +00001427 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1428 char *zIns;
1429 if( !p->writableSchema ){
1430 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1431 p->writableSchema = 1;
1432 }
1433 zIns = sqlite3_mprintf(
1434 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1435 "VALUES('table','%q','%q',0,'%q');",
1436 zTable, zTable, zSql);
1437 fprintf(p->out, "%s\n", zIns);
1438 sqlite3_free(zIns);
1439 return 0;
drh00b950d2005-09-11 02:03:03 +00001440 }else{
1441 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001442 }
danielk19772a02e332004-06-05 08:04:36 +00001443
1444 if( strcmp(zType, "table")==0 ){
1445 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001446 char *zSelect = 0;
1447 char *zTableInfo = 0;
1448 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001449 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001450
1451 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1452 zTableInfo = appendText(zTableInfo, zTable, '"');
1453 zTableInfo = appendText(zTableInfo, ");", 0);
1454
1455 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001456 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001457 if( rc!=SQLITE_OK || !pTableInfo ){
1458 return 1;
1459 }
1460
1461 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001462 /* Always quote the table name, even if it appears to be pure ascii,
1463 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1464 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001465 if( zTmp ){
1466 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001467 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001468 }
1469 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1470 rc = sqlite3_step(pTableInfo);
1471 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001472 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001473 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001474 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001475 rc = sqlite3_step(pTableInfo);
1476 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001477 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001478 }else{
1479 zSelect = appendText(zSelect, ") ", 0);
1480 }
drh157e29a2009-05-21 15:15:00 +00001481 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001482 }
1483 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001484 if( rc!=SQLITE_OK || nRow==0 ){
1485 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001486 return 1;
1487 }
1488 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1489 zSelect = appendText(zSelect, zTable, '"');
1490
drh2f464a02011-10-13 00:41:49 +00001491 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001492 if( rc==SQLITE_CORRUPT ){
1493 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001494 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001495 }
drh85e72432012-04-11 11:38:53 +00001496 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001497 }
drh4c653a02000-06-07 01:27:47 +00001498 return 0;
1499}
1500
1501/*
drh45e29d82006-11-20 16:21:10 +00001502** Run zQuery. Use dump_callback() as the callback routine so that
1503** the contents of the query are output as SQL statements.
1504**
drhdd3d4592004-08-30 01:54:05 +00001505** If we get a SQLITE_CORRUPT error, rerun the query after appending
1506** "ORDER BY rowid DESC" to the end.
1507*/
1508static int run_schema_dump_query(
1509 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001510 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001511){
1512 int rc;
drh2f464a02011-10-13 00:41:49 +00001513 char *zErr = 0;
1514 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001515 if( rc==SQLITE_CORRUPT ){
1516 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001517 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001518 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1519 if( zErr ){
1520 fprintf(p->out, "/****** %s ******/\n", zErr);
1521 sqlite3_free(zErr);
1522 zErr = 0;
1523 }
drhdd3d4592004-08-30 01:54:05 +00001524 zQ2 = malloc( len+100 );
1525 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001526 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001527 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1528 if( rc ){
1529 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1530 }else{
1531 rc = SQLITE_CORRUPT;
1532 }
1533 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001534 free(zQ2);
1535 }
1536 return rc;
1537}
1538
1539/*
drh75897232000-05-29 14:26:00 +00001540** Text of a help message
1541*/
persicom1d0b8722002-04-18 02:53:04 +00001542static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001543 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001544 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001545 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001546 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001547 " If TABLE specified, only dump tables matching\n"
1548 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001549 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001550 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001551 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1552 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001553 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001554 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001555 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001556 ".indices ?TABLE? Show names of all indices\n"
1557 " If TABLE specified, only show indices for tables\n"
1558 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001559#ifdef SQLITE_ENABLE_IOTRACE
1560 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1561#endif
drh70df4fe2006-06-13 15:12:21 +00001562#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001563 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001564#endif
drh127f9d72010-02-23 01:47:00 +00001565 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001566 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001567 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001568 " column Left-aligned columns. (See .width)\n"
1569 " html HTML <table> code\n"
1570 " insert SQL insert statements for TABLE\n"
1571 " line One value per line\n"
1572 " list Values delimited by .separator string\n"
1573 " tabs Tab-separated values\n"
1574 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001575 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001576 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001577 ".output FILENAME Send output to FILENAME\n"
1578 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001579 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001580 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001581 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001582 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001583 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001584 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001585 " If TABLE specified, only show tables matching\n"
1586 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001587 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001588 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001589 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001590 ".tables ?TABLE? List names of tables\n"
1591 " If TABLE specified, only list tables matching\n"
1592 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001593 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001594 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001595 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001596 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001597;
1598
shaneb320ccd2009-10-21 03:42:58 +00001599static char zTimerHelp[] =
1600 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1601;
1602
drhdaffd0e2001-04-11 14:28:42 +00001603/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001604static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001605
drh75897232000-05-29 14:26:00 +00001606/*
drh44c2eb12003-04-30 11:38:26 +00001607** Make sure the database is open. If it is not, then open it. If
1608** the database fails to open, print an error message and exit.
1609*/
drh05782482013-10-24 15:20:20 +00001610static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001611 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001612 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001613 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001614 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001615 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1616 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1617 shellstaticFunc, 0, 0);
1618 }
1619 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001620 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001621 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001622 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001623 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001624 }
drhc2e87a32006-06-27 15:16:14 +00001625#ifndef SQLITE_OMIT_LOAD_EXTENSION
1626 sqlite3_enable_load_extension(p->db, 1);
1627#endif
drh44c2eb12003-04-30 11:38:26 +00001628 }
1629}
1630
1631/*
drhfeac5f82004-08-01 00:10:45 +00001632** Do C-language style dequoting.
1633**
1634** \t -> tab
1635** \n -> newline
1636** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001637** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001638** \NNN -> ascii character NNN in octal
1639** \\ -> backslash
1640*/
1641static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001642 int i, j;
1643 char c;
drhfeac5f82004-08-01 00:10:45 +00001644 for(i=j=0; (c = z[i])!=0; i++, j++){
1645 if( c=='\\' ){
1646 c = z[++i];
1647 if( c=='n' ){
1648 c = '\n';
1649 }else if( c=='t' ){
1650 c = '\t';
1651 }else if( c=='r' ){
1652 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001653 }else if( c=='\\' ){
1654 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001655 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001656 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001657 if( z[i+1]>='0' && z[i+1]<='7' ){
1658 i++;
1659 c = (c<<3) + z[i] - '0';
1660 if( z[i+1]>='0' && z[i+1]<='7' ){
1661 i++;
1662 c = (c<<3) + z[i] - '0';
1663 }
1664 }
1665 }
1666 }
1667 z[j] = c;
1668 }
1669 z[j] = 0;
1670}
1671
1672/*
drh348d19c2013-06-03 12:47:43 +00001673** Return the value of a hexadecimal digit. Return -1 if the input
1674** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001675*/
drh348d19c2013-06-03 12:47:43 +00001676static int hexDigitValue(char c){
1677 if( c>='0' && c<='9' ) return c - '0';
1678 if( c>='a' && c<='f' ) return c - 'a' + 10;
1679 if( c>='A' && c<='F' ) return c - 'A' + 10;
1680 return -1;
drhc28490c2006-10-26 14:25:58 +00001681}
1682
1683/*
drh7d9f3942013-04-03 01:26:54 +00001684** Interpret zArg as an integer value, possibly with suffixes.
1685*/
1686static sqlite3_int64 integerValue(const char *zArg){
1687 sqlite3_int64 v = 0;
1688 static const struct { char *zSuffix; int iMult; } aMult[] = {
1689 { "KiB", 1024 },
1690 { "MiB", 1024*1024 },
1691 { "GiB", 1024*1024*1024 },
1692 { "KB", 1000 },
1693 { "MB", 1000000 },
1694 { "GB", 1000000000 },
1695 { "K", 1000 },
1696 { "M", 1000000 },
1697 { "G", 1000000000 },
1698 };
1699 int i;
1700 int isNeg = 0;
1701 if( zArg[0]=='-' ){
1702 isNeg = 1;
1703 zArg++;
1704 }else if( zArg[0]=='+' ){
1705 zArg++;
1706 }
drh348d19c2013-06-03 12:47:43 +00001707 if( zArg[0]=='0' && zArg[1]=='x' ){
1708 int x;
1709 zArg += 2;
1710 while( (x = hexDigitValue(zArg[0]))>=0 ){
1711 v = (v<<4) + x;
1712 zArg++;
1713 }
1714 }else{
1715 while( IsDigit(zArg[0]) ){
1716 v = v*10 + zArg[0] - '0';
1717 zArg++;
1718 }
drh7d9f3942013-04-03 01:26:54 +00001719 }
drhc2bed0a2013-05-24 11:57:50 +00001720 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001721 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1722 v *= aMult[i].iMult;
1723 break;
1724 }
1725 }
1726 return isNeg? -v : v;
1727}
1728
1729/*
drh348d19c2013-06-03 12:47:43 +00001730** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1731** for TRUE and FALSE. Return the integer value if appropriate.
1732*/
1733static int booleanValue(char *zArg){
1734 int i;
1735 if( zArg[0]=='0' && zArg[1]=='x' ){
1736 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1737 }else{
1738 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1739 }
1740 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1741 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1742 return 1;
1743 }
1744 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1745 return 0;
1746 }
1747 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1748 zArg);
1749 return 0;
1750}
1751
1752/*
drh42f64e52012-04-04 16:56:23 +00001753** Close an output file, assuming it is not stderr or stdout
1754*/
1755static void output_file_close(FILE *f){
1756 if( f && f!=stdout && f!=stderr ) fclose(f);
1757}
1758
1759/*
1760** Try to open an output file. The names "stdout" and "stderr" are
1761** recognized and do the right thing. NULL is returned if the output
1762** filename is "off".
1763*/
1764static FILE *output_file_open(const char *zFile){
1765 FILE *f;
1766 if( strcmp(zFile,"stdout")==0 ){
1767 f = stdout;
1768 }else if( strcmp(zFile, "stderr")==0 ){
1769 f = stderr;
1770 }else if( strcmp(zFile, "off")==0 ){
1771 f = 0;
1772 }else{
1773 f = fopen(zFile, "wb");
1774 if( f==0 ){
1775 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1776 }
1777 }
1778 return f;
1779}
1780
1781/*
1782** A routine for handling output from sqlite3_trace().
1783*/
1784static void sql_trace_callback(void *pArg, const char *z){
1785 FILE *f = (FILE*)pArg;
1786 if( f ) fprintf(f, "%s\n", z);
1787}
1788
1789/*
drhd8621b92012-04-17 09:09:33 +00001790** A no-op routine that runs with the ".breakpoint" doc-command. This is
1791** a useful spot to set a debugger breakpoint.
1792*/
1793static void test_breakpoint(void){
1794 static int nCall = 0;
1795 nCall++;
1796}
1797
1798/*
drhdb95f682013-06-26 22:46:00 +00001799** An object used to read a CSV file
1800*/
1801typedef struct CSVReader CSVReader;
1802struct CSVReader {
1803 const char *zFile; /* Name of the input file */
1804 FILE *in; /* Read the CSV text from this input stream */
1805 char *z; /* Accumulated text for a field */
1806 int n; /* Number of bytes in z */
1807 int nAlloc; /* Space allocated for z[] */
1808 int nLine; /* Current line number */
1809 int cTerm; /* Character that terminated the most recent field */
1810 int cSeparator; /* The separator character. (Usually ",") */
1811};
1812
1813/* Append a single byte to z[] */
1814static void csv_append_char(CSVReader *p, int c){
1815 if( p->n+1>=p->nAlloc ){
1816 p->nAlloc += p->nAlloc + 100;
1817 p->z = sqlite3_realloc(p->z, p->nAlloc);
1818 if( p->z==0 ){
1819 fprintf(stderr, "out of memory\n");
1820 exit(1);
1821 }
1822 }
1823 p->z[p->n++] = (char)c;
1824}
1825
1826/* Read a single field of CSV text. Compatible with rfc4180 and extended
1827** with the option of having a separator other than ",".
1828**
1829** + Input comes from p->in.
1830** + Store results in p->z of length p->n. Space to hold p->z comes
1831** from sqlite3_malloc().
1832** + Use p->cSep as the separator. The default is ",".
1833** + Keep track of the line number in p->nLine.
1834** + Store the character that terminates the field in p->cTerm. Store
1835** EOF on end-of-file.
1836** + Report syntax errors on stderr
1837*/
1838static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001839 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001840 int cSep = p->cSeparator;
1841 p->n = 0;
1842 c = fgetc(p->in);
1843 if( c==EOF || seenInterrupt ){
1844 p->cTerm = EOF;
1845 return 0;
1846 }
1847 if( c=='"' ){
1848 int startLine = p->nLine;
1849 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001850 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001851 while( 1 ){
1852 c = fgetc(p->in);
1853 if( c=='\n' ) p->nLine++;
1854 if( c==cQuote ){
1855 if( pc==cQuote ){
1856 pc = 0;
1857 continue;
1858 }
1859 }
1860 if( (c==cSep && pc==cQuote)
1861 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001862 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001863 || (c==EOF && pc==cQuote)
1864 ){
1865 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001866 p->cTerm = c;
1867 break;
1868 }
1869 if( pc==cQuote && c!='\r' ){
1870 fprintf(stderr, "%s:%d: unescaped %c character\n",
1871 p->zFile, p->nLine, cQuote);
1872 }
1873 if( c==EOF ){
1874 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1875 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001876 p->cTerm = EOF;
1877 break;
1878 }
1879 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001880 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001881 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001882 }
drhdb95f682013-06-26 22:46:00 +00001883 }else{
drhd0a64dc2013-06-30 20:24:26 +00001884 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001885 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001886 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001887 }
1888 if( c=='\n' ){
1889 p->nLine++;
1890 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1891 }
drhdb95f682013-06-26 22:46:00 +00001892 p->cTerm = c;
1893 }
drh8dd675e2013-07-12 21:09:24 +00001894 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001895 return p->z;
1896}
1897
1898/*
drh75897232000-05-29 14:26:00 +00001899** If an input line begins with "." then invoke this routine to
1900** process that line.
drh67505e72002-04-19 12:34:06 +00001901**
drh47ad6842006-11-08 12:25:42 +00001902** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00001903*/
drh44c2eb12003-04-30 11:38:26 +00001904static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00001905 int i = 1;
1906 int nArg = 0;
1907 int n, c;
drh67505e72002-04-19 12:34:06 +00001908 int rc = 0;
drh75897232000-05-29 14:26:00 +00001909 char *azArg[50];
1910
1911 /* Parse the input line into tokens.
1912 */
1913 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00001914 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00001915 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00001916 if( zLine[i]=='\'' || zLine[i]=='"' ){
1917 int delim = zLine[i++];
1918 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00001919 while( zLine[i] && zLine[i]!=delim ){
1920 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
1921 i++;
1922 }
drh75897232000-05-29 14:26:00 +00001923 if( zLine[i]==delim ){
1924 zLine[i++] = 0;
1925 }
drhfeac5f82004-08-01 00:10:45 +00001926 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001927 }else{
1928 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00001929 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00001930 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00001931 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001932 }
1933 }
1934
1935 /* Process the input line.
1936 */
shane9bd1b442009-10-23 01:27:39 +00001937 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00001938 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00001939 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00001940 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
1941 const char *zDestFile = 0;
1942 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00001943 sqlite3 *pDest;
1944 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00001945 int j;
1946 for(j=1; j<nArg; j++){
1947 const char *z = azArg[j];
1948 if( z[0]=='-' ){
1949 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00001950 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00001951 {
1952 fprintf(stderr, "unknown option: %s\n", azArg[j]);
1953 return 1;
1954 }
1955 }else if( zDestFile==0 ){
1956 zDestFile = azArg[j];
1957 }else if( zDb==0 ){
1958 zDb = zDestFile;
1959 zDestFile = azArg[j];
1960 }else{
1961 fprintf(stderr, "too many arguments to .backup\n");
1962 return 1;
1963 }
drh9ff849f2009-02-04 20:55:57 +00001964 }
drhbc46f022013-01-23 18:53:23 +00001965 if( zDestFile==0 ){
1966 fprintf(stderr, "missing FILENAME argument on .backup\n");
1967 return 1;
1968 }
1969 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00001970 rc = sqlite3_open(zDestFile, &pDest);
1971 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001972 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00001973 sqlite3_close(pDest);
1974 return 1;
1975 }
drh05782482013-10-24 15:20:20 +00001976 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00001977 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
1978 if( pBackup==0 ){
1979 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1980 sqlite3_close(pDest);
1981 return 1;
1982 }
1983 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
1984 sqlite3_backup_finish(pBackup);
1985 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00001986 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00001987 }else{
1988 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00001989 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00001990 }
1991 sqlite3_close(pDest);
1992 }else
1993
shanehe2aa9d72009-11-06 17:20:17 +00001994 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00001995 bail_on_error = booleanValue(azArg[1]);
1996 }else
1997
drhd8621b92012-04-17 09:09:33 +00001998 /* The undocumented ".breakpoint" command causes a call to the no-op
1999 ** routine named test_breakpoint().
2000 */
2001 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2002 test_breakpoint();
2003 }else
2004
shanehe2aa9d72009-11-06 17:20:17 +00002005 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002006 struct callback_data data;
2007 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002008 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002009 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002010 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002011 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002012 data.colWidth[0] = 3;
2013 data.colWidth[1] = 15;
2014 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002015 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002016 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002017 if( zErrMsg ){
2018 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002019 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002020 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002021 }
2022 }else
2023
shanehe2aa9d72009-11-06 17:20:17 +00002024 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002025 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002026 /* When playing back a "dump", the content might appear in an order
2027 ** which causes immediate foreign key constraints to be violated.
2028 ** So disable foreign-key constraint enforcement to prevent problems. */
2029 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002030 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002031 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002032 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002033 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002034 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002035 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002036 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002037 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002038 );
2039 run_schema_dump_query(p,
2040 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002041 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002042 );
drh2f464a02011-10-13 00:41:49 +00002043 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002044 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002045 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002046 );
drh4c653a02000-06-07 01:27:47 +00002047 }else{
2048 int i;
drhdd3d4592004-08-30 01:54:05 +00002049 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002050 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002051 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002052 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002053 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002054 " AND sql NOT NULL");
2055 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002056 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002057 "WHERE sql NOT NULL"
2058 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002059 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002060 );
danielk1977bc6ada42004-06-30 08:20:16 +00002061 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002062 }
2063 }
drh45e29d82006-11-20 16:21:10 +00002064 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002065 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002066 p->writableSchema = 0;
2067 }
drh56197952011-10-13 16:30:13 +00002068 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2069 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002070 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002071 }else
drh75897232000-05-29 14:26:00 +00002072
shanehe2aa9d72009-11-06 17:20:17 +00002073 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002074 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002075 }else
2076
drhd3ac7d92013-01-25 18:33:43 +00002077 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002078 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002079 rc = 2;
drh75897232000-05-29 14:26:00 +00002080 }else
2081
shanehe2aa9d72009-11-06 17:20:17 +00002082 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002083 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002084 if(val == 1) {
2085 if(!p->explainPrev.valid) {
2086 p->explainPrev.valid = 1;
2087 p->explainPrev.mode = p->mode;
2088 p->explainPrev.showHeader = p->showHeader;
2089 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2090 }
2091 /* We could put this code under the !p->explainValid
2092 ** condition so that it does not execute if we are already in
2093 ** explain mode. However, always executing it allows us an easy
2094 ** was to reset to explain mode in case the user previously
2095 ** did an .explain followed by a .width, .mode or .header
2096 ** command.
2097 */
danielk19770d78bae2008-01-03 07:09:48 +00002098 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002099 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002100 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002101 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002102 p->colWidth[1] = 13; /* opcode */
2103 p->colWidth[2] = 4; /* P1 */
2104 p->colWidth[3] = 4; /* P2 */
2105 p->colWidth[4] = 4; /* P3 */
2106 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002107 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002108 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002109 }else if (p->explainPrev.valid) {
2110 p->explainPrev.valid = 0;
2111 p->mode = p->explainPrev.mode;
2112 p->showHeader = p->explainPrev.showHeader;
2113 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2114 }
drh75897232000-05-29 14:26:00 +00002115 }else
2116
drhc28490c2006-10-26 14:25:58 +00002117 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002118 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002119 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002120 }else
2121
2122 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002123 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002124 if( HAS_TIMER ){
2125 fprintf(stderr,"%s",zTimerHelp);
2126 }
drh75897232000-05-29 14:26:00 +00002127 }else
2128
shanehe2aa9d72009-11-06 17:20:17 +00002129 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002130 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002131 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002132 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002133 int nCol; /* Number of columns in the table */
2134 int nByte; /* Number of bytes in an SQL string */
2135 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002136 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002137 int nSep; /* Number of bytes in p->separator[] */
2138 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002139 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002140 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002141
drhdb95f682013-06-26 22:46:00 +00002142 seenInterrupt = 0;
2143 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002144 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002145 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002146 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002147 fprintf(stderr, "Error: non-null separator required for import\n");
2148 return 1;
drhfeac5f82004-08-01 00:10:45 +00002149 }
drhdb95f682013-06-26 22:46:00 +00002150 if( nSep>1 ){
2151 fprintf(stderr, "Error: multi-character separators not allowed"
2152 " for import\n");
2153 return 1;
2154 }
drh5bde8162013-06-27 14:07:53 +00002155 sCsv.zFile = zFile;
2156 sCsv.nLine = 1;
2157 if( sCsv.zFile[0]=='|' ){
2158 sCsv.in = popen(sCsv.zFile+1, "r");
2159 sCsv.zFile = "<pipe>";
2160 xCloser = pclose;
2161 }else{
2162 sCsv.in = fopen(sCsv.zFile, "rb");
2163 xCloser = fclose;
2164 }
drhdb95f682013-06-26 22:46:00 +00002165 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002166 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002167 return 1;
2168 }
2169 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002170 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002171 if( zSql==0 ){
2172 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002173 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002174 return 1;
2175 }
drh4f21c4a2008-12-10 22:15:00 +00002176 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002177 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002178 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2179 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2180 char cSep = '(';
2181 while( csv_read_one_field(&sCsv) ){
2182 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2183 cSep = ',';
2184 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2185 }
drh5bde8162013-06-27 14:07:53 +00002186 if( cSep=='(' ){
2187 sqlite3_free(zCreate);
2188 sqlite3_free(sCsv.z);
2189 xCloser(sCsv.in);
2190 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2191 return 1;
2192 }
drhdb95f682013-06-26 22:46:00 +00002193 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2194 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2195 sqlite3_free(zCreate);
2196 if( rc ){
2197 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2198 sqlite3_errmsg(db));
2199 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002200 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002201 return 1;
2202 }
2203 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2204 }
drhfeac5f82004-08-01 00:10:45 +00002205 sqlite3_free(zSql);
2206 if( rc ){
shane916f9612009-10-23 00:37:15 +00002207 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002208 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002209 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002210 return 1;
drhfeac5f82004-08-01 00:10:45 +00002211 }
shane916f9612009-10-23 00:37:15 +00002212 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002213 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002214 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002215 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002216 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002217 if( zSql==0 ){
2218 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002219 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002220 return 1;
2221 }
drhdb95f682013-06-26 22:46:00 +00002222 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002223 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002224 for(i=1; i<nCol; i++){
2225 zSql[j++] = ',';
2226 zSql[j++] = '?';
2227 }
2228 zSql[j++] = ')';
2229 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002230 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002231 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002232 if( rc ){
2233 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002234 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002235 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002236 return 1;
drhfeac5f82004-08-01 00:10:45 +00002237 }
drh2d463112013-08-06 14:36:36 +00002238 needCommit = sqlite3_get_autocommit(db);
2239 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002240 do{
2241 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002242 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002243 char *z = csv_read_one_field(&sCsv);
2244 if( z==0 && i==0 ) break;
2245 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2246 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2247 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2248 "filling the rest with NULL\n",
2249 sCsv.zFile, startLine, nCol, i+1);
2250 i++;
2251 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002252 }
drhfeac5f82004-08-01 00:10:45 +00002253 }
drhdb95f682013-06-26 22:46:00 +00002254 if( sCsv.cTerm==sCsv.cSeparator ){
2255 do{
2256 csv_read_one_field(&sCsv);
2257 i++;
2258 }while( sCsv.cTerm==sCsv.cSeparator );
2259 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2260 "extras ignored\n",
2261 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002262 }
drhdb95f682013-06-26 22:46:00 +00002263 if( i>=nCol ){
2264 sqlite3_step(pStmt);
2265 rc = sqlite3_reset(pStmt);
2266 if( rc!=SQLITE_OK ){
2267 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2268 sqlite3_errmsg(db));
2269 }
2270 }
2271 }while( sCsv.cTerm!=EOF );
2272
drh5bde8162013-06-27 14:07:53 +00002273 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002274 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002275 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002276 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002277 }else
2278
shanehe2aa9d72009-11-06 17:20:17 +00002279 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002280 struct callback_data data;
2281 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002282 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002283 memcpy(&data, p, sizeof(data));
2284 data.showHeader = 0;
2285 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002286 if( nArg==1 ){
2287 rc = sqlite3_exec(p->db,
2288 "SELECT name FROM sqlite_master "
2289 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2290 "UNION ALL "
2291 "SELECT name FROM sqlite_temp_master "
2292 "WHERE type='index' "
2293 "ORDER BY 1",
2294 callback, &data, &zErrMsg
2295 );
2296 }else{
2297 zShellStatic = azArg[1];
2298 rc = sqlite3_exec(p->db,
2299 "SELECT name FROM sqlite_master "
2300 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2301 "UNION ALL "
2302 "SELECT name FROM sqlite_temp_master "
2303 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2304 "ORDER BY 1",
2305 callback, &data, &zErrMsg
2306 );
2307 zShellStatic = 0;
2308 }
drh75897232000-05-29 14:26:00 +00002309 if( zErrMsg ){
2310 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002311 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002312 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002313 }else if( rc != SQLITE_OK ){
2314 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2315 rc = 1;
drh75897232000-05-29 14:26:00 +00002316 }
2317 }else
2318
drhae5e4452007-05-03 17:18:36 +00002319#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002320 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002321 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002322 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2323 iotrace = 0;
2324 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002325 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002326 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002327 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002328 iotrace = stdout;
2329 }else{
2330 iotrace = fopen(azArg[1], "w");
2331 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002332 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002333 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002334 rc = 1;
drhb0603412007-02-28 04:47:26 +00002335 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002336 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002337 }
2338 }
2339 }else
drhae5e4452007-05-03 17:18:36 +00002340#endif
drhb0603412007-02-28 04:47:26 +00002341
drh70df4fe2006-06-13 15:12:21 +00002342#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002343 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2344 const char *zFile, *zProc;
2345 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002346 zFile = azArg[1];
2347 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002348 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002349 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2350 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002351 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002352 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002353 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002354 }
2355 }else
drh70df4fe2006-06-13 15:12:21 +00002356#endif
drh1e397f82006-06-08 15:28:43 +00002357
drhc8ba2122011-03-23 11:16:22 +00002358 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002359 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002360 output_file_close(p->pLog);
2361 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002362 }else
2363
shanehe2aa9d72009-11-06 17:20:17 +00002364 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002365 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002366 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002367 ||
shanehe2aa9d72009-11-06 17:20:17 +00002368 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002369 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002370 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002371 ||
shanehe2aa9d72009-11-06 17:20:17 +00002372 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002373 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002374 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002375 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002376 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002377 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002378 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002379 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002380 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002381 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002382 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002383 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002384 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002385 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002386 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002387 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002388 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002389 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002390 }else {
shane9bd1b442009-10-23 01:27:39 +00002391 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002392 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002393 rc = 1;
drh75897232000-05-29 14:26:00 +00002394 }
2395 }else
2396
shanehe2aa9d72009-11-06 17:20:17 +00002397 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2398 int n2 = strlen30(azArg[1]);
2399 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2400 p->mode = MODE_Insert;
2401 set_table_name(p, azArg[2]);
2402 }else {
2403 fprintf(stderr, "Error: invalid arguments: "
2404 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2405 rc = 1;
2406 }
2407 }else
2408
persicom7e2dfdd2002-04-18 02:46:52 +00002409 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002410 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2411 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002412 }else
2413
drh05782482013-10-24 15:20:20 +00002414 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2415 sqlite3 *savedDb = p->db;
2416 const char *zSavedFilename = p->zDbFilename;
2417 char *zNewFilename = 0;
2418 p->db = 0;
2419 if( nArg>=2 ){
2420 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2421 }
2422 open_db(p, 1);
2423 if( p->db!=0 ){
2424 sqlite3_close(savedDb);
2425 sqlite3_free(p->zFreeOnClose);
2426 p->zFreeOnClose = zNewFilename;
2427 }else{
2428 sqlite3_free(zNewFilename);
2429 p->db = savedDb;
2430 p->zDbFilename = zSavedFilename;
2431 }
2432 }else
2433
drh75897232000-05-29 14:26:00 +00002434 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002435 if( p->outfile[0]=='|' ){
2436 pclose(p->out);
2437 }else{
2438 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002439 }
drh42f64e52012-04-04 16:56:23 +00002440 p->outfile[0] = 0;
2441 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002442 p->out = popen(&azArg[1][1], "w");
2443 if( p->out==0 ){
2444 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2445 p->out = stdout;
2446 rc = 1;
2447 }else{
2448 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2449 }
drh75897232000-05-29 14:26:00 +00002450 }else{
drh42f64e52012-04-04 16:56:23 +00002451 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002452 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002453 if( strcmp(azArg[1],"off")!=0 ){
2454 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2455 }
drh75897232000-05-29 14:26:00 +00002456 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002457 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002458 } else {
drh42f64e52012-04-04 16:56:23 +00002459 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002460 }
2461 }
2462 }else
2463
drh078b1fd2012-09-21 13:40:02 +00002464 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2465 int i;
2466 for(i=1; i<nArg; i++){
2467 if( i>1 ) fprintf(p->out, " ");
2468 fprintf(p->out, "%s", azArg[i]);
2469 }
2470 fprintf(p->out, "\n");
2471 }else
2472
drhdd45df82002-04-18 12:39:03 +00002473 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002474 if( nArg >= 2) {
2475 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2476 }
2477 if( nArg >= 3) {
2478 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2479 }
2480 }else
2481
shanehe2aa9d72009-11-06 17:20:17 +00002482 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002483 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002484 }else
2485
drh9ff849f2009-02-04 20:55:57 +00002486 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002487 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002488 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002489 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2490 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002491 }else{
shane9bd1b442009-10-23 01:27:39 +00002492 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002493 fclose(alt);
2494 }
2495 }else
2496
shanehe2aa9d72009-11-06 17:20:17 +00002497 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002498 const char *zSrcFile;
2499 const char *zDb;
2500 sqlite3 *pSrc;
2501 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002502 int nTimeout = 0;
2503
drh9ff849f2009-02-04 20:55:57 +00002504 if( nArg==2 ){
2505 zSrcFile = azArg[1];
2506 zDb = "main";
2507 }else{
2508 zSrcFile = azArg[2];
2509 zDb = azArg[1];
2510 }
2511 rc = sqlite3_open(zSrcFile, &pSrc);
2512 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002513 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002514 sqlite3_close(pSrc);
2515 return 1;
2516 }
drh05782482013-10-24 15:20:20 +00002517 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002518 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2519 if( pBackup==0 ){
2520 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2521 sqlite3_close(pSrc);
2522 return 1;
2523 }
drhdc2c4912009-02-04 22:46:47 +00002524 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2525 || rc==SQLITE_BUSY ){
2526 if( rc==SQLITE_BUSY ){
2527 if( nTimeout++ >= 3 ) break;
2528 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002529 }
2530 }
2531 sqlite3_backup_finish(pBackup);
2532 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002533 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002534 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002535 fprintf(stderr, "Error: source database is busy\n");
2536 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002537 }else{
2538 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002539 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002540 }
2541 sqlite3_close(pSrc);
2542 }else
2543
shanehe2aa9d72009-11-06 17:20:17 +00002544 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002545 struct callback_data data;
2546 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002547 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002548 memcpy(&data, p, sizeof(data));
2549 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002550 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002551 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002552 int i;
drhf0693c82011-10-11 20:41:54 +00002553 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002554 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002555 char *new_argv[2], *new_colv[2];
2556 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2557 " type text,\n"
2558 " name text,\n"
2559 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002560 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002561 " sql text\n"
2562 ")";
2563 new_argv[1] = 0;
2564 new_colv[0] = "sql";
2565 new_colv[1] = 0;
2566 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002567 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002568 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002569 char *new_argv[2], *new_colv[2];
2570 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2571 " type text,\n"
2572 " name text,\n"
2573 " tbl_name text,\n"
2574 " rootpage integer,\n"
2575 " sql text\n"
2576 ")";
2577 new_argv[1] = 0;
2578 new_colv[0] = "sql";
2579 new_colv[1] = 0;
2580 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002581 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002582 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002583 zShellStatic = azArg[1];
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) "
drh6ac7a582011-11-04 00:35:56 +00002589 "WHERE lower(tbl_name) LIKE shellstatic()"
2590 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002591 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002592 callback, &data, &zErrMsg);
2593 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002594 }
drh75897232000-05-29 14:26:00 +00002595 }else{
shane9bd1b442009-10-23 01:27:39 +00002596 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002597 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002598 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002599 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002600 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002601 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002602 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002603 callback, &data, &zErrMsg
2604 );
drh75897232000-05-29 14:26:00 +00002605 }
drh75897232000-05-29 14:26:00 +00002606 if( zErrMsg ){
2607 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002608 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002609 rc = 1;
2610 }else if( rc != SQLITE_OK ){
2611 fprintf(stderr,"Error: querying schema information\n");
2612 rc = 1;
2613 }else{
2614 rc = 0;
drh75897232000-05-29 14:26:00 +00002615 }
2616 }else
2617
drh340f5822013-06-27 13:01:21 +00002618#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002619 /* Undocumented commands for internal testing. Subject to change
2620 ** without notice. */
2621 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2622 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2623 int i, v;
2624 for(i=1; i<nArg; i++){
2625 v = booleanValue(azArg[i]);
2626 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2627 }
2628 }
2629 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2630 int i; sqlite3_int64 v;
2631 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002632 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002633 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002634 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2635 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002636 }
2637 }
2638 }else
drh340f5822013-06-27 13:01:21 +00002639#endif
drh348d19c2013-06-03 12:47:43 +00002640
drh75897232000-05-29 14:26:00 +00002641 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002642 sqlite3_snprintf(sizeof(p->separator), p->separator,
2643 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002644 }else
2645
shanehe2aa9d72009-11-06 17:20:17 +00002646 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002647 int i;
2648 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002649 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002650 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002651 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002652 fprintf(p->out,"%9.9s: ", "nullvalue");
2653 output_c_string(p->out, p->nullvalue);
2654 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002655 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002656 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002657 fprintf(p->out,"%9.9s: ", "separator");
2658 output_c_string(p->out, p->separator);
2659 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002660 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002661 fprintf(p->out,"%9.9s: ","width");
2662 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002663 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002664 }
drhfeac5f82004-08-01 00:10:45 +00002665 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002666 }else
2667
shaneh642d8b82010-07-28 16:05:34 +00002668 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2669 p->statsOn = booleanValue(azArg[1]);
2670 }else
2671
shanehe2aa9d72009-11-06 17:20:17 +00002672 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002673 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002674 char **azResult;
drh98781232012-04-23 12:38:05 +00002675 int nRow, nAlloc;
2676 char *zSql = 0;
2677 int ii;
drh05782482013-10-24 15:20:20 +00002678 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002679 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2680 if( rc ) return rc;
2681 zSql = sqlite3_mprintf(
2682 "SELECT name FROM sqlite_master"
2683 " WHERE type IN ('table','view')"
2684 " AND name NOT LIKE 'sqlite_%%'"
2685 " AND name LIKE ?1");
2686 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2687 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2688 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2689 if( strcmp(zDbName,"temp")==0 ){
2690 zSql = sqlite3_mprintf(
2691 "%z UNION ALL "
2692 "SELECT 'temp.' || name FROM sqlite_temp_master"
2693 " WHERE type IN ('table','view')"
2694 " AND name NOT LIKE 'sqlite_%%'"
2695 " AND name LIKE ?1", zSql);
2696 }else{
2697 zSql = sqlite3_mprintf(
2698 "%z UNION ALL "
2699 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2700 " WHERE type IN ('table','view')"
2701 " AND name NOT LIKE 'sqlite_%%'"
2702 " AND name LIKE ?1", zSql, zDbName, zDbName);
2703 }
drha50da102000-08-08 20:19:09 +00002704 }
drh98781232012-04-23 12:38:05 +00002705 sqlite3_finalize(pStmt);
2706 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2707 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2708 sqlite3_free(zSql);
2709 if( rc ) return rc;
2710 nRow = nAlloc = 0;
2711 azResult = 0;
2712 if( nArg>1 ){
2713 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002714 }else{
drh98781232012-04-23 12:38:05 +00002715 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2716 }
2717 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2718 if( nRow>=nAlloc ){
2719 char **azNew;
2720 int n = nAlloc*2 + 10;
2721 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2722 if( azNew==0 ){
2723 fprintf(stderr, "Error: out of memory\n");
2724 break;
2725 }
2726 nAlloc = n;
2727 azResult = azNew;
2728 }
2729 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2730 if( azResult[nRow] ) nRow++;
2731 }
2732 sqlite3_finalize(pStmt);
2733 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002734 int len, maxlen = 0;
2735 int i, j;
2736 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002737 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002738 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002739 if( len>maxlen ) maxlen = len;
2740 }
2741 nPrintCol = 80/(maxlen+2);
2742 if( nPrintCol<1 ) nPrintCol = 1;
2743 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2744 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002745 for(j=i; j<nRow; j+=nPrintRow){
2746 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002747 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002748 }
drh151b7d52013-05-06 20:28:54 +00002749 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002750 }
2751 }
drh98781232012-04-23 12:38:05 +00002752 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2753 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002754 }else
2755
shaneh96887e12011-02-10 21:08:58 +00002756 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002757 static const struct {
2758 const char *zCtrlName; /* Name of a test-control option */
2759 int ctrlCode; /* Integer code for that option */
2760 } aCtrl[] = {
2761 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2762 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2763 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2764 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2765 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2766 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2767 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2768 { "assert", SQLITE_TESTCTRL_ASSERT },
2769 { "always", SQLITE_TESTCTRL_ALWAYS },
2770 { "reserve", SQLITE_TESTCTRL_RESERVE },
2771 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2772 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002773 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2774 };
shaneh96887e12011-02-10 21:08:58 +00002775 int testctrl = -1;
2776 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002777 int i, n;
drh05782482013-10-24 15:20:20 +00002778 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00002779
drhd416fe72011-03-17 16:45:50 +00002780 /* convert testctrl text option to value. allow any unique prefix
2781 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002782 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002783 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002784 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2785 if( testctrl<0 ){
2786 testctrl = aCtrl[i].ctrlCode;
2787 }else{
drhb07028f2011-10-14 21:49:18 +00002788 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00002789 testctrl = -1;
2790 break;
2791 }
2792 }
2793 }
drh348d19c2013-06-03 12:47:43 +00002794 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002795 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2796 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2797 }else{
2798 switch(testctrl){
2799
2800 /* sqlite3_test_control(int, db, int) */
2801 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2802 case SQLITE_TESTCTRL_RESERVE:
2803 if( nArg==3 ){
2804 int opt = (int)strtol(azArg[2], 0, 0);
2805 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00002806 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002807 } else {
drhd416fe72011-03-17 16:45:50 +00002808 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2809 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002810 }
2811 break;
2812
2813 /* sqlite3_test_control(int) */
2814 case SQLITE_TESTCTRL_PRNG_SAVE:
2815 case SQLITE_TESTCTRL_PRNG_RESTORE:
2816 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00002817 if( nArg==2 ){
2818 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00002819 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002820 } else {
2821 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2822 }
2823 break;
2824
2825 /* sqlite3_test_control(int, uint) */
2826 case SQLITE_TESTCTRL_PENDING_BYTE:
2827 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00002828 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002829 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002830 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002831 } else {
drhd416fe72011-03-17 16:45:50 +00002832 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2833 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002834 }
2835 break;
2836
2837 /* sqlite3_test_control(int, int) */
2838 case SQLITE_TESTCTRL_ASSERT:
2839 case SQLITE_TESTCTRL_ALWAYS:
2840 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00002841 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002842 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002843 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002844 } else {
drhd416fe72011-03-17 16:45:50 +00002845 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2846 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002847 }
2848 break;
2849
2850 /* sqlite3_test_control(int, char *) */
2851#ifdef SQLITE_N_KEYWORD
2852 case SQLITE_TESTCTRL_ISKEYWORD:
2853 if( nArg==3 ){
2854 const char *opt = azArg[2];
2855 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002856 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002857 } else {
drhd416fe72011-03-17 16:45:50 +00002858 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2859 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002860 }
2861 break;
2862#endif
2863
2864 case SQLITE_TESTCTRL_BITVEC_TEST:
2865 case SQLITE_TESTCTRL_FAULT_INSTALL:
2866 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2867 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2868 default:
drhd416fe72011-03-17 16:45:50 +00002869 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2870 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002871 break;
2872 }
2873 }
2874 }else
2875
shanehe2aa9d72009-11-06 17:20:17 +00002876 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00002877 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00002878 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00002879 }else
2880
drhd416fe72011-03-17 16:45:50 +00002881 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2882 && nArg==2
2883 ){
drh3b1a9882007-11-02 12:53:03 +00002884 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002885 }else
2886
drh42f64e52012-04-04 16:56:23 +00002887 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00002888 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00002889 output_file_close(p->traceOut);
2890 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00002891#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00002892 if( p->traceOut==0 ){
2893 sqlite3_trace(p->db, 0, 0);
2894 }else{
2895 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
2896 }
2897#endif
2898 }else
2899
drh9fd301b2011-06-03 13:28:22 +00002900 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00002901 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00002902 sqlite3_libversion(), sqlite3_sourceid());
2903 }else
2904
drhde60fc22011-12-14 17:53:36 +00002905 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
2906 const char *zDbName = nArg==2 ? azArg[1] : "main";
2907 char *zVfsName = 0;
2908 if( p->db ){
2909 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
2910 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00002911 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00002912 sqlite3_free(zVfsName);
2913 }
2914 }
2915 }else
2916
drhcef4fc82012-09-21 22:50:45 +00002917#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2918 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
2919 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00002920 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00002921 }else
2922#endif
2923
shanehe2aa9d72009-11-06 17:20:17 +00002924 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00002925 int j;
drh43617e92006-03-06 20:55:46 +00002926 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002927 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00002928 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00002929 }
2930 }else
2931
2932 {
shane9bd1b442009-10-23 01:27:39 +00002933 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00002934 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00002935 rc = 1;
drh75897232000-05-29 14:26:00 +00002936 }
drh67505e72002-04-19 12:34:06 +00002937
2938 return rc;
drh75897232000-05-29 14:26:00 +00002939}
2940
drh67505e72002-04-19 12:34:06 +00002941/*
drh91a66392007-09-07 01:12:32 +00002942** Return TRUE if a semicolon occurs anywhere in the first N characters
2943** of string z[].
drh324ccef2003-02-05 14:06:20 +00002944*/
drh9f099fd2013-08-06 14:01:46 +00002945static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00002946 int i;
2947 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2948 return 0;
drh324ccef2003-02-05 14:06:20 +00002949}
2950
2951/*
drh70c7a4b2003-04-26 03:03:06 +00002952** Test to see if a line consists entirely of whitespace.
2953*/
2954static int _all_whitespace(const char *z){
2955 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00002956 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002957 if( *z=='/' && z[1]=='*' ){
2958 z += 2;
2959 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2960 if( *z==0 ) return 0;
2961 z++;
2962 continue;
2963 }
2964 if( *z=='-' && z[1]=='-' ){
2965 z += 2;
2966 while( *z && *z!='\n' ){ z++; }
2967 if( *z==0 ) return 1;
2968 continue;
2969 }
2970 return 0;
2971 }
2972 return 1;
2973}
2974
2975/*
drha9b17162003-04-29 18:01:28 +00002976** Return TRUE if the line typed in is an SQL command terminator other
2977** than a semi-colon. The SQL Server style "go" command is understood
2978** as is the Oracle "/".
2979*/
drh9f099fd2013-08-06 14:01:46 +00002980static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00002981 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002982 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2983 return 1; /* Oracle */
2984 }
drhf0693c82011-10-11 20:41:54 +00002985 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00002986 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002987 return 1; /* SQL Server */
2988 }
2989 return 0;
2990}
2991
2992/*
drh233a5312008-12-18 22:25:13 +00002993** Return true if zSql is a complete SQL statement. Return false if it
2994** ends in the middle of a string literal or C-style comment.
2995*/
drh9f099fd2013-08-06 14:01:46 +00002996static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00002997 int rc;
2998 if( zSql==0 ) return 1;
2999 zSql[nSql] = ';';
3000 zSql[nSql+1] = 0;
3001 rc = sqlite3_complete(zSql);
3002 zSql[nSql] = 0;
3003 return rc;
3004}
3005
3006/*
drh67505e72002-04-19 12:34:06 +00003007** Read input from *in and process it. If *in==0 then input
3008** is interactive - the user is typing it it. Otherwise, input
3009** is coming from a file or device. A prompt is issued and history
3010** is saved only if input is interactive. An interrupt signal will
3011** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003012**
3013** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003014*/
drhc28490c2006-10-26 14:25:58 +00003015static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003016 char *zLine = 0; /* A single input line */
3017 char *zSql = 0; /* Accumulated SQL text */
3018 int nLine; /* Length of current line */
3019 int nSql = 0; /* Bytes of zSql[] used */
3020 int nAlloc = 0; /* Allocated zSql[] space */
3021 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3022 char *zErrMsg; /* Error message returned */
3023 int rc; /* Error code */
3024 int errCnt = 0; /* Number of errors seen */
3025 int lineno = 0; /* Current line number */
3026 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003027
3028 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3029 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003030 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003031 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003032 /* End of input */
3033 if( stdin_is_interactive ) printf("\n");
3034 break;
drhc49f44e2006-10-26 18:15:42 +00003035 }
drh67505e72002-04-19 12:34:06 +00003036 if( seenInterrupt ){
3037 if( in!=0 ) break;
3038 seenInterrupt = 0;
3039 }
drhc28490c2006-10-26 14:25:58 +00003040 lineno++;
drh9f099fd2013-08-06 14:01:46 +00003041 if( nSql==0 && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00003042 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003043 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003044 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003045 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003046 break;
3047 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003048 errCnt++;
3049 }
drhdaffd0e2001-04-11 14:28:42 +00003050 continue;
3051 }
drh9f099fd2013-08-06 14:01:46 +00003052 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003053 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003054 }
drh9f099fd2013-08-06 14:01:46 +00003055 nLine = strlen30(zLine);
3056 if( nSql+nLine+2>=nAlloc ){
3057 nAlloc = nSql+nLine+100;
3058 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003059 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003060 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003061 exit(1);
3062 }
drhdaffd0e2001-04-11 14:28:42 +00003063 }
drh9f099fd2013-08-06 14:01:46 +00003064 nSqlPrior = nSql;
3065 if( nSql==0 ){
3066 int i;
3067 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003068 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003069 memcpy(zSql, zLine+i, nLine+1-i);
3070 startline = lineno;
3071 nSql = nLine-i;
3072 }else{
3073 zSql[nSql++] = '\n';
3074 memcpy(zSql+nSql, zLine, nLine+1);
3075 nSql += nLine;
3076 }
3077 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003078 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003079 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003080 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003081 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003082 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003083 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003084 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003085 char zPrefix[100];
3086 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003087 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003088 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003089 }else{
shane9bd1b442009-10-23 01:27:39 +00003090 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003091 }
drh7f953e22002-07-13 17:33:45 +00003092 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003093 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003094 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003095 zErrMsg = 0;
3096 }else{
shaned2bed1c2009-10-21 03:56:54 +00003097 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003098 }
drhc49f44e2006-10-26 18:15:42 +00003099 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003100 }
drhdaffd0e2001-04-11 14:28:42 +00003101 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003102 }else if( nSql && _all_whitespace(zSql) ){
drh7a411f42013-04-17 17:33:17 +00003103 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003104 }
3105 }
drh9f099fd2013-08-06 14:01:46 +00003106 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003107 if( !_all_whitespace(zSql) ){
3108 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3109 }
drhdaffd0e2001-04-11 14:28:42 +00003110 free(zSql);
3111 }
danielk19772ac27622007-07-03 05:31:16 +00003112 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003113 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003114}
3115
drh67505e72002-04-19 12:34:06 +00003116/*
3117** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003118** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003119*/
3120static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003121 static char *home_dir = NULL;
3122 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003123
drh83905c92012-06-21 13:00:37 +00003124#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003125 {
3126 struct passwd *pwent;
3127 uid_t uid = getuid();
3128 if( (pwent=getpwuid(uid)) != NULL) {
3129 home_dir = pwent->pw_dir;
3130 }
drh67505e72002-04-19 12:34:06 +00003131 }
3132#endif
3133
chw65d3c132007-11-12 21:09:10 +00003134#if defined(_WIN32_WCE)
3135 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3136 */
drh85e72432012-04-11 11:38:53 +00003137 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003138#else
3139
drh83905c92012-06-21 13:00:37 +00003140#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003141 if (!home_dir) {
3142 home_dir = getenv("USERPROFILE");
3143 }
3144#endif
3145
drh67505e72002-04-19 12:34:06 +00003146 if (!home_dir) {
3147 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003148 }
3149
drh83905c92012-06-21 13:00:37 +00003150#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003151 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003152 char *zDrive, *zPath;
3153 int n;
3154 zDrive = getenv("HOMEDRIVE");
3155 zPath = getenv("HOMEPATH");
3156 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003157 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003158 home_dir = malloc( n );
3159 if( home_dir==0 ) return 0;
3160 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3161 return home_dir;
3162 }
3163 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003164 }
3165#endif
3166
chw65d3c132007-11-12 21:09:10 +00003167#endif /* !_WIN32_WCE */
3168
drh67505e72002-04-19 12:34:06 +00003169 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003170 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003171 char *z = malloc( n );
3172 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003173 home_dir = z;
3174 }
drhe98d4fa2002-04-21 19:06:22 +00003175
drh67505e72002-04-19 12:34:06 +00003176 return home_dir;
3177}
3178
3179/*
3180** Read input from the file given by sqliterc_override. Or if that
3181** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003182**
3183** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003184*/
shane9bd1b442009-10-23 01:27:39 +00003185static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003186 struct callback_data *p, /* Configuration data */
3187 const char *sqliterc_override /* Name of config file. NULL to use default */
3188){
persicom7e2dfdd2002-04-18 02:46:52 +00003189 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003190 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003191 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003192 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003193 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003194
3195 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003196 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003197 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003198#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003199 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003200#endif
shane9bd1b442009-10-23 01:27:39 +00003201 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003202 }
drh2f3de322012-06-27 16:41:31 +00003203 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003204 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3205 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003206 }
drha1f9b5e2004-02-14 16:31:02 +00003207 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003208 if( in ){
drhc28490c2006-10-26 14:25:58 +00003209 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003210 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003211 }
shane9bd1b442009-10-23 01:27:39 +00003212 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003213 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003214 }
drh85e72432012-04-11 11:38:53 +00003215 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003216 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003217}
3218
drh67505e72002-04-19 12:34:06 +00003219/*
drhe1e38c42003-05-04 18:30:59 +00003220** Show available command line options
3221*/
3222static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003223 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003224 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003225 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003226 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003227 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003228 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003229 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003230 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003231#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3232 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3233#endif
drhcc3b4f82012-02-07 14:13:50 +00003234 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003235 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003236 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003237 " -line set output mode to 'line'\n"
3238 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003239 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003240#ifdef SQLITE_ENABLE_MULTIPLEX
3241 " -multiplex enable the multiplexor VFS\n"
3242#endif
drh98d312f2012-10-25 15:23:14 +00003243 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3244 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003245 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003246 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003247 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003248#ifdef SQLITE_ENABLE_VFSTRACE
3249 " -vfstrace enable tracing of all VFS calls\n"
3250#endif
drhe1e38c42003-05-04 18:30:59 +00003251;
3252static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003253 fprintf(stderr,
3254 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3255 "FILENAME is the name of an SQLite database. A new database is created\n"
3256 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003257 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003258 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003259 }else{
3260 fprintf(stderr, "Use the -help option for additional information\n");
3261 }
3262 exit(1);
3263}
3264
3265/*
drh67505e72002-04-19 12:34:06 +00003266** Initialize the state information in data
3267*/
drh0850b532006-01-31 19:31:43 +00003268static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003269 memset(data, 0, sizeof(*data));
3270 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003271 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003272 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003273 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003274 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003275 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3276 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003277 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003278}
3279
drh98d312f2012-10-25 15:23:14 +00003280/*
3281** Get the argument to an --option. Throw an error and die if no argument
3282** is available.
3283*/
3284static char *cmdline_option_value(int argc, char **argv, int i){
3285 if( i==argc ){
3286 fprintf(stderr, "%s: Error: missing argument to %s\n",
3287 argv[0], argv[argc-1]);
3288 exit(1);
3289 }
3290 return argv[i];
3291}
3292
drh75897232000-05-29 14:26:00 +00003293int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003294 char *zErrMsg = 0;
3295 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003296 const char *zInitFile = 0;
3297 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003298 int i;
drhc28490c2006-10-26 14:25:58 +00003299 int rc = 0;
drh75897232000-05-29 14:26:00 +00003300
drh52784bd2011-05-18 17:15:06 +00003301 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3302 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3303 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3304 exit(1);
3305 }
drhdaffd0e2001-04-11 14:28:42 +00003306 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003307 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003308 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003309
drh44c2eb12003-04-30 11:38:26 +00003310 /* Make sure we have a valid signal handler early, before anything
3311 ** else is done.
3312 */
drh4c504392000-10-16 22:06:40 +00003313#ifdef SIGINT
3314 signal(SIGINT, interrupt_handler);
3315#endif
drh44c2eb12003-04-30 11:38:26 +00003316
drh22fbcb82004-02-01 01:22:50 +00003317 /* Do an initial pass through the command-line argument to locate
3318 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003319 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003320 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003321 */
drh98d312f2012-10-25 15:23:14 +00003322 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003323 char *z;
drhc28490c2006-10-26 14:25:58 +00003324 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003325 if( z[0]!='-' ){
3326 if( data.zDbFilename==0 ){
3327 data.zDbFilename = z;
3328 continue;
3329 }
3330 if( zFirstCmd==0 ){
3331 zFirstCmd = z;
3332 continue;
3333 }
3334 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3335 fprintf(stderr,"Use -help for a list of options.\n");
3336 return 1;
3337 }
drhcc3b4f82012-02-07 14:13:50 +00003338 if( z[1]=='-' ) z++;
3339 if( strcmp(z,"-separator")==0
3340 || strcmp(z,"-nullvalue")==0
3341 || strcmp(z,"-cmd")==0
3342 ){
drh98d312f2012-10-25 15:23:14 +00003343 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003344 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003345 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003346 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003347 /* Need to check for batch mode here to so we can avoid printing
3348 ** informational messages (like from process_sqliterc) before
3349 ** we do the actual processing of arguments later in a second pass.
3350 */
shanef69573d2009-10-24 02:06:14 +00003351 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003352 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003353#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003354 const char *zSize;
3355 sqlite3_int64 szHeap;
3356
drh98d312f2012-10-25 15:23:14 +00003357 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003358 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003359 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003360 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3361#endif
drh97ae8ff2011-03-16 16:56:29 +00003362#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003363 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003364 extern int vfstrace_register(
3365 const char *zTraceName,
3366 const char *zOldVfsName,
3367 int (*xOut)(const char*,void*),
3368 void *pOutArg,
3369 int makeDefault
3370 );
drh2b625e22011-03-16 17:05:28 +00003371 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003372#endif
drh6f25e892011-07-08 17:02:57 +00003373#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003374 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003375 extern int sqlite3_multiple_initialize(const char*,int);
3376 sqlite3_multiplex_initialize(0, 1);
3377#endif
drh7d9f3942013-04-03 01:26:54 +00003378 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003379 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3380 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003381 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003382 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003383 if( pVfs ){
3384 sqlite3_vfs_register(pVfs, 1);
3385 }else{
3386 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3387 exit(1);
3388 }
drh44c2eb12003-04-30 11:38:26 +00003389 }
3390 }
drh98d312f2012-10-25 15:23:14 +00003391 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003392#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003393 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003394#else
shane86f5bdb2009-10-24 02:00:07 +00003395 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3396 return 1;
drh01b41712005-08-29 23:06:23 +00003397#endif
drh98d312f2012-10-25 15:23:14 +00003398 }
3399 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003400
drh44c2eb12003-04-30 11:38:26 +00003401 /* Go ahead and open the database file if it already exists. If the
3402 ** file does not exist, delay opening it. This prevents empty database
3403 ** files from being created if a user mistypes the database name argument
3404 ** to the sqlite command-line tool.
3405 */
drhc8d74412004-08-31 23:41:26 +00003406 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003407 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003408 }
3409
drh22fbcb82004-02-01 01:22:50 +00003410 /* Process the initialization file if there is one. If no -init option
3411 ** is given on the command line, look for a file named ~/.sqliterc and
3412 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003413 */
shane86f5bdb2009-10-24 02:00:07 +00003414 rc = process_sqliterc(&data,zInitFile);
3415 if( rc>0 ){
3416 return rc;
3417 }
drh44c2eb12003-04-30 11:38:26 +00003418
drh22fbcb82004-02-01 01:22:50 +00003419 /* Make a second pass through the command-line argument and set
3420 ** options. This second pass is delayed until after the initialization
3421 ** file is processed so that the command-line arguments will override
3422 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003423 */
drh98d312f2012-10-25 15:23:14 +00003424 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003425 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003426 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003427 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003428 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003429 i++;
3430 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003431 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003432 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003433 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003434 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003435 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003436 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003437 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003438 }else if( strcmp(z,"-csv")==0 ){
3439 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003440 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003441 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003442 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003443 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003444 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003445 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003446 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003447 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003448 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003449 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003450 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003451 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003452 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003453 }else if( strcmp(z,"-stats")==0 ){
3454 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003455 }else if( strcmp(z,"-bail")==0 ){
3456 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003457 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003458 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003459 return 0;
drhc28490c2006-10-26 14:25:58 +00003460 }else if( strcmp(z,"-interactive")==0 ){
3461 stdin_is_interactive = 1;
3462 }else if( strcmp(z,"-batch")==0 ){
3463 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003464 }else if( strcmp(z,"-heap")==0 ){
3465 i++;
drh7d9f3942013-04-03 01:26:54 +00003466 }else if( strcmp(z,"-mmap")==0 ){
3467 i++;
drha7e61d82011-03-12 17:02:57 +00003468 }else if( strcmp(z,"-vfs")==0 ){
3469 i++;
drh6f25e892011-07-08 17:02:57 +00003470#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003471 }else if( strcmp(z,"-vfstrace")==0 ){
3472 i++;
drh6f25e892011-07-08 17:02:57 +00003473#endif
3474#ifdef SQLITE_ENABLE_MULTIPLEX
3475 }else if( strcmp(z,"-multiplex")==0 ){
3476 i++;
3477#endif
drhcc3b4f82012-02-07 14:13:50 +00003478 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003479 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003480 }else if( strcmp(z,"-cmd")==0 ){
3481 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003482 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003483 if( z[0]=='.' ){
3484 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003485 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003486 }else{
drh05782482013-10-24 15:20:20 +00003487 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003488 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3489 if( zErrMsg!=0 ){
3490 fprintf(stderr,"Error: %s\n", zErrMsg);
3491 if( bail_on_error ) return rc!=0 ? rc : 1;
3492 }else if( rc!=0 ){
3493 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3494 if( bail_on_error ) return rc;
3495 }
3496 }
drh1e5d0e92000-05-31 23:33:17 +00003497 }else{
shane86f5bdb2009-10-24 02:00:07 +00003498 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003499 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003500 return 1;
3501 }
3502 }
drh44c2eb12003-04-30 11:38:26 +00003503
drh22fbcb82004-02-01 01:22:50 +00003504 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003505 /* Run just the command that follows the database name
3506 */
drh22fbcb82004-02-01 01:22:50 +00003507 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003508 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003509 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003510 }else{
drh05782482013-10-24 15:20:20 +00003511 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003512 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003513 if( zErrMsg!=0 ){
3514 fprintf(stderr,"Error: %s\n", zErrMsg);
3515 return rc!=0 ? rc : 1;
3516 }else if( rc!=0 ){
3517 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3518 return rc;
drh6ff13852001-11-25 13:18:23 +00003519 }
drh75897232000-05-29 14:26:00 +00003520 }
3521 }else{
drh44c2eb12003-04-30 11:38:26 +00003522 /* Run commands received from standard input
3523 */
drhc28490c2006-10-26 14:25:58 +00003524 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003525 char *zHome;
3526 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003527 int nHistory;
drh75897232000-05-29 14:26:00 +00003528 printf(
drh743e0032011-12-12 16:51:50 +00003529 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003530 "Enter \".help\" for instructions\n"
3531 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003532 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003533 );
drh67505e72002-04-19 12:34:06 +00003534 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003535 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003536 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003537 if( (zHistory = malloc(nHistory))!=0 ){
3538 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3539 }
drh67505e72002-04-19 12:34:06 +00003540 }
danielk19774af00c62005-01-23 23:43:21 +00003541#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003542 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003543#endif
drhc28490c2006-10-26 14:25:58 +00003544 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003545 if( zHistory ){
3546 stifle_history(100);
3547 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003548 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003549 }
drhdaffd0e2001-04-11 14:28:42 +00003550 }else{
drhc28490c2006-10-26 14:25:58 +00003551 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003552 }
3553 }
drh33048c02001-10-01 14:29:22 +00003554 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003555 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003556 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003557 }
drh05782482013-10-24 15:20:20 +00003558 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003559 return rc;
drh75897232000-05-29 14:26:00 +00003560}