blob: 676175081605a583892df2006ef421001c12b817 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drh81d7fd12010-12-08 00:02:26 +000048#ifdef HAVE_EDITLINE
49# include <editline/editline.h>
50#endif
drh16e59552000-07-31 11:57:37 +000051#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000052# include <readline/readline.h>
53# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000054#endif
55#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
persicom1d0b8722002-04-18 02:53:04 +000056# define add_history(X)
drh67505e72002-04-19 12:34:06 +000057# define read_history(X)
58# define write_history(X)
59# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000060#endif
61
adamd2e8464a2006-09-06 21:39:40 +000062#if defined(_WIN32) || defined(WIN32)
63# include <io.h>
shane18e526c2008-12-10 22:30:24 +000064#define isatty(h) _isatty(h)
65#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000066#undef popen
drh53371f92013-07-25 17:07:03 +000067#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000068#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000069#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000070#else
drh4328c8b2003-04-26 02:50:11 +000071/* Make sure isatty() has a prototype.
72*/
drhb2acc3b2011-10-13 16:36:29 +000073extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000074
drh53371f92013-07-25 17:07:03 +000075/* popen and pclose are not C89 functions and so are sometimes omitted from
76** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000077extern FILE *popen(const char*,const char*);
78extern int pclose(FILE*);
79#endif
drh53371f92013-07-25 17:07:03 +000080
chw65d3c132007-11-12 21:09:10 +000081#if defined(_WIN32_WCE)
82/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
83 * thus we always assume that we have a console. That can be
84 * overridden with the -batch command line option.
85 */
86#define isatty(x) 1
87#endif
88
drhf0693c82011-10-11 20:41:54 +000089/* ctype macros that work with signed characters */
90#define IsSpace(X) isspace((unsigned char)X)
91#define IsDigit(X) isdigit((unsigned char)X)
92#define ToLower(X) (char)tolower((unsigned char)X)
93
drh43408312013-10-30 12:43:36 +000094
95/* True if the timer is enabled */
96static int enableTimer = 0;
97
98/* Return the current wall-clock time */
99static sqlite3_int64 timeOfDay(void){
100 static sqlite3_vfs *clockVfs = 0;
101 sqlite3_int64 t;
102 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
103 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
104 clockVfs->xCurrentTimeInt64(clockVfs, &t);
105 }else{
106 double r;
107 clockVfs->xCurrentTime(clockVfs, &r);
108 t = (sqlite3_int64)(r*86400000.0);
109 }
110 return t;
111}
112
drhd5d0f642013-02-20 00:54:21 +0000113#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
114 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000115#include <sys/time.h>
116#include <sys/resource.h>
117
drhda108222009-02-25 19:07:24 +0000118/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000119static struct rusage sBegin; /* CPU time at start */
120static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000121
drhda108222009-02-25 19:07:24 +0000122/*
123** Begin timing an operation
124*/
125static void beginTimer(void){
126 if( enableTimer ){
127 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000128 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000129 }
130}
131
132/* Return the difference of two time_structs in seconds */
133static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
134 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
135 (double)(pEnd->tv_sec - pStart->tv_sec);
136}
137
138/*
139** Print the timing results.
140*/
141static void endTimer(void){
142 if( enableTimer ){
143 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000144 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000145 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000146 printf("Run Time: real %.3f user %f sys %f\n",
147 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000148 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
149 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
150 }
151}
shaneb320ccd2009-10-21 03:42:58 +0000152
drhda108222009-02-25 19:07:24 +0000153#define BEGIN_TIMER beginTimer()
154#define END_TIMER endTimer()
155#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000156
157#elif (defined(_WIN32) || defined(WIN32))
158
159#include <windows.h>
160
161/* Saved resource information for the beginning of an operation */
162static HANDLE hProcess;
163static FILETIME ftKernelBegin;
164static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000165static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000166typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
167static GETPROCTIMES getProcessTimesAddr = NULL;
168
shaneb320ccd2009-10-21 03:42:58 +0000169/*
170** Check to see if we have timer support. Return 1 if necessary
171** support found (or found previously).
172*/
173static int hasTimer(void){
174 if( getProcessTimesAddr ){
175 return 1;
176 } else {
177 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
178 ** See if the version we are running on has it, and if it does, save off
179 ** a pointer to it and the current process handle.
180 */
181 hProcess = GetCurrentProcess();
182 if( hProcess ){
183 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
184 if( NULL != hinstLib ){
185 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
186 if( NULL != getProcessTimesAddr ){
187 return 1;
188 }
189 FreeLibrary(hinstLib);
190 }
191 }
192 }
193 return 0;
194}
195
196/*
197** Begin timing an operation
198*/
199static void beginTimer(void){
200 if( enableTimer && getProcessTimesAddr ){
201 FILETIME ftCreation, ftExit;
202 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000203 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000204 }
205}
206
207/* Return the difference of two FILETIME structs in seconds */
208static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
209 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
210 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
211 return (double) ((i64End - i64Start) / 10000000.0);
212}
213
214/*
215** Print the timing results.
216*/
217static void endTimer(void){
218 if( enableTimer && getProcessTimesAddr){
219 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000220 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000221 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000222 printf("Run Time: real %.3f user %f sys %f\n",
223 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000224 timeDiff(&ftUserBegin, &ftUserEnd),
225 timeDiff(&ftKernelBegin, &ftKernelEnd));
226 }
227}
228
229#define BEGIN_TIMER beginTimer()
230#define END_TIMER endTimer()
231#define HAS_TIMER hasTimer()
232
drhda108222009-02-25 19:07:24 +0000233#else
234#define BEGIN_TIMER
235#define END_TIMER
236#define HAS_TIMER 0
237#endif
238
shanec0688ea2009-03-05 03:48:06 +0000239/*
240** Used to prevent warnings about unused parameters
241*/
242#define UNUSED_PARAMETER(x) (void)(x)
243
drhe91d16b2008-12-08 18:27:31 +0000244/*
drhc49f44e2006-10-26 18:15:42 +0000245** If the following flag is set, then command execution stops
246** at an error if we are not interactive.
247*/
248static int bail_on_error = 0;
249
250/*
drhc28490c2006-10-26 14:25:58 +0000251** Threat stdin as an interactive input if the following variable
252** is true. Otherwise, assume stdin is connected to a file or pipe.
253*/
254static int stdin_is_interactive = 1;
255
256/*
drh4c504392000-10-16 22:06:40 +0000257** The following is the open SQLite database. We make a pointer
258** to this database a static variable so that it can be accessed
259** by the SIGINT handler to interrupt database processing.
260*/
danielk197792f9a1b2004-06-19 09:08:16 +0000261static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000262
263/*
drh67505e72002-04-19 12:34:06 +0000264** True if an interrupt (Control-C) has been received.
265*/
drh43617e92006-03-06 20:55:46 +0000266static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000267
268/*
persicom7e2dfdd2002-04-18 02:46:52 +0000269** This is the name of our program. It is set in main(), used
270** in a number of other places, mostly for error messages.
271*/
272static char *Argv0;
273
274/*
275** Prompt strings. Initialized in main. Settable with
276** .prompt main continue
277*/
278static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
279static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
280
drhb0603412007-02-28 04:47:26 +0000281/*
282** Write I/O traces to the following stream.
283*/
rsebe0a9092007-07-30 18:24:38 +0000284#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000285static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000286#endif
drhb0603412007-02-28 04:47:26 +0000287
288/*
289** This routine works like printf in that its first argument is a
290** format string and subsequent arguments are values to be substituted
291** in place of % fields. The result of formatting this string
292** is written to iotrace.
293*/
rsebe0a9092007-07-30 18:24:38 +0000294#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000295static void iotracePrintf(const char *zFormat, ...){
296 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000297 char *z;
drhb0603412007-02-28 04:47:26 +0000298 if( iotrace==0 ) return;
299 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000300 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000301 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000302 fprintf(iotrace, "%s", z);
303 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000304}
rsebe0a9092007-07-30 18:24:38 +0000305#endif
drhb0603412007-02-28 04:47:26 +0000306
drh44c2eb12003-04-30 11:38:26 +0000307
persicom7e2dfdd2002-04-18 02:46:52 +0000308/*
drh83965662003-04-17 02:54:13 +0000309** Determines if a string is a number of not.
310*/
danielk19772e588c72005-12-09 14:25:08 +0000311static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000312 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000313 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000314 return 0;
315 }
316 z++;
317 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000318 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000319 if( *z=='.' ){
320 z++;
drhf0693c82011-10-11 20:41:54 +0000321 if( !IsDigit(*z) ) return 0;
322 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000323 if( realnum ) *realnum = 1;
324 }
325 if( *z=='e' || *z=='E' ){
326 z++;
327 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000328 if( !IsDigit(*z) ) return 0;
329 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000330 if( realnum ) *realnum = 1;
331 }
332 return *z==0;
333}
drh83965662003-04-17 02:54:13 +0000334
335/*
danielk1977bc6ada42004-06-30 08:20:16 +0000336** A global char* and an SQL function to access its current value
337** from within an SQL statement. This program used to use the
338** sqlite_exec_printf() API to substitue a string into an SQL statement.
339** The correct way to do this with sqlite3 is to use the bind API, but
340** since the shell is built around the callback paradigm it would be a lot
341** of work. Instead just use this hack, which is quite harmless.
342*/
343static const char *zShellStatic = 0;
344static void shellstaticFunc(
345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
349 assert( 0==argc );
350 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000351 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000352 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000353 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
354}
355
356
357/*
drhfeac5f82004-08-01 00:10:45 +0000358** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000359** the text in memory obtained from malloc() and returns a pointer
360** to the text. NULL is returned at end of file, or if malloc()
361** fails.
362**
drh9f099fd2013-08-06 14:01:46 +0000363** If zLine is not NULL then it is a malloced buffer returned from
364** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000365*/
drh9f099fd2013-08-06 14:01:46 +0000366static char *local_getline(char *zLine, FILE *in){
367 int nLine = zLine==0 ? 0 : 100;
368 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000369
drhb07028f2011-10-14 21:49:18 +0000370 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000371 if( n+100>nLine ){
372 nLine = nLine*2 + 100;
373 zLine = realloc(zLine, nLine);
374 if( zLine==0 ) return 0;
375 }
drhdaffd0e2001-04-11 14:28:42 +0000376 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000377 if( n==0 ){
378 free(zLine);
379 return 0;
380 }
381 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000382 break;
383 }
drh9f099fd2013-08-06 14:01:46 +0000384 while( zLine[n] ) n++;
385 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000386 n--;
shaneh13b36022009-12-17 21:07:15 +0000387 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000388 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000389 break;
drh8e7e7a22000-05-30 18:45:23 +0000390 }
391 }
drh8e7e7a22000-05-30 18:45:23 +0000392 return zLine;
393}
394
395/*
drhc28490c2006-10-26 14:25:58 +0000396** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000397**
drh9f099fd2013-08-06 14:01:46 +0000398** If in==0 then read from standard input and prompt before each line.
399** If isContinuation is true, then a continuation prompt is appropriate.
400** If isContinuation is zero, then the main prompt should be used.
401**
402** If zPrior is not NULL then it is a buffer from a prior call to this
403** routine that can be reused.
404**
405** The result is stored in space obtained from malloc() and must either
406** be freed by the caller or else passed back into this routine via the
407** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000408*/
drh9f099fd2013-08-06 14:01:46 +0000409static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000410 char *zPrompt;
411 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000412 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000413 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000414 }else{
drh9f099fd2013-08-06 14:01:46 +0000415 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danielk19774af00c62005-01-23 23:43:21 +0000416#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh9f099fd2013-08-06 14:01:46 +0000417 free(zPrior);
418 zResult = readline(zPrompt);
419 if( zResult && *zResult ) add_history(zResult);
420#else
421 printf("%s", zPrompt);
422 fflush(stdout);
423 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000424#endif
drh9f099fd2013-08-06 14:01:46 +0000425 }
drh8e7e7a22000-05-30 18:45:23 +0000426 return zResult;
427}
428
persicom7e2dfdd2002-04-18 02:46:52 +0000429struct previous_mode_data {
430 int valid; /* Is there legit data in here? */
431 int mode;
432 int showHeader;
433 int colWidth[100];
434};
drh45e29d82006-11-20 16:21:10 +0000435
drh8e7e7a22000-05-30 18:45:23 +0000436/*
drh75897232000-05-29 14:26:00 +0000437** An pointer to an instance of this structure is passed from
438** the main program to the callback. This is used to communicate
439** state and mode information.
440*/
441struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000442 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000443 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000444 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000445 int cnt; /* Number of records displayed so far */
446 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000447 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000448 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000449 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000450 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000451 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000452 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000453 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000454 int colWidth[100]; /* Requested width of each column when in column mode*/
455 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000456 char nullvalue[20]; /* The text to print when a NULL comes back from
457 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000458 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000459 /* Holds the mode information just before
460 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000461 char outfile[FILENAME_MAX]; /* Filename for *out */
462 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000463 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000464 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000465 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000466 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000467 int *aiIndent; /* Array of indents used in MODE_Explain */
468 int nIndent; /* Size of array aiIndent[] */
drh75897232000-05-29 14:26:00 +0000469};
470
471/*
472** These are the allowed modes.
473*/
drh967e8b72000-06-21 13:59:10 +0000474#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000475#define MODE_Column 1 /* One record per line in neat columns */
476#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000477#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
478#define MODE_Html 4 /* Generate an XHTML table */
479#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000480#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000481#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000482#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000483
drh66ce4d02008-02-15 17:38:06 +0000484static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000485 "line",
486 "column",
487 "list",
488 "semi",
489 "html",
drhfeac5f82004-08-01 00:10:45 +0000490 "insert",
491 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000492 "csv",
drh66ce4d02008-02-15 17:38:06 +0000493 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000494};
drh75897232000-05-29 14:26:00 +0000495
496/*
497** Number of elements in an array
498*/
drh902b9ee2008-12-05 17:17:07 +0000499#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000500
501/*
drhea678832008-12-10 19:26:22 +0000502** Compute a string length that is limited to what can be stored in
503** lower 30 bits of a 32-bit signed integer.
504*/
drh4f21c4a2008-12-10 22:15:00 +0000505static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000506 const char *z2 = z;
507 while( *z2 ){ z2++; }
508 return 0x3fffffff & (int)(z2 - z);
509}
510
511/*
drh127f9d72010-02-23 01:47:00 +0000512** A callback for the sqlite3_log() interface.
513*/
514static void shellLog(void *pArg, int iErrCode, const char *zMsg){
515 struct callback_data *p = (struct callback_data*)pArg;
516 if( p->pLog==0 ) return;
517 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
518 fflush(p->pLog);
519}
520
521/*
shane626a6e42009-10-22 17:30:15 +0000522** Output the given string as a hex-encoded blob (eg. X'1234' )
523*/
524static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
525 int i;
526 char *zBlob = (char *)pBlob;
527 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000528 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000529 fprintf(out,"'");
530}
531
532/*
drh28bd4bc2000-06-15 15:57:22 +0000533** Output the given string as a quoted string using SQL quoting conventions.
534*/
535static void output_quoted_string(FILE *out, const char *z){
536 int i;
537 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000538 for(i=0; z[i]; i++){
539 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000540 }
541 if( nSingle==0 ){
542 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000543 }else{
544 fprintf(out,"'");
545 while( *z ){
546 for(i=0; z[i] && z[i]!='\''; i++){}
547 if( i==0 ){
548 fprintf(out,"''");
549 z++;
550 }else if( z[i]=='\'' ){
551 fprintf(out,"%.*s''",i,z);
552 z += i+1;
553 }else{
drhcd7d2732002-02-26 23:24:26 +0000554 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000555 break;
556 }
557 }
drhcd7d2732002-02-26 23:24:26 +0000558 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000559 }
560}
561
562/*
drhfeac5f82004-08-01 00:10:45 +0000563** Output the given string as a quoted according to C or TCL quoting rules.
564*/
565static void output_c_string(FILE *out, const char *z){
566 unsigned int c;
567 fputc('"', out);
568 while( (c = *(z++))!=0 ){
569 if( c=='\\' ){
570 fputc(c, out);
571 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000572 }else if( c=='"' ){
573 fputc('\\', out);
574 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000575 }else if( c=='\t' ){
576 fputc('\\', out);
577 fputc('t', out);
578 }else if( c=='\n' ){
579 fputc('\\', out);
580 fputc('n', out);
581 }else if( c=='\r' ){
582 fputc('\\', out);
583 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000584 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000585 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000586 }else{
587 fputc(c, out);
588 }
589 }
590 fputc('"', out);
591}
592
593/*
drhc08a4f12000-06-15 16:49:48 +0000594** Output the given string with characters that are special to
595** HTML escaped.
596*/
597static void output_html_string(FILE *out, const char *z){
598 int i;
599 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000600 for(i=0; z[i]
601 && z[i]!='<'
602 && z[i]!='&'
603 && z[i]!='>'
604 && z[i]!='\"'
605 && z[i]!='\'';
606 i++){}
drhc08a4f12000-06-15 16:49:48 +0000607 if( i>0 ){
608 fprintf(out,"%.*s",i,z);
609 }
610 if( z[i]=='<' ){
611 fprintf(out,"&lt;");
612 }else if( z[i]=='&' ){
613 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000614 }else if( z[i]=='>' ){
615 fprintf(out,"&gt;");
616 }else if( z[i]=='\"' ){
617 fprintf(out,"&quot;");
618 }else if( z[i]=='\'' ){
619 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000620 }else{
621 break;
622 }
623 z += i + 1;
624 }
625}
626
627/*
drhc49f44e2006-10-26 18:15:42 +0000628** If a field contains any character identified by a 1 in the following
629** array, then the string must be quoted for CSV.
630*/
631static const char needCsvQuote[] = {
632 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
633 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
634 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
635 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
636 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648};
649
650/*
drh8e64d1c2004-10-07 00:32:39 +0000651** Output a single term of CSV. Actually, p->separator is used for
652** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000653** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000654*/
655static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000656 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000657 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000658 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000659 }else{
drhc49f44e2006-10-26 18:15:42 +0000660 int i;
drh4f21c4a2008-12-10 22:15:00 +0000661 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000662 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000663 if( needCsvQuote[((unsigned char*)z)[i]]
664 || (z[i]==p->separator[0] &&
665 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000666 i = 0;
667 break;
668 }
669 }
670 if( i==0 ){
671 putc('"', out);
672 for(i=0; z[i]; i++){
673 if( z[i]=='"' ) putc('"', out);
674 putc(z[i], out);
675 }
676 putc('"', out);
677 }else{
678 fprintf(out, "%s", z);
679 }
drh8e64d1c2004-10-07 00:32:39 +0000680 }
681 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000682 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000683 }
684}
685
danielk19774af00c62005-01-23 23:43:21 +0000686#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000687/*
drh4c504392000-10-16 22:06:40 +0000688** This routine runs when the user presses Ctrl-C
689*/
690static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000691 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000692 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000693 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000694}
danielk19774af00c62005-01-23 23:43:21 +0000695#endif
drh4c504392000-10-16 22:06:40 +0000696
697/*
shane626a6e42009-10-22 17:30:15 +0000698** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000699** invokes for each row of a query result.
700*/
shane626a6e42009-10-22 17:30:15 +0000701static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000702 int i;
703 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000704
drh75897232000-05-29 14:26:00 +0000705 switch( p->mode ){
706 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000707 int w = 5;
drh6a535342001-10-19 16:44:56 +0000708 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000709 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000710 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000711 if( len>w ) w = len;
712 }
drh75897232000-05-29 14:26:00 +0000713 if( p->cnt++>0 ) fprintf(p->out,"\n");
714 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000715 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000716 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000717 }
718 break;
719 }
danielk19770d78bae2008-01-03 07:09:48 +0000720 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000721 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000722 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000723 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000724 int w, n;
725 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000726 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000727 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000728 w = 0;
drh75897232000-05-29 14:26:00 +0000729 }
drh078b1fd2012-09-21 13:40:02 +0000730 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000731 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000732 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000733 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000734 if( w<n ) w = n;
735 }
736 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000737 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000738 }
739 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000740 if( w<0 ){
741 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
742 }else{
743 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
744 }
drha0c66f52000-07-29 13:20:21 +0000745 }
746 }
747 if( p->showHeader ){
748 for(i=0; i<nArg; i++){
749 int w;
750 if( i<ArraySize(p->actualWidth) ){
751 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000752 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000753 }else{
754 w = 10;
755 }
756 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
757 "----------------------------------------------------------",
758 i==nArg-1 ? "\n": " ");
759 }
drh75897232000-05-29 14:26:00 +0000760 }
761 }
drh6a535342001-10-19 16:44:56 +0000762 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000763 for(i=0; i<nArg; i++){
764 int w;
drha0c66f52000-07-29 13:20:21 +0000765 if( i<ArraySize(p->actualWidth) ){
766 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000767 }else{
768 w = 10;
769 }
dana98bf362013-11-13 18:35:01 +0000770 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000771 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000772 }
dana98bf362013-11-13 18:35:01 +0000773 if( i==1 && p->aiIndent && p->pStmt ){
774 int iOp = sqlite3_column_int(p->pStmt, 0);
775 if( iOp<p->nIndent ){
776 fprintf(p->out, "%*.s", p->aiIndent[iOp], "");
777 }
778 }
drh078b1fd2012-09-21 13:40:02 +0000779 if( w<0 ){
780 fprintf(p->out,"%*.*s%s",-w,-w,
781 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
782 }else{
783 fprintf(p->out,"%-*.*s%s",w,w,
784 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
785 }
drh75897232000-05-29 14:26:00 +0000786 }
787 break;
788 }
drhe3710332000-09-29 13:30:53 +0000789 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000790 case MODE_List: {
791 if( p->cnt++==0 && p->showHeader ){
792 for(i=0; i<nArg; i++){
793 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
794 }
795 }
drh6a535342001-10-19 16:44:56 +0000796 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000797 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000798 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000799 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000800 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000801 if( i<nArg-1 ){
802 fprintf(p->out, "%s", p->separator);
803 }else if( p->mode==MODE_Semi ){
804 fprintf(p->out, ";\n");
805 }else{
806 fprintf(p->out, "\n");
807 }
drh75897232000-05-29 14:26:00 +0000808 }
809 break;
810 }
drh1e5d0e92000-05-31 23:33:17 +0000811 case MODE_Html: {
812 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000813 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000814 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000815 fprintf(p->out,"<TH>");
816 output_html_string(p->out, azCol[i]);
817 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000818 }
mihailim57c591a2008-06-23 21:26:05 +0000819 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000820 }
drh6a535342001-10-19 16:44:56 +0000821 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000822 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000823 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000825 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000826 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000827 }
mihailim57c591a2008-06-23 21:26:05 +0000828 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000829 break;
830 }
drhfeac5f82004-08-01 00:10:45 +0000831 case MODE_Tcl: {
832 if( p->cnt++==0 && p->showHeader ){
833 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000834 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000835 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000836 }
837 fprintf(p->out,"\n");
838 }
839 if( azArg==0 ) break;
840 for(i=0; i<nArg; i++){
841 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000842 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000843 }
844 fprintf(p->out,"\n");
845 break;
846 }
drh8e64d1c2004-10-07 00:32:39 +0000847 case MODE_Csv: {
848 if( p->cnt++==0 && p->showHeader ){
849 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000850 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000851 }
852 fprintf(p->out,"\n");
853 }
854 if( azArg==0 ) break;
855 for(i=0; i<nArg; i++){
856 output_csv(p, azArg[i], i<nArg-1);
857 }
858 fprintf(p->out,"\n");
859 break;
860 }
drh28bd4bc2000-06-15 15:57:22 +0000861 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000862 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000863 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000864 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000865 for(i=0; i<nArg; i++){
866 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000867 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000868 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000869 }else if( aiType && aiType[i]==SQLITE_TEXT ){
870 if( zSep[0] ) fprintf(p->out,"%s",zSep);
871 output_quoted_string(p->out, azArg[i]);
872 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
873 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000874 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
875 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
876 int nBlob = sqlite3_column_bytes(p->pStmt, i);
877 if( zSep[0] ) fprintf(p->out,"%s",zSep);
878 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000879 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000880 fprintf(p->out,"%s%s",zSep, azArg[i]);
881 }else{
882 if( zSep[0] ) fprintf(p->out,"%s",zSep);
883 output_quoted_string(p->out, azArg[i]);
884 }
885 }
886 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000887 break;
drh28bd4bc2000-06-15 15:57:22 +0000888 }
persicom1d0b8722002-04-18 02:53:04 +0000889 }
drh75897232000-05-29 14:26:00 +0000890 return 0;
891}
892
893/*
shane626a6e42009-10-22 17:30:15 +0000894** This is the callback routine that the SQLite library
895** invokes for each row of a query result.
896*/
897static int callback(void *pArg, int nArg, char **azArg, char **azCol){
898 /* since we don't have type info, call the shell_callback with a NULL value */
899 return shell_callback(pArg, nArg, azArg, azCol, NULL);
900}
901
902/*
drh33048c02001-10-01 14:29:22 +0000903** Set the destination table field of the callback_data structure to
904** the name of the table given. Escape any quote characters in the
905** table name.
906*/
907static void set_table_name(struct callback_data *p, const char *zName){
908 int i, n;
909 int needQuote;
910 char *z;
911
912 if( p->zDestTable ){
913 free(p->zDestTable);
914 p->zDestTable = 0;
915 }
916 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000917 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000918 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000919 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000920 needQuote = 1;
921 if( zName[i]=='\'' ) n++;
922 }
923 }
924 if( needQuote ) n += 2;
925 z = p->zDestTable = malloc( n+1 );
926 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000927 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000928 exit(1);
929 }
930 n = 0;
931 if( needQuote ) z[n++] = '\'';
932 for(i=0; zName[i]; i++){
933 z[n++] = zName[i];
934 if( zName[i]=='\'' ) z[n++] = '\'';
935 }
936 if( needQuote ) z[n++] = '\'';
937 z[n] = 0;
938}
939
danielk19772a02e332004-06-05 08:04:36 +0000940/* zIn is either a pointer to a NULL-terminated string in memory obtained
941** from malloc(), or a NULL pointer. The string pointed to by zAppend is
942** added to zIn, and the result returned in memory obtained from malloc().
943** zIn, if it was not NULL, is freed.
944**
945** If the third argument, quote, is not '\0', then it is used as a
946** quote character for zAppend.
947*/
drhc28490c2006-10-26 14:25:58 +0000948static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000949 int len;
950 int i;
drh4f21c4a2008-12-10 22:15:00 +0000951 int nAppend = strlen30(zAppend);
952 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000953
954 len = nAppend+nIn+1;
955 if( quote ){
956 len += 2;
957 for(i=0; i<nAppend; i++){
958 if( zAppend[i]==quote ) len++;
959 }
960 }
961
962 zIn = (char *)realloc(zIn, len);
963 if( !zIn ){
964 return 0;
965 }
966
967 if( quote ){
968 char *zCsr = &zIn[nIn];
969 *zCsr++ = quote;
970 for(i=0; i<nAppend; i++){
971 *zCsr++ = zAppend[i];
972 if( zAppend[i]==quote ) *zCsr++ = quote;
973 }
974 *zCsr++ = quote;
975 *zCsr++ = '\0';
976 assert( (zCsr-zIn)==len );
977 }else{
978 memcpy(&zIn[nIn], zAppend, nAppend);
979 zIn[len-1] = '\0';
980 }
981
982 return zIn;
983}
984
drhdd3d4592004-08-30 01:54:05 +0000985
986/*
drhb21a8e42012-01-28 21:08:51 +0000987** Execute a query statement that will generate SQL output. Print
988** the result columns, comma-separated, on a line and then add a
989** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000990**
drhb21a8e42012-01-28 21:08:51 +0000991** If the number of columns is 1 and that column contains text "--"
992** then write the semicolon on a separate line. That way, if a
993** "--" comment occurs at the end of the statement, the comment
994** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +0000995*/
drh157e29a2009-05-21 15:15:00 +0000996static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000997 struct callback_data *p, /* Query context */
998 const char *zSelect, /* SELECT statement to extract content */
999 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001000){
drhdd3d4592004-08-30 01:54:05 +00001001 sqlite3_stmt *pSelect;
1002 int rc;
drhb21a8e42012-01-28 21:08:51 +00001003 int nResult;
1004 int i;
1005 const char *z;
drh2f464a02011-10-13 00:41:49 +00001006 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001007 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001008 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001009 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001010 return rc;
1011 }
1012 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001013 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001014 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001015 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001016 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001017 zFirstRow = 0;
1018 }
drhb21a8e42012-01-28 21:08:51 +00001019 z = (const char*)sqlite3_column_text(pSelect, 0);
1020 fprintf(p->out, "%s", z);
1021 for(i=1; i<nResult; i++){
1022 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1023 }
1024 if( z==0 ) z = "";
1025 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1026 if( z[0] ){
1027 fprintf(p->out, "\n;\n");
1028 }else{
1029 fprintf(p->out, ";\n");
1030 }
drhdd3d4592004-08-30 01:54:05 +00001031 rc = sqlite3_step(pSelect);
1032 }
drh2f464a02011-10-13 00:41:49 +00001033 rc = sqlite3_finalize(pSelect);
1034 if( rc!=SQLITE_OK ){
1035 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001036 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001037 }
1038 return rc;
drhdd3d4592004-08-30 01:54:05 +00001039}
1040
shane626a6e42009-10-22 17:30:15 +00001041/*
1042** Allocate space and save off current error string.
1043*/
1044static char *save_err_msg(
1045 sqlite3 *db /* Database to query */
1046){
1047 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1048 char *zErrMsg = sqlite3_malloc(nErrMsg);
1049 if( zErrMsg ){
1050 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1051 }
1052 return zErrMsg;
1053}
1054
1055/*
shaneh642d8b82010-07-28 16:05:34 +00001056** Display memory stats.
1057*/
1058static int display_stats(
1059 sqlite3 *db, /* Database to query */
1060 struct callback_data *pArg, /* Pointer to struct callback_data */
1061 int bReset /* True to reset the stats */
1062){
1063 int iCur;
1064 int iHiwtr;
1065
1066 if( pArg && pArg->out ){
1067
1068 iHiwtr = iCur = -1;
1069 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001070 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001071 iHiwtr = iCur = -1;
1072 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001073 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001074/*
1075** Not currently used by the CLI.
1076** iHiwtr = iCur = -1;
1077** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1078** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1079*/
1080 iHiwtr = iCur = -1;
1081 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1082 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1083/*
1084** Not currently used by the CLI.
1085** iHiwtr = iCur = -1;
1086** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1087** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1088*/
1089 iHiwtr = iCur = -1;
1090 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1091 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1092 iHiwtr = iCur = -1;
1093 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1094 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1095 iHiwtr = iCur = -1;
1096 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1097 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1098 iHiwtr = iCur = -1;
1099 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1100 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1101#ifdef YYTRACKMAXSTACKDEPTH
1102 iHiwtr = iCur = -1;
1103 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1104 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1105#endif
1106 }
1107
1108 if( pArg && pArg->out && db ){
1109 iHiwtr = iCur = -1;
1110 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1111 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001112 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1113 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1114 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1116 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1117 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001118 iHiwtr = iCur = -1;
1119 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001120 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1122 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1123 iHiwtr = iCur = -1;
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1125 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001126 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001127 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1128 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1129 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001130 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1131 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1132 iHiwtr = iCur = -1;
1133 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1134 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1135 }
1136
1137 if( pArg && pArg->out && db && pArg->pStmt ){
1138 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1139 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1140 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1141 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1142 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1143 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001144 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1145 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001146 }
1147
1148 return 0;
1149}
1150
1151/*
dana98bf362013-11-13 18:35:01 +00001152** Parameter azArray points to a zero-terminated array of strings. zStr
1153** points to a single nul-terminated string. Return non-zero if zStr
1154** is equal, according to strcmp(), to any of the strings in the array.
1155** Otherwise, return zero.
1156*/
1157static int str_in_array(const char *zStr, const char **azArray){
1158 int i;
1159 for(i=0; azArray[i]; i++){
1160 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1161 }
1162 return 0;
1163}
1164
1165/*
1166** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1167** and populate the callback_data.aiIndent[] array with the number of
1168** spaces each opcode should be indented before it is output.
1169**
1170** The indenting rules are:
1171**
1172** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1173** all opcodes that occur between the p2 jump destination and the opcode
1174** itself by 2 spaces.
1175**
1176** * For each "Goto", if the jump destination is a "Yield" instruction
1177** that occurs earlier in the program than the Goto itself, indent
1178** all opcodes between the "Yield" and "Goto" by 2 spaces.
1179*/
1180static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1181 const char *zSql; /* The text of the SQL statement */
1182 const char *z; /* Used to check if this is an EXPLAIN */
1183 int *abYield = 0; /* True if op is an OP_Yield */
1184 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
1185 int iOp;
1186
1187 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", 0 };
1188 const char *azYield[] = { "Yield", 0 };
1189 const char *azGoto[] = { "Goto", 0 };
1190
1191 /* Try to figure out if this is really an EXPLAIN statement. If this
1192 ** cannot be verified, return early. */
1193 zSql = sqlite3_sql(pSql);
1194 if( zSql==0 ) return;
1195 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1196 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1197
1198 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1199 int i;
1200 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1201 int p2 = sqlite3_column_int(pSql, 3);
1202
1203 /* Grow the p->aiIndent array as required */
1204 if( iOp>=nAlloc ){
1205 nAlloc += 100;
1206 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1207 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1208 }
1209 abYield[iOp] = str_in_array(zOp, azYield);
1210 p->aiIndent[iOp] = 0;
1211 p->nIndent = iOp+1;
1212
1213 if( str_in_array(zOp, azNext) ){
1214 for(i=p2; i<iOp; i++) p->aiIndent[i] += 2;
1215 }
1216 if( str_in_array(zOp, azGoto) && p2<p->nIndent && abYield[p2] ){
1217 for(i=p2+1; i<iOp; i++) p->aiIndent[i] += 2;
1218 }
1219 }
1220
1221 sqlite3_free(abYield);
1222 sqlite3_reset(pSql);
1223}
1224
1225/*
1226** Free the array allocated by explain_data_prepare().
1227*/
1228static void explain_data_delete(struct callback_data *p){
1229 sqlite3_free(p->aiIndent);
1230 p->aiIndent = 0;
1231 p->nIndent = 0;
1232}
1233
1234/*
shane626a6e42009-10-22 17:30:15 +00001235** Execute a statement or set of statements. Print
1236** any result rows/columns depending on the current mode
1237** set via the supplied callback.
1238**
1239** This is very similar to SQLite's built-in sqlite3_exec()
1240** function except it takes a slightly different callback
1241** and callback data argument.
1242*/
1243static int shell_exec(
1244 sqlite3 *db, /* An open database */
1245 const char *zSql, /* SQL to be evaluated */
1246 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1247 /* (not the same as sqlite3_exec) */
1248 struct callback_data *pArg, /* Pointer to struct callback_data */
1249 char **pzErrMsg /* Error msg written here */
1250){
dan4564ced2010-01-05 04:59:56 +00001251 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1252 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001253 int rc2;
dan4564ced2010-01-05 04:59:56 +00001254 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001255
1256 if( pzErrMsg ){
1257 *pzErrMsg = NULL;
1258 }
1259
shaneb9fc17d2009-10-22 21:23:35 +00001260 while( zSql[0] && (SQLITE_OK == rc) ){
1261 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1262 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001263 if( pzErrMsg ){
1264 *pzErrMsg = save_err_msg(db);
1265 }
1266 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001267 if( !pStmt ){
1268 /* this happens for a comment or white-space */
1269 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001270 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001271 continue;
1272 }
shane626a6e42009-10-22 17:30:15 +00001273
shaneh642d8b82010-07-28 16:05:34 +00001274 /* save off the prepared statment handle and reset row count */
1275 if( pArg ){
1276 pArg->pStmt = pStmt;
1277 pArg->cnt = 0;
1278 }
1279
shanehb7977c52010-01-18 18:17:10 +00001280 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001281 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001282 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001283 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001284 }
shanehb7977c52010-01-18 18:17:10 +00001285
drh7e02e5e2011-12-06 19:44:51 +00001286 /* Output TESTCTRL_EXPLAIN text of requested */
1287 if( pArg && pArg->mode==MODE_Explain ){
1288 const char *zExplain = 0;
1289 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1290 if( zExplain && zExplain[0] ){
1291 fprintf(pArg->out, "%s", zExplain);
1292 }
1293 }
1294
dana98bf362013-11-13 18:35:01 +00001295 /* If the shell is currently in ".explain" mode, gather the extra
1296 ** data required to add indents to the output.*/
1297 if( pArg->mode==MODE_Explain ){
1298 explain_data_prepare(pArg, pStmt);
1299 }
1300
shaneb9fc17d2009-10-22 21:23:35 +00001301 /* perform the first step. this will tell us if we
1302 ** have a result set or not and how wide it is.
1303 */
1304 rc = sqlite3_step(pStmt);
1305 /* if we have a result set... */
1306 if( SQLITE_ROW == rc ){
1307 /* if we have a callback... */
1308 if( xCallback ){
1309 /* allocate space for col name ptr, value ptr, and type */
1310 int nCol = sqlite3_column_count(pStmt);
1311 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1312 if( !pData ){
1313 rc = SQLITE_NOMEM;
1314 }else{
1315 char **azCols = (char **)pData; /* Names of result columns */
1316 char **azVals = &azCols[nCol]; /* Results */
1317 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001318 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001319 assert(sizeof(int) <= sizeof(char *));
1320 /* save off ptrs to column names */
1321 for(i=0; i<nCol; i++){
1322 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1323 }
shaneb9fc17d2009-10-22 21:23:35 +00001324 do{
1325 /* extract the data and data types */
1326 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001327 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001328 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001329 azVals[i] = "";
1330 }else{
1331 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1332 }
shaneb9fc17d2009-10-22 21:23:35 +00001333 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1334 rc = SQLITE_NOMEM;
1335 break; /* from for */
1336 }
1337 } /* end for */
1338
1339 /* if data and types extracted successfully... */
1340 if( SQLITE_ROW == rc ){
1341 /* call the supplied callback with the result row data */
1342 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1343 rc = SQLITE_ABORT;
1344 }else{
1345 rc = sqlite3_step(pStmt);
1346 }
1347 }
1348 } while( SQLITE_ROW == rc );
1349 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001350 }
1351 }else{
1352 do{
1353 rc = sqlite3_step(pStmt);
1354 } while( rc == SQLITE_ROW );
1355 }
1356 }
1357
dana98bf362013-11-13 18:35:01 +00001358 explain_data_delete(pArg);
1359
shaneh642d8b82010-07-28 16:05:34 +00001360 /* print usage stats if stats on */
1361 if( pArg && pArg->statsOn ){
1362 display_stats(db, pArg, 0);
1363 }
1364
dan4564ced2010-01-05 04:59:56 +00001365 /* Finalize the statement just executed. If this fails, save a
1366 ** copy of the error message. Otherwise, set zSql to point to the
1367 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001368 rc2 = sqlite3_finalize(pStmt);
1369 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001370 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001371 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001372 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001373 }else if( pzErrMsg ){
1374 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001375 }
shaneh642d8b82010-07-28 16:05:34 +00001376
1377 /* clear saved stmt handle */
1378 if( pArg ){
1379 pArg->pStmt = NULL;
1380 }
shane626a6e42009-10-22 17:30:15 +00001381 }
shaneb9fc17d2009-10-22 21:23:35 +00001382 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001383
1384 return rc;
1385}
1386
drhdd3d4592004-08-30 01:54:05 +00001387
drh33048c02001-10-01 14:29:22 +00001388/*
drh4c653a02000-06-07 01:27:47 +00001389** This is a different callback routine used for dumping the database.
1390** Each row received by this callback consists of a table name,
1391** the table type ("index" or "table") and SQL to create the table.
1392** This routine should print text sufficient to recreate the table.
1393*/
1394static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001395 int rc;
1396 const char *zTable;
1397 const char *zType;
1398 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001399 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001400 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001401
drh902b9ee2008-12-05 17:17:07 +00001402 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001403 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001404 zTable = azArg[0];
1405 zType = azArg[1];
1406 zSql = azArg[2];
1407
drh00b950d2005-09-11 02:03:03 +00001408 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001409 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001410 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001411 fprintf(p->out, "ANALYZE sqlite_master;\n");
1412 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1413 return 0;
drh45e29d82006-11-20 16:21:10 +00001414 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1415 char *zIns;
1416 if( !p->writableSchema ){
1417 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1418 p->writableSchema = 1;
1419 }
1420 zIns = sqlite3_mprintf(
1421 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1422 "VALUES('table','%q','%q',0,'%q');",
1423 zTable, zTable, zSql);
1424 fprintf(p->out, "%s\n", zIns);
1425 sqlite3_free(zIns);
1426 return 0;
drh00b950d2005-09-11 02:03:03 +00001427 }else{
1428 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001429 }
danielk19772a02e332004-06-05 08:04:36 +00001430
1431 if( strcmp(zType, "table")==0 ){
1432 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001433 char *zSelect = 0;
1434 char *zTableInfo = 0;
1435 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001436 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001437
1438 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1439 zTableInfo = appendText(zTableInfo, zTable, '"');
1440 zTableInfo = appendText(zTableInfo, ");", 0);
1441
1442 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001443 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001444 if( rc!=SQLITE_OK || !pTableInfo ){
1445 return 1;
1446 }
1447
1448 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001449 /* Always quote the table name, even if it appears to be pure ascii,
1450 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1451 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001452 if( zTmp ){
1453 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001454 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001455 }
1456 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1457 rc = sqlite3_step(pTableInfo);
1458 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001459 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001460 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001461 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001462 rc = sqlite3_step(pTableInfo);
1463 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001464 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001465 }else{
1466 zSelect = appendText(zSelect, ") ", 0);
1467 }
drh157e29a2009-05-21 15:15:00 +00001468 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001469 }
1470 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001471 if( rc!=SQLITE_OK || nRow==0 ){
1472 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001473 return 1;
1474 }
1475 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1476 zSelect = appendText(zSelect, zTable, '"');
1477
drh2f464a02011-10-13 00:41:49 +00001478 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001479 if( rc==SQLITE_CORRUPT ){
1480 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001481 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001482 }
drh85e72432012-04-11 11:38:53 +00001483 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001484 }
drh4c653a02000-06-07 01:27:47 +00001485 return 0;
1486}
1487
1488/*
drh45e29d82006-11-20 16:21:10 +00001489** Run zQuery. Use dump_callback() as the callback routine so that
1490** the contents of the query are output as SQL statements.
1491**
drhdd3d4592004-08-30 01:54:05 +00001492** If we get a SQLITE_CORRUPT error, rerun the query after appending
1493** "ORDER BY rowid DESC" to the end.
1494*/
1495static int run_schema_dump_query(
1496 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001497 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001498){
1499 int rc;
drh2f464a02011-10-13 00:41:49 +00001500 char *zErr = 0;
1501 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001502 if( rc==SQLITE_CORRUPT ){
1503 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001504 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001505 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1506 if( zErr ){
1507 fprintf(p->out, "/****** %s ******/\n", zErr);
1508 sqlite3_free(zErr);
1509 zErr = 0;
1510 }
drhdd3d4592004-08-30 01:54:05 +00001511 zQ2 = malloc( len+100 );
1512 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001513 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001514 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1515 if( rc ){
1516 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1517 }else{
1518 rc = SQLITE_CORRUPT;
1519 }
1520 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001521 free(zQ2);
1522 }
1523 return rc;
1524}
1525
1526/*
drh75897232000-05-29 14:26:00 +00001527** Text of a help message
1528*/
persicom1d0b8722002-04-18 02:53:04 +00001529static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001530 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001531 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001532 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001533 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001534 " If TABLE specified, only dump tables matching\n"
1535 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001536 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001537 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001538 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1539 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001540 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001541 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001542 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001543 ".indices ?TABLE? Show names of all indices\n"
1544 " If TABLE specified, only show indices for tables\n"
1545 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001546#ifdef SQLITE_ENABLE_IOTRACE
1547 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1548#endif
drh70df4fe2006-06-13 15:12:21 +00001549#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001550 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001551#endif
drh127f9d72010-02-23 01:47:00 +00001552 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001553 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001554 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001555 " column Left-aligned columns. (See .width)\n"
1556 " html HTML <table> code\n"
1557 " insert SQL insert statements for TABLE\n"
1558 " line One value per line\n"
1559 " list Values delimited by .separator string\n"
1560 " tabs Tab-separated values\n"
1561 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001562 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001563 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001564 ".output FILENAME Send output to FILENAME\n"
1565 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001566 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001567 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001568 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001569 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001570 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001571 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001572 " If TABLE specified, only show tables matching\n"
1573 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001574 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001575 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001576 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001577 ".tables ?TABLE? List names of tables\n"
1578 " If TABLE specified, only list tables matching\n"
1579 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001580 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001581 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001582 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001583 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001584;
1585
shaneb320ccd2009-10-21 03:42:58 +00001586static char zTimerHelp[] =
1587 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1588;
1589
drhdaffd0e2001-04-11 14:28:42 +00001590/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001591static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001592
drh75897232000-05-29 14:26:00 +00001593/*
drh44c2eb12003-04-30 11:38:26 +00001594** Make sure the database is open. If it is not, then open it. If
1595** the database fails to open, print an error message and exit.
1596*/
drh05782482013-10-24 15:20:20 +00001597static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001598 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001599 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001600 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001601 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001602 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1603 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1604 shellstaticFunc, 0, 0);
1605 }
1606 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001607 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001608 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001609 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001610 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001611 }
drhc2e87a32006-06-27 15:16:14 +00001612#ifndef SQLITE_OMIT_LOAD_EXTENSION
1613 sqlite3_enable_load_extension(p->db, 1);
1614#endif
drh44c2eb12003-04-30 11:38:26 +00001615 }
1616}
1617
1618/*
drhfeac5f82004-08-01 00:10:45 +00001619** Do C-language style dequoting.
1620**
1621** \t -> tab
1622** \n -> newline
1623** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001624** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001625** \NNN -> ascii character NNN in octal
1626** \\ -> backslash
1627*/
1628static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001629 int i, j;
1630 char c;
drhfeac5f82004-08-01 00:10:45 +00001631 for(i=j=0; (c = z[i])!=0; i++, j++){
1632 if( c=='\\' ){
1633 c = z[++i];
1634 if( c=='n' ){
1635 c = '\n';
1636 }else if( c=='t' ){
1637 c = '\t';
1638 }else if( c=='r' ){
1639 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001640 }else if( c=='\\' ){
1641 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001642 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001643 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001644 if( z[i+1]>='0' && z[i+1]<='7' ){
1645 i++;
1646 c = (c<<3) + z[i] - '0';
1647 if( z[i+1]>='0' && z[i+1]<='7' ){
1648 i++;
1649 c = (c<<3) + z[i] - '0';
1650 }
1651 }
1652 }
1653 }
1654 z[j] = c;
1655 }
1656 z[j] = 0;
1657}
1658
1659/*
drh348d19c2013-06-03 12:47:43 +00001660** Return the value of a hexadecimal digit. Return -1 if the input
1661** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001662*/
drh348d19c2013-06-03 12:47:43 +00001663static int hexDigitValue(char c){
1664 if( c>='0' && c<='9' ) return c - '0';
1665 if( c>='a' && c<='f' ) return c - 'a' + 10;
1666 if( c>='A' && c<='F' ) return c - 'A' + 10;
1667 return -1;
drhc28490c2006-10-26 14:25:58 +00001668}
1669
1670/*
drh7d9f3942013-04-03 01:26:54 +00001671** Interpret zArg as an integer value, possibly with suffixes.
1672*/
1673static sqlite3_int64 integerValue(const char *zArg){
1674 sqlite3_int64 v = 0;
1675 static const struct { char *zSuffix; int iMult; } aMult[] = {
1676 { "KiB", 1024 },
1677 { "MiB", 1024*1024 },
1678 { "GiB", 1024*1024*1024 },
1679 { "KB", 1000 },
1680 { "MB", 1000000 },
1681 { "GB", 1000000000 },
1682 { "K", 1000 },
1683 { "M", 1000000 },
1684 { "G", 1000000000 },
1685 };
1686 int i;
1687 int isNeg = 0;
1688 if( zArg[0]=='-' ){
1689 isNeg = 1;
1690 zArg++;
1691 }else if( zArg[0]=='+' ){
1692 zArg++;
1693 }
drh348d19c2013-06-03 12:47:43 +00001694 if( zArg[0]=='0' && zArg[1]=='x' ){
1695 int x;
1696 zArg += 2;
1697 while( (x = hexDigitValue(zArg[0]))>=0 ){
1698 v = (v<<4) + x;
1699 zArg++;
1700 }
1701 }else{
1702 while( IsDigit(zArg[0]) ){
1703 v = v*10 + zArg[0] - '0';
1704 zArg++;
1705 }
drh7d9f3942013-04-03 01:26:54 +00001706 }
drhc2bed0a2013-05-24 11:57:50 +00001707 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001708 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1709 v *= aMult[i].iMult;
1710 break;
1711 }
1712 }
1713 return isNeg? -v : v;
1714}
1715
1716/*
drh348d19c2013-06-03 12:47:43 +00001717** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1718** for TRUE and FALSE. Return the integer value if appropriate.
1719*/
1720static int booleanValue(char *zArg){
1721 int i;
1722 if( zArg[0]=='0' && zArg[1]=='x' ){
1723 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1724 }else{
1725 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1726 }
1727 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1728 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1729 return 1;
1730 }
1731 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1732 return 0;
1733 }
1734 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1735 zArg);
1736 return 0;
1737}
1738
1739/*
drh42f64e52012-04-04 16:56:23 +00001740** Close an output file, assuming it is not stderr or stdout
1741*/
1742static void output_file_close(FILE *f){
1743 if( f && f!=stdout && f!=stderr ) fclose(f);
1744}
1745
1746/*
1747** Try to open an output file. The names "stdout" and "stderr" are
1748** recognized and do the right thing. NULL is returned if the output
1749** filename is "off".
1750*/
1751static FILE *output_file_open(const char *zFile){
1752 FILE *f;
1753 if( strcmp(zFile,"stdout")==0 ){
1754 f = stdout;
1755 }else if( strcmp(zFile, "stderr")==0 ){
1756 f = stderr;
1757 }else if( strcmp(zFile, "off")==0 ){
1758 f = 0;
1759 }else{
1760 f = fopen(zFile, "wb");
1761 if( f==0 ){
1762 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1763 }
1764 }
1765 return f;
1766}
1767
1768/*
1769** A routine for handling output from sqlite3_trace().
1770*/
1771static void sql_trace_callback(void *pArg, const char *z){
1772 FILE *f = (FILE*)pArg;
1773 if( f ) fprintf(f, "%s\n", z);
1774}
1775
1776/*
drhd8621b92012-04-17 09:09:33 +00001777** A no-op routine that runs with the ".breakpoint" doc-command. This is
1778** a useful spot to set a debugger breakpoint.
1779*/
1780static void test_breakpoint(void){
1781 static int nCall = 0;
1782 nCall++;
1783}
1784
1785/*
drhdb95f682013-06-26 22:46:00 +00001786** An object used to read a CSV file
1787*/
1788typedef struct CSVReader CSVReader;
1789struct CSVReader {
1790 const char *zFile; /* Name of the input file */
1791 FILE *in; /* Read the CSV text from this input stream */
1792 char *z; /* Accumulated text for a field */
1793 int n; /* Number of bytes in z */
1794 int nAlloc; /* Space allocated for z[] */
1795 int nLine; /* Current line number */
1796 int cTerm; /* Character that terminated the most recent field */
1797 int cSeparator; /* The separator character. (Usually ",") */
1798};
1799
1800/* Append a single byte to z[] */
1801static void csv_append_char(CSVReader *p, int c){
1802 if( p->n+1>=p->nAlloc ){
1803 p->nAlloc += p->nAlloc + 100;
1804 p->z = sqlite3_realloc(p->z, p->nAlloc);
1805 if( p->z==0 ){
1806 fprintf(stderr, "out of memory\n");
1807 exit(1);
1808 }
1809 }
1810 p->z[p->n++] = (char)c;
1811}
1812
1813/* Read a single field of CSV text. Compatible with rfc4180 and extended
1814** with the option of having a separator other than ",".
1815**
1816** + Input comes from p->in.
1817** + Store results in p->z of length p->n. Space to hold p->z comes
1818** from sqlite3_malloc().
1819** + Use p->cSep as the separator. The default is ",".
1820** + Keep track of the line number in p->nLine.
1821** + Store the character that terminates the field in p->cTerm. Store
1822** EOF on end-of-file.
1823** + Report syntax errors on stderr
1824*/
1825static char *csv_read_one_field(CSVReader *p){
1826 int c, pc;
1827 int cSep = p->cSeparator;
1828 p->n = 0;
1829 c = fgetc(p->in);
1830 if( c==EOF || seenInterrupt ){
1831 p->cTerm = EOF;
1832 return 0;
1833 }
1834 if( c=='"' ){
1835 int startLine = p->nLine;
1836 int cQuote = c;
1837 pc = 0;
1838 while( 1 ){
1839 c = fgetc(p->in);
1840 if( c=='\n' ) p->nLine++;
1841 if( c==cQuote ){
1842 if( pc==cQuote ){
1843 pc = 0;
1844 continue;
1845 }
1846 }
1847 if( (c==cSep && pc==cQuote)
1848 || (c=='\n' && pc==cQuote)
drh868ccf22013-08-28 13:33:40 +00001849 || (c=='\n' && pc=='\r' && p->n>=2 && p->z[p->n-2]==cQuote)
drhdb95f682013-06-26 22:46:00 +00001850 || (c==EOF && pc==cQuote)
1851 ){
1852 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001853 p->cTerm = c;
1854 break;
1855 }
1856 if( pc==cQuote && c!='\r' ){
1857 fprintf(stderr, "%s:%d: unescaped %c character\n",
1858 p->zFile, p->nLine, cQuote);
1859 }
1860 if( c==EOF ){
1861 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1862 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001863 p->cTerm = EOF;
1864 break;
1865 }
1866 csv_append_char(p, c);
1867 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001868 }
drhdb95f682013-06-26 22:46:00 +00001869 }else{
drhd0a64dc2013-06-30 20:24:26 +00001870 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001871 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001872 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001873 }
1874 if( c=='\n' ){
1875 p->nLine++;
1876 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1877 }
drhdb95f682013-06-26 22:46:00 +00001878 p->cTerm = c;
1879 }
drh8dd675e2013-07-12 21:09:24 +00001880 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001881 return p->z;
1882}
1883
1884/*
drh75897232000-05-29 14:26:00 +00001885** If an input line begins with "." then invoke this routine to
1886** process that line.
drh67505e72002-04-19 12:34:06 +00001887**
drh47ad6842006-11-08 12:25:42 +00001888** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00001889*/
drh44c2eb12003-04-30 11:38:26 +00001890static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00001891 int i = 1;
1892 int nArg = 0;
1893 int n, c;
drh67505e72002-04-19 12:34:06 +00001894 int rc = 0;
drh75897232000-05-29 14:26:00 +00001895 char *azArg[50];
1896
1897 /* Parse the input line into tokens.
1898 */
1899 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00001900 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00001901 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00001902 if( zLine[i]=='\'' || zLine[i]=='"' ){
1903 int delim = zLine[i++];
1904 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00001905 while( zLine[i] && zLine[i]!=delim ){
1906 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
1907 i++;
1908 }
drh75897232000-05-29 14:26:00 +00001909 if( zLine[i]==delim ){
1910 zLine[i++] = 0;
1911 }
drhfeac5f82004-08-01 00:10:45 +00001912 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001913 }else{
1914 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00001915 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00001916 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00001917 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001918 }
1919 }
1920
1921 /* Process the input line.
1922 */
shane9bd1b442009-10-23 01:27:39 +00001923 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00001924 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00001925 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00001926 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
1927 const char *zDestFile = 0;
1928 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00001929 sqlite3 *pDest;
1930 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00001931 int j;
1932 for(j=1; j<nArg; j++){
1933 const char *z = azArg[j];
1934 if( z[0]=='-' ){
1935 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00001936 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00001937 {
1938 fprintf(stderr, "unknown option: %s\n", azArg[j]);
1939 return 1;
1940 }
1941 }else if( zDestFile==0 ){
1942 zDestFile = azArg[j];
1943 }else if( zDb==0 ){
1944 zDb = zDestFile;
1945 zDestFile = azArg[j];
1946 }else{
1947 fprintf(stderr, "too many arguments to .backup\n");
1948 return 1;
1949 }
drh9ff849f2009-02-04 20:55:57 +00001950 }
drhbc46f022013-01-23 18:53:23 +00001951 if( zDestFile==0 ){
1952 fprintf(stderr, "missing FILENAME argument on .backup\n");
1953 return 1;
1954 }
1955 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00001956 rc = sqlite3_open(zDestFile, &pDest);
1957 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001958 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00001959 sqlite3_close(pDest);
1960 return 1;
1961 }
drh05782482013-10-24 15:20:20 +00001962 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00001963 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
1964 if( pBackup==0 ){
1965 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1966 sqlite3_close(pDest);
1967 return 1;
1968 }
1969 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
1970 sqlite3_backup_finish(pBackup);
1971 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00001972 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00001973 }else{
1974 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00001975 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00001976 }
1977 sqlite3_close(pDest);
1978 }else
1979
shanehe2aa9d72009-11-06 17:20:17 +00001980 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00001981 bail_on_error = booleanValue(azArg[1]);
1982 }else
1983
drhd8621b92012-04-17 09:09:33 +00001984 /* The undocumented ".breakpoint" command causes a call to the no-op
1985 ** routine named test_breakpoint().
1986 */
1987 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
1988 test_breakpoint();
1989 }else
1990
shanehe2aa9d72009-11-06 17:20:17 +00001991 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00001992 struct callback_data data;
1993 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00001994 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00001995 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00001996 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00001997 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00001998 data.colWidth[0] = 3;
1999 data.colWidth[1] = 15;
2000 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002001 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002002 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002003 if( zErrMsg ){
2004 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002005 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002006 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002007 }
2008 }else
2009
shanehe2aa9d72009-11-06 17:20:17 +00002010 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002011 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002012 /* When playing back a "dump", the content might appear in an order
2013 ** which causes immediate foreign key constraints to be violated.
2014 ** So disable foreign-key constraint enforcement to prevent problems. */
2015 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002016 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002017 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002018 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002019 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002020 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002021 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002022 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002023 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002024 );
2025 run_schema_dump_query(p,
2026 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002027 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002028 );
drh2f464a02011-10-13 00:41:49 +00002029 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002030 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002031 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002032 );
drh4c653a02000-06-07 01:27:47 +00002033 }else{
2034 int i;
drhdd3d4592004-08-30 01:54:05 +00002035 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002036 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002037 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002038 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002039 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002040 " AND sql NOT NULL");
2041 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002042 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002043 "WHERE sql NOT NULL"
2044 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002045 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002046 );
danielk1977bc6ada42004-06-30 08:20:16 +00002047 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002048 }
2049 }
drh45e29d82006-11-20 16:21:10 +00002050 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002051 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002052 p->writableSchema = 0;
2053 }
drh56197952011-10-13 16:30:13 +00002054 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2055 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002056 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002057 }else
drh75897232000-05-29 14:26:00 +00002058
shanehe2aa9d72009-11-06 17:20:17 +00002059 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002060 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002061 }else
2062
drhd3ac7d92013-01-25 18:33:43 +00002063 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002064 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002065 rc = 2;
drh75897232000-05-29 14:26:00 +00002066 }else
2067
shanehe2aa9d72009-11-06 17:20:17 +00002068 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002069 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002070 if(val == 1) {
2071 if(!p->explainPrev.valid) {
2072 p->explainPrev.valid = 1;
2073 p->explainPrev.mode = p->mode;
2074 p->explainPrev.showHeader = p->showHeader;
2075 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2076 }
2077 /* We could put this code under the !p->explainValid
2078 ** condition so that it does not execute if we are already in
2079 ** explain mode. However, always executing it allows us an easy
2080 ** was to reset to explain mode in case the user previously
2081 ** did an .explain followed by a .width, .mode or .header
2082 ** command.
2083 */
danielk19770d78bae2008-01-03 07:09:48 +00002084 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002085 p->showHeader = 1;
2086 memset(p->colWidth,0,ArraySize(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002087 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002088 p->colWidth[1] = 13; /* opcode */
2089 p->colWidth[2] = 4; /* P1 */
2090 p->colWidth[3] = 4; /* P2 */
2091 p->colWidth[4] = 4; /* P3 */
2092 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002093 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002094 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002095 }else if (p->explainPrev.valid) {
2096 p->explainPrev.valid = 0;
2097 p->mode = p->explainPrev.mode;
2098 p->showHeader = p->explainPrev.showHeader;
2099 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2100 }
drh75897232000-05-29 14:26:00 +00002101 }else
2102
drhc28490c2006-10-26 14:25:58 +00002103 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002104 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002105 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002106 }else
2107
2108 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002109 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002110 if( HAS_TIMER ){
2111 fprintf(stderr,"%s",zTimerHelp);
2112 }
drh75897232000-05-29 14:26:00 +00002113 }else
2114
shanehe2aa9d72009-11-06 17:20:17 +00002115 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002116 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002117 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002118 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002119 int nCol; /* Number of columns in the table */
2120 int nByte; /* Number of bytes in an SQL string */
2121 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002122 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002123 int nSep; /* Number of bytes in p->separator[] */
2124 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002125 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002126 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002127
drhdb95f682013-06-26 22:46:00 +00002128 seenInterrupt = 0;
2129 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002130 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002131 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002132 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002133 fprintf(stderr, "Error: non-null separator required for import\n");
2134 return 1;
drhfeac5f82004-08-01 00:10:45 +00002135 }
drhdb95f682013-06-26 22:46:00 +00002136 if( nSep>1 ){
2137 fprintf(stderr, "Error: multi-character separators not allowed"
2138 " for import\n");
2139 return 1;
2140 }
drh5bde8162013-06-27 14:07:53 +00002141 sCsv.zFile = zFile;
2142 sCsv.nLine = 1;
2143 if( sCsv.zFile[0]=='|' ){
2144 sCsv.in = popen(sCsv.zFile+1, "r");
2145 sCsv.zFile = "<pipe>";
2146 xCloser = pclose;
2147 }else{
2148 sCsv.in = fopen(sCsv.zFile, "rb");
2149 xCloser = fclose;
2150 }
drhdb95f682013-06-26 22:46:00 +00002151 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002152 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002153 return 1;
2154 }
2155 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002156 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002157 if( zSql==0 ){
2158 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002159 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002160 return 1;
2161 }
drh4f21c4a2008-12-10 22:15:00 +00002162 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002163 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002164 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2165 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2166 char cSep = '(';
2167 while( csv_read_one_field(&sCsv) ){
2168 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2169 cSep = ',';
2170 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2171 }
drh5bde8162013-06-27 14:07:53 +00002172 if( cSep=='(' ){
2173 sqlite3_free(zCreate);
2174 sqlite3_free(sCsv.z);
2175 xCloser(sCsv.in);
2176 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2177 return 1;
2178 }
drhdb95f682013-06-26 22:46:00 +00002179 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2180 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2181 sqlite3_free(zCreate);
2182 if( rc ){
2183 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2184 sqlite3_errmsg(db));
2185 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002186 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002187 return 1;
2188 }
2189 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2190 }
drhfeac5f82004-08-01 00:10:45 +00002191 sqlite3_free(zSql);
2192 if( rc ){
shane916f9612009-10-23 00:37:15 +00002193 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002194 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002195 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002196 return 1;
drhfeac5f82004-08-01 00:10:45 +00002197 }
shane916f9612009-10-23 00:37:15 +00002198 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002199 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002200 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002201 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002202 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002203 if( zSql==0 ){
2204 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002205 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002206 return 1;
2207 }
drhdb95f682013-06-26 22:46:00 +00002208 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002209 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002210 for(i=1; i<nCol; i++){
2211 zSql[j++] = ',';
2212 zSql[j++] = '?';
2213 }
2214 zSql[j++] = ')';
2215 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002216 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002217 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002218 if( rc ){
2219 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002220 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002221 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002222 return 1;
drhfeac5f82004-08-01 00:10:45 +00002223 }
drh2d463112013-08-06 14:36:36 +00002224 needCommit = sqlite3_get_autocommit(db);
2225 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002226 do{
2227 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002228 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002229 char *z = csv_read_one_field(&sCsv);
2230 if( z==0 && i==0 ) break;
2231 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2232 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2233 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2234 "filling the rest with NULL\n",
2235 sCsv.zFile, startLine, nCol, i+1);
2236 i++;
2237 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002238 }
drhfeac5f82004-08-01 00:10:45 +00002239 }
drhdb95f682013-06-26 22:46:00 +00002240 if( sCsv.cTerm==sCsv.cSeparator ){
2241 do{
2242 csv_read_one_field(&sCsv);
2243 i++;
2244 }while( sCsv.cTerm==sCsv.cSeparator );
2245 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2246 "extras ignored\n",
2247 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002248 }
drhdb95f682013-06-26 22:46:00 +00002249 if( i>=nCol ){
2250 sqlite3_step(pStmt);
2251 rc = sqlite3_reset(pStmt);
2252 if( rc!=SQLITE_OK ){
2253 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2254 sqlite3_errmsg(db));
2255 }
2256 }
2257 }while( sCsv.cTerm!=EOF );
2258
drh5bde8162013-06-27 14:07:53 +00002259 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002260 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002261 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002262 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002263 }else
2264
shanehe2aa9d72009-11-06 17:20:17 +00002265 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002266 struct callback_data data;
2267 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002268 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002269 memcpy(&data, p, sizeof(data));
2270 data.showHeader = 0;
2271 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002272 if( nArg==1 ){
2273 rc = sqlite3_exec(p->db,
2274 "SELECT name FROM sqlite_master "
2275 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2276 "UNION ALL "
2277 "SELECT name FROM sqlite_temp_master "
2278 "WHERE type='index' "
2279 "ORDER BY 1",
2280 callback, &data, &zErrMsg
2281 );
2282 }else{
2283 zShellStatic = azArg[1];
2284 rc = sqlite3_exec(p->db,
2285 "SELECT name FROM sqlite_master "
2286 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2287 "UNION ALL "
2288 "SELECT name FROM sqlite_temp_master "
2289 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2290 "ORDER BY 1",
2291 callback, &data, &zErrMsg
2292 );
2293 zShellStatic = 0;
2294 }
drh75897232000-05-29 14:26:00 +00002295 if( zErrMsg ){
2296 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002297 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002298 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002299 }else if( rc != SQLITE_OK ){
2300 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2301 rc = 1;
drh75897232000-05-29 14:26:00 +00002302 }
2303 }else
2304
drhae5e4452007-05-03 17:18:36 +00002305#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002306 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002307 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002308 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2309 iotrace = 0;
2310 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002311 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002312 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002313 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002314 iotrace = stdout;
2315 }else{
2316 iotrace = fopen(azArg[1], "w");
2317 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002318 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002319 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002320 rc = 1;
drhb0603412007-02-28 04:47:26 +00002321 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002322 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002323 }
2324 }
2325 }else
drhae5e4452007-05-03 17:18:36 +00002326#endif
drhb0603412007-02-28 04:47:26 +00002327
drh70df4fe2006-06-13 15:12:21 +00002328#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002329 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2330 const char *zFile, *zProc;
2331 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002332 zFile = azArg[1];
2333 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002334 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002335 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2336 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002337 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002338 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002339 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002340 }
2341 }else
drh70df4fe2006-06-13 15:12:21 +00002342#endif
drh1e397f82006-06-08 15:28:43 +00002343
drhc8ba2122011-03-23 11:16:22 +00002344 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002345 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002346 output_file_close(p->pLog);
2347 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002348 }else
2349
shanehe2aa9d72009-11-06 17:20:17 +00002350 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002351 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002352 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002353 ||
shanehe2aa9d72009-11-06 17:20:17 +00002354 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002355 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002356 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002357 ||
shanehe2aa9d72009-11-06 17:20:17 +00002358 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002359 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002360 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002361 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002362 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002363 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002364 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002365 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002366 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002367 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002368 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002369 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002370 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002371 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002372 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002373 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002374 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002375 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002376 }else {
shane9bd1b442009-10-23 01:27:39 +00002377 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002378 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002379 rc = 1;
drh75897232000-05-29 14:26:00 +00002380 }
2381 }else
2382
shanehe2aa9d72009-11-06 17:20:17 +00002383 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2384 int n2 = strlen30(azArg[1]);
2385 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2386 p->mode = MODE_Insert;
2387 set_table_name(p, azArg[2]);
2388 }else {
2389 fprintf(stderr, "Error: invalid arguments: "
2390 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2391 rc = 1;
2392 }
2393 }else
2394
persicom7e2dfdd2002-04-18 02:46:52 +00002395 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002396 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2397 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002398 }else
2399
drh05782482013-10-24 15:20:20 +00002400 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2401 sqlite3 *savedDb = p->db;
2402 const char *zSavedFilename = p->zDbFilename;
2403 char *zNewFilename = 0;
2404 p->db = 0;
2405 if( nArg>=2 ){
2406 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2407 }
2408 open_db(p, 1);
2409 if( p->db!=0 ){
2410 sqlite3_close(savedDb);
2411 sqlite3_free(p->zFreeOnClose);
2412 p->zFreeOnClose = zNewFilename;
2413 }else{
2414 sqlite3_free(zNewFilename);
2415 p->db = savedDb;
2416 p->zDbFilename = zSavedFilename;
2417 }
2418 }else
2419
drh75897232000-05-29 14:26:00 +00002420 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002421 if( p->outfile[0]=='|' ){
2422 pclose(p->out);
2423 }else{
2424 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002425 }
drh42f64e52012-04-04 16:56:23 +00002426 p->outfile[0] = 0;
2427 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002428 p->out = popen(&azArg[1][1], "w");
2429 if( p->out==0 ){
2430 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2431 p->out = stdout;
2432 rc = 1;
2433 }else{
2434 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2435 }
drh75897232000-05-29 14:26:00 +00002436 }else{
drh42f64e52012-04-04 16:56:23 +00002437 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002438 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002439 if( strcmp(azArg[1],"off")!=0 ){
2440 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2441 }
drh75897232000-05-29 14:26:00 +00002442 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002443 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002444 } else {
drh42f64e52012-04-04 16:56:23 +00002445 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002446 }
2447 }
2448 }else
2449
drh078b1fd2012-09-21 13:40:02 +00002450 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2451 int i;
2452 for(i=1; i<nArg; i++){
2453 if( i>1 ) fprintf(p->out, " ");
2454 fprintf(p->out, "%s", azArg[i]);
2455 }
2456 fprintf(p->out, "\n");
2457 }else
2458
drhdd45df82002-04-18 12:39:03 +00002459 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002460 if( nArg >= 2) {
2461 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2462 }
2463 if( nArg >= 3) {
2464 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2465 }
2466 }else
2467
shanehe2aa9d72009-11-06 17:20:17 +00002468 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002469 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002470 }else
2471
drh9ff849f2009-02-04 20:55:57 +00002472 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002473 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002474 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002475 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2476 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002477 }else{
shane9bd1b442009-10-23 01:27:39 +00002478 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002479 fclose(alt);
2480 }
2481 }else
2482
shanehe2aa9d72009-11-06 17:20:17 +00002483 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002484 const char *zSrcFile;
2485 const char *zDb;
2486 sqlite3 *pSrc;
2487 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002488 int nTimeout = 0;
2489
drh9ff849f2009-02-04 20:55:57 +00002490 if( nArg==2 ){
2491 zSrcFile = azArg[1];
2492 zDb = "main";
2493 }else{
2494 zSrcFile = azArg[2];
2495 zDb = azArg[1];
2496 }
2497 rc = sqlite3_open(zSrcFile, &pSrc);
2498 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002499 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002500 sqlite3_close(pSrc);
2501 return 1;
2502 }
drh05782482013-10-24 15:20:20 +00002503 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002504 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2505 if( pBackup==0 ){
2506 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2507 sqlite3_close(pSrc);
2508 return 1;
2509 }
drhdc2c4912009-02-04 22:46:47 +00002510 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2511 || rc==SQLITE_BUSY ){
2512 if( rc==SQLITE_BUSY ){
2513 if( nTimeout++ >= 3 ) break;
2514 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002515 }
2516 }
2517 sqlite3_backup_finish(pBackup);
2518 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002519 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002520 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002521 fprintf(stderr, "Error: source database is busy\n");
2522 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002523 }else{
2524 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002525 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002526 }
2527 sqlite3_close(pSrc);
2528 }else
2529
shanehe2aa9d72009-11-06 17:20:17 +00002530 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002531 struct callback_data data;
2532 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002533 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002534 memcpy(&data, p, sizeof(data));
2535 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002536 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002537 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002538 int i;
drhf0693c82011-10-11 20:41:54 +00002539 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002540 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002541 char *new_argv[2], *new_colv[2];
2542 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2543 " type text,\n"
2544 " name text,\n"
2545 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002546 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002547 " sql text\n"
2548 ")";
2549 new_argv[1] = 0;
2550 new_colv[0] = "sql";
2551 new_colv[1] = 0;
2552 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002553 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002554 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002555 char *new_argv[2], *new_colv[2];
2556 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2557 " type text,\n"
2558 " name text,\n"
2559 " tbl_name text,\n"
2560 " rootpage integer,\n"
2561 " 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;
drha18c5682000-10-08 22:20:57 +00002568 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002569 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002570 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002571 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002572 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002573 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002574 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002575 "WHERE lower(tbl_name) LIKE shellstatic()"
2576 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002577 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002578 callback, &data, &zErrMsg);
2579 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002580 }
drh75897232000-05-29 14:26:00 +00002581 }else{
shane9bd1b442009-10-23 01:27:39 +00002582 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002583 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002584 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002585 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002586 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002587 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002588 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002589 callback, &data, &zErrMsg
2590 );
drh75897232000-05-29 14:26:00 +00002591 }
drh75897232000-05-29 14:26:00 +00002592 if( zErrMsg ){
2593 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002594 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002595 rc = 1;
2596 }else if( rc != SQLITE_OK ){
2597 fprintf(stderr,"Error: querying schema information\n");
2598 rc = 1;
2599 }else{
2600 rc = 0;
drh75897232000-05-29 14:26:00 +00002601 }
2602 }else
2603
drh340f5822013-06-27 13:01:21 +00002604#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002605 /* Undocumented commands for internal testing. Subject to change
2606 ** without notice. */
2607 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2608 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2609 int i, v;
2610 for(i=1; i<nArg; i++){
2611 v = booleanValue(azArg[i]);
2612 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2613 }
2614 }
2615 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2616 int i; sqlite3_int64 v;
2617 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002618 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002619 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002620 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2621 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002622 }
2623 }
2624 }else
drh340f5822013-06-27 13:01:21 +00002625#endif
drh348d19c2013-06-03 12:47:43 +00002626
drh75897232000-05-29 14:26:00 +00002627 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002628 sqlite3_snprintf(sizeof(p->separator), p->separator,
2629 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002630 }else
2631
shanehe2aa9d72009-11-06 17:20:17 +00002632 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002633 int i;
2634 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002635 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002636 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002637 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002638 fprintf(p->out,"%9.9s: ", "nullvalue");
2639 output_c_string(p->out, p->nullvalue);
2640 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002641 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002642 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002643 fprintf(p->out,"%9.9s: ", "separator");
2644 output_c_string(p->out, p->separator);
2645 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002646 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002647 fprintf(p->out,"%9.9s: ","width");
2648 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002649 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002650 }
drhfeac5f82004-08-01 00:10:45 +00002651 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002652 }else
2653
shaneh642d8b82010-07-28 16:05:34 +00002654 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2655 p->statsOn = booleanValue(azArg[1]);
2656 }else
2657
shanehe2aa9d72009-11-06 17:20:17 +00002658 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002659 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002660 char **azResult;
drh98781232012-04-23 12:38:05 +00002661 int nRow, nAlloc;
2662 char *zSql = 0;
2663 int ii;
drh05782482013-10-24 15:20:20 +00002664 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002665 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2666 if( rc ) return rc;
2667 zSql = sqlite3_mprintf(
2668 "SELECT name FROM sqlite_master"
2669 " WHERE type IN ('table','view')"
2670 " AND name NOT LIKE 'sqlite_%%'"
2671 " AND name LIKE ?1");
2672 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2673 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2674 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2675 if( strcmp(zDbName,"temp")==0 ){
2676 zSql = sqlite3_mprintf(
2677 "%z UNION ALL "
2678 "SELECT 'temp.' || name FROM sqlite_temp_master"
2679 " WHERE type IN ('table','view')"
2680 " AND name NOT LIKE 'sqlite_%%'"
2681 " AND name LIKE ?1", zSql);
2682 }else{
2683 zSql = sqlite3_mprintf(
2684 "%z UNION ALL "
2685 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2686 " WHERE type IN ('table','view')"
2687 " AND name NOT LIKE 'sqlite_%%'"
2688 " AND name LIKE ?1", zSql, zDbName, zDbName);
2689 }
drha50da102000-08-08 20:19:09 +00002690 }
drh98781232012-04-23 12:38:05 +00002691 sqlite3_finalize(pStmt);
2692 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2693 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2694 sqlite3_free(zSql);
2695 if( rc ) return rc;
2696 nRow = nAlloc = 0;
2697 azResult = 0;
2698 if( nArg>1 ){
2699 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002700 }else{
drh98781232012-04-23 12:38:05 +00002701 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2702 }
2703 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2704 if( nRow>=nAlloc ){
2705 char **azNew;
2706 int n = nAlloc*2 + 10;
2707 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2708 if( azNew==0 ){
2709 fprintf(stderr, "Error: out of memory\n");
2710 break;
2711 }
2712 nAlloc = n;
2713 azResult = azNew;
2714 }
2715 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2716 if( azResult[nRow] ) nRow++;
2717 }
2718 sqlite3_finalize(pStmt);
2719 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002720 int len, maxlen = 0;
2721 int i, j;
2722 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002723 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002724 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002725 if( len>maxlen ) maxlen = len;
2726 }
2727 nPrintCol = 80/(maxlen+2);
2728 if( nPrintCol<1 ) nPrintCol = 1;
2729 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2730 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002731 for(j=i; j<nRow; j+=nPrintRow){
2732 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002733 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002734 }
drh151b7d52013-05-06 20:28:54 +00002735 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002736 }
2737 }
drh98781232012-04-23 12:38:05 +00002738 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2739 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002740 }else
2741
shaneh96887e12011-02-10 21:08:58 +00002742 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002743 static const struct {
2744 const char *zCtrlName; /* Name of a test-control option */
2745 int ctrlCode; /* Integer code for that option */
2746 } aCtrl[] = {
2747 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2748 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2749 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2750 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2751 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2752 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2753 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2754 { "assert", SQLITE_TESTCTRL_ASSERT },
2755 { "always", SQLITE_TESTCTRL_ALWAYS },
2756 { "reserve", SQLITE_TESTCTRL_RESERVE },
2757 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2758 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002759 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2760 };
shaneh96887e12011-02-10 21:08:58 +00002761 int testctrl = -1;
2762 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002763 int i, n;
drh05782482013-10-24 15:20:20 +00002764 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00002765
drhd416fe72011-03-17 16:45:50 +00002766 /* convert testctrl text option to value. allow any unique prefix
2767 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002768 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002769 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002770 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2771 if( testctrl<0 ){
2772 testctrl = aCtrl[i].ctrlCode;
2773 }else{
drhb07028f2011-10-14 21:49:18 +00002774 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00002775 testctrl = -1;
2776 break;
2777 }
2778 }
2779 }
drh348d19c2013-06-03 12:47:43 +00002780 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002781 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2782 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2783 }else{
2784 switch(testctrl){
2785
2786 /* sqlite3_test_control(int, db, int) */
2787 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2788 case SQLITE_TESTCTRL_RESERVE:
2789 if( nArg==3 ){
2790 int opt = (int)strtol(azArg[2], 0, 0);
2791 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00002792 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002793 } else {
drhd416fe72011-03-17 16:45:50 +00002794 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2795 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002796 }
2797 break;
2798
2799 /* sqlite3_test_control(int) */
2800 case SQLITE_TESTCTRL_PRNG_SAVE:
2801 case SQLITE_TESTCTRL_PRNG_RESTORE:
2802 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00002803 if( nArg==2 ){
2804 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00002805 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002806 } else {
2807 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2808 }
2809 break;
2810
2811 /* sqlite3_test_control(int, uint) */
2812 case SQLITE_TESTCTRL_PENDING_BYTE:
2813 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00002814 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002815 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002816 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002817 } else {
drhd416fe72011-03-17 16:45:50 +00002818 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2819 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002820 }
2821 break;
2822
2823 /* sqlite3_test_control(int, int) */
2824 case SQLITE_TESTCTRL_ASSERT:
2825 case SQLITE_TESTCTRL_ALWAYS:
2826 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00002827 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00002828 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002829 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002830 } else {
drhd416fe72011-03-17 16:45:50 +00002831 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2832 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002833 }
2834 break;
2835
2836 /* sqlite3_test_control(int, char *) */
2837#ifdef SQLITE_N_KEYWORD
2838 case SQLITE_TESTCTRL_ISKEYWORD:
2839 if( nArg==3 ){
2840 const char *opt = azArg[2];
2841 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00002842 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00002843 } else {
drhd416fe72011-03-17 16:45:50 +00002844 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2845 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002846 }
2847 break;
2848#endif
2849
2850 case SQLITE_TESTCTRL_BITVEC_TEST:
2851 case SQLITE_TESTCTRL_FAULT_INSTALL:
2852 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2853 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2854 default:
drhd416fe72011-03-17 16:45:50 +00002855 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2856 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002857 break;
2858 }
2859 }
2860 }else
2861
shanehe2aa9d72009-11-06 17:20:17 +00002862 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00002863 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00002864 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00002865 }else
2866
drhd416fe72011-03-17 16:45:50 +00002867 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2868 && nArg==2
2869 ){
drh3b1a9882007-11-02 12:53:03 +00002870 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002871 }else
2872
drh42f64e52012-04-04 16:56:23 +00002873 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00002874 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00002875 output_file_close(p->traceOut);
2876 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00002877#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00002878 if( p->traceOut==0 ){
2879 sqlite3_trace(p->db, 0, 0);
2880 }else{
2881 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
2882 }
2883#endif
2884 }else
2885
drh9fd301b2011-06-03 13:28:22 +00002886 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00002887 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00002888 sqlite3_libversion(), sqlite3_sourceid());
2889 }else
2890
drhde60fc22011-12-14 17:53:36 +00002891 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
2892 const char *zDbName = nArg==2 ? azArg[1] : "main";
2893 char *zVfsName = 0;
2894 if( p->db ){
2895 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
2896 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00002897 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00002898 sqlite3_free(zVfsName);
2899 }
2900 }
2901 }else
2902
drhcef4fc82012-09-21 22:50:45 +00002903#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2904 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
2905 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00002906 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00002907 }else
2908#endif
2909
shanehe2aa9d72009-11-06 17:20:17 +00002910 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00002911 int j;
drh43617e92006-03-06 20:55:46 +00002912 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002913 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00002914 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00002915 }
2916 }else
2917
2918 {
shane9bd1b442009-10-23 01:27:39 +00002919 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00002920 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00002921 rc = 1;
drh75897232000-05-29 14:26:00 +00002922 }
drh67505e72002-04-19 12:34:06 +00002923
2924 return rc;
drh75897232000-05-29 14:26:00 +00002925}
2926
drh67505e72002-04-19 12:34:06 +00002927/*
drh91a66392007-09-07 01:12:32 +00002928** Return TRUE if a semicolon occurs anywhere in the first N characters
2929** of string z[].
drh324ccef2003-02-05 14:06:20 +00002930*/
drh9f099fd2013-08-06 14:01:46 +00002931static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00002932 int i;
2933 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2934 return 0;
drh324ccef2003-02-05 14:06:20 +00002935}
2936
2937/*
drh70c7a4b2003-04-26 03:03:06 +00002938** Test to see if a line consists entirely of whitespace.
2939*/
2940static int _all_whitespace(const char *z){
2941 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00002942 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002943 if( *z=='/' && z[1]=='*' ){
2944 z += 2;
2945 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2946 if( *z==0 ) return 0;
2947 z++;
2948 continue;
2949 }
2950 if( *z=='-' && z[1]=='-' ){
2951 z += 2;
2952 while( *z && *z!='\n' ){ z++; }
2953 if( *z==0 ) return 1;
2954 continue;
2955 }
2956 return 0;
2957 }
2958 return 1;
2959}
2960
2961/*
drha9b17162003-04-29 18:01:28 +00002962** Return TRUE if the line typed in is an SQL command terminator other
2963** than a semi-colon. The SQL Server style "go" command is understood
2964** as is the Oracle "/".
2965*/
drh9f099fd2013-08-06 14:01:46 +00002966static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00002967 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002968 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2969 return 1; /* Oracle */
2970 }
drhf0693c82011-10-11 20:41:54 +00002971 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00002972 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002973 return 1; /* SQL Server */
2974 }
2975 return 0;
2976}
2977
2978/*
drh233a5312008-12-18 22:25:13 +00002979** Return true if zSql is a complete SQL statement. Return false if it
2980** ends in the middle of a string literal or C-style comment.
2981*/
drh9f099fd2013-08-06 14:01:46 +00002982static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00002983 int rc;
2984 if( zSql==0 ) return 1;
2985 zSql[nSql] = ';';
2986 zSql[nSql+1] = 0;
2987 rc = sqlite3_complete(zSql);
2988 zSql[nSql] = 0;
2989 return rc;
2990}
2991
2992/*
drh67505e72002-04-19 12:34:06 +00002993** Read input from *in and process it. If *in==0 then input
2994** is interactive - the user is typing it it. Otherwise, input
2995** is coming from a file or device. A prompt is issued and history
2996** is saved only if input is interactive. An interrupt signal will
2997** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00002998**
2999** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003000*/
drhc28490c2006-10-26 14:25:58 +00003001static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003002 char *zLine = 0; /* A single input line */
3003 char *zSql = 0; /* Accumulated SQL text */
3004 int nLine; /* Length of current line */
3005 int nSql = 0; /* Bytes of zSql[] used */
3006 int nAlloc = 0; /* Allocated zSql[] space */
3007 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3008 char *zErrMsg; /* Error message returned */
3009 int rc; /* Error code */
3010 int errCnt = 0; /* Number of errors seen */
3011 int lineno = 0; /* Current line number */
3012 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003013
3014 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3015 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003016 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003017 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003018 /* End of input */
3019 if( stdin_is_interactive ) printf("\n");
3020 break;
drhc49f44e2006-10-26 18:15:42 +00003021 }
drh67505e72002-04-19 12:34:06 +00003022 if( seenInterrupt ){
3023 if( in!=0 ) break;
3024 seenInterrupt = 0;
3025 }
drhc28490c2006-10-26 14:25:58 +00003026 lineno++;
drh9f099fd2013-08-06 14:01:46 +00003027 if( nSql==0 && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00003028 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003029 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003030 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003031 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003032 break;
3033 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003034 errCnt++;
3035 }
drhdaffd0e2001-04-11 14:28:42 +00003036 continue;
3037 }
drh9f099fd2013-08-06 14:01:46 +00003038 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003039 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003040 }
drh9f099fd2013-08-06 14:01:46 +00003041 nLine = strlen30(zLine);
3042 if( nSql+nLine+2>=nAlloc ){
3043 nAlloc = nSql+nLine+100;
3044 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003045 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003046 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003047 exit(1);
3048 }
drhdaffd0e2001-04-11 14:28:42 +00003049 }
drh9f099fd2013-08-06 14:01:46 +00003050 nSqlPrior = nSql;
3051 if( nSql==0 ){
3052 int i;
3053 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003054 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003055 memcpy(zSql, zLine+i, nLine+1-i);
3056 startline = lineno;
3057 nSql = nLine-i;
3058 }else{
3059 zSql[nSql++] = '\n';
3060 memcpy(zSql+nSql, zLine, nLine+1);
3061 nSql += nLine;
3062 }
3063 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003064 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003065 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003066 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003067 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003068 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003069 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003070 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003071 char zPrefix[100];
3072 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003073 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003074 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003075 }else{
shane9bd1b442009-10-23 01:27:39 +00003076 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003077 }
drh7f953e22002-07-13 17:33:45 +00003078 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003079 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003080 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003081 zErrMsg = 0;
3082 }else{
shaned2bed1c2009-10-21 03:56:54 +00003083 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003084 }
drhc49f44e2006-10-26 18:15:42 +00003085 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003086 }
drhdaffd0e2001-04-11 14:28:42 +00003087 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003088 }else if( nSql && _all_whitespace(zSql) ){
drh7a411f42013-04-17 17:33:17 +00003089 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003090 }
3091 }
drh9f099fd2013-08-06 14:01:46 +00003092 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003093 if( !_all_whitespace(zSql) ){
3094 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3095 }
drhdaffd0e2001-04-11 14:28:42 +00003096 free(zSql);
3097 }
danielk19772ac27622007-07-03 05:31:16 +00003098 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003099 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003100}
3101
drh67505e72002-04-19 12:34:06 +00003102/*
3103** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003104** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003105*/
3106static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003107 static char *home_dir = NULL;
3108 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003109
drh83905c92012-06-21 13:00:37 +00003110#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003111 {
3112 struct passwd *pwent;
3113 uid_t uid = getuid();
3114 if( (pwent=getpwuid(uid)) != NULL) {
3115 home_dir = pwent->pw_dir;
3116 }
drh67505e72002-04-19 12:34:06 +00003117 }
3118#endif
3119
chw65d3c132007-11-12 21:09:10 +00003120#if defined(_WIN32_WCE)
3121 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3122 */
drh85e72432012-04-11 11:38:53 +00003123 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003124#else
3125
drh83905c92012-06-21 13:00:37 +00003126#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003127 if (!home_dir) {
3128 home_dir = getenv("USERPROFILE");
3129 }
3130#endif
3131
drh67505e72002-04-19 12:34:06 +00003132 if (!home_dir) {
3133 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003134 }
3135
drh83905c92012-06-21 13:00:37 +00003136#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003137 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003138 char *zDrive, *zPath;
3139 int n;
3140 zDrive = getenv("HOMEDRIVE");
3141 zPath = getenv("HOMEPATH");
3142 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003143 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003144 home_dir = malloc( n );
3145 if( home_dir==0 ) return 0;
3146 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3147 return home_dir;
3148 }
3149 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003150 }
3151#endif
3152
chw65d3c132007-11-12 21:09:10 +00003153#endif /* !_WIN32_WCE */
3154
drh67505e72002-04-19 12:34:06 +00003155 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003156 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003157 char *z = malloc( n );
3158 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003159 home_dir = z;
3160 }
drhe98d4fa2002-04-21 19:06:22 +00003161
drh67505e72002-04-19 12:34:06 +00003162 return home_dir;
3163}
3164
3165/*
3166** Read input from the file given by sqliterc_override. Or if that
3167** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003168**
3169** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003170*/
shane9bd1b442009-10-23 01:27:39 +00003171static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003172 struct callback_data *p, /* Configuration data */
3173 const char *sqliterc_override /* Name of config file. NULL to use default */
3174){
persicom7e2dfdd2002-04-18 02:46:52 +00003175 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003176 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003177 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003178 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003179 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003180
3181 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003182 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003183 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003184#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003185 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003186#endif
shane9bd1b442009-10-23 01:27:39 +00003187 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003188 }
drh2f3de322012-06-27 16:41:31 +00003189 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003190 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3191 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003192 }
drha1f9b5e2004-02-14 16:31:02 +00003193 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003194 if( in ){
drhc28490c2006-10-26 14:25:58 +00003195 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003196 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003197 }
shane9bd1b442009-10-23 01:27:39 +00003198 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003199 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003200 }
drh85e72432012-04-11 11:38:53 +00003201 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003202 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003203}
3204
drh67505e72002-04-19 12:34:06 +00003205/*
drhe1e38c42003-05-04 18:30:59 +00003206** Show available command line options
3207*/
3208static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003209 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003210 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003211 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003212 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003213 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003214 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003215 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003216 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003217#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3218 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3219#endif
drhcc3b4f82012-02-07 14:13:50 +00003220 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003221 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003222 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003223 " -line set output mode to 'line'\n"
3224 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003225 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003226#ifdef SQLITE_ENABLE_MULTIPLEX
3227 " -multiplex enable the multiplexor VFS\n"
3228#endif
drh98d312f2012-10-25 15:23:14 +00003229 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3230 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003231 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003232 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003233 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003234#ifdef SQLITE_ENABLE_VFSTRACE
3235 " -vfstrace enable tracing of all VFS calls\n"
3236#endif
drhe1e38c42003-05-04 18:30:59 +00003237;
3238static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003239 fprintf(stderr,
3240 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3241 "FILENAME is the name of an SQLite database. A new database is created\n"
3242 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003243 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003244 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003245 }else{
3246 fprintf(stderr, "Use the -help option for additional information\n");
3247 }
3248 exit(1);
3249}
3250
3251/*
drh67505e72002-04-19 12:34:06 +00003252** Initialize the state information in data
3253*/
drh0850b532006-01-31 19:31:43 +00003254static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003255 memset(data, 0, sizeof(*data));
3256 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003257 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003258 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003259 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003260 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003261 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3262 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003263 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003264}
3265
drh98d312f2012-10-25 15:23:14 +00003266/*
3267** Get the argument to an --option. Throw an error and die if no argument
3268** is available.
3269*/
3270static char *cmdline_option_value(int argc, char **argv, int i){
3271 if( i==argc ){
3272 fprintf(stderr, "%s: Error: missing argument to %s\n",
3273 argv[0], argv[argc-1]);
3274 exit(1);
3275 }
3276 return argv[i];
3277}
3278
drh75897232000-05-29 14:26:00 +00003279int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003280 char *zErrMsg = 0;
3281 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003282 const char *zInitFile = 0;
3283 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003284 int i;
drhc28490c2006-10-26 14:25:58 +00003285 int rc = 0;
drh75897232000-05-29 14:26:00 +00003286
drh52784bd2011-05-18 17:15:06 +00003287 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3288 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3289 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3290 exit(1);
3291 }
drhdaffd0e2001-04-11 14:28:42 +00003292 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003293 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003294 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003295
drh44c2eb12003-04-30 11:38:26 +00003296 /* Make sure we have a valid signal handler early, before anything
3297 ** else is done.
3298 */
drh4c504392000-10-16 22:06:40 +00003299#ifdef SIGINT
3300 signal(SIGINT, interrupt_handler);
3301#endif
drh44c2eb12003-04-30 11:38:26 +00003302
drh22fbcb82004-02-01 01:22:50 +00003303 /* Do an initial pass through the command-line argument to locate
3304 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003305 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003306 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003307 */
drh98d312f2012-10-25 15:23:14 +00003308 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003309 char *z;
drhc28490c2006-10-26 14:25:58 +00003310 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003311 if( z[0]!='-' ){
3312 if( data.zDbFilename==0 ){
3313 data.zDbFilename = z;
3314 continue;
3315 }
3316 if( zFirstCmd==0 ){
3317 zFirstCmd = z;
3318 continue;
3319 }
3320 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3321 fprintf(stderr,"Use -help for a list of options.\n");
3322 return 1;
3323 }
drhcc3b4f82012-02-07 14:13:50 +00003324 if( z[1]=='-' ) z++;
3325 if( strcmp(z,"-separator")==0
3326 || strcmp(z,"-nullvalue")==0
3327 || strcmp(z,"-cmd")==0
3328 ){
drh98d312f2012-10-25 15:23:14 +00003329 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003330 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003331 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003332 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003333 /* Need to check for batch mode here to so we can avoid printing
3334 ** informational messages (like from process_sqliterc) before
3335 ** we do the actual processing of arguments later in a second pass.
3336 */
shanef69573d2009-10-24 02:06:14 +00003337 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003338 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003339#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003340 const char *zSize;
3341 sqlite3_int64 szHeap;
3342
drh98d312f2012-10-25 15:23:14 +00003343 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003344 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003345 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003346 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3347#endif
drh97ae8ff2011-03-16 16:56:29 +00003348#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003349 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003350 extern int vfstrace_register(
3351 const char *zTraceName,
3352 const char *zOldVfsName,
3353 int (*xOut)(const char*,void*),
3354 void *pOutArg,
3355 int makeDefault
3356 );
drh2b625e22011-03-16 17:05:28 +00003357 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003358#endif
drh6f25e892011-07-08 17:02:57 +00003359#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003360 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003361 extern int sqlite3_multiple_initialize(const char*,int);
3362 sqlite3_multiplex_initialize(0, 1);
3363#endif
drh7d9f3942013-04-03 01:26:54 +00003364 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003365 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3366 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003367 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003368 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003369 if( pVfs ){
3370 sqlite3_vfs_register(pVfs, 1);
3371 }else{
3372 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3373 exit(1);
3374 }
drh44c2eb12003-04-30 11:38:26 +00003375 }
3376 }
drh98d312f2012-10-25 15:23:14 +00003377 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003378#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003379 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003380#else
shane86f5bdb2009-10-24 02:00:07 +00003381 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3382 return 1;
drh01b41712005-08-29 23:06:23 +00003383#endif
drh98d312f2012-10-25 15:23:14 +00003384 }
3385 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003386
drh44c2eb12003-04-30 11:38:26 +00003387 /* Go ahead and open the database file if it already exists. If the
3388 ** file does not exist, delay opening it. This prevents empty database
3389 ** files from being created if a user mistypes the database name argument
3390 ** to the sqlite command-line tool.
3391 */
drhc8d74412004-08-31 23:41:26 +00003392 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003393 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003394 }
3395
drh22fbcb82004-02-01 01:22:50 +00003396 /* Process the initialization file if there is one. If no -init option
3397 ** is given on the command line, look for a file named ~/.sqliterc and
3398 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003399 */
shane86f5bdb2009-10-24 02:00:07 +00003400 rc = process_sqliterc(&data,zInitFile);
3401 if( rc>0 ){
3402 return rc;
3403 }
drh44c2eb12003-04-30 11:38:26 +00003404
drh22fbcb82004-02-01 01:22:50 +00003405 /* Make a second pass through the command-line argument and set
3406 ** options. This second pass is delayed until after the initialization
3407 ** file is processed so that the command-line arguments will override
3408 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003409 */
drh98d312f2012-10-25 15:23:14 +00003410 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003411 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003412 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003413 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003414 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003415 i++;
3416 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003417 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003418 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003419 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003420 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003421 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003422 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003423 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003424 }else if( strcmp(z,"-csv")==0 ){
3425 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003426 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003427 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003428 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003429 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003430 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003431 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003432 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003433 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003434 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003435 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003436 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003437 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003438 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003439 }else if( strcmp(z,"-stats")==0 ){
3440 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003441 }else if( strcmp(z,"-bail")==0 ){
3442 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003443 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003444 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003445 return 0;
drhc28490c2006-10-26 14:25:58 +00003446 }else if( strcmp(z,"-interactive")==0 ){
3447 stdin_is_interactive = 1;
3448 }else if( strcmp(z,"-batch")==0 ){
3449 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003450 }else if( strcmp(z,"-heap")==0 ){
3451 i++;
drh7d9f3942013-04-03 01:26:54 +00003452 }else if( strcmp(z,"-mmap")==0 ){
3453 i++;
drha7e61d82011-03-12 17:02:57 +00003454 }else if( strcmp(z,"-vfs")==0 ){
3455 i++;
drh6f25e892011-07-08 17:02:57 +00003456#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003457 }else if( strcmp(z,"-vfstrace")==0 ){
3458 i++;
drh6f25e892011-07-08 17:02:57 +00003459#endif
3460#ifdef SQLITE_ENABLE_MULTIPLEX
3461 }else if( strcmp(z,"-multiplex")==0 ){
3462 i++;
3463#endif
drhcc3b4f82012-02-07 14:13:50 +00003464 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003465 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003466 }else if( strcmp(z,"-cmd")==0 ){
3467 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003468 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003469 if( z[0]=='.' ){
3470 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003471 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003472 }else{
drh05782482013-10-24 15:20:20 +00003473 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003474 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3475 if( zErrMsg!=0 ){
3476 fprintf(stderr,"Error: %s\n", zErrMsg);
3477 if( bail_on_error ) return rc!=0 ? rc : 1;
3478 }else if( rc!=0 ){
3479 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3480 if( bail_on_error ) return rc;
3481 }
3482 }
drh1e5d0e92000-05-31 23:33:17 +00003483 }else{
shane86f5bdb2009-10-24 02:00:07 +00003484 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003485 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003486 return 1;
3487 }
3488 }
drh44c2eb12003-04-30 11:38:26 +00003489
drh22fbcb82004-02-01 01:22:50 +00003490 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003491 /* Run just the command that follows the database name
3492 */
drh22fbcb82004-02-01 01:22:50 +00003493 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003494 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003495 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003496 }else{
drh05782482013-10-24 15:20:20 +00003497 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003498 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003499 if( zErrMsg!=0 ){
3500 fprintf(stderr,"Error: %s\n", zErrMsg);
3501 return rc!=0 ? rc : 1;
3502 }else if( rc!=0 ){
3503 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3504 return rc;
drh6ff13852001-11-25 13:18:23 +00003505 }
drh75897232000-05-29 14:26:00 +00003506 }
3507 }else{
drh44c2eb12003-04-30 11:38:26 +00003508 /* Run commands received from standard input
3509 */
drhc28490c2006-10-26 14:25:58 +00003510 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003511 char *zHome;
3512 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003513 int nHistory;
drh75897232000-05-29 14:26:00 +00003514 printf(
drh743e0032011-12-12 16:51:50 +00003515 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003516 "Enter \".help\" for instructions\n"
3517 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003518 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003519 );
drh67505e72002-04-19 12:34:06 +00003520 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003521 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003522 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003523 if( (zHistory = malloc(nHistory))!=0 ){
3524 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3525 }
drh67505e72002-04-19 12:34:06 +00003526 }
danielk19774af00c62005-01-23 23:43:21 +00003527#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003528 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003529#endif
drhc28490c2006-10-26 14:25:58 +00003530 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003531 if( zHistory ){
3532 stifle_history(100);
3533 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003534 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003535 }
drhdaffd0e2001-04-11 14:28:42 +00003536 }else{
drhc28490c2006-10-26 14:25:58 +00003537 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003538 }
3539 }
drh33048c02001-10-01 14:29:22 +00003540 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003541 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003542 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003543 }
drh05782482013-10-24 15:20:20 +00003544 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003545 return rc;
drh75897232000-05-29 14:26:00 +00003546}