blob: 1606e9d3e23098db2022904255a47fd7614c4154 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drh81d7fd12010-12-08 00:02:26 +000048#ifdef HAVE_EDITLINE
49# include <editline/editline.h>
50#endif
drh16e59552000-07-31 11:57:37 +000051#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000052# include <readline/readline.h>
53# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000054#endif
55#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
persicom1d0b8722002-04-18 02:53:04 +000056# define add_history(X)
drh67505e72002-04-19 12:34:06 +000057# define read_history(X)
58# define write_history(X)
59# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000060#endif
61
adamd2e8464a2006-09-06 21:39:40 +000062#if defined(_WIN32) || defined(WIN32)
63# include <io.h>
shane18e526c2008-12-10 22:30:24 +000064#define isatty(h) _isatty(h)
65#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000066#undef popen
drh53371f92013-07-25 17:07:03 +000067#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000068#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000069#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000070#else
drh4328c8b2003-04-26 02:50:11 +000071/* Make sure isatty() has a prototype.
72*/
drhb2acc3b2011-10-13 16:36:29 +000073extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000074
drh53371f92013-07-25 17:07:03 +000075/* popen and pclose are not C89 functions and so are sometimes omitted from
76** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000077extern FILE *popen(const char*,const char*);
78extern int pclose(FILE*);
79#endif
drh53371f92013-07-25 17:07:03 +000080
chw65d3c132007-11-12 21:09:10 +000081#if defined(_WIN32_WCE)
82/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
83 * thus we always assume that we have a console. That can be
84 * overridden with the -batch command line option.
85 */
86#define isatty(x) 1
87#endif
88
drhf0693c82011-10-11 20:41:54 +000089/* ctype macros that work with signed characters */
90#define IsSpace(X) isspace((unsigned char)X)
91#define IsDigit(X) isdigit((unsigned char)X)
92#define ToLower(X) (char)tolower((unsigned char)X)
93
drh43408312013-10-30 12:43:36 +000094
95/* True if the timer is enabled */
96static int enableTimer = 0;
97
98/* Return the current wall-clock time */
99static sqlite3_int64 timeOfDay(void){
100 static sqlite3_vfs *clockVfs = 0;
101 sqlite3_int64 t;
102 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
103 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
104 clockVfs->xCurrentTimeInt64(clockVfs, &t);
105 }else{
106 double r;
107 clockVfs->xCurrentTime(clockVfs, &r);
108 t = (sqlite3_int64)(r*86400000.0);
109 }
110 return t;
111}
112
drhd5d0f642013-02-20 00:54:21 +0000113#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
114 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000115#include <sys/time.h>
116#include <sys/resource.h>
117
drhda108222009-02-25 19:07:24 +0000118/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000119static struct rusage sBegin; /* CPU time at start */
120static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000121
drhda108222009-02-25 19:07:24 +0000122/*
123** Begin timing an operation
124*/
125static void beginTimer(void){
126 if( enableTimer ){
127 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000128 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000129 }
130}
131
132/* Return the difference of two time_structs in seconds */
133static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
134 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
135 (double)(pEnd->tv_sec - pStart->tv_sec);
136}
137
138/*
139** Print the timing results.
140*/
141static void endTimer(void){
142 if( enableTimer ){
143 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000144 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000145 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000146 printf("Run Time: real %.3f user %f sys %f\n",
147 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000148 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
149 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
150 }
151}
shaneb320ccd2009-10-21 03:42:58 +0000152
drhda108222009-02-25 19:07:24 +0000153#define BEGIN_TIMER beginTimer()
154#define END_TIMER endTimer()
155#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000156
157#elif (defined(_WIN32) || defined(WIN32))
158
159#include <windows.h>
160
161/* Saved resource information for the beginning of an operation */
162static HANDLE hProcess;
163static FILETIME ftKernelBegin;
164static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000165static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000166typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
167static GETPROCTIMES getProcessTimesAddr = NULL;
168
shaneb320ccd2009-10-21 03:42:58 +0000169/*
170** Check to see if we have timer support. Return 1 if necessary
171** support found (or found previously).
172*/
173static int hasTimer(void){
174 if( getProcessTimesAddr ){
175 return 1;
176 } else {
177 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
178 ** See if the version we are running on has it, and if it does, save off
179 ** a pointer to it and the current process handle.
180 */
181 hProcess = GetCurrentProcess();
182 if( hProcess ){
183 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
184 if( NULL != hinstLib ){
185 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
186 if( NULL != getProcessTimesAddr ){
187 return 1;
188 }
189 FreeLibrary(hinstLib);
190 }
191 }
192 }
193 return 0;
194}
195
196/*
197** Begin timing an operation
198*/
199static void beginTimer(void){
200 if( enableTimer && getProcessTimesAddr ){
201 FILETIME ftCreation, ftExit;
202 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000203 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000204 }
205}
206
207/* Return the difference of two FILETIME structs in seconds */
208static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
209 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
210 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
211 return (double) ((i64End - i64Start) / 10000000.0);
212}
213
214/*
215** Print the timing results.
216*/
217static void endTimer(void){
218 if( enableTimer && getProcessTimesAddr){
219 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000220 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000221 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000222 printf("Run Time: real %.3f user %f sys %f\n",
223 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000224 timeDiff(&ftUserBegin, &ftUserEnd),
225 timeDiff(&ftKernelBegin, &ftKernelEnd));
226 }
227}
228
229#define BEGIN_TIMER beginTimer()
230#define END_TIMER endTimer()
231#define HAS_TIMER hasTimer()
232
drhda108222009-02-25 19:07:24 +0000233#else
234#define BEGIN_TIMER
235#define END_TIMER
236#define HAS_TIMER 0
237#endif
238
shanec0688ea2009-03-05 03:48:06 +0000239/*
240** Used to prevent warnings about unused parameters
241*/
242#define UNUSED_PARAMETER(x) (void)(x)
243
drhe91d16b2008-12-08 18:27:31 +0000244/*
drhc49f44e2006-10-26 18:15:42 +0000245** If the following flag is set, then command execution stops
246** at an error if we are not interactive.
247*/
248static int bail_on_error = 0;
249
250/*
drhc28490c2006-10-26 14:25:58 +0000251** Threat stdin as an interactive input if the following variable
252** is true. Otherwise, assume stdin is connected to a file or pipe.
253*/
254static int stdin_is_interactive = 1;
255
256/*
drh4c504392000-10-16 22:06:40 +0000257** The following is the open SQLite database. We make a pointer
258** to this database a static variable so that it can be accessed
259** by the SIGINT handler to interrupt database processing.
260*/
danielk197792f9a1b2004-06-19 09:08:16 +0000261static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000262
263/*
drh67505e72002-04-19 12:34:06 +0000264** True if an interrupt (Control-C) has been received.
265*/
drh43617e92006-03-06 20:55:46 +0000266static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000267
268/*
persicom7e2dfdd2002-04-18 02:46:52 +0000269** This is the name of our program. It is set in main(), used
270** in a number of other places, mostly for error messages.
271*/
272static char *Argv0;
273
274/*
275** Prompt strings. Initialized in main. Settable with
276** .prompt main continue
277*/
278static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
279static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
280
drhb0603412007-02-28 04:47:26 +0000281/*
282** Write I/O traces to the following stream.
283*/
rsebe0a9092007-07-30 18:24:38 +0000284#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000285static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000286#endif
drhb0603412007-02-28 04:47:26 +0000287
288/*
289** This routine works like printf in that its first argument is a
290** format string and subsequent arguments are values to be substituted
291** in place of % fields. The result of formatting this string
292** is written to iotrace.
293*/
rsebe0a9092007-07-30 18:24:38 +0000294#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000295static void iotracePrintf(const char *zFormat, ...){
296 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000297 char *z;
drhb0603412007-02-28 04:47:26 +0000298 if( iotrace==0 ) return;
299 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000300 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000301 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000302 fprintf(iotrace, "%s", z);
303 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000304}
rsebe0a9092007-07-30 18:24:38 +0000305#endif
drhb0603412007-02-28 04:47:26 +0000306
drh44c2eb12003-04-30 11:38:26 +0000307
persicom7e2dfdd2002-04-18 02:46:52 +0000308/*
drh83965662003-04-17 02:54:13 +0000309** Determines if a string is a number of not.
310*/
danielk19772e588c72005-12-09 14:25:08 +0000311static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000312 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000313 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000314 return 0;
315 }
316 z++;
317 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000318 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000319 if( *z=='.' ){
320 z++;
drhf0693c82011-10-11 20:41:54 +0000321 if( !IsDigit(*z) ) return 0;
322 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000323 if( realnum ) *realnum = 1;
324 }
325 if( *z=='e' || *z=='E' ){
326 z++;
327 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000328 if( !IsDigit(*z) ) return 0;
329 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000330 if( realnum ) *realnum = 1;
331 }
332 return *z==0;
333}
drh83965662003-04-17 02:54:13 +0000334
335/*
danielk1977bc6ada42004-06-30 08:20:16 +0000336** A global char* and an SQL function to access its current value
337** from within an SQL statement. This program used to use the
338** sqlite_exec_printf() API to substitue a string into an SQL statement.
339** The correct way to do this with sqlite3 is to use the bind API, but
340** since the shell is built around the callback paradigm it would be a lot
341** of work. Instead just use this hack, which is quite harmless.
342*/
343static const char *zShellStatic = 0;
344static void shellstaticFunc(
345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
349 assert( 0==argc );
350 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000351 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000352 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000353 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
354}
355
356
357/*
drhfeac5f82004-08-01 00:10:45 +0000358** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000359** the text in memory obtained from malloc() and returns a pointer
360** to the text. NULL is returned at end of file, or if malloc()
361** fails.
362**
drh9f099fd2013-08-06 14:01:46 +0000363** If zLine is not NULL then it is a malloced buffer returned from
364** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000365*/
drh9f099fd2013-08-06 14:01:46 +0000366static char *local_getline(char *zLine, FILE *in){
367 int nLine = zLine==0 ? 0 : 100;
368 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000369
drhb07028f2011-10-14 21:49:18 +0000370 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000371 if( n+100>nLine ){
372 nLine = nLine*2 + 100;
373 zLine = realloc(zLine, nLine);
374 if( zLine==0 ) return 0;
375 }
drhdaffd0e2001-04-11 14:28:42 +0000376 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000377 if( n==0 ){
378 free(zLine);
379 return 0;
380 }
381 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000382 break;
383 }
drh9f099fd2013-08-06 14:01:46 +0000384 while( zLine[n] ) n++;
385 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000386 n--;
shaneh13b36022009-12-17 21:07:15 +0000387 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000388 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000389 break;
drh8e7e7a22000-05-30 18:45:23 +0000390 }
391 }
drh8e7e7a22000-05-30 18:45:23 +0000392 return zLine;
393}
394
395/*
drhc28490c2006-10-26 14:25:58 +0000396** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000397**
drh9f099fd2013-08-06 14:01:46 +0000398** If in==0 then read from standard input and prompt before each line.
399** If isContinuation is true, then a continuation prompt is appropriate.
400** If isContinuation is zero, then the main prompt should be used.
401**
402** If zPrior is not NULL then it is a buffer from a prior call to this
403** routine that can be reused.
404**
405** The result is stored in space obtained from malloc() and must either
406** be freed by the caller or else passed back into this routine via the
407** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000408*/
drh9f099fd2013-08-06 14:01:46 +0000409static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000410 char *zPrompt;
411 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000412 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000413 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000414 }else{
drh9f099fd2013-08-06 14:01:46 +0000415 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danielk19774af00c62005-01-23 23:43:21 +0000416#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh9f099fd2013-08-06 14:01:46 +0000417 free(zPrior);
418 zResult = readline(zPrompt);
419 if( zResult && *zResult ) add_history(zResult);
420#else
421 printf("%s", zPrompt);
422 fflush(stdout);
423 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000424#endif
drh9f099fd2013-08-06 14:01:46 +0000425 }
drh8e7e7a22000-05-30 18:45:23 +0000426 return zResult;
427}
428
persicom7e2dfdd2002-04-18 02:46:52 +0000429struct previous_mode_data {
430 int valid; /* Is there legit data in here? */
431 int mode;
432 int showHeader;
433 int colWidth[100];
434};
drh45e29d82006-11-20 16:21:10 +0000435
drh8e7e7a22000-05-30 18:45:23 +0000436/*
drh75897232000-05-29 14:26:00 +0000437** An pointer to an instance of this structure is passed from
438** the main program to the callback. This is used to communicate
439** state and mode information.
440*/
441struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000442 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000443 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000444 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000445 int cnt; /* Number of records displayed so far */
446 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000447 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000448 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000449 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000450 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000451 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000452 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000453 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000454 int colWidth[100]; /* Requested width of each column when in column mode*/
455 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000456 char nullvalue[20]; /* The text to print when a NULL comes back from
457 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000458 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000459 /* Holds the mode information just before
460 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000461 char outfile[FILENAME_MAX]; /* Filename for *out */
462 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000463 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000464 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000465 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000466 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000467 int *aiIndent; /* Array of indents used in MODE_Explain */
468 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000469 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000470};
471
472/*
473** These are the allowed modes.
474*/
drh967e8b72000-06-21 13:59:10 +0000475#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000476#define MODE_Column 1 /* One record per line in neat columns */
477#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000478#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
479#define MODE_Html 4 /* Generate an XHTML table */
480#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000481#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000482#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000483#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000484
drh66ce4d02008-02-15 17:38:06 +0000485static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000486 "line",
487 "column",
488 "list",
489 "semi",
490 "html",
drhfeac5f82004-08-01 00:10:45 +0000491 "insert",
492 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000493 "csv",
drh66ce4d02008-02-15 17:38:06 +0000494 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000495};
drh75897232000-05-29 14:26:00 +0000496
497/*
498** Number of elements in an array
499*/
drh902b9ee2008-12-05 17:17:07 +0000500#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000501
502/*
drhea678832008-12-10 19:26:22 +0000503** Compute a string length that is limited to what can be stored in
504** lower 30 bits of a 32-bit signed integer.
505*/
drh4f21c4a2008-12-10 22:15:00 +0000506static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000507 const char *z2 = z;
508 while( *z2 ){ z2++; }
509 return 0x3fffffff & (int)(z2 - z);
510}
511
512/*
drh127f9d72010-02-23 01:47:00 +0000513** A callback for the sqlite3_log() interface.
514*/
515static void shellLog(void *pArg, int iErrCode, const char *zMsg){
516 struct callback_data *p = (struct callback_data*)pArg;
517 if( p->pLog==0 ) return;
518 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
519 fflush(p->pLog);
520}
521
522/*
shane626a6e42009-10-22 17:30:15 +0000523** Output the given string as a hex-encoded blob (eg. X'1234' )
524*/
525static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
526 int i;
527 char *zBlob = (char *)pBlob;
528 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000529 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000530 fprintf(out,"'");
531}
532
533/*
drh28bd4bc2000-06-15 15:57:22 +0000534** Output the given string as a quoted string using SQL quoting conventions.
535*/
536static void output_quoted_string(FILE *out, const char *z){
537 int i;
538 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000539 for(i=0; z[i]; i++){
540 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000541 }
542 if( nSingle==0 ){
543 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000544 }else{
545 fprintf(out,"'");
546 while( *z ){
547 for(i=0; z[i] && z[i]!='\''; i++){}
548 if( i==0 ){
549 fprintf(out,"''");
550 z++;
551 }else if( z[i]=='\'' ){
552 fprintf(out,"%.*s''",i,z);
553 z += i+1;
554 }else{
drhcd7d2732002-02-26 23:24:26 +0000555 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000556 break;
557 }
558 }
drhcd7d2732002-02-26 23:24:26 +0000559 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000560 }
561}
562
563/*
drhfeac5f82004-08-01 00:10:45 +0000564** Output the given string as a quoted according to C or TCL quoting rules.
565*/
566static void output_c_string(FILE *out, const char *z){
567 unsigned int c;
568 fputc('"', out);
569 while( (c = *(z++))!=0 ){
570 if( c=='\\' ){
571 fputc(c, out);
572 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000573 }else if( c=='"' ){
574 fputc('\\', out);
575 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000576 }else if( c=='\t' ){
577 fputc('\\', out);
578 fputc('t', out);
579 }else if( c=='\n' ){
580 fputc('\\', out);
581 fputc('n', out);
582 }else if( c=='\r' ){
583 fputc('\\', out);
584 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000585 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000586 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000587 }else{
588 fputc(c, out);
589 }
590 }
591 fputc('"', out);
592}
593
594/*
drhc08a4f12000-06-15 16:49:48 +0000595** Output the given string with characters that are special to
596** HTML escaped.
597*/
598static void output_html_string(FILE *out, const char *z){
599 int i;
drhc3d6ba42014-01-13 20:38:35 +0000600 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000601 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000602 for(i=0; z[i]
603 && z[i]!='<'
604 && z[i]!='&'
605 && z[i]!='>'
606 && z[i]!='\"'
607 && z[i]!='\'';
608 i++){}
drhc08a4f12000-06-15 16:49:48 +0000609 if( i>0 ){
610 fprintf(out,"%.*s",i,z);
611 }
612 if( z[i]=='<' ){
613 fprintf(out,"&lt;");
614 }else if( z[i]=='&' ){
615 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000616 }else if( z[i]=='>' ){
617 fprintf(out,"&gt;");
618 }else if( z[i]=='\"' ){
619 fprintf(out,"&quot;");
620 }else if( z[i]=='\'' ){
621 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000622 }else{
623 break;
624 }
625 z += i + 1;
626 }
627}
628
629/*
drhc49f44e2006-10-26 18:15:42 +0000630** If a field contains any character identified by a 1 in the following
631** array, then the string must be quoted for CSV.
632*/
633static const char needCsvQuote[] = {
634 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
635 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
636 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650};
651
652/*
drh8e64d1c2004-10-07 00:32:39 +0000653** Output a single term of CSV. Actually, p->separator is used for
654** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000655** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000656*/
657static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000658 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000659 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000660 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000661 }else{
drhc49f44e2006-10-26 18:15:42 +0000662 int i;
drh4f21c4a2008-12-10 22:15:00 +0000663 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000664 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000665 if( needCsvQuote[((unsigned char*)z)[i]]
666 || (z[i]==p->separator[0] &&
667 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000668 i = 0;
669 break;
670 }
671 }
672 if( i==0 ){
673 putc('"', out);
674 for(i=0; z[i]; i++){
675 if( z[i]=='"' ) putc('"', out);
676 putc(z[i], out);
677 }
678 putc('"', out);
679 }else{
680 fprintf(out, "%s", z);
681 }
drh8e64d1c2004-10-07 00:32:39 +0000682 }
683 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000684 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000685 }
686}
687
danielk19774af00c62005-01-23 23:43:21 +0000688#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000689/*
drh4c504392000-10-16 22:06:40 +0000690** This routine runs when the user presses Ctrl-C
691*/
692static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000693 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000694 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000695 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000696}
danielk19774af00c62005-01-23 23:43:21 +0000697#endif
drh4c504392000-10-16 22:06:40 +0000698
699/*
shane626a6e42009-10-22 17:30:15 +0000700** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000701** invokes for each row of a query result.
702*/
shane626a6e42009-10-22 17:30:15 +0000703static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000704 int i;
705 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000706
drh75897232000-05-29 14:26:00 +0000707 switch( p->mode ){
708 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000709 int w = 5;
drh6a535342001-10-19 16:44:56 +0000710 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000711 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000712 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000713 if( len>w ) w = len;
714 }
drh75897232000-05-29 14:26:00 +0000715 if( p->cnt++>0 ) fprintf(p->out,"\n");
716 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000717 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000718 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000719 }
720 break;
721 }
danielk19770d78bae2008-01-03 07:09:48 +0000722 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000723 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000724 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000725 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000726 int w, n;
727 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000728 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000729 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000730 w = 0;
drh75897232000-05-29 14:26:00 +0000731 }
drh078b1fd2012-09-21 13:40:02 +0000732 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000733 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000734 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000735 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000736 if( w<n ) w = n;
737 }
738 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000739 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000740 }
741 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000742 if( w<0 ){
743 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
744 }else{
745 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
746 }
drha0c66f52000-07-29 13:20:21 +0000747 }
748 }
749 if( p->showHeader ){
750 for(i=0; i<nArg; i++){
751 int w;
752 if( i<ArraySize(p->actualWidth) ){
753 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000754 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000755 }else{
756 w = 10;
757 }
758 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
759 "----------------------------------------------------------",
760 i==nArg-1 ? "\n": " ");
761 }
drh75897232000-05-29 14:26:00 +0000762 }
763 }
drh6a535342001-10-19 16:44:56 +0000764 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000765 for(i=0; i<nArg; i++){
766 int w;
drha0c66f52000-07-29 13:20:21 +0000767 if( i<ArraySize(p->actualWidth) ){
768 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000769 }else{
770 w = 10;
771 }
dana98bf362013-11-13 18:35:01 +0000772 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000773 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000774 }
dana98bf362013-11-13 18:35:01 +0000775 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000776 if( p->iIndent<p->nIndent ){
777 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000778 }
danc4650bb2013-11-18 08:41:06 +0000779 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000780 }
drh078b1fd2012-09-21 13:40:02 +0000781 if( w<0 ){
782 fprintf(p->out,"%*.*s%s",-w,-w,
783 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
784 }else{
785 fprintf(p->out,"%-*.*s%s",w,w,
786 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
787 }
drh75897232000-05-29 14:26:00 +0000788 }
789 break;
790 }
drhe3710332000-09-29 13:30:53 +0000791 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000792 case MODE_List: {
793 if( p->cnt++==0 && p->showHeader ){
794 for(i=0; i<nArg; i++){
795 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
796 }
797 }
drh6a535342001-10-19 16:44:56 +0000798 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000799 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000800 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000801 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000802 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000803 if( i<nArg-1 ){
804 fprintf(p->out, "%s", p->separator);
805 }else if( p->mode==MODE_Semi ){
806 fprintf(p->out, ";\n");
807 }else{
808 fprintf(p->out, "\n");
809 }
drh75897232000-05-29 14:26:00 +0000810 }
811 break;
812 }
drh1e5d0e92000-05-31 23:33:17 +0000813 case MODE_Html: {
814 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000815 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000816 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000817 fprintf(p->out,"<TH>");
818 output_html_string(p->out, azCol[i]);
819 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000820 }
mihailim57c591a2008-06-23 21:26:05 +0000821 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000822 }
drh6a535342001-10-19 16:44:56 +0000823 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000825 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000826 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000827 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000828 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000829 }
mihailim57c591a2008-06-23 21:26:05 +0000830 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000831 break;
832 }
drhfeac5f82004-08-01 00:10:45 +0000833 case MODE_Tcl: {
834 if( p->cnt++==0 && p->showHeader ){
835 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000836 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000837 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000838 }
839 fprintf(p->out,"\n");
840 }
841 if( azArg==0 ) break;
842 for(i=0; i<nArg; i++){
843 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000844 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000845 }
846 fprintf(p->out,"\n");
847 break;
848 }
drh8e64d1c2004-10-07 00:32:39 +0000849 case MODE_Csv: {
850 if( p->cnt++==0 && p->showHeader ){
851 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000852 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000853 }
854 fprintf(p->out,"\n");
855 }
856 if( azArg==0 ) break;
857 for(i=0; i<nArg; i++){
858 output_csv(p, azArg[i], i<nArg-1);
859 }
860 fprintf(p->out,"\n");
861 break;
862 }
drh28bd4bc2000-06-15 15:57:22 +0000863 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000864 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000865 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000866 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000867 for(i=0; i<nArg; i++){
868 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000869 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000870 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000871 }else if( aiType && aiType[i]==SQLITE_TEXT ){
872 if( zSep[0] ) fprintf(p->out,"%s",zSep);
873 output_quoted_string(p->out, azArg[i]);
874 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
875 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000876 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
877 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
878 int nBlob = sqlite3_column_bytes(p->pStmt, i);
879 if( zSep[0] ) fprintf(p->out,"%s",zSep);
880 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000881 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000882 fprintf(p->out,"%s%s",zSep, azArg[i]);
883 }else{
884 if( zSep[0] ) fprintf(p->out,"%s",zSep);
885 output_quoted_string(p->out, azArg[i]);
886 }
887 }
888 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000889 break;
drh28bd4bc2000-06-15 15:57:22 +0000890 }
persicom1d0b8722002-04-18 02:53:04 +0000891 }
drh75897232000-05-29 14:26:00 +0000892 return 0;
893}
894
895/*
shane626a6e42009-10-22 17:30:15 +0000896** This is the callback routine that the SQLite library
897** invokes for each row of a query result.
898*/
899static int callback(void *pArg, int nArg, char **azArg, char **azCol){
900 /* since we don't have type info, call the shell_callback with a NULL value */
901 return shell_callback(pArg, nArg, azArg, azCol, NULL);
902}
903
904/*
drh33048c02001-10-01 14:29:22 +0000905** Set the destination table field of the callback_data structure to
906** the name of the table given. Escape any quote characters in the
907** table name.
908*/
909static void set_table_name(struct callback_data *p, const char *zName){
910 int i, n;
911 int needQuote;
912 char *z;
913
914 if( p->zDestTable ){
915 free(p->zDestTable);
916 p->zDestTable = 0;
917 }
918 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000919 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000920 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000921 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000922 needQuote = 1;
923 if( zName[i]=='\'' ) n++;
924 }
925 }
926 if( needQuote ) n += 2;
927 z = p->zDestTable = malloc( n+1 );
928 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000929 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000930 exit(1);
931 }
932 n = 0;
933 if( needQuote ) z[n++] = '\'';
934 for(i=0; zName[i]; i++){
935 z[n++] = zName[i];
936 if( zName[i]=='\'' ) z[n++] = '\'';
937 }
938 if( needQuote ) z[n++] = '\'';
939 z[n] = 0;
940}
941
danielk19772a02e332004-06-05 08:04:36 +0000942/* zIn is either a pointer to a NULL-terminated string in memory obtained
943** from malloc(), or a NULL pointer. The string pointed to by zAppend is
944** added to zIn, and the result returned in memory obtained from malloc().
945** zIn, if it was not NULL, is freed.
946**
947** If the third argument, quote, is not '\0', then it is used as a
948** quote character for zAppend.
949*/
drhc28490c2006-10-26 14:25:58 +0000950static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000951 int len;
952 int i;
drh4f21c4a2008-12-10 22:15:00 +0000953 int nAppend = strlen30(zAppend);
954 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000955
956 len = nAppend+nIn+1;
957 if( quote ){
958 len += 2;
959 for(i=0; i<nAppend; i++){
960 if( zAppend[i]==quote ) len++;
961 }
962 }
963
964 zIn = (char *)realloc(zIn, len);
965 if( !zIn ){
966 return 0;
967 }
968
969 if( quote ){
970 char *zCsr = &zIn[nIn];
971 *zCsr++ = quote;
972 for(i=0; i<nAppend; i++){
973 *zCsr++ = zAppend[i];
974 if( zAppend[i]==quote ) *zCsr++ = quote;
975 }
976 *zCsr++ = quote;
977 *zCsr++ = '\0';
978 assert( (zCsr-zIn)==len );
979 }else{
980 memcpy(&zIn[nIn], zAppend, nAppend);
981 zIn[len-1] = '\0';
982 }
983
984 return zIn;
985}
986
drhdd3d4592004-08-30 01:54:05 +0000987
988/*
drhb21a8e42012-01-28 21:08:51 +0000989** Execute a query statement that will generate SQL output. Print
990** the result columns, comma-separated, on a line and then add a
991** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000992**
drhb21a8e42012-01-28 21:08:51 +0000993** If the number of columns is 1 and that column contains text "--"
994** then write the semicolon on a separate line. That way, if a
995** "--" comment occurs at the end of the statement, the comment
996** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +0000997*/
drh157e29a2009-05-21 15:15:00 +0000998static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000999 struct callback_data *p, /* Query context */
1000 const char *zSelect, /* SELECT statement to extract content */
1001 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001002){
drhdd3d4592004-08-30 01:54:05 +00001003 sqlite3_stmt *pSelect;
1004 int rc;
drhb21a8e42012-01-28 21:08:51 +00001005 int nResult;
1006 int i;
1007 const char *z;
drh2f464a02011-10-13 00:41:49 +00001008 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001009 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001010 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001011 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001012 return rc;
1013 }
1014 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001015 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001016 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001017 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001018 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001019 zFirstRow = 0;
1020 }
drhb21a8e42012-01-28 21:08:51 +00001021 z = (const char*)sqlite3_column_text(pSelect, 0);
1022 fprintf(p->out, "%s", z);
1023 for(i=1; i<nResult; i++){
1024 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1025 }
1026 if( z==0 ) z = "";
1027 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1028 if( z[0] ){
1029 fprintf(p->out, "\n;\n");
1030 }else{
1031 fprintf(p->out, ";\n");
1032 }
drhdd3d4592004-08-30 01:54:05 +00001033 rc = sqlite3_step(pSelect);
1034 }
drh2f464a02011-10-13 00:41:49 +00001035 rc = sqlite3_finalize(pSelect);
1036 if( rc!=SQLITE_OK ){
1037 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001038 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001039 }
1040 return rc;
drhdd3d4592004-08-30 01:54:05 +00001041}
1042
shane626a6e42009-10-22 17:30:15 +00001043/*
1044** Allocate space and save off current error string.
1045*/
1046static char *save_err_msg(
1047 sqlite3 *db /* Database to query */
1048){
1049 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1050 char *zErrMsg = sqlite3_malloc(nErrMsg);
1051 if( zErrMsg ){
1052 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1053 }
1054 return zErrMsg;
1055}
1056
1057/*
shaneh642d8b82010-07-28 16:05:34 +00001058** Display memory stats.
1059*/
1060static int display_stats(
1061 sqlite3 *db, /* Database to query */
1062 struct callback_data *pArg, /* Pointer to struct callback_data */
1063 int bReset /* True to reset the stats */
1064){
1065 int iCur;
1066 int iHiwtr;
1067
1068 if( pArg && pArg->out ){
1069
1070 iHiwtr = iCur = -1;
1071 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001072 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001073 iHiwtr = iCur = -1;
1074 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001075 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001076/*
1077** Not currently used by the CLI.
1078** iHiwtr = iCur = -1;
1079** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1080** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1081*/
1082 iHiwtr = iCur = -1;
1083 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1084 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1085/*
1086** Not currently used by the CLI.
1087** iHiwtr = iCur = -1;
1088** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1089** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1090*/
1091 iHiwtr = iCur = -1;
1092 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1093 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1094 iHiwtr = iCur = -1;
1095 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1096 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1103#ifdef YYTRACKMAXSTACKDEPTH
1104 iHiwtr = iCur = -1;
1105 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1106 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1107#endif
1108 }
1109
1110 if( pArg && pArg->out && db ){
1111 iHiwtr = iCur = -1;
1112 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1113 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001114 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1115 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1116 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1117 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1118 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001120 iHiwtr = iCur = -1;
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001122 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1123 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1124 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1125 iHiwtr = iCur = -1;
1126 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1127 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001128 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1131 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001132 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1133 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1134 iHiwtr = iCur = -1;
1135 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1137 }
1138
1139 if( pArg && pArg->out && db && pArg->pStmt ){
1140 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1141 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1142 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1143 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1144 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1145 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001146 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1147 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001148 }
1149
1150 return 0;
1151}
1152
1153/*
dana98bf362013-11-13 18:35:01 +00001154** Parameter azArray points to a zero-terminated array of strings. zStr
1155** points to a single nul-terminated string. Return non-zero if zStr
1156** is equal, according to strcmp(), to any of the strings in the array.
1157** Otherwise, return zero.
1158*/
1159static int str_in_array(const char *zStr, const char **azArray){
1160 int i;
1161 for(i=0; azArray[i]; i++){
1162 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1163 }
1164 return 0;
1165}
1166
1167/*
1168** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1169** and populate the callback_data.aiIndent[] array with the number of
1170** spaces each opcode should be indented before it is output.
1171**
1172** The indenting rules are:
1173**
1174** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1175** all opcodes that occur between the p2 jump destination and the opcode
1176** itself by 2 spaces.
1177**
drh01752bc2013-11-14 23:59:33 +00001178** * For each "Goto", if the jump destination is earlier in the program
1179** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001180** Yield SeekGt SeekLt RowSetRead Rewind
drh01752bc2013-11-14 23:59:33 +00001181** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001182** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001183*/
1184static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1185 const char *zSql; /* The text of the SQL statement */
1186 const char *z; /* Used to check if this is an EXPLAIN */
1187 int *abYield = 0; /* True if op is an OP_Yield */
1188 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001189 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001190
drh602320e2013-11-15 03:16:34 +00001191 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001192 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001193 const char *azGoto[] = { "Goto", 0 };
1194
1195 /* Try to figure out if this is really an EXPLAIN statement. If this
1196 ** cannot be verified, return early. */
1197 zSql = sqlite3_sql(pSql);
1198 if( zSql==0 ) return;
1199 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1200 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1201
1202 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1203 int i;
danc4650bb2013-11-18 08:41:06 +00001204 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001205 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001206
1207 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1208 ** p2 is an instruction address, set variable p2op to the index of that
1209 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1210 ** the current instruction is part of a sub-program generated by an
1211 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001212 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001213 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001214
1215 /* Grow the p->aiIndent array as required */
1216 if( iOp>=nAlloc ){
1217 nAlloc += 100;
1218 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1219 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1220 }
1221 abYield[iOp] = str_in_array(zOp, azYield);
1222 p->aiIndent[iOp] = 0;
1223 p->nIndent = iOp+1;
1224
1225 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001226 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001227 }
danc4650bb2013-11-18 08:41:06 +00001228 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
drhe73f0592014-01-21 22:25:45 +00001229 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001230 }
1231 }
1232
danc4650bb2013-11-18 08:41:06 +00001233 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001234 sqlite3_free(abYield);
1235 sqlite3_reset(pSql);
1236}
1237
1238/*
1239** Free the array allocated by explain_data_prepare().
1240*/
1241static void explain_data_delete(struct callback_data *p){
1242 sqlite3_free(p->aiIndent);
1243 p->aiIndent = 0;
1244 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001245 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001246}
1247
1248/*
shane626a6e42009-10-22 17:30:15 +00001249** Execute a statement or set of statements. Print
1250** any result rows/columns depending on the current mode
1251** set via the supplied callback.
1252**
1253** This is very similar to SQLite's built-in sqlite3_exec()
1254** function except it takes a slightly different callback
1255** and callback data argument.
1256*/
1257static int shell_exec(
1258 sqlite3 *db, /* An open database */
1259 const char *zSql, /* SQL to be evaluated */
1260 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1261 /* (not the same as sqlite3_exec) */
1262 struct callback_data *pArg, /* Pointer to struct callback_data */
1263 char **pzErrMsg /* Error msg written here */
1264){
dan4564ced2010-01-05 04:59:56 +00001265 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1266 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001267 int rc2;
dan4564ced2010-01-05 04:59:56 +00001268 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001269
1270 if( pzErrMsg ){
1271 *pzErrMsg = NULL;
1272 }
1273
shaneb9fc17d2009-10-22 21:23:35 +00001274 while( zSql[0] && (SQLITE_OK == rc) ){
1275 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1276 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001277 if( pzErrMsg ){
1278 *pzErrMsg = save_err_msg(db);
1279 }
1280 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001281 if( !pStmt ){
1282 /* this happens for a comment or white-space */
1283 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001284 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001285 continue;
1286 }
shane626a6e42009-10-22 17:30:15 +00001287
shaneh642d8b82010-07-28 16:05:34 +00001288 /* save off the prepared statment handle and reset row count */
1289 if( pArg ){
1290 pArg->pStmt = pStmt;
1291 pArg->cnt = 0;
1292 }
1293
shanehb7977c52010-01-18 18:17:10 +00001294 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001295 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001296 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001297 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001298 }
shanehb7977c52010-01-18 18:17:10 +00001299
drh7e02e5e2011-12-06 19:44:51 +00001300 /* Output TESTCTRL_EXPLAIN text of requested */
1301 if( pArg && pArg->mode==MODE_Explain ){
1302 const char *zExplain = 0;
1303 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1304 if( zExplain && zExplain[0] ){
1305 fprintf(pArg->out, "%s", zExplain);
1306 }
1307 }
1308
dana98bf362013-11-13 18:35:01 +00001309 /* If the shell is currently in ".explain" mode, gather the extra
1310 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001311 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001312 explain_data_prepare(pArg, pStmt);
1313 }
1314
shaneb9fc17d2009-10-22 21:23:35 +00001315 /* perform the first step. this will tell us if we
1316 ** have a result set or not and how wide it is.
1317 */
1318 rc = sqlite3_step(pStmt);
1319 /* if we have a result set... */
1320 if( SQLITE_ROW == rc ){
1321 /* if we have a callback... */
1322 if( xCallback ){
1323 /* allocate space for col name ptr, value ptr, and type */
1324 int nCol = sqlite3_column_count(pStmt);
1325 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1326 if( !pData ){
1327 rc = SQLITE_NOMEM;
1328 }else{
1329 char **azCols = (char **)pData; /* Names of result columns */
1330 char **azVals = &azCols[nCol]; /* Results */
1331 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001332 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001333 assert(sizeof(int) <= sizeof(char *));
1334 /* save off ptrs to column names */
1335 for(i=0; i<nCol; i++){
1336 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1337 }
shaneb9fc17d2009-10-22 21:23:35 +00001338 do{
1339 /* extract the data and data types */
1340 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001341 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001342 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001343 azVals[i] = "";
1344 }else{
1345 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1346 }
shaneb9fc17d2009-10-22 21:23:35 +00001347 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1348 rc = SQLITE_NOMEM;
1349 break; /* from for */
1350 }
1351 } /* end for */
1352
1353 /* if data and types extracted successfully... */
1354 if( SQLITE_ROW == rc ){
1355 /* call the supplied callback with the result row data */
1356 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1357 rc = SQLITE_ABORT;
1358 }else{
1359 rc = sqlite3_step(pStmt);
1360 }
1361 }
1362 } while( SQLITE_ROW == rc );
1363 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001364 }
1365 }else{
1366 do{
1367 rc = sqlite3_step(pStmt);
1368 } while( rc == SQLITE_ROW );
1369 }
1370 }
1371
dana98bf362013-11-13 18:35:01 +00001372 explain_data_delete(pArg);
1373
shaneh642d8b82010-07-28 16:05:34 +00001374 /* print usage stats if stats on */
1375 if( pArg && pArg->statsOn ){
1376 display_stats(db, pArg, 0);
1377 }
1378
dan4564ced2010-01-05 04:59:56 +00001379 /* Finalize the statement just executed. If this fails, save a
1380 ** copy of the error message. Otherwise, set zSql to point to the
1381 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001382 rc2 = sqlite3_finalize(pStmt);
1383 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001384 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001385 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001386 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001387 }else if( pzErrMsg ){
1388 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001389 }
shaneh642d8b82010-07-28 16:05:34 +00001390
1391 /* clear saved stmt handle */
1392 if( pArg ){
1393 pArg->pStmt = NULL;
1394 }
shane626a6e42009-10-22 17:30:15 +00001395 }
shaneb9fc17d2009-10-22 21:23:35 +00001396 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001397
1398 return rc;
1399}
1400
drhdd3d4592004-08-30 01:54:05 +00001401
drh33048c02001-10-01 14:29:22 +00001402/*
drh4c653a02000-06-07 01:27:47 +00001403** This is a different callback routine used for dumping the database.
1404** Each row received by this callback consists of a table name,
1405** the table type ("index" or "table") and SQL to create the table.
1406** This routine should print text sufficient to recreate the table.
1407*/
1408static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001409 int rc;
1410 const char *zTable;
1411 const char *zType;
1412 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001413 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001414 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001415
drh902b9ee2008-12-05 17:17:07 +00001416 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001417 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001418 zTable = azArg[0];
1419 zType = azArg[1];
1420 zSql = azArg[2];
1421
drh00b950d2005-09-11 02:03:03 +00001422 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001423 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001424 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001425 fprintf(p->out, "ANALYZE sqlite_master;\n");
1426 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1427 return 0;
drh45e29d82006-11-20 16:21:10 +00001428 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1429 char *zIns;
1430 if( !p->writableSchema ){
1431 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1432 p->writableSchema = 1;
1433 }
1434 zIns = sqlite3_mprintf(
1435 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1436 "VALUES('table','%q','%q',0,'%q');",
1437 zTable, zTable, zSql);
1438 fprintf(p->out, "%s\n", zIns);
1439 sqlite3_free(zIns);
1440 return 0;
drh00b950d2005-09-11 02:03:03 +00001441 }else{
1442 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001443 }
danielk19772a02e332004-06-05 08:04:36 +00001444
1445 if( strcmp(zType, "table")==0 ){
1446 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001447 char *zSelect = 0;
1448 char *zTableInfo = 0;
1449 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001450 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001451
1452 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1453 zTableInfo = appendText(zTableInfo, zTable, '"');
1454 zTableInfo = appendText(zTableInfo, ");", 0);
1455
1456 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001457 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001458 if( rc!=SQLITE_OK || !pTableInfo ){
1459 return 1;
1460 }
1461
1462 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001463 /* Always quote the table name, even if it appears to be pure ascii,
1464 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1465 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001466 if( zTmp ){
1467 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001468 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001469 }
1470 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1471 rc = sqlite3_step(pTableInfo);
1472 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001473 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001474 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001475 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001476 rc = sqlite3_step(pTableInfo);
1477 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001478 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001479 }else{
1480 zSelect = appendText(zSelect, ") ", 0);
1481 }
drh157e29a2009-05-21 15:15:00 +00001482 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001483 }
1484 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001485 if( rc!=SQLITE_OK || nRow==0 ){
1486 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001487 return 1;
1488 }
1489 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1490 zSelect = appendText(zSelect, zTable, '"');
1491
drh2f464a02011-10-13 00:41:49 +00001492 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001493 if( rc==SQLITE_CORRUPT ){
1494 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001495 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001496 }
drh85e72432012-04-11 11:38:53 +00001497 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001498 }
drh4c653a02000-06-07 01:27:47 +00001499 return 0;
1500}
1501
1502/*
drh45e29d82006-11-20 16:21:10 +00001503** Run zQuery. Use dump_callback() as the callback routine so that
1504** the contents of the query are output as SQL statements.
1505**
drhdd3d4592004-08-30 01:54:05 +00001506** If we get a SQLITE_CORRUPT error, rerun the query after appending
1507** "ORDER BY rowid DESC" to the end.
1508*/
1509static int run_schema_dump_query(
1510 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001511 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001512){
1513 int rc;
drh2f464a02011-10-13 00:41:49 +00001514 char *zErr = 0;
1515 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001516 if( rc==SQLITE_CORRUPT ){
1517 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001518 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001519 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1520 if( zErr ){
1521 fprintf(p->out, "/****** %s ******/\n", zErr);
1522 sqlite3_free(zErr);
1523 zErr = 0;
1524 }
drhdd3d4592004-08-30 01:54:05 +00001525 zQ2 = malloc( len+100 );
1526 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001527 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001528 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1529 if( rc ){
1530 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1531 }else{
1532 rc = SQLITE_CORRUPT;
1533 }
1534 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001535 free(zQ2);
1536 }
1537 return rc;
1538}
1539
1540/*
drh75897232000-05-29 14:26:00 +00001541** Text of a help message
1542*/
persicom1d0b8722002-04-18 02:53:04 +00001543static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001544 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001545 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001546 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001547 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001548 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001549 " If TABLE specified, only dump tables matching\n"
1550 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001551 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001552 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001553 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1554 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001555 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001556 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001557 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001558 ".indices ?TABLE? Show names of all indices\n"
1559 " If TABLE specified, only show indices for tables\n"
1560 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001561#ifdef SQLITE_ENABLE_IOTRACE
1562 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1563#endif
drh70df4fe2006-06-13 15:12:21 +00001564#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001565 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001566#endif
drh127f9d72010-02-23 01:47:00 +00001567 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001568 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001569 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001570 " column Left-aligned columns. (See .width)\n"
1571 " html HTML <table> code\n"
1572 " insert SQL insert statements for TABLE\n"
1573 " line One value per line\n"
1574 " list Values delimited by .separator string\n"
1575 " tabs Tab-separated values\n"
1576 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001577 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001578 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001579 ".output FILENAME Send output to FILENAME\n"
1580 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001581 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001582 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001583 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001584 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001585 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001586 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001587 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001588 " If TABLE specified, only show tables matching\n"
1589 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001590 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001591 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001592 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001593 ".tables ?TABLE? List names of tables\n"
1594 " If TABLE specified, only list tables matching\n"
1595 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001596 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001597 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001598 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001599 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001600;
1601
shaneb320ccd2009-10-21 03:42:58 +00001602static char zTimerHelp[] =
1603 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1604;
1605
drhdaffd0e2001-04-11 14:28:42 +00001606/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001607static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001608
drh75897232000-05-29 14:26:00 +00001609/*
drh44c2eb12003-04-30 11:38:26 +00001610** Make sure the database is open. If it is not, then open it. If
1611** the database fails to open, print an error message and exit.
1612*/
drh05782482013-10-24 15:20:20 +00001613static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001614 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001615 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001616 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001617 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001618 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1619 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1620 shellstaticFunc, 0, 0);
1621 }
1622 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001623 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001624 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001625 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001626 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001627 }
drhc2e87a32006-06-27 15:16:14 +00001628#ifndef SQLITE_OMIT_LOAD_EXTENSION
1629 sqlite3_enable_load_extension(p->db, 1);
1630#endif
drh44c2eb12003-04-30 11:38:26 +00001631 }
1632}
1633
1634/*
drhfeac5f82004-08-01 00:10:45 +00001635** Do C-language style dequoting.
1636**
1637** \t -> tab
1638** \n -> newline
1639** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001640** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001641** \NNN -> ascii character NNN in octal
1642** \\ -> backslash
1643*/
1644static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001645 int i, j;
1646 char c;
drhfeac5f82004-08-01 00:10:45 +00001647 for(i=j=0; (c = z[i])!=0; i++, j++){
1648 if( c=='\\' ){
1649 c = z[++i];
1650 if( c=='n' ){
1651 c = '\n';
1652 }else if( c=='t' ){
1653 c = '\t';
1654 }else if( c=='r' ){
1655 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001656 }else if( c=='\\' ){
1657 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001658 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001659 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001660 if( z[i+1]>='0' && z[i+1]<='7' ){
1661 i++;
1662 c = (c<<3) + z[i] - '0';
1663 if( z[i+1]>='0' && z[i+1]<='7' ){
1664 i++;
1665 c = (c<<3) + z[i] - '0';
1666 }
1667 }
1668 }
1669 }
1670 z[j] = c;
1671 }
1672 z[j] = 0;
1673}
1674
1675/*
drh348d19c2013-06-03 12:47:43 +00001676** Return the value of a hexadecimal digit. Return -1 if the input
1677** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001678*/
drh348d19c2013-06-03 12:47:43 +00001679static int hexDigitValue(char c){
1680 if( c>='0' && c<='9' ) return c - '0';
1681 if( c>='a' && c<='f' ) return c - 'a' + 10;
1682 if( c>='A' && c<='F' ) return c - 'A' + 10;
1683 return -1;
drhc28490c2006-10-26 14:25:58 +00001684}
1685
1686/*
drh7d9f3942013-04-03 01:26:54 +00001687** Interpret zArg as an integer value, possibly with suffixes.
1688*/
1689static sqlite3_int64 integerValue(const char *zArg){
1690 sqlite3_int64 v = 0;
1691 static const struct { char *zSuffix; int iMult; } aMult[] = {
1692 { "KiB", 1024 },
1693 { "MiB", 1024*1024 },
1694 { "GiB", 1024*1024*1024 },
1695 { "KB", 1000 },
1696 { "MB", 1000000 },
1697 { "GB", 1000000000 },
1698 { "K", 1000 },
1699 { "M", 1000000 },
1700 { "G", 1000000000 },
1701 };
1702 int i;
1703 int isNeg = 0;
1704 if( zArg[0]=='-' ){
1705 isNeg = 1;
1706 zArg++;
1707 }else if( zArg[0]=='+' ){
1708 zArg++;
1709 }
drh348d19c2013-06-03 12:47:43 +00001710 if( zArg[0]=='0' && zArg[1]=='x' ){
1711 int x;
1712 zArg += 2;
1713 while( (x = hexDigitValue(zArg[0]))>=0 ){
1714 v = (v<<4) + x;
1715 zArg++;
1716 }
1717 }else{
1718 while( IsDigit(zArg[0]) ){
1719 v = v*10 + zArg[0] - '0';
1720 zArg++;
1721 }
drh7d9f3942013-04-03 01:26:54 +00001722 }
drhc2bed0a2013-05-24 11:57:50 +00001723 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001724 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1725 v *= aMult[i].iMult;
1726 break;
1727 }
1728 }
1729 return isNeg? -v : v;
1730}
1731
1732/*
drh348d19c2013-06-03 12:47:43 +00001733** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1734** for TRUE and FALSE. Return the integer value if appropriate.
1735*/
1736static int booleanValue(char *zArg){
1737 int i;
1738 if( zArg[0]=='0' && zArg[1]=='x' ){
1739 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1740 }else{
1741 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1742 }
1743 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1744 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1745 return 1;
1746 }
1747 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1748 return 0;
1749 }
1750 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1751 zArg);
1752 return 0;
1753}
1754
1755/*
drh42f64e52012-04-04 16:56:23 +00001756** Close an output file, assuming it is not stderr or stdout
1757*/
1758static void output_file_close(FILE *f){
1759 if( f && f!=stdout && f!=stderr ) fclose(f);
1760}
1761
1762/*
1763** Try to open an output file. The names "stdout" and "stderr" are
1764** recognized and do the right thing. NULL is returned if the output
1765** filename is "off".
1766*/
1767static FILE *output_file_open(const char *zFile){
1768 FILE *f;
1769 if( strcmp(zFile,"stdout")==0 ){
1770 f = stdout;
1771 }else if( strcmp(zFile, "stderr")==0 ){
1772 f = stderr;
1773 }else if( strcmp(zFile, "off")==0 ){
1774 f = 0;
1775 }else{
1776 f = fopen(zFile, "wb");
1777 if( f==0 ){
1778 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1779 }
1780 }
1781 return f;
1782}
1783
1784/*
1785** A routine for handling output from sqlite3_trace().
1786*/
1787static void sql_trace_callback(void *pArg, const char *z){
1788 FILE *f = (FILE*)pArg;
1789 if( f ) fprintf(f, "%s\n", z);
1790}
1791
1792/*
drhd8621b92012-04-17 09:09:33 +00001793** A no-op routine that runs with the ".breakpoint" doc-command. This is
1794** a useful spot to set a debugger breakpoint.
1795*/
1796static void test_breakpoint(void){
1797 static int nCall = 0;
1798 nCall++;
1799}
1800
1801/*
drhdb95f682013-06-26 22:46:00 +00001802** An object used to read a CSV file
1803*/
1804typedef struct CSVReader CSVReader;
1805struct CSVReader {
1806 const char *zFile; /* Name of the input file */
1807 FILE *in; /* Read the CSV text from this input stream */
1808 char *z; /* Accumulated text for a field */
1809 int n; /* Number of bytes in z */
1810 int nAlloc; /* Space allocated for z[] */
1811 int nLine; /* Current line number */
1812 int cTerm; /* Character that terminated the most recent field */
1813 int cSeparator; /* The separator character. (Usually ",") */
1814};
1815
1816/* Append a single byte to z[] */
1817static void csv_append_char(CSVReader *p, int c){
1818 if( p->n+1>=p->nAlloc ){
1819 p->nAlloc += p->nAlloc + 100;
1820 p->z = sqlite3_realloc(p->z, p->nAlloc);
1821 if( p->z==0 ){
1822 fprintf(stderr, "out of memory\n");
1823 exit(1);
1824 }
1825 }
1826 p->z[p->n++] = (char)c;
1827}
1828
1829/* Read a single field of CSV text. Compatible with rfc4180 and extended
1830** with the option of having a separator other than ",".
1831**
1832** + Input comes from p->in.
1833** + Store results in p->z of length p->n. Space to hold p->z comes
1834** from sqlite3_malloc().
1835** + Use p->cSep as the separator. The default is ",".
1836** + Keep track of the line number in p->nLine.
1837** + Store the character that terminates the field in p->cTerm. Store
1838** EOF on end-of-file.
1839** + Report syntax errors on stderr
1840*/
1841static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001842 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001843 int cSep = p->cSeparator;
1844 p->n = 0;
1845 c = fgetc(p->in);
1846 if( c==EOF || seenInterrupt ){
1847 p->cTerm = EOF;
1848 return 0;
1849 }
1850 if( c=='"' ){
1851 int startLine = p->nLine;
1852 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001853 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001854 while( 1 ){
1855 c = fgetc(p->in);
1856 if( c=='\n' ) p->nLine++;
1857 if( c==cQuote ){
1858 if( pc==cQuote ){
1859 pc = 0;
1860 continue;
1861 }
1862 }
1863 if( (c==cSep && pc==cQuote)
1864 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001865 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001866 || (c==EOF && pc==cQuote)
1867 ){
1868 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001869 p->cTerm = c;
1870 break;
1871 }
1872 if( pc==cQuote && c!='\r' ){
1873 fprintf(stderr, "%s:%d: unescaped %c character\n",
1874 p->zFile, p->nLine, cQuote);
1875 }
1876 if( c==EOF ){
1877 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1878 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001879 p->cTerm = EOF;
1880 break;
1881 }
1882 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001883 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001884 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001885 }
drhdb95f682013-06-26 22:46:00 +00001886 }else{
drhd0a64dc2013-06-30 20:24:26 +00001887 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001888 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001889 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001890 }
1891 if( c=='\n' ){
1892 p->nLine++;
1893 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1894 }
drhdb95f682013-06-26 22:46:00 +00001895 p->cTerm = c;
1896 }
drh8dd675e2013-07-12 21:09:24 +00001897 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001898 return p->z;
1899}
1900
1901/*
drh4bbcf102014-02-06 02:46:08 +00001902** Try to transfer data for table zTable. If an error is seen while
1903** moving forward, try to go backwards. The backwards movement won't
1904** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001905*/
mistachkine31ae902014-02-06 01:15:29 +00001906static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001907 struct callback_data *p,
1908 sqlite3 *newDb,
1909 const char *zTable
1910){
1911 sqlite3_stmt *pQuery = 0;
1912 sqlite3_stmt *pInsert = 0;
1913 char *zQuery = 0;
1914 char *zInsert = 0;
1915 int rc;
1916 int i, j, n;
1917 int nTable = (int)strlen(zTable);
1918 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001919 int cnt = 0;
1920 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001921
1922 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1923 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1924 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001925 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001926 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1927 zQuery);
1928 goto end_data_xfer;
1929 }
1930 n = sqlite3_column_count(pQuery);
1931 zInsert = sqlite3_malloc(200 + nTable + n*3);
1932 if( zInsert==0 ){
1933 fprintf(stderr, "out of memory\n");
1934 goto end_data_xfer;
1935 }
1936 sqlite3_snprintf(200+nTable,zInsert,
1937 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1938 i = (int)strlen(zInsert);
1939 for(j=1; j<n; j++){
1940 memcpy(zInsert+i, ",?", 2);
1941 i += 2;
1942 }
1943 memcpy(zInsert+i, ");", 3);
1944 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1945 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001946 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001947 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1948 zQuery);
1949 goto end_data_xfer;
1950 }
1951 for(k=0; k<2; k++){
1952 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1953 for(i=0; i<n; i++){
1954 switch( sqlite3_column_type(pQuery, i) ){
1955 case SQLITE_NULL: {
1956 sqlite3_bind_null(pInsert, i+1);
1957 break;
1958 }
1959 case SQLITE_INTEGER: {
1960 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1961 break;
1962 }
1963 case SQLITE_FLOAT: {
1964 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1965 break;
1966 }
1967 case SQLITE_TEXT: {
1968 sqlite3_bind_text(pInsert, i+1,
1969 (const char*)sqlite3_column_text(pQuery,i),
1970 -1, SQLITE_STATIC);
1971 break;
1972 }
1973 case SQLITE_BLOB: {
1974 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1975 sqlite3_column_bytes(pQuery,i),
1976 SQLITE_STATIC);
1977 break;
1978 }
1979 }
1980 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00001981 rc = sqlite3_step(pInsert);
1982 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
1983 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
1984 sqlite3_errmsg(newDb));
1985 }
drh3350ce92014-02-06 00:49:12 +00001986 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00001987 cnt++;
1988 if( (cnt%spinRate)==0 ){
1989 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
1990 fflush(stdout);
1991 }
drh3350ce92014-02-06 00:49:12 +00001992 } /* End while */
1993 if( rc==SQLITE_DONE ) break;
1994 sqlite3_finalize(pQuery);
1995 sqlite3_free(zQuery);
1996 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
1997 zTable);
1998 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1999 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002000 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2001 break;
drh3350ce92014-02-06 00:49:12 +00002002 }
2003 } /* End for(k=0...) */
2004
2005end_data_xfer:
2006 sqlite3_finalize(pQuery);
2007 sqlite3_finalize(pInsert);
2008 sqlite3_free(zQuery);
2009 sqlite3_free(zInsert);
2010}
2011
2012
2013/*
2014** Try to transfer all rows of the schema that match zWhere. For
2015** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002016** If an error is encountered while moving forward through the
2017** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002018*/
mistachkine31ae902014-02-06 01:15:29 +00002019static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002020 struct callback_data *p,
2021 sqlite3 *newDb,
2022 const char *zWhere,
2023 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2024){
2025 sqlite3_stmt *pQuery = 0;
2026 char *zQuery = 0;
2027 int rc;
2028 const unsigned char *zName;
2029 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002030 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002031
2032 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2033 " WHERE %s", zWhere);
2034 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2035 if( rc ){
2036 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2037 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2038 zQuery);
2039 goto end_schema_xfer;
2040 }
2041 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2042 zName = sqlite3_column_text(pQuery, 0);
2043 zSql = sqlite3_column_text(pQuery, 1);
2044 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002045 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2046 if( zErrMsg ){
2047 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2048 sqlite3_free(zErrMsg);
2049 zErrMsg = 0;
2050 }
drh3350ce92014-02-06 00:49:12 +00002051 if( xForEach ){
2052 xForEach(p, newDb, (const char*)zName);
2053 }
2054 printf("done\n");
2055 }
2056 if( rc!=SQLITE_DONE ){
2057 sqlite3_finalize(pQuery);
2058 sqlite3_free(zQuery);
2059 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2060 " WHERE %s ORDER BY rowid DESC", zWhere);
2061 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2062 if( rc ){
2063 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2064 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2065 zQuery);
2066 goto end_schema_xfer;
2067 }
2068 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2069 zName = sqlite3_column_text(pQuery, 0);
2070 zSql = sqlite3_column_text(pQuery, 1);
2071 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002072 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2073 if( zErrMsg ){
2074 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2075 sqlite3_free(zErrMsg);
2076 zErrMsg = 0;
2077 }
drh3350ce92014-02-06 00:49:12 +00002078 if( xForEach ){
2079 xForEach(p, newDb, (const char*)zName);
2080 }
2081 printf("done\n");
2082 }
2083 }
2084end_schema_xfer:
2085 sqlite3_finalize(pQuery);
2086 sqlite3_free(zQuery);
2087}
2088
2089/*
2090** Open a new database file named "zNewDb". Try to recover as much information
2091** as possible out of the main database (which might be corrupt) and write it
2092** into zNewDb.
2093*/
mistachkine31ae902014-02-06 01:15:29 +00002094static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002095 int rc;
2096 sqlite3 *newDb = 0;
2097 if( access(zNewDb,0)==0 ){
2098 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2099 return;
2100 }
2101 rc = sqlite3_open(zNewDb, &newDb);
2102 if( rc ){
2103 fprintf(stderr, "Cannot create output database: %s\n",
2104 sqlite3_errmsg(newDb));
2105 }else{
2106 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002107 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2108 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002109 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2110 }
2111 sqlite3_close(newDb);
2112}
2113
2114/*
drh75897232000-05-29 14:26:00 +00002115** If an input line begins with "." then invoke this routine to
2116** process that line.
drh67505e72002-04-19 12:34:06 +00002117**
drh47ad6842006-11-08 12:25:42 +00002118** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002119*/
drh44c2eb12003-04-30 11:38:26 +00002120static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002121 int i = 1;
2122 int nArg = 0;
2123 int n, c;
drh67505e72002-04-19 12:34:06 +00002124 int rc = 0;
drh75897232000-05-29 14:26:00 +00002125 char *azArg[50];
2126
2127 /* Parse the input line into tokens.
2128 */
2129 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002130 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002131 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002132 if( zLine[i]=='\'' || zLine[i]=='"' ){
2133 int delim = zLine[i++];
2134 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002135 while( zLine[i] && zLine[i]!=delim ){
2136 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2137 i++;
2138 }
drh75897232000-05-29 14:26:00 +00002139 if( zLine[i]==delim ){
2140 zLine[i++] = 0;
2141 }
drhfeac5f82004-08-01 00:10:45 +00002142 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002143 }else{
2144 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002145 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002146 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002147 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002148 }
2149 }
2150
2151 /* Process the input line.
2152 */
shane9bd1b442009-10-23 01:27:39 +00002153 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002154 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002155 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002156 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2157 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2158 ){
drhbc46f022013-01-23 18:53:23 +00002159 const char *zDestFile = 0;
2160 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002161 sqlite3 *pDest;
2162 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002163 int j;
2164 for(j=1; j<nArg; j++){
2165 const char *z = azArg[j];
2166 if( z[0]=='-' ){
2167 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002168 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002169 {
2170 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2171 return 1;
2172 }
2173 }else if( zDestFile==0 ){
2174 zDestFile = azArg[j];
2175 }else if( zDb==0 ){
2176 zDb = zDestFile;
2177 zDestFile = azArg[j];
2178 }else{
2179 fprintf(stderr, "too many arguments to .backup\n");
2180 return 1;
2181 }
drh9ff849f2009-02-04 20:55:57 +00002182 }
drhbc46f022013-01-23 18:53:23 +00002183 if( zDestFile==0 ){
2184 fprintf(stderr, "missing FILENAME argument on .backup\n");
2185 return 1;
2186 }
2187 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002188 rc = sqlite3_open(zDestFile, &pDest);
2189 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002190 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002191 sqlite3_close(pDest);
2192 return 1;
2193 }
drh05782482013-10-24 15:20:20 +00002194 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002195 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2196 if( pBackup==0 ){
2197 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2198 sqlite3_close(pDest);
2199 return 1;
2200 }
2201 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2202 sqlite3_backup_finish(pBackup);
2203 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002204 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002205 }else{
2206 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002207 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002208 }
2209 sqlite3_close(pDest);
2210 }else
2211
shanehe2aa9d72009-11-06 17:20:17 +00002212 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002213 bail_on_error = booleanValue(azArg[1]);
2214 }else
2215
drhd8621b92012-04-17 09:09:33 +00002216 /* The undocumented ".breakpoint" command causes a call to the no-op
2217 ** routine named test_breakpoint().
2218 */
2219 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2220 test_breakpoint();
2221 }else
2222
mistachkine31ae902014-02-06 01:15:29 +00002223 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2224 tryToClone(p, azArg[1]);
2225 }else
2226
shanehe2aa9d72009-11-06 17:20:17 +00002227 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002228 struct callback_data data;
2229 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002230 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002231 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002232 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002233 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002234 data.colWidth[0] = 3;
2235 data.colWidth[1] = 15;
2236 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002237 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002238 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002239 if( zErrMsg ){
2240 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002241 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002242 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002243 }
2244 }else
2245
shanehe2aa9d72009-11-06 17:20:17 +00002246 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002247 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002248 /* When playing back a "dump", the content might appear in an order
2249 ** which causes immediate foreign key constraints to be violated.
2250 ** So disable foreign-key constraint enforcement to prevent problems. */
2251 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002252 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002253 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002254 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002255 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002256 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002257 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002258 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002259 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002260 );
2261 run_schema_dump_query(p,
2262 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002263 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002264 );
drh2f464a02011-10-13 00:41:49 +00002265 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002266 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002267 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002268 );
drh4c653a02000-06-07 01:27:47 +00002269 }else{
2270 int i;
drhdd3d4592004-08-30 01:54:05 +00002271 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002272 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002273 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002274 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002275 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002276 " AND sql NOT NULL");
2277 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002278 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002279 "WHERE sql NOT NULL"
2280 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002281 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002282 );
danielk1977bc6ada42004-06-30 08:20:16 +00002283 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002284 }
2285 }
drh45e29d82006-11-20 16:21:10 +00002286 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002287 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002288 p->writableSchema = 0;
2289 }
drh56197952011-10-13 16:30:13 +00002290 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2291 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002292 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002293 }else
drh75897232000-05-29 14:26:00 +00002294
shanehe2aa9d72009-11-06 17:20:17 +00002295 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002296 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002297 }else
2298
drhd3ac7d92013-01-25 18:33:43 +00002299 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002300 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002301 rc = 2;
drh75897232000-05-29 14:26:00 +00002302 }else
2303
shanehe2aa9d72009-11-06 17:20:17 +00002304 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002305 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002306 if(val == 1) {
2307 if(!p->explainPrev.valid) {
2308 p->explainPrev.valid = 1;
2309 p->explainPrev.mode = p->mode;
2310 p->explainPrev.showHeader = p->showHeader;
2311 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2312 }
2313 /* We could put this code under the !p->explainValid
2314 ** condition so that it does not execute if we are already in
2315 ** explain mode. However, always executing it allows us an easy
2316 ** was to reset to explain mode in case the user previously
2317 ** did an .explain followed by a .width, .mode or .header
2318 ** command.
2319 */
danielk19770d78bae2008-01-03 07:09:48 +00002320 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002321 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002322 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002323 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002324 p->colWidth[1] = 13; /* opcode */
2325 p->colWidth[2] = 4; /* P1 */
2326 p->colWidth[3] = 4; /* P2 */
2327 p->colWidth[4] = 4; /* P3 */
2328 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002329 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002330 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002331 }else if (p->explainPrev.valid) {
2332 p->explainPrev.valid = 0;
2333 p->mode = p->explainPrev.mode;
2334 p->showHeader = p->explainPrev.showHeader;
2335 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2336 }
drh75897232000-05-29 14:26:00 +00002337 }else
2338
drhc28490c2006-10-26 14:25:58 +00002339 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002340 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002341 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002342 }else
2343
2344 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002345 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002346 if( HAS_TIMER ){
2347 fprintf(stderr,"%s",zTimerHelp);
2348 }
drh75897232000-05-29 14:26:00 +00002349 }else
2350
shanehe2aa9d72009-11-06 17:20:17 +00002351 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002352 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002353 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002354 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002355 int nCol; /* Number of columns in the table */
2356 int nByte; /* Number of bytes in an SQL string */
2357 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002358 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002359 int nSep; /* Number of bytes in p->separator[] */
2360 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002361 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002362 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002363
drhdb95f682013-06-26 22:46:00 +00002364 seenInterrupt = 0;
2365 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002366 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002367 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002368 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002369 fprintf(stderr, "Error: non-null separator required for import\n");
2370 return 1;
drhfeac5f82004-08-01 00:10:45 +00002371 }
drhdb95f682013-06-26 22:46:00 +00002372 if( nSep>1 ){
2373 fprintf(stderr, "Error: multi-character separators not allowed"
2374 " for import\n");
2375 return 1;
2376 }
drh5bde8162013-06-27 14:07:53 +00002377 sCsv.zFile = zFile;
2378 sCsv.nLine = 1;
2379 if( sCsv.zFile[0]=='|' ){
2380 sCsv.in = popen(sCsv.zFile+1, "r");
2381 sCsv.zFile = "<pipe>";
2382 xCloser = pclose;
2383 }else{
2384 sCsv.in = fopen(sCsv.zFile, "rb");
2385 xCloser = fclose;
2386 }
drhdb95f682013-06-26 22:46:00 +00002387 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002388 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002389 return 1;
2390 }
2391 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002392 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002393 if( zSql==0 ){
2394 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002395 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002396 return 1;
2397 }
drh4f21c4a2008-12-10 22:15:00 +00002398 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002399 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002400 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2401 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2402 char cSep = '(';
2403 while( csv_read_one_field(&sCsv) ){
2404 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2405 cSep = ',';
2406 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2407 }
drh5bde8162013-06-27 14:07:53 +00002408 if( cSep=='(' ){
2409 sqlite3_free(zCreate);
2410 sqlite3_free(sCsv.z);
2411 xCloser(sCsv.in);
2412 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2413 return 1;
2414 }
drhdb95f682013-06-26 22:46:00 +00002415 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2416 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2417 sqlite3_free(zCreate);
2418 if( rc ){
2419 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2420 sqlite3_errmsg(db));
2421 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002422 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002423 return 1;
2424 }
2425 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2426 }
drhfeac5f82004-08-01 00:10:45 +00002427 sqlite3_free(zSql);
2428 if( rc ){
shane916f9612009-10-23 00:37:15 +00002429 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002430 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002431 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002432 return 1;
drhfeac5f82004-08-01 00:10:45 +00002433 }
shane916f9612009-10-23 00:37:15 +00002434 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002435 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002436 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002437 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002438 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002439 if( zSql==0 ){
2440 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002441 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002442 return 1;
2443 }
drhdb95f682013-06-26 22:46:00 +00002444 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002445 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002446 for(i=1; i<nCol; i++){
2447 zSql[j++] = ',';
2448 zSql[j++] = '?';
2449 }
2450 zSql[j++] = ')';
2451 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002452 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002453 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002454 if( rc ){
2455 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002456 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002457 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002458 return 1;
drhfeac5f82004-08-01 00:10:45 +00002459 }
drh2d463112013-08-06 14:36:36 +00002460 needCommit = sqlite3_get_autocommit(db);
2461 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002462 do{
2463 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002464 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002465 char *z = csv_read_one_field(&sCsv);
2466 if( z==0 && i==0 ) break;
2467 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2468 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2469 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2470 "filling the rest with NULL\n",
2471 sCsv.zFile, startLine, nCol, i+1);
2472 i++;
2473 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002474 }
drhfeac5f82004-08-01 00:10:45 +00002475 }
drhdb95f682013-06-26 22:46:00 +00002476 if( sCsv.cTerm==sCsv.cSeparator ){
2477 do{
2478 csv_read_one_field(&sCsv);
2479 i++;
2480 }while( sCsv.cTerm==sCsv.cSeparator );
2481 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2482 "extras ignored\n",
2483 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002484 }
drhdb95f682013-06-26 22:46:00 +00002485 if( i>=nCol ){
2486 sqlite3_step(pStmt);
2487 rc = sqlite3_reset(pStmt);
2488 if( rc!=SQLITE_OK ){
2489 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2490 sqlite3_errmsg(db));
2491 }
2492 }
2493 }while( sCsv.cTerm!=EOF );
2494
drh5bde8162013-06-27 14:07:53 +00002495 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002496 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002497 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002498 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002499 }else
2500
shanehe2aa9d72009-11-06 17:20:17 +00002501 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002502 struct callback_data data;
2503 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002504 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002505 memcpy(&data, p, sizeof(data));
2506 data.showHeader = 0;
2507 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002508 if( nArg==1 ){
2509 rc = sqlite3_exec(p->db,
2510 "SELECT name FROM sqlite_master "
2511 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2512 "UNION ALL "
2513 "SELECT name FROM sqlite_temp_master "
2514 "WHERE type='index' "
2515 "ORDER BY 1",
2516 callback, &data, &zErrMsg
2517 );
2518 }else{
2519 zShellStatic = azArg[1];
2520 rc = sqlite3_exec(p->db,
2521 "SELECT name FROM sqlite_master "
2522 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2523 "UNION ALL "
2524 "SELECT name FROM sqlite_temp_master "
2525 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2526 "ORDER BY 1",
2527 callback, &data, &zErrMsg
2528 );
2529 zShellStatic = 0;
2530 }
drh75897232000-05-29 14:26:00 +00002531 if( zErrMsg ){
2532 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002533 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002534 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002535 }else if( rc != SQLITE_OK ){
2536 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2537 rc = 1;
drh75897232000-05-29 14:26:00 +00002538 }
2539 }else
2540
drhae5e4452007-05-03 17:18:36 +00002541#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002542 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002543 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002544 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2545 iotrace = 0;
2546 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002547 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002548 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002549 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002550 iotrace = stdout;
2551 }else{
2552 iotrace = fopen(azArg[1], "w");
2553 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002554 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002555 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002556 rc = 1;
drhb0603412007-02-28 04:47:26 +00002557 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002558 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002559 }
2560 }
2561 }else
drhae5e4452007-05-03 17:18:36 +00002562#endif
drhb0603412007-02-28 04:47:26 +00002563
drh70df4fe2006-06-13 15:12:21 +00002564#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002565 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2566 const char *zFile, *zProc;
2567 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002568 zFile = azArg[1];
2569 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002570 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002571 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2572 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002573 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002574 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002575 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002576 }
2577 }else
drh70df4fe2006-06-13 15:12:21 +00002578#endif
drh1e397f82006-06-08 15:28:43 +00002579
drhc8ba2122011-03-23 11:16:22 +00002580 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002581 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002582 output_file_close(p->pLog);
2583 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002584 }else
2585
shanehe2aa9d72009-11-06 17:20:17 +00002586 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002587 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002588 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002589 ||
shanehe2aa9d72009-11-06 17:20:17 +00002590 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002591 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002592 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002593 ||
shanehe2aa9d72009-11-06 17:20:17 +00002594 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002595 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002596 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002597 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002598 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002599 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002600 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002601 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002602 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002603 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002604 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002605 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002606 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002607 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002608 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002609 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002610 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002611 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002612 }else {
shane9bd1b442009-10-23 01:27:39 +00002613 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002614 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002615 rc = 1;
drh75897232000-05-29 14:26:00 +00002616 }
2617 }else
2618
shanehe2aa9d72009-11-06 17:20:17 +00002619 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2620 int n2 = strlen30(azArg[1]);
2621 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2622 p->mode = MODE_Insert;
2623 set_table_name(p, azArg[2]);
2624 }else {
2625 fprintf(stderr, "Error: invalid arguments: "
2626 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2627 rc = 1;
2628 }
2629 }else
2630
persicom7e2dfdd2002-04-18 02:46:52 +00002631 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002632 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2633 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002634 }else
2635
drh05782482013-10-24 15:20:20 +00002636 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2637 sqlite3 *savedDb = p->db;
2638 const char *zSavedFilename = p->zDbFilename;
2639 char *zNewFilename = 0;
2640 p->db = 0;
2641 if( nArg>=2 ){
2642 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2643 }
2644 open_db(p, 1);
2645 if( p->db!=0 ){
2646 sqlite3_close(savedDb);
2647 sqlite3_free(p->zFreeOnClose);
2648 p->zFreeOnClose = zNewFilename;
2649 }else{
2650 sqlite3_free(zNewFilename);
2651 p->db = savedDb;
2652 p->zDbFilename = zSavedFilename;
2653 }
2654 }else
2655
drh75897232000-05-29 14:26:00 +00002656 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002657 if( p->outfile[0]=='|' ){
2658 pclose(p->out);
2659 }else{
2660 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002661 }
drh42f64e52012-04-04 16:56:23 +00002662 p->outfile[0] = 0;
2663 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002664 p->out = popen(&azArg[1][1], "w");
2665 if( p->out==0 ){
2666 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2667 p->out = stdout;
2668 rc = 1;
2669 }else{
2670 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2671 }
drh75897232000-05-29 14:26:00 +00002672 }else{
drh42f64e52012-04-04 16:56:23 +00002673 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002674 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002675 if( strcmp(azArg[1],"off")!=0 ){
2676 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2677 }
drh75897232000-05-29 14:26:00 +00002678 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002679 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002680 } else {
drh42f64e52012-04-04 16:56:23 +00002681 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002682 }
2683 }
2684 }else
2685
drh078b1fd2012-09-21 13:40:02 +00002686 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2687 int i;
2688 for(i=1; i<nArg; i++){
2689 if( i>1 ) fprintf(p->out, " ");
2690 fprintf(p->out, "%s", azArg[i]);
2691 }
2692 fprintf(p->out, "\n");
2693 }else
2694
drhdd45df82002-04-18 12:39:03 +00002695 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002696 if( nArg >= 2) {
2697 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2698 }
2699 if( nArg >= 3) {
2700 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2701 }
2702 }else
2703
shanehe2aa9d72009-11-06 17:20:17 +00002704 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002705 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002706 }else
2707
drh9ff849f2009-02-04 20:55:57 +00002708 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002709 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002710 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002711 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2712 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002713 }else{
shane9bd1b442009-10-23 01:27:39 +00002714 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002715 fclose(alt);
2716 }
2717 }else
2718
shanehe2aa9d72009-11-06 17:20:17 +00002719 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002720 const char *zSrcFile;
2721 const char *zDb;
2722 sqlite3 *pSrc;
2723 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002724 int nTimeout = 0;
2725
drh9ff849f2009-02-04 20:55:57 +00002726 if( nArg==2 ){
2727 zSrcFile = azArg[1];
2728 zDb = "main";
2729 }else{
2730 zSrcFile = azArg[2];
2731 zDb = azArg[1];
2732 }
2733 rc = sqlite3_open(zSrcFile, &pSrc);
2734 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002735 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002736 sqlite3_close(pSrc);
2737 return 1;
2738 }
drh05782482013-10-24 15:20:20 +00002739 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002740 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2741 if( pBackup==0 ){
2742 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2743 sqlite3_close(pSrc);
2744 return 1;
2745 }
drhdc2c4912009-02-04 22:46:47 +00002746 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2747 || rc==SQLITE_BUSY ){
2748 if( rc==SQLITE_BUSY ){
2749 if( nTimeout++ >= 3 ) break;
2750 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002751 }
2752 }
2753 sqlite3_backup_finish(pBackup);
2754 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002755 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002756 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002757 fprintf(stderr, "Error: source database is busy\n");
2758 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002759 }else{
2760 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002761 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002762 }
2763 sqlite3_close(pSrc);
2764 }else
2765
shanehe2aa9d72009-11-06 17:20:17 +00002766 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002767 struct callback_data data;
2768 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002769 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002770 memcpy(&data, p, sizeof(data));
2771 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002772 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002773 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002774 int i;
drhf0693c82011-10-11 20:41:54 +00002775 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002776 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002777 char *new_argv[2], *new_colv[2];
2778 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2779 " type text,\n"
2780 " name text,\n"
2781 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002782 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002783 " sql text\n"
2784 ")";
2785 new_argv[1] = 0;
2786 new_colv[0] = "sql";
2787 new_colv[1] = 0;
2788 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002789 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002790 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002791 char *new_argv[2], *new_colv[2];
2792 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2793 " type text,\n"
2794 " name text,\n"
2795 " tbl_name text,\n"
2796 " rootpage integer,\n"
2797 " sql text\n"
2798 ")";
2799 new_argv[1] = 0;
2800 new_colv[0] = "sql";
2801 new_colv[1] = 0;
2802 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002803 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002804 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002805 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002806 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002807 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002808 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002809 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002810 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002811 "WHERE lower(tbl_name) LIKE shellstatic()"
2812 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002813 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002814 callback, &data, &zErrMsg);
2815 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002816 }
drh75897232000-05-29 14:26:00 +00002817 }else{
shane9bd1b442009-10-23 01:27:39 +00002818 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002819 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002820 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002821 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002822 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002823 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002824 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002825 callback, &data, &zErrMsg
2826 );
drh75897232000-05-29 14:26:00 +00002827 }
drh75897232000-05-29 14:26:00 +00002828 if( zErrMsg ){
2829 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002830 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002831 rc = 1;
2832 }else if( rc != SQLITE_OK ){
2833 fprintf(stderr,"Error: querying schema information\n");
2834 rc = 1;
2835 }else{
2836 rc = 0;
drh75897232000-05-29 14:26:00 +00002837 }
2838 }else
2839
drh340f5822013-06-27 13:01:21 +00002840#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002841 /* Undocumented commands for internal testing. Subject to change
2842 ** without notice. */
2843 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2844 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2845 int i, v;
2846 for(i=1; i<nArg; i++){
2847 v = booleanValue(azArg[i]);
2848 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2849 }
2850 }
2851 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2852 int i; sqlite3_int64 v;
2853 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002854 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002855 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002856 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2857 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002858 }
2859 }
2860 }else
drh340f5822013-06-27 13:01:21 +00002861#endif
drh348d19c2013-06-03 12:47:43 +00002862
drh75897232000-05-29 14:26:00 +00002863 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002864 sqlite3_snprintf(sizeof(p->separator), p->separator,
2865 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002866 }else
2867
shanehe2aa9d72009-11-06 17:20:17 +00002868 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002869 int i;
2870 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002871 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002872 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002873 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002874 fprintf(p->out,"%9.9s: ", "nullvalue");
2875 output_c_string(p->out, p->nullvalue);
2876 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002877 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002878 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002879 fprintf(p->out,"%9.9s: ", "separator");
2880 output_c_string(p->out, p->separator);
2881 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002882 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002883 fprintf(p->out,"%9.9s: ","width");
2884 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002885 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002886 }
drhfeac5f82004-08-01 00:10:45 +00002887 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002888 }else
2889
shaneh642d8b82010-07-28 16:05:34 +00002890 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2891 p->statsOn = booleanValue(azArg[1]);
2892 }else
2893
shanehe2aa9d72009-11-06 17:20:17 +00002894 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002895 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002896 char **azResult;
drh98781232012-04-23 12:38:05 +00002897 int nRow, nAlloc;
2898 char *zSql = 0;
2899 int ii;
drh05782482013-10-24 15:20:20 +00002900 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002901 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2902 if( rc ) return rc;
2903 zSql = sqlite3_mprintf(
2904 "SELECT name FROM sqlite_master"
2905 " WHERE type IN ('table','view')"
2906 " AND name NOT LIKE 'sqlite_%%'"
2907 " AND name LIKE ?1");
2908 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2909 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2910 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2911 if( strcmp(zDbName,"temp")==0 ){
2912 zSql = sqlite3_mprintf(
2913 "%z UNION ALL "
2914 "SELECT 'temp.' || name FROM sqlite_temp_master"
2915 " WHERE type IN ('table','view')"
2916 " AND name NOT LIKE 'sqlite_%%'"
2917 " AND name LIKE ?1", zSql);
2918 }else{
2919 zSql = sqlite3_mprintf(
2920 "%z UNION ALL "
2921 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2922 " WHERE type IN ('table','view')"
2923 " AND name NOT LIKE 'sqlite_%%'"
2924 " AND name LIKE ?1", zSql, zDbName, zDbName);
2925 }
drha50da102000-08-08 20:19:09 +00002926 }
drh98781232012-04-23 12:38:05 +00002927 sqlite3_finalize(pStmt);
2928 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2929 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2930 sqlite3_free(zSql);
2931 if( rc ) return rc;
2932 nRow = nAlloc = 0;
2933 azResult = 0;
2934 if( nArg>1 ){
2935 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002936 }else{
drh98781232012-04-23 12:38:05 +00002937 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2938 }
2939 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2940 if( nRow>=nAlloc ){
2941 char **azNew;
2942 int n = nAlloc*2 + 10;
2943 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2944 if( azNew==0 ){
2945 fprintf(stderr, "Error: out of memory\n");
2946 break;
2947 }
2948 nAlloc = n;
2949 azResult = azNew;
2950 }
2951 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2952 if( azResult[nRow] ) nRow++;
2953 }
2954 sqlite3_finalize(pStmt);
2955 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002956 int len, maxlen = 0;
2957 int i, j;
2958 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002959 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002960 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002961 if( len>maxlen ) maxlen = len;
2962 }
2963 nPrintCol = 80/(maxlen+2);
2964 if( nPrintCol<1 ) nPrintCol = 1;
2965 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2966 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002967 for(j=i; j<nRow; j+=nPrintRow){
2968 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002969 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002970 }
drh151b7d52013-05-06 20:28:54 +00002971 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002972 }
2973 }
drh98781232012-04-23 12:38:05 +00002974 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2975 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002976 }else
2977
shaneh96887e12011-02-10 21:08:58 +00002978 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002979 static const struct {
2980 const char *zCtrlName; /* Name of a test-control option */
2981 int ctrlCode; /* Integer code for that option */
2982 } aCtrl[] = {
2983 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2984 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2985 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2986 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2987 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2988 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2989 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2990 { "assert", SQLITE_TESTCTRL_ASSERT },
2991 { "always", SQLITE_TESTCTRL_ALWAYS },
2992 { "reserve", SQLITE_TESTCTRL_RESERVE },
2993 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2994 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002995 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2996 };
shaneh96887e12011-02-10 21:08:58 +00002997 int testctrl = -1;
2998 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002999 int i, n;
drh05782482013-10-24 15:20:20 +00003000 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003001
drhd416fe72011-03-17 16:45:50 +00003002 /* convert testctrl text option to value. allow any unique prefix
3003 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003004 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003005 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003006 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3007 if( testctrl<0 ){
3008 testctrl = aCtrl[i].ctrlCode;
3009 }else{
drhb07028f2011-10-14 21:49:18 +00003010 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003011 testctrl = -1;
3012 break;
3013 }
3014 }
3015 }
drh348d19c2013-06-03 12:47:43 +00003016 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003017 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3018 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3019 }else{
3020 switch(testctrl){
3021
3022 /* sqlite3_test_control(int, db, int) */
3023 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3024 case SQLITE_TESTCTRL_RESERVE:
3025 if( nArg==3 ){
3026 int opt = (int)strtol(azArg[2], 0, 0);
3027 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003028 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003029 } else {
drhd416fe72011-03-17 16:45:50 +00003030 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3031 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003032 }
3033 break;
3034
3035 /* sqlite3_test_control(int) */
3036 case SQLITE_TESTCTRL_PRNG_SAVE:
3037 case SQLITE_TESTCTRL_PRNG_RESTORE:
3038 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003039 if( nArg==2 ){
3040 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003041 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003042 } else {
3043 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3044 }
3045 break;
3046
3047 /* sqlite3_test_control(int, uint) */
3048 case SQLITE_TESTCTRL_PENDING_BYTE:
3049 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003050 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003051 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003052 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003053 } else {
drhd416fe72011-03-17 16:45:50 +00003054 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3055 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003056 }
3057 break;
3058
3059 /* sqlite3_test_control(int, int) */
3060 case SQLITE_TESTCTRL_ASSERT:
3061 case SQLITE_TESTCTRL_ALWAYS:
3062 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003063 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003064 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003065 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003066 } else {
drhd416fe72011-03-17 16:45:50 +00003067 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3068 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003069 }
3070 break;
3071
3072 /* sqlite3_test_control(int, char *) */
3073#ifdef SQLITE_N_KEYWORD
3074 case SQLITE_TESTCTRL_ISKEYWORD:
3075 if( nArg==3 ){
3076 const char *opt = azArg[2];
3077 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003078 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003079 } else {
drhd416fe72011-03-17 16:45:50 +00003080 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3081 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003082 }
3083 break;
3084#endif
3085
3086 case SQLITE_TESTCTRL_BITVEC_TEST:
3087 case SQLITE_TESTCTRL_FAULT_INSTALL:
3088 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3089 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3090 default:
drhd416fe72011-03-17 16:45:50 +00003091 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3092 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003093 break;
3094 }
3095 }
3096 }else
3097
shanehe2aa9d72009-11-06 17:20:17 +00003098 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003099 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003100 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003101 }else
3102
drhd416fe72011-03-17 16:45:50 +00003103 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3104 && nArg==2
3105 ){
drh3b1a9882007-11-02 12:53:03 +00003106 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003107 }else
3108
drh42f64e52012-04-04 16:56:23 +00003109 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003110 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003111 output_file_close(p->traceOut);
3112 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003113#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003114 if( p->traceOut==0 ){
3115 sqlite3_trace(p->db, 0, 0);
3116 }else{
3117 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3118 }
3119#endif
3120 }else
3121
drh9fd301b2011-06-03 13:28:22 +00003122 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003123 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003124 sqlite3_libversion(), sqlite3_sourceid());
3125 }else
3126
drhde60fc22011-12-14 17:53:36 +00003127 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3128 const char *zDbName = nArg==2 ? azArg[1] : "main";
3129 char *zVfsName = 0;
3130 if( p->db ){
3131 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3132 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003133 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003134 sqlite3_free(zVfsName);
3135 }
3136 }
3137 }else
3138
drhcef4fc82012-09-21 22:50:45 +00003139#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3140 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3141 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003142 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003143 }else
3144#endif
3145
shanehe2aa9d72009-11-06 17:20:17 +00003146 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003147 int j;
drh43617e92006-03-06 20:55:46 +00003148 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003149 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003150 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003151 }
3152 }else
3153
3154 {
shane9bd1b442009-10-23 01:27:39 +00003155 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003156 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003157 rc = 1;
drh75897232000-05-29 14:26:00 +00003158 }
drh67505e72002-04-19 12:34:06 +00003159
3160 return rc;
drh75897232000-05-29 14:26:00 +00003161}
3162
drh67505e72002-04-19 12:34:06 +00003163/*
drh91a66392007-09-07 01:12:32 +00003164** Return TRUE if a semicolon occurs anywhere in the first N characters
3165** of string z[].
drh324ccef2003-02-05 14:06:20 +00003166*/
drh9f099fd2013-08-06 14:01:46 +00003167static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003168 int i;
3169 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3170 return 0;
drh324ccef2003-02-05 14:06:20 +00003171}
3172
3173/*
drh70c7a4b2003-04-26 03:03:06 +00003174** Test to see if a line consists entirely of whitespace.
3175*/
3176static int _all_whitespace(const char *z){
3177 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003178 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003179 if( *z=='/' && z[1]=='*' ){
3180 z += 2;
3181 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3182 if( *z==0 ) return 0;
3183 z++;
3184 continue;
3185 }
3186 if( *z=='-' && z[1]=='-' ){
3187 z += 2;
3188 while( *z && *z!='\n' ){ z++; }
3189 if( *z==0 ) return 1;
3190 continue;
3191 }
3192 return 0;
3193 }
3194 return 1;
3195}
3196
3197/*
drha9b17162003-04-29 18:01:28 +00003198** Return TRUE if the line typed in is an SQL command terminator other
3199** than a semi-colon. The SQL Server style "go" command is understood
3200** as is the Oracle "/".
3201*/
drh9f099fd2013-08-06 14:01:46 +00003202static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003203 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003204 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3205 return 1; /* Oracle */
3206 }
drhf0693c82011-10-11 20:41:54 +00003207 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003208 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003209 return 1; /* SQL Server */
3210 }
3211 return 0;
3212}
3213
3214/*
drh233a5312008-12-18 22:25:13 +00003215** Return true if zSql is a complete SQL statement. Return false if it
3216** ends in the middle of a string literal or C-style comment.
3217*/
drh9f099fd2013-08-06 14:01:46 +00003218static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003219 int rc;
3220 if( zSql==0 ) return 1;
3221 zSql[nSql] = ';';
3222 zSql[nSql+1] = 0;
3223 rc = sqlite3_complete(zSql);
3224 zSql[nSql] = 0;
3225 return rc;
3226}
3227
3228/*
drh67505e72002-04-19 12:34:06 +00003229** Read input from *in and process it. If *in==0 then input
3230** is interactive - the user is typing it it. Otherwise, input
3231** is coming from a file or device. A prompt is issued and history
3232** is saved only if input is interactive. An interrupt signal will
3233** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003234**
3235** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003236*/
drhc28490c2006-10-26 14:25:58 +00003237static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003238 char *zLine = 0; /* A single input line */
3239 char *zSql = 0; /* Accumulated SQL text */
3240 int nLine; /* Length of current line */
3241 int nSql = 0; /* Bytes of zSql[] used */
3242 int nAlloc = 0; /* Allocated zSql[] space */
3243 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3244 char *zErrMsg; /* Error message returned */
3245 int rc; /* Error code */
3246 int errCnt = 0; /* Number of errors seen */
3247 int lineno = 0; /* Current line number */
3248 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003249
3250 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3251 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003252 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003253 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003254 /* End of input */
3255 if( stdin_is_interactive ) printf("\n");
3256 break;
drhc49f44e2006-10-26 18:15:42 +00003257 }
drh67505e72002-04-19 12:34:06 +00003258 if( seenInterrupt ){
3259 if( in!=0 ) break;
3260 seenInterrupt = 0;
3261 }
drhc28490c2006-10-26 14:25:58 +00003262 lineno++;
drh849a9d92013-12-21 15:46:06 +00003263 if( nSql==0 && _all_whitespace(zLine) ){
3264 if( p->echoOn ) printf("%s\n", zLine);
3265 continue;
3266 }
drh2af0b2d2002-02-21 02:25:02 +00003267 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003268 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003269 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003270 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003271 break;
3272 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003273 errCnt++;
3274 }
drhdaffd0e2001-04-11 14:28:42 +00003275 continue;
3276 }
drh9f099fd2013-08-06 14:01:46 +00003277 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003278 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003279 }
drh9f099fd2013-08-06 14:01:46 +00003280 nLine = strlen30(zLine);
3281 if( nSql+nLine+2>=nAlloc ){
3282 nAlloc = nSql+nLine+100;
3283 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003284 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003285 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003286 exit(1);
3287 }
drhdaffd0e2001-04-11 14:28:42 +00003288 }
drh9f099fd2013-08-06 14:01:46 +00003289 nSqlPrior = nSql;
3290 if( nSql==0 ){
3291 int i;
3292 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003293 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003294 memcpy(zSql, zLine+i, nLine+1-i);
3295 startline = lineno;
3296 nSql = nLine-i;
3297 }else{
3298 zSql[nSql++] = '\n';
3299 memcpy(zSql+nSql, zLine, nLine+1);
3300 nSql += nLine;
3301 }
3302 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003303 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003304 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003305 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003306 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003307 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003308 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003309 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003310 char zPrefix[100];
3311 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003312 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003313 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003314 }else{
shane9bd1b442009-10-23 01:27:39 +00003315 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003316 }
drh7f953e22002-07-13 17:33:45 +00003317 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003318 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003319 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003320 zErrMsg = 0;
3321 }else{
shaned2bed1c2009-10-21 03:56:54 +00003322 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003323 }
drhc49f44e2006-10-26 18:15:42 +00003324 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003325 }
drhdaffd0e2001-04-11 14:28:42 +00003326 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003327 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003328 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003329 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003330 }
3331 }
drh9f099fd2013-08-06 14:01:46 +00003332 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003333 if( !_all_whitespace(zSql) ){
3334 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3335 }
drhdaffd0e2001-04-11 14:28:42 +00003336 free(zSql);
3337 }
danielk19772ac27622007-07-03 05:31:16 +00003338 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003339 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003340}
3341
drh67505e72002-04-19 12:34:06 +00003342/*
3343** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003344** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003345*/
3346static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003347 static char *home_dir = NULL;
3348 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003349
drh83905c92012-06-21 13:00:37 +00003350#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003351 {
3352 struct passwd *pwent;
3353 uid_t uid = getuid();
3354 if( (pwent=getpwuid(uid)) != NULL) {
3355 home_dir = pwent->pw_dir;
3356 }
drh67505e72002-04-19 12:34:06 +00003357 }
3358#endif
3359
chw65d3c132007-11-12 21:09:10 +00003360#if defined(_WIN32_WCE)
3361 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3362 */
drh85e72432012-04-11 11:38:53 +00003363 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003364#else
3365
drh83905c92012-06-21 13:00:37 +00003366#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003367 if (!home_dir) {
3368 home_dir = getenv("USERPROFILE");
3369 }
3370#endif
3371
drh67505e72002-04-19 12:34:06 +00003372 if (!home_dir) {
3373 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003374 }
3375
drh83905c92012-06-21 13:00:37 +00003376#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003377 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003378 char *zDrive, *zPath;
3379 int n;
3380 zDrive = getenv("HOMEDRIVE");
3381 zPath = getenv("HOMEPATH");
3382 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003383 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003384 home_dir = malloc( n );
3385 if( home_dir==0 ) return 0;
3386 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3387 return home_dir;
3388 }
3389 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003390 }
3391#endif
3392
chw65d3c132007-11-12 21:09:10 +00003393#endif /* !_WIN32_WCE */
3394
drh67505e72002-04-19 12:34:06 +00003395 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003396 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003397 char *z = malloc( n );
3398 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003399 home_dir = z;
3400 }
drhe98d4fa2002-04-21 19:06:22 +00003401
drh67505e72002-04-19 12:34:06 +00003402 return home_dir;
3403}
3404
3405/*
3406** Read input from the file given by sqliterc_override. Or if that
3407** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003408**
3409** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003410*/
shane9bd1b442009-10-23 01:27:39 +00003411static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003412 struct callback_data *p, /* Configuration data */
3413 const char *sqliterc_override /* Name of config file. NULL to use default */
3414){
persicom7e2dfdd2002-04-18 02:46:52 +00003415 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003416 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003417 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003418 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003419 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003420
3421 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003422 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003423 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003424#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003425 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003426#endif
shane9bd1b442009-10-23 01:27:39 +00003427 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003428 }
drh2f3de322012-06-27 16:41:31 +00003429 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003430 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3431 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003432 }
drha1f9b5e2004-02-14 16:31:02 +00003433 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003434 if( in ){
drhc28490c2006-10-26 14:25:58 +00003435 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003436 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003437 }
shane9bd1b442009-10-23 01:27:39 +00003438 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003439 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003440 }
drh85e72432012-04-11 11:38:53 +00003441 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003442 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003443}
3444
drh67505e72002-04-19 12:34:06 +00003445/*
drhe1e38c42003-05-04 18:30:59 +00003446** Show available command line options
3447*/
3448static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003449 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003450 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003451 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003452 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003453 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003454 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003455 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003456 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003457#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3458 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3459#endif
drhcc3b4f82012-02-07 14:13:50 +00003460 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003461 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003462 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003463 " -line set output mode to 'line'\n"
3464 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003465 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003466#ifdef SQLITE_ENABLE_MULTIPLEX
3467 " -multiplex enable the multiplexor VFS\n"
3468#endif
drh98d312f2012-10-25 15:23:14 +00003469 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3470 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003471 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003472 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003473 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003474#ifdef SQLITE_ENABLE_VFSTRACE
3475 " -vfstrace enable tracing of all VFS calls\n"
3476#endif
drhe1e38c42003-05-04 18:30:59 +00003477;
3478static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003479 fprintf(stderr,
3480 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3481 "FILENAME is the name of an SQLite database. A new database is created\n"
3482 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003483 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003484 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003485 }else{
3486 fprintf(stderr, "Use the -help option for additional information\n");
3487 }
3488 exit(1);
3489}
3490
3491/*
drh67505e72002-04-19 12:34:06 +00003492** Initialize the state information in data
3493*/
drh0850b532006-01-31 19:31:43 +00003494static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003495 memset(data, 0, sizeof(*data));
3496 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003497 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003498 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003499 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003500 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003501 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3502 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003503 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003504}
3505
drh98d312f2012-10-25 15:23:14 +00003506/*
drh5c7976f2014-02-10 19:59:27 +00003507** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003508*/
3509#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003510static void printBold(const char *zText){
3511 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3512 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3513 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3514 SetConsoleTextAttribute(out,
3515 FOREGROUND_RED|FOREGROUND_INTENSITY
3516 );
3517 printf("%s", zText);
3518 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003519}
3520#else
drh5c7976f2014-02-10 19:59:27 +00003521static void printBold(const char *zText){
3522 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003523}
3524#endif
3525
3526/*
drh98d312f2012-10-25 15:23:14 +00003527** Get the argument to an --option. Throw an error and die if no argument
3528** is available.
3529*/
3530static char *cmdline_option_value(int argc, char **argv, int i){
3531 if( i==argc ){
3532 fprintf(stderr, "%s: Error: missing argument to %s\n",
3533 argv[0], argv[argc-1]);
3534 exit(1);
3535 }
3536 return argv[i];
3537}
3538
drh75897232000-05-29 14:26:00 +00003539int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003540 char *zErrMsg = 0;
3541 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003542 const char *zInitFile = 0;
3543 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003544 int i;
drhc28490c2006-10-26 14:25:58 +00003545 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003546 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003547
drh52784bd2011-05-18 17:15:06 +00003548 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3549 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3550 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3551 exit(1);
3552 }
drhdaffd0e2001-04-11 14:28:42 +00003553 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003554 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003555 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003556
drh44c2eb12003-04-30 11:38:26 +00003557 /* Make sure we have a valid signal handler early, before anything
3558 ** else is done.
3559 */
drh4c504392000-10-16 22:06:40 +00003560#ifdef SIGINT
3561 signal(SIGINT, interrupt_handler);
3562#endif
drh44c2eb12003-04-30 11:38:26 +00003563
drh22fbcb82004-02-01 01:22:50 +00003564 /* Do an initial pass through the command-line argument to locate
3565 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003566 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003567 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003568 */
drh98d312f2012-10-25 15:23:14 +00003569 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003570 char *z;
drhc28490c2006-10-26 14:25:58 +00003571 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003572 if( z[0]!='-' ){
3573 if( data.zDbFilename==0 ){
3574 data.zDbFilename = z;
3575 continue;
3576 }
3577 if( zFirstCmd==0 ){
3578 zFirstCmd = z;
3579 continue;
3580 }
3581 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3582 fprintf(stderr,"Use -help for a list of options.\n");
3583 return 1;
3584 }
drhcc3b4f82012-02-07 14:13:50 +00003585 if( z[1]=='-' ) z++;
3586 if( strcmp(z,"-separator")==0
3587 || strcmp(z,"-nullvalue")==0
3588 || strcmp(z,"-cmd")==0
3589 ){
drh98d312f2012-10-25 15:23:14 +00003590 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003591 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003592 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003593 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003594 /* Need to check for batch mode here to so we can avoid printing
3595 ** informational messages (like from process_sqliterc) before
3596 ** we do the actual processing of arguments later in a second pass.
3597 */
shanef69573d2009-10-24 02:06:14 +00003598 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003599 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003600#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003601 const char *zSize;
3602 sqlite3_int64 szHeap;
3603
drh98d312f2012-10-25 15:23:14 +00003604 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003605 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003606 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003607 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3608#endif
drh97ae8ff2011-03-16 16:56:29 +00003609#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003610 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003611 extern int vfstrace_register(
3612 const char *zTraceName,
3613 const char *zOldVfsName,
3614 int (*xOut)(const char*,void*),
3615 void *pOutArg,
3616 int makeDefault
3617 );
drh2b625e22011-03-16 17:05:28 +00003618 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003619#endif
drh6f25e892011-07-08 17:02:57 +00003620#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003621 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003622 extern int sqlite3_multiple_initialize(const char*,int);
3623 sqlite3_multiplex_initialize(0, 1);
3624#endif
drh7d9f3942013-04-03 01:26:54 +00003625 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003626 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3627 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003628 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003629 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003630 if( pVfs ){
3631 sqlite3_vfs_register(pVfs, 1);
3632 }else{
3633 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3634 exit(1);
3635 }
drh44c2eb12003-04-30 11:38:26 +00003636 }
3637 }
drh98d312f2012-10-25 15:23:14 +00003638 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003639#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003640 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003641 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003642#else
shane86f5bdb2009-10-24 02:00:07 +00003643 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3644 return 1;
drh01b41712005-08-29 23:06:23 +00003645#endif
drh98d312f2012-10-25 15:23:14 +00003646 }
3647 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003648
drh44c2eb12003-04-30 11:38:26 +00003649 /* Go ahead and open the database file if it already exists. If the
3650 ** file does not exist, delay opening it. This prevents empty database
3651 ** files from being created if a user mistypes the database name argument
3652 ** to the sqlite command-line tool.
3653 */
drhc8d74412004-08-31 23:41:26 +00003654 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003655 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003656 }
3657
drh22fbcb82004-02-01 01:22:50 +00003658 /* Process the initialization file if there is one. If no -init option
3659 ** is given on the command line, look for a file named ~/.sqliterc and
3660 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003661 */
shane86f5bdb2009-10-24 02:00:07 +00003662 rc = process_sqliterc(&data,zInitFile);
3663 if( rc>0 ){
3664 return rc;
3665 }
drh44c2eb12003-04-30 11:38:26 +00003666
drh22fbcb82004-02-01 01:22:50 +00003667 /* Make a second pass through the command-line argument and set
3668 ** options. This second pass is delayed until after the initialization
3669 ** file is processed so that the command-line arguments will override
3670 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003671 */
drh98d312f2012-10-25 15:23:14 +00003672 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003673 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003674 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003675 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003676 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003677 i++;
3678 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003679 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003680 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003681 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003682 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003683 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003684 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003685 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003686 }else if( strcmp(z,"-csv")==0 ){
3687 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003688 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003689 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003690 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003691 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003692 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003693 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003694 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003695 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003696 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003697 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003698 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003699 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003700 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003701 }else if( strcmp(z,"-stats")==0 ){
3702 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003703 }else if( strcmp(z,"-bail")==0 ){
3704 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003705 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003706 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003707 return 0;
drhc28490c2006-10-26 14:25:58 +00003708 }else if( strcmp(z,"-interactive")==0 ){
3709 stdin_is_interactive = 1;
3710 }else if( strcmp(z,"-batch")==0 ){
3711 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003712 }else if( strcmp(z,"-heap")==0 ){
3713 i++;
drh7d9f3942013-04-03 01:26:54 +00003714 }else if( strcmp(z,"-mmap")==0 ){
3715 i++;
drha7e61d82011-03-12 17:02:57 +00003716 }else if( strcmp(z,"-vfs")==0 ){
3717 i++;
drh6f25e892011-07-08 17:02:57 +00003718#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003719 }else if( strcmp(z,"-vfstrace")==0 ){
3720 i++;
drh6f25e892011-07-08 17:02:57 +00003721#endif
3722#ifdef SQLITE_ENABLE_MULTIPLEX
3723 }else if( strcmp(z,"-multiplex")==0 ){
3724 i++;
3725#endif
drhcc3b4f82012-02-07 14:13:50 +00003726 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003727 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003728 }else if( strcmp(z,"-cmd")==0 ){
3729 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003730 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003731 if( z[0]=='.' ){
3732 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003733 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003734 }else{
drh05782482013-10-24 15:20:20 +00003735 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003736 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3737 if( zErrMsg!=0 ){
3738 fprintf(stderr,"Error: %s\n", zErrMsg);
3739 if( bail_on_error ) return rc!=0 ? rc : 1;
3740 }else if( rc!=0 ){
3741 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3742 if( bail_on_error ) return rc;
3743 }
3744 }
drh1e5d0e92000-05-31 23:33:17 +00003745 }else{
shane86f5bdb2009-10-24 02:00:07 +00003746 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003747 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003748 return 1;
3749 }
3750 }
drh44c2eb12003-04-30 11:38:26 +00003751
drh22fbcb82004-02-01 01:22:50 +00003752 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003753 /* Run just the command that follows the database name
3754 */
drh22fbcb82004-02-01 01:22:50 +00003755 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003756 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003757 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003758 }else{
drh05782482013-10-24 15:20:20 +00003759 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003760 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003761 if( zErrMsg!=0 ){
3762 fprintf(stderr,"Error: %s\n", zErrMsg);
3763 return rc!=0 ? rc : 1;
3764 }else if( rc!=0 ){
3765 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3766 return rc;
drh6ff13852001-11-25 13:18:23 +00003767 }
drh75897232000-05-29 14:26:00 +00003768 }
3769 }else{
drh44c2eb12003-04-30 11:38:26 +00003770 /* Run commands received from standard input
3771 */
drhc28490c2006-10-26 14:25:58 +00003772 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003773 char *zHome;
3774 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003775 int nHistory;
drh75897232000-05-29 14:26:00 +00003776 printf(
drh743e0032011-12-12 16:51:50 +00003777 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003778 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003779 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003780 );
drhb3735912014-02-10 16:13:42 +00003781 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003782 printf("Connected to a ");
drh5c7976f2014-02-10 19:59:27 +00003783 printBold("transient in-memory database.");
3784 printf("\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003785 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003786 }
drh67505e72002-04-19 12:34:06 +00003787 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003788 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003789 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003790 if( (zHistory = malloc(nHistory))!=0 ){
3791 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3792 }
drh67505e72002-04-19 12:34:06 +00003793 }
danielk19774af00c62005-01-23 23:43:21 +00003794#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00003795 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003796#endif
drhc28490c2006-10-26 14:25:58 +00003797 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003798 if( zHistory ){
3799 stifle_history(100);
3800 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003801 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003802 }
drhdaffd0e2001-04-11 14:28:42 +00003803 }else{
drhc28490c2006-10-26 14:25:58 +00003804 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003805 }
3806 }
drh33048c02001-10-01 14:29:22 +00003807 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003808 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003809 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003810 }
drh05782482013-10-24 15:20:20 +00003811 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003812 return rc;
drh75897232000-05-29 14:26:00 +00003813}