blob: 7bb8da3e0f175531e669edde6f5864abb087d3c1 [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
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
68#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000069#undef popen
drh53371f92013-07-25 17:07:03 +000070#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000071#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000072#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000073#else
drh4328c8b2003-04-26 02:50:11 +000074/* Make sure isatty() has a prototype.
75*/
drhb2acc3b2011-10-13 16:36:29 +000076extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000077
drh53371f92013-07-25 17:07:03 +000078/* popen and pclose are not C89 functions and so are sometimes omitted from
79** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000080extern FILE *popen(const char*,const char*);
81extern int pclose(FILE*);
82#endif
drh53371f92013-07-25 17:07:03 +000083
chw65d3c132007-11-12 21:09:10 +000084#if defined(_WIN32_WCE)
85/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
86 * thus we always assume that we have a console. That can be
87 * overridden with the -batch command line option.
88 */
89#define isatty(x) 1
90#endif
91
drhf0693c82011-10-11 20:41:54 +000092/* ctype macros that work with signed characters */
93#define IsSpace(X) isspace((unsigned char)X)
94#define IsDigit(X) isdigit((unsigned char)X)
95#define ToLower(X) (char)tolower((unsigned char)X)
96
drh43408312013-10-30 12:43:36 +000097
98/* True if the timer is enabled */
99static int enableTimer = 0;
100
101/* Return the current wall-clock time */
102static sqlite3_int64 timeOfDay(void){
103 static sqlite3_vfs *clockVfs = 0;
104 sqlite3_int64 t;
105 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
106 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
107 clockVfs->xCurrentTimeInt64(clockVfs, &t);
108 }else{
109 double r;
110 clockVfs->xCurrentTime(clockVfs, &r);
111 t = (sqlite3_int64)(r*86400000.0);
112 }
113 return t;
114}
115
drhd5d0f642013-02-20 00:54:21 +0000116#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
117 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000118#include <sys/time.h>
119#include <sys/resource.h>
120
drhda108222009-02-25 19:07:24 +0000121/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000122static struct rusage sBegin; /* CPU time at start */
123static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000124
drhda108222009-02-25 19:07:24 +0000125/*
126** Begin timing an operation
127*/
128static void beginTimer(void){
129 if( enableTimer ){
130 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000131 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000132 }
133}
134
135/* Return the difference of two time_structs in seconds */
136static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
137 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
138 (double)(pEnd->tv_sec - pStart->tv_sec);
139}
140
141/*
142** Print the timing results.
143*/
144static void endTimer(void){
145 if( enableTimer ){
146 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000147 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000148 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000149 printf("Run Time: real %.3f user %f sys %f\n",
150 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000151 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
152 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
153 }
154}
shaneb320ccd2009-10-21 03:42:58 +0000155
drhda108222009-02-25 19:07:24 +0000156#define BEGIN_TIMER beginTimer()
157#define END_TIMER endTimer()
158#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000159
160#elif (defined(_WIN32) || defined(WIN32))
161
162#include <windows.h>
163
164/* Saved resource information for the beginning of an operation */
165static HANDLE hProcess;
166static FILETIME ftKernelBegin;
167static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000168static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000169typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
170static GETPROCTIMES getProcessTimesAddr = NULL;
171
shaneb320ccd2009-10-21 03:42:58 +0000172/*
173** Check to see if we have timer support. Return 1 if necessary
174** support found (or found previously).
175*/
176static int hasTimer(void){
177 if( getProcessTimesAddr ){
178 return 1;
179 } else {
180 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
181 ** See if the version we are running on has it, and if it does, save off
182 ** a pointer to it and the current process handle.
183 */
184 hProcess = GetCurrentProcess();
185 if( hProcess ){
186 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
187 if( NULL != hinstLib ){
188 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
189 if( NULL != getProcessTimesAddr ){
190 return 1;
191 }
192 FreeLibrary(hinstLib);
193 }
194 }
195 }
196 return 0;
197}
198
199/*
200** Begin timing an operation
201*/
202static void beginTimer(void){
203 if( enableTimer && getProcessTimesAddr ){
204 FILETIME ftCreation, ftExit;
205 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000206 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000207 }
208}
209
210/* Return the difference of two FILETIME structs in seconds */
211static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
212 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
213 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
214 return (double) ((i64End - i64Start) / 10000000.0);
215}
216
217/*
218** Print the timing results.
219*/
220static void endTimer(void){
221 if( enableTimer && getProcessTimesAddr){
222 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000223 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000224 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000225 printf("Run Time: real %.3f user %f sys %f\n",
226 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000227 timeDiff(&ftUserBegin, &ftUserEnd),
228 timeDiff(&ftKernelBegin, &ftKernelEnd));
229 }
230}
231
232#define BEGIN_TIMER beginTimer()
233#define END_TIMER endTimer()
234#define HAS_TIMER hasTimer()
235
drhda108222009-02-25 19:07:24 +0000236#else
237#define BEGIN_TIMER
238#define END_TIMER
239#define HAS_TIMER 0
240#endif
241
shanec0688ea2009-03-05 03:48:06 +0000242/*
243** Used to prevent warnings about unused parameters
244*/
245#define UNUSED_PARAMETER(x) (void)(x)
246
drhe91d16b2008-12-08 18:27:31 +0000247/*
drhc49f44e2006-10-26 18:15:42 +0000248** If the following flag is set, then command execution stops
249** at an error if we are not interactive.
250*/
251static int bail_on_error = 0;
252
253/*
drhc28490c2006-10-26 14:25:58 +0000254** Threat stdin as an interactive input if the following variable
255** is true. Otherwise, assume stdin is connected to a file or pipe.
256*/
257static int stdin_is_interactive = 1;
258
259/*
drh4c504392000-10-16 22:06:40 +0000260** The following is the open SQLite database. We make a pointer
261** to this database a static variable so that it can be accessed
262** by the SIGINT handler to interrupt database processing.
263*/
danielk197792f9a1b2004-06-19 09:08:16 +0000264static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000265
266/*
drh67505e72002-04-19 12:34:06 +0000267** True if an interrupt (Control-C) has been received.
268*/
drh43617e92006-03-06 20:55:46 +0000269static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000270
271/*
persicom7e2dfdd2002-04-18 02:46:52 +0000272** This is the name of our program. It is set in main(), used
273** in a number of other places, mostly for error messages.
274*/
275static char *Argv0;
276
277/*
278** Prompt strings. Initialized in main. Settable with
279** .prompt main continue
280*/
281static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
282static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
283
drhb0603412007-02-28 04:47:26 +0000284/*
285** Write I/O traces to the following stream.
286*/
rsebe0a9092007-07-30 18:24:38 +0000287#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000288static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000289#endif
drhb0603412007-02-28 04:47:26 +0000290
291/*
292** This routine works like printf in that its first argument is a
293** format string and subsequent arguments are values to be substituted
294** in place of % fields. The result of formatting this string
295** is written to iotrace.
296*/
rsebe0a9092007-07-30 18:24:38 +0000297#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000298static void iotracePrintf(const char *zFormat, ...){
299 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000300 char *z;
drhb0603412007-02-28 04:47:26 +0000301 if( iotrace==0 ) return;
302 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000303 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000304 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000305 fprintf(iotrace, "%s", z);
306 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000307}
rsebe0a9092007-07-30 18:24:38 +0000308#endif
drhb0603412007-02-28 04:47:26 +0000309
drh44c2eb12003-04-30 11:38:26 +0000310
persicom7e2dfdd2002-04-18 02:46:52 +0000311/*
drh83965662003-04-17 02:54:13 +0000312** Determines if a string is a number of not.
313*/
danielk19772e588c72005-12-09 14:25:08 +0000314static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000315 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000316 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000317 return 0;
318 }
319 z++;
320 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000321 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000322 if( *z=='.' ){
323 z++;
drhf0693c82011-10-11 20:41:54 +0000324 if( !IsDigit(*z) ) return 0;
325 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000326 if( realnum ) *realnum = 1;
327 }
328 if( *z=='e' || *z=='E' ){
329 z++;
330 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000331 if( !IsDigit(*z) ) return 0;
332 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000333 if( realnum ) *realnum = 1;
334 }
335 return *z==0;
336}
drh83965662003-04-17 02:54:13 +0000337
338/*
danielk1977bc6ada42004-06-30 08:20:16 +0000339** A global char* and an SQL function to access its current value
340** from within an SQL statement. This program used to use the
341** sqlite_exec_printf() API to substitue a string into an SQL statement.
342** The correct way to do this with sqlite3 is to use the bind API, but
343** since the shell is built around the callback paradigm it would be a lot
344** of work. Instead just use this hack, which is quite harmless.
345*/
346static const char *zShellStatic = 0;
347static void shellstaticFunc(
348 sqlite3_context *context,
349 int argc,
350 sqlite3_value **argv
351){
352 assert( 0==argc );
353 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000354 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000355 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000356 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
357}
358
359
360/*
drhfeac5f82004-08-01 00:10:45 +0000361** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000362** the text in memory obtained from malloc() and returns a pointer
363** to the text. NULL is returned at end of file, or if malloc()
364** fails.
365**
drh9f099fd2013-08-06 14:01:46 +0000366** If zLine is not NULL then it is a malloced buffer returned from
367** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000368*/
drh9f099fd2013-08-06 14:01:46 +0000369static char *local_getline(char *zLine, FILE *in){
370 int nLine = zLine==0 ? 0 : 100;
371 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000372
drhb07028f2011-10-14 21:49:18 +0000373 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000374 if( n+100>nLine ){
375 nLine = nLine*2 + 100;
376 zLine = realloc(zLine, nLine);
377 if( zLine==0 ) return 0;
378 }
drhdaffd0e2001-04-11 14:28:42 +0000379 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000380 if( n==0 ){
381 free(zLine);
382 return 0;
383 }
384 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000385 break;
386 }
drh9f099fd2013-08-06 14:01:46 +0000387 while( zLine[n] ) n++;
388 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000389 n--;
shaneh13b36022009-12-17 21:07:15 +0000390 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000391 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000392 break;
drh8e7e7a22000-05-30 18:45:23 +0000393 }
394 }
drh8e7e7a22000-05-30 18:45:23 +0000395 return zLine;
396}
397
398/*
drhc28490c2006-10-26 14:25:58 +0000399** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000400**
drh9f099fd2013-08-06 14:01:46 +0000401** If in==0 then read from standard input and prompt before each line.
402** If isContinuation is true, then a continuation prompt is appropriate.
403** If isContinuation is zero, then the main prompt should be used.
404**
405** If zPrior is not NULL then it is a buffer from a prior call to this
406** routine that can be reused.
407**
408** The result is stored in space obtained from malloc() and must either
409** be freed by the caller or else passed back into this routine via the
410** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000411*/
drh9f099fd2013-08-06 14:01:46 +0000412static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000413 char *zPrompt;
414 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000415 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000416 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000417 }else{
drh9f099fd2013-08-06 14:01:46 +0000418 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000419#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000420 free(zPrior);
421 zResult = readline(zPrompt);
422 if( zResult && *zResult ) add_history(zResult);
423#else
424 printf("%s", zPrompt);
425 fflush(stdout);
426 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000427#endif
drh9f099fd2013-08-06 14:01:46 +0000428 }
drh8e7e7a22000-05-30 18:45:23 +0000429 return zResult;
430}
431
persicom7e2dfdd2002-04-18 02:46:52 +0000432struct previous_mode_data {
433 int valid; /* Is there legit data in here? */
434 int mode;
435 int showHeader;
436 int colWidth[100];
437};
drh45e29d82006-11-20 16:21:10 +0000438
drh8e7e7a22000-05-30 18:45:23 +0000439/*
drh75897232000-05-29 14:26:00 +0000440** An pointer to an instance of this structure is passed from
441** the main program to the callback. This is used to communicate
442** state and mode information.
443*/
444struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000445 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000446 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000447 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000448 int cnt; /* Number of records displayed so far */
449 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000450 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000451 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000452 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000453 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000454 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000455 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000456 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000457 int colWidth[100]; /* Requested width of each column when in column mode*/
458 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000459 char nullvalue[20]; /* The text to print when a NULL comes back from
460 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000461 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000462 /* Holds the mode information just before
463 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000464 char outfile[FILENAME_MAX]; /* Filename for *out */
465 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000466 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000467 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000468 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000469 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000470 int *aiIndent; /* Array of indents used in MODE_Explain */
471 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000472 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000473};
474
475/*
476** These are the allowed modes.
477*/
drh967e8b72000-06-21 13:59:10 +0000478#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000479#define MODE_Column 1 /* One record per line in neat columns */
480#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000481#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
482#define MODE_Html 4 /* Generate an XHTML table */
483#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000484#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000485#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000486#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000487
drh66ce4d02008-02-15 17:38:06 +0000488static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000489 "line",
490 "column",
491 "list",
492 "semi",
493 "html",
drhfeac5f82004-08-01 00:10:45 +0000494 "insert",
495 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000496 "csv",
drh66ce4d02008-02-15 17:38:06 +0000497 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000498};
drh75897232000-05-29 14:26:00 +0000499
500/*
501** Number of elements in an array
502*/
drh902b9ee2008-12-05 17:17:07 +0000503#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000504
505/*
drhea678832008-12-10 19:26:22 +0000506** Compute a string length that is limited to what can be stored in
507** lower 30 bits of a 32-bit signed integer.
508*/
drh4f21c4a2008-12-10 22:15:00 +0000509static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000510 const char *z2 = z;
511 while( *z2 ){ z2++; }
512 return 0x3fffffff & (int)(z2 - z);
513}
514
515/*
drh127f9d72010-02-23 01:47:00 +0000516** A callback for the sqlite3_log() interface.
517*/
518static void shellLog(void *pArg, int iErrCode, const char *zMsg){
519 struct callback_data *p = (struct callback_data*)pArg;
520 if( p->pLog==0 ) return;
521 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
522 fflush(p->pLog);
523}
524
525/*
shane626a6e42009-10-22 17:30:15 +0000526** Output the given string as a hex-encoded blob (eg. X'1234' )
527*/
528static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
529 int i;
530 char *zBlob = (char *)pBlob;
531 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000532 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000533 fprintf(out,"'");
534}
535
536/*
drh28bd4bc2000-06-15 15:57:22 +0000537** Output the given string as a quoted string using SQL quoting conventions.
538*/
539static void output_quoted_string(FILE *out, const char *z){
540 int i;
541 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000542 for(i=0; z[i]; i++){
543 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000544 }
545 if( nSingle==0 ){
546 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000547 }else{
548 fprintf(out,"'");
549 while( *z ){
550 for(i=0; z[i] && z[i]!='\''; i++){}
551 if( i==0 ){
552 fprintf(out,"''");
553 z++;
554 }else if( z[i]=='\'' ){
555 fprintf(out,"%.*s''",i,z);
556 z += i+1;
557 }else{
drhcd7d2732002-02-26 23:24:26 +0000558 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000559 break;
560 }
561 }
drhcd7d2732002-02-26 23:24:26 +0000562 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000563 }
564}
565
566/*
drhfeac5f82004-08-01 00:10:45 +0000567** Output the given string as a quoted according to C or TCL quoting rules.
568*/
569static void output_c_string(FILE *out, const char *z){
570 unsigned int c;
571 fputc('"', out);
572 while( (c = *(z++))!=0 ){
573 if( c=='\\' ){
574 fputc(c, out);
575 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000576 }else if( c=='"' ){
577 fputc('\\', out);
578 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000579 }else if( c=='\t' ){
580 fputc('\\', out);
581 fputc('t', out);
582 }else if( c=='\n' ){
583 fputc('\\', out);
584 fputc('n', out);
585 }else if( c=='\r' ){
586 fputc('\\', out);
587 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000588 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000589 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000590 }else{
591 fputc(c, out);
592 }
593 }
594 fputc('"', out);
595}
596
597/*
drhc08a4f12000-06-15 16:49:48 +0000598** Output the given string with characters that are special to
599** HTML escaped.
600*/
601static void output_html_string(FILE *out, const char *z){
602 int i;
drhc3d6ba42014-01-13 20:38:35 +0000603 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000604 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000605 for(i=0; z[i]
606 && z[i]!='<'
607 && z[i]!='&'
608 && z[i]!='>'
609 && z[i]!='\"'
610 && z[i]!='\'';
611 i++){}
drhc08a4f12000-06-15 16:49:48 +0000612 if( i>0 ){
613 fprintf(out,"%.*s",i,z);
614 }
615 if( z[i]=='<' ){
616 fprintf(out,"&lt;");
617 }else if( z[i]=='&' ){
618 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000619 }else if( z[i]=='>' ){
620 fprintf(out,"&gt;");
621 }else if( z[i]=='\"' ){
622 fprintf(out,"&quot;");
623 }else if( z[i]=='\'' ){
624 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000625 }else{
626 break;
627 }
628 z += i + 1;
629 }
630}
631
632/*
drhc49f44e2006-10-26 18:15:42 +0000633** If a field contains any character identified by a 1 in the following
634** array, then the string must be quoted for CSV.
635*/
636static const char needCsvQuote[] = {
637 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
638 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
639 1, 0, 1, 0, 0, 0, 0, 1, 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, 0,
642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653};
654
655/*
drh8e64d1c2004-10-07 00:32:39 +0000656** Output a single term of CSV. Actually, p->separator is used for
657** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000658** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000659*/
660static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000661 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000662 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000663 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000664 }else{
drhc49f44e2006-10-26 18:15:42 +0000665 int i;
drh4f21c4a2008-12-10 22:15:00 +0000666 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000667 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000668 if( needCsvQuote[((unsigned char*)z)[i]]
669 || (z[i]==p->separator[0] &&
670 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000671 i = 0;
672 break;
673 }
674 }
675 if( i==0 ){
676 putc('"', out);
677 for(i=0; z[i]; i++){
678 if( z[i]=='"' ) putc('"', out);
679 putc(z[i], out);
680 }
681 putc('"', out);
682 }else{
683 fprintf(out, "%s", z);
684 }
drh8e64d1c2004-10-07 00:32:39 +0000685 }
686 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000687 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000688 }
689}
690
danielk19774af00c62005-01-23 23:43:21 +0000691#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000692/*
drh4c504392000-10-16 22:06:40 +0000693** This routine runs when the user presses Ctrl-C
694*/
695static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000696 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000697 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000698 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000699}
danielk19774af00c62005-01-23 23:43:21 +0000700#endif
drh4c504392000-10-16 22:06:40 +0000701
702/*
shane626a6e42009-10-22 17:30:15 +0000703** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000704** invokes for each row of a query result.
705*/
shane626a6e42009-10-22 17:30:15 +0000706static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000707 int i;
708 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000709
drh75897232000-05-29 14:26:00 +0000710 switch( p->mode ){
711 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000712 int w = 5;
drh6a535342001-10-19 16:44:56 +0000713 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000714 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000715 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000716 if( len>w ) w = len;
717 }
drh75897232000-05-29 14:26:00 +0000718 if( p->cnt++>0 ) fprintf(p->out,"\n");
719 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000720 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000721 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000722 }
723 break;
724 }
danielk19770d78bae2008-01-03 07:09:48 +0000725 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000726 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000727 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000728 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000729 int w, n;
730 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000731 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000732 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000733 w = 0;
drh75897232000-05-29 14:26:00 +0000734 }
drh078b1fd2012-09-21 13:40:02 +0000735 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000736 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000737 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000738 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000739 if( w<n ) w = n;
740 }
741 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000742 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000743 }
744 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000745 if( w<0 ){
746 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
747 }else{
748 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
749 }
drha0c66f52000-07-29 13:20:21 +0000750 }
751 }
752 if( p->showHeader ){
753 for(i=0; i<nArg; i++){
754 int w;
755 if( i<ArraySize(p->actualWidth) ){
756 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000757 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000758 }else{
759 w = 10;
760 }
761 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
762 "----------------------------------------------------------",
763 i==nArg-1 ? "\n": " ");
764 }
drh75897232000-05-29 14:26:00 +0000765 }
766 }
drh6a535342001-10-19 16:44:56 +0000767 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000768 for(i=0; i<nArg; i++){
769 int w;
drha0c66f52000-07-29 13:20:21 +0000770 if( i<ArraySize(p->actualWidth) ){
771 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000772 }else{
773 w = 10;
774 }
dana98bf362013-11-13 18:35:01 +0000775 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000776 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000777 }
dana98bf362013-11-13 18:35:01 +0000778 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000779 if( p->iIndent<p->nIndent ){
780 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000781 }
danc4650bb2013-11-18 08:41:06 +0000782 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000783 }
drh078b1fd2012-09-21 13:40:02 +0000784 if( w<0 ){
785 fprintf(p->out,"%*.*s%s",-w,-w,
786 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
787 }else{
788 fprintf(p->out,"%-*.*s%s",w,w,
789 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
790 }
drh75897232000-05-29 14:26:00 +0000791 }
792 break;
793 }
drhe3710332000-09-29 13:30:53 +0000794 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000795 case MODE_List: {
796 if( p->cnt++==0 && p->showHeader ){
797 for(i=0; i<nArg; i++){
798 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
799 }
800 }
drh6a535342001-10-19 16:44:56 +0000801 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000802 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000803 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000804 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000805 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000806 if( i<nArg-1 ){
807 fprintf(p->out, "%s", p->separator);
808 }else if( p->mode==MODE_Semi ){
809 fprintf(p->out, ";\n");
810 }else{
811 fprintf(p->out, "\n");
812 }
drh75897232000-05-29 14:26:00 +0000813 }
814 break;
815 }
drh1e5d0e92000-05-31 23:33:17 +0000816 case MODE_Html: {
817 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000818 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000819 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000820 fprintf(p->out,"<TH>");
821 output_html_string(p->out, azCol[i]);
822 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000823 }
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000825 }
drh6a535342001-10-19 16:44:56 +0000826 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000828 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000829 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000830 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000831 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000832 }
mihailim57c591a2008-06-23 21:26:05 +0000833 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000834 break;
835 }
drhfeac5f82004-08-01 00:10:45 +0000836 case MODE_Tcl: {
837 if( p->cnt++==0 && p->showHeader ){
838 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000839 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000840 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000841 }
842 fprintf(p->out,"\n");
843 }
844 if( azArg==0 ) break;
845 for(i=0; i<nArg; i++){
846 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000847 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000848 }
849 fprintf(p->out,"\n");
850 break;
851 }
drh8e64d1c2004-10-07 00:32:39 +0000852 case MODE_Csv: {
853 if( p->cnt++==0 && p->showHeader ){
854 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000855 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000856 }
857 fprintf(p->out,"\n");
858 }
859 if( azArg==0 ) break;
860 for(i=0; i<nArg; i++){
861 output_csv(p, azArg[i], i<nArg-1);
862 }
863 fprintf(p->out,"\n");
864 break;
865 }
drh28bd4bc2000-06-15 15:57:22 +0000866 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000867 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000868 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000869 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000870 for(i=0; i<nArg; i++){
871 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000872 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000873 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000874 }else if( aiType && aiType[i]==SQLITE_TEXT ){
875 if( zSep[0] ) fprintf(p->out,"%s",zSep);
876 output_quoted_string(p->out, azArg[i]);
877 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
878 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000879 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
880 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
881 int nBlob = sqlite3_column_bytes(p->pStmt, i);
882 if( zSep[0] ) fprintf(p->out,"%s",zSep);
883 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000884 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000885 fprintf(p->out,"%s%s",zSep, azArg[i]);
886 }else{
887 if( zSep[0] ) fprintf(p->out,"%s",zSep);
888 output_quoted_string(p->out, azArg[i]);
889 }
890 }
891 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000892 break;
drh28bd4bc2000-06-15 15:57:22 +0000893 }
persicom1d0b8722002-04-18 02:53:04 +0000894 }
drh75897232000-05-29 14:26:00 +0000895 return 0;
896}
897
898/*
shane626a6e42009-10-22 17:30:15 +0000899** This is the callback routine that the SQLite library
900** invokes for each row of a query result.
901*/
902static int callback(void *pArg, int nArg, char **azArg, char **azCol){
903 /* since we don't have type info, call the shell_callback with a NULL value */
904 return shell_callback(pArg, nArg, azArg, azCol, NULL);
905}
906
907/*
drh33048c02001-10-01 14:29:22 +0000908** Set the destination table field of the callback_data structure to
909** the name of the table given. Escape any quote characters in the
910** table name.
911*/
912static void set_table_name(struct callback_data *p, const char *zName){
913 int i, n;
914 int needQuote;
915 char *z;
916
917 if( p->zDestTable ){
918 free(p->zDestTable);
919 p->zDestTable = 0;
920 }
921 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000922 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000923 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000924 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000925 needQuote = 1;
926 if( zName[i]=='\'' ) n++;
927 }
928 }
929 if( needQuote ) n += 2;
930 z = p->zDestTable = malloc( n+1 );
931 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000932 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000933 exit(1);
934 }
935 n = 0;
936 if( needQuote ) z[n++] = '\'';
937 for(i=0; zName[i]; i++){
938 z[n++] = zName[i];
939 if( zName[i]=='\'' ) z[n++] = '\'';
940 }
941 if( needQuote ) z[n++] = '\'';
942 z[n] = 0;
943}
944
danielk19772a02e332004-06-05 08:04:36 +0000945/* zIn is either a pointer to a NULL-terminated string in memory obtained
946** from malloc(), or a NULL pointer. The string pointed to by zAppend is
947** added to zIn, and the result returned in memory obtained from malloc().
948** zIn, if it was not NULL, is freed.
949**
950** If the third argument, quote, is not '\0', then it is used as a
951** quote character for zAppend.
952*/
drhc28490c2006-10-26 14:25:58 +0000953static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000954 int len;
955 int i;
drh4f21c4a2008-12-10 22:15:00 +0000956 int nAppend = strlen30(zAppend);
957 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000958
959 len = nAppend+nIn+1;
960 if( quote ){
961 len += 2;
962 for(i=0; i<nAppend; i++){
963 if( zAppend[i]==quote ) len++;
964 }
965 }
966
967 zIn = (char *)realloc(zIn, len);
968 if( !zIn ){
969 return 0;
970 }
971
972 if( quote ){
973 char *zCsr = &zIn[nIn];
974 *zCsr++ = quote;
975 for(i=0; i<nAppend; i++){
976 *zCsr++ = zAppend[i];
977 if( zAppend[i]==quote ) *zCsr++ = quote;
978 }
979 *zCsr++ = quote;
980 *zCsr++ = '\0';
981 assert( (zCsr-zIn)==len );
982 }else{
983 memcpy(&zIn[nIn], zAppend, nAppend);
984 zIn[len-1] = '\0';
985 }
986
987 return zIn;
988}
989
drhdd3d4592004-08-30 01:54:05 +0000990
991/*
drhb21a8e42012-01-28 21:08:51 +0000992** Execute a query statement that will generate SQL output. Print
993** the result columns, comma-separated, on a line and then add a
994** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000995**
drhb21a8e42012-01-28 21:08:51 +0000996** If the number of columns is 1 and that column contains text "--"
997** then write the semicolon on a separate line. That way, if a
998** "--" comment occurs at the end of the statement, the comment
999** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001000*/
drh157e29a2009-05-21 15:15:00 +00001001static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001002 struct callback_data *p, /* Query context */
1003 const char *zSelect, /* SELECT statement to extract content */
1004 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001005){
drhdd3d4592004-08-30 01:54:05 +00001006 sqlite3_stmt *pSelect;
1007 int rc;
drhb21a8e42012-01-28 21:08:51 +00001008 int nResult;
1009 int i;
1010 const char *z;
drh2f464a02011-10-13 00:41:49 +00001011 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001012 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001013 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001014 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001015 return rc;
1016 }
1017 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001018 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001019 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001020 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001021 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001022 zFirstRow = 0;
1023 }
drhb21a8e42012-01-28 21:08:51 +00001024 z = (const char*)sqlite3_column_text(pSelect, 0);
1025 fprintf(p->out, "%s", z);
1026 for(i=1; i<nResult; i++){
1027 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1028 }
1029 if( z==0 ) z = "";
1030 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1031 if( z[0] ){
1032 fprintf(p->out, "\n;\n");
1033 }else{
1034 fprintf(p->out, ";\n");
1035 }
drhdd3d4592004-08-30 01:54:05 +00001036 rc = sqlite3_step(pSelect);
1037 }
drh2f464a02011-10-13 00:41:49 +00001038 rc = sqlite3_finalize(pSelect);
1039 if( rc!=SQLITE_OK ){
1040 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001041 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001042 }
1043 return rc;
drhdd3d4592004-08-30 01:54:05 +00001044}
1045
shane626a6e42009-10-22 17:30:15 +00001046/*
1047** Allocate space and save off current error string.
1048*/
1049static char *save_err_msg(
1050 sqlite3 *db /* Database to query */
1051){
1052 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1053 char *zErrMsg = sqlite3_malloc(nErrMsg);
1054 if( zErrMsg ){
1055 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1056 }
1057 return zErrMsg;
1058}
1059
1060/*
shaneh642d8b82010-07-28 16:05:34 +00001061** Display memory stats.
1062*/
1063static int display_stats(
1064 sqlite3 *db, /* Database to query */
1065 struct callback_data *pArg, /* Pointer to struct callback_data */
1066 int bReset /* True to reset the stats */
1067){
1068 int iCur;
1069 int iHiwtr;
1070
1071 if( pArg && pArg->out ){
1072
1073 iHiwtr = iCur = -1;
1074 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001075 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001076 iHiwtr = iCur = -1;
1077 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001078 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001079/*
1080** Not currently used by the CLI.
1081** iHiwtr = iCur = -1;
1082** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1083** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1084*/
1085 iHiwtr = iCur = -1;
1086 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1087 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1088/*
1089** Not currently used by the CLI.
1090** iHiwtr = iCur = -1;
1091** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1092** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1093*/
1094 iHiwtr = iCur = -1;
1095 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1096 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1106#ifdef YYTRACKMAXSTACKDEPTH
1107 iHiwtr = iCur = -1;
1108 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1109 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1110#endif
1111 }
1112
1113 if( pArg && pArg->out && db ){
1114 iHiwtr = iCur = -1;
1115 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1116 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001117 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1118 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1119 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1120 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1122 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001123 iHiwtr = iCur = -1;
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001125 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1126 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1127 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1128 iHiwtr = iCur = -1;
1129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001131 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1134 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1137 iHiwtr = iCur = -1;
1138 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1140 }
1141
1142 if( pArg && pArg->out && db && pArg->pStmt ){
1143 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1144 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1145 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1146 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1147 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1148 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001149 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1150 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001151 }
1152
1153 return 0;
1154}
1155
1156/*
dana98bf362013-11-13 18:35:01 +00001157** Parameter azArray points to a zero-terminated array of strings. zStr
1158** points to a single nul-terminated string. Return non-zero if zStr
1159** is equal, according to strcmp(), to any of the strings in the array.
1160** Otherwise, return zero.
1161*/
1162static int str_in_array(const char *zStr, const char **azArray){
1163 int i;
1164 for(i=0; azArray[i]; i++){
1165 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1166 }
1167 return 0;
1168}
1169
1170/*
1171** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1172** and populate the callback_data.aiIndent[] array with the number of
1173** spaces each opcode should be indented before it is output.
1174**
1175** The indenting rules are:
1176**
1177** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1178** all opcodes that occur between the p2 jump destination and the opcode
1179** itself by 2 spaces.
1180**
drh01752bc2013-11-14 23:59:33 +00001181** * For each "Goto", if the jump destination is earlier in the program
1182** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001183** Yield SeekGt SeekLt RowSetRead Rewind
drh01752bc2013-11-14 23:59:33 +00001184** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001185** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001186*/
1187static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1188 const char *zSql; /* The text of the SQL statement */
1189 const char *z; /* Used to check if this is an EXPLAIN */
1190 int *abYield = 0; /* True if op is an OP_Yield */
1191 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001192 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001193
drh602320e2013-11-15 03:16:34 +00001194 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001195 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001196 const char *azGoto[] = { "Goto", 0 };
1197
1198 /* Try to figure out if this is really an EXPLAIN statement. If this
1199 ** cannot be verified, return early. */
1200 zSql = sqlite3_sql(pSql);
1201 if( zSql==0 ) return;
1202 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1203 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1204
1205 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1206 int i;
danc4650bb2013-11-18 08:41:06 +00001207 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001208 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001209
1210 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1211 ** p2 is an instruction address, set variable p2op to the index of that
1212 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1213 ** the current instruction is part of a sub-program generated by an
1214 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001215 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001216 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001217
1218 /* Grow the p->aiIndent array as required */
1219 if( iOp>=nAlloc ){
1220 nAlloc += 100;
1221 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1222 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1223 }
1224 abYield[iOp] = str_in_array(zOp, azYield);
1225 p->aiIndent[iOp] = 0;
1226 p->nIndent = iOp+1;
1227
1228 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001229 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001230 }
danc4650bb2013-11-18 08:41:06 +00001231 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
drhe73f0592014-01-21 22:25:45 +00001232 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001233 }
1234 }
1235
danc4650bb2013-11-18 08:41:06 +00001236 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001237 sqlite3_free(abYield);
1238 sqlite3_reset(pSql);
1239}
1240
1241/*
1242** Free the array allocated by explain_data_prepare().
1243*/
1244static void explain_data_delete(struct callback_data *p){
1245 sqlite3_free(p->aiIndent);
1246 p->aiIndent = 0;
1247 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001248 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001249}
1250
1251/*
shane626a6e42009-10-22 17:30:15 +00001252** Execute a statement or set of statements. Print
1253** any result rows/columns depending on the current mode
1254** set via the supplied callback.
1255**
1256** This is very similar to SQLite's built-in sqlite3_exec()
1257** function except it takes a slightly different callback
1258** and callback data argument.
1259*/
1260static int shell_exec(
1261 sqlite3 *db, /* An open database */
1262 const char *zSql, /* SQL to be evaluated */
1263 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1264 /* (not the same as sqlite3_exec) */
1265 struct callback_data *pArg, /* Pointer to struct callback_data */
1266 char **pzErrMsg /* Error msg written here */
1267){
dan4564ced2010-01-05 04:59:56 +00001268 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1269 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001270 int rc2;
dan4564ced2010-01-05 04:59:56 +00001271 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001272
1273 if( pzErrMsg ){
1274 *pzErrMsg = NULL;
1275 }
1276
shaneb9fc17d2009-10-22 21:23:35 +00001277 while( zSql[0] && (SQLITE_OK == rc) ){
1278 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1279 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001280 if( pzErrMsg ){
1281 *pzErrMsg = save_err_msg(db);
1282 }
1283 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001284 if( !pStmt ){
1285 /* this happens for a comment or white-space */
1286 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001287 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001288 continue;
1289 }
shane626a6e42009-10-22 17:30:15 +00001290
shaneh642d8b82010-07-28 16:05:34 +00001291 /* save off the prepared statment handle and reset row count */
1292 if( pArg ){
1293 pArg->pStmt = pStmt;
1294 pArg->cnt = 0;
1295 }
1296
shanehb7977c52010-01-18 18:17:10 +00001297 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001298 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001299 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001300 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001301 }
shanehb7977c52010-01-18 18:17:10 +00001302
drh7e02e5e2011-12-06 19:44:51 +00001303 /* Output TESTCTRL_EXPLAIN text of requested */
1304 if( pArg && pArg->mode==MODE_Explain ){
1305 const char *zExplain = 0;
1306 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1307 if( zExplain && zExplain[0] ){
1308 fprintf(pArg->out, "%s", zExplain);
1309 }
1310 }
1311
dana98bf362013-11-13 18:35:01 +00001312 /* If the shell is currently in ".explain" mode, gather the extra
1313 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001314 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001315 explain_data_prepare(pArg, pStmt);
1316 }
1317
shaneb9fc17d2009-10-22 21:23:35 +00001318 /* perform the first step. this will tell us if we
1319 ** have a result set or not and how wide it is.
1320 */
1321 rc = sqlite3_step(pStmt);
1322 /* if we have a result set... */
1323 if( SQLITE_ROW == rc ){
1324 /* if we have a callback... */
1325 if( xCallback ){
1326 /* allocate space for col name ptr, value ptr, and type */
1327 int nCol = sqlite3_column_count(pStmt);
1328 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1329 if( !pData ){
1330 rc = SQLITE_NOMEM;
1331 }else{
1332 char **azCols = (char **)pData; /* Names of result columns */
1333 char **azVals = &azCols[nCol]; /* Results */
1334 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001335 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001336 assert(sizeof(int) <= sizeof(char *));
1337 /* save off ptrs to column names */
1338 for(i=0; i<nCol; i++){
1339 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1340 }
shaneb9fc17d2009-10-22 21:23:35 +00001341 do{
1342 /* extract the data and data types */
1343 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001344 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001345 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001346 azVals[i] = "";
1347 }else{
1348 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1349 }
shaneb9fc17d2009-10-22 21:23:35 +00001350 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1351 rc = SQLITE_NOMEM;
1352 break; /* from for */
1353 }
1354 } /* end for */
1355
1356 /* if data and types extracted successfully... */
1357 if( SQLITE_ROW == rc ){
1358 /* call the supplied callback with the result row data */
1359 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1360 rc = SQLITE_ABORT;
1361 }else{
1362 rc = sqlite3_step(pStmt);
1363 }
1364 }
1365 } while( SQLITE_ROW == rc );
1366 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001367 }
1368 }else{
1369 do{
1370 rc = sqlite3_step(pStmt);
1371 } while( rc == SQLITE_ROW );
1372 }
1373 }
1374
dana98bf362013-11-13 18:35:01 +00001375 explain_data_delete(pArg);
1376
shaneh642d8b82010-07-28 16:05:34 +00001377 /* print usage stats if stats on */
1378 if( pArg && pArg->statsOn ){
1379 display_stats(db, pArg, 0);
1380 }
1381
dan4564ced2010-01-05 04:59:56 +00001382 /* Finalize the statement just executed. If this fails, save a
1383 ** copy of the error message. Otherwise, set zSql to point to the
1384 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001385 rc2 = sqlite3_finalize(pStmt);
1386 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001387 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001388 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001389 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001390 }else if( pzErrMsg ){
1391 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001392 }
shaneh642d8b82010-07-28 16:05:34 +00001393
1394 /* clear saved stmt handle */
1395 if( pArg ){
1396 pArg->pStmt = NULL;
1397 }
shane626a6e42009-10-22 17:30:15 +00001398 }
shaneb9fc17d2009-10-22 21:23:35 +00001399 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001400
1401 return rc;
1402}
1403
drhdd3d4592004-08-30 01:54:05 +00001404
drh33048c02001-10-01 14:29:22 +00001405/*
drh4c653a02000-06-07 01:27:47 +00001406** This is a different callback routine used for dumping the database.
1407** Each row received by this callback consists of a table name,
1408** the table type ("index" or "table") and SQL to create the table.
1409** This routine should print text sufficient to recreate the table.
1410*/
1411static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001412 int rc;
1413 const char *zTable;
1414 const char *zType;
1415 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001416 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001417 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001418
drh902b9ee2008-12-05 17:17:07 +00001419 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001420 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001421 zTable = azArg[0];
1422 zType = azArg[1];
1423 zSql = azArg[2];
1424
drh00b950d2005-09-11 02:03:03 +00001425 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001426 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001427 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001428 fprintf(p->out, "ANALYZE sqlite_master;\n");
1429 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1430 return 0;
drh45e29d82006-11-20 16:21:10 +00001431 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1432 char *zIns;
1433 if( !p->writableSchema ){
1434 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1435 p->writableSchema = 1;
1436 }
1437 zIns = sqlite3_mprintf(
1438 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1439 "VALUES('table','%q','%q',0,'%q');",
1440 zTable, zTable, zSql);
1441 fprintf(p->out, "%s\n", zIns);
1442 sqlite3_free(zIns);
1443 return 0;
drh00b950d2005-09-11 02:03:03 +00001444 }else{
1445 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001446 }
danielk19772a02e332004-06-05 08:04:36 +00001447
1448 if( strcmp(zType, "table")==0 ){
1449 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001450 char *zSelect = 0;
1451 char *zTableInfo = 0;
1452 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001453 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001454
1455 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1456 zTableInfo = appendText(zTableInfo, zTable, '"');
1457 zTableInfo = appendText(zTableInfo, ");", 0);
1458
1459 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001460 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001461 if( rc!=SQLITE_OK || !pTableInfo ){
1462 return 1;
1463 }
1464
1465 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001466 /* Always quote the table name, even if it appears to be pure ascii,
1467 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1468 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001469 if( zTmp ){
1470 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001471 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001472 }
1473 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1474 rc = sqlite3_step(pTableInfo);
1475 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001476 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001477 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001478 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001479 rc = sqlite3_step(pTableInfo);
1480 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001481 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001482 }else{
1483 zSelect = appendText(zSelect, ") ", 0);
1484 }
drh157e29a2009-05-21 15:15:00 +00001485 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001486 }
1487 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001488 if( rc!=SQLITE_OK || nRow==0 ){
1489 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001490 return 1;
1491 }
1492 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1493 zSelect = appendText(zSelect, zTable, '"');
1494
drh2f464a02011-10-13 00:41:49 +00001495 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001496 if( rc==SQLITE_CORRUPT ){
1497 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001498 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001499 }
drh85e72432012-04-11 11:38:53 +00001500 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001501 }
drh4c653a02000-06-07 01:27:47 +00001502 return 0;
1503}
1504
1505/*
drh45e29d82006-11-20 16:21:10 +00001506** Run zQuery. Use dump_callback() as the callback routine so that
1507** the contents of the query are output as SQL statements.
1508**
drhdd3d4592004-08-30 01:54:05 +00001509** If we get a SQLITE_CORRUPT error, rerun the query after appending
1510** "ORDER BY rowid DESC" to the end.
1511*/
1512static int run_schema_dump_query(
1513 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001514 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001515){
1516 int rc;
drh2f464a02011-10-13 00:41:49 +00001517 char *zErr = 0;
1518 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001519 if( rc==SQLITE_CORRUPT ){
1520 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001521 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001522 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1523 if( zErr ){
1524 fprintf(p->out, "/****** %s ******/\n", zErr);
1525 sqlite3_free(zErr);
1526 zErr = 0;
1527 }
drhdd3d4592004-08-30 01:54:05 +00001528 zQ2 = malloc( len+100 );
1529 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001530 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001531 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1532 if( rc ){
1533 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1534 }else{
1535 rc = SQLITE_CORRUPT;
1536 }
1537 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001538 free(zQ2);
1539 }
1540 return rc;
1541}
1542
1543/*
drh75897232000-05-29 14:26:00 +00001544** Text of a help message
1545*/
persicom1d0b8722002-04-18 02:53:04 +00001546static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001547 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001548 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001549 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001550 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001551 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001552 " If TABLE specified, only dump tables matching\n"
1553 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001554 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001555 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001556 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1557 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001558 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001559 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001560 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001561 ".indices ?TABLE? Show names of all indices\n"
1562 " If TABLE specified, only show indices for tables\n"
1563 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001564#ifdef SQLITE_ENABLE_IOTRACE
1565 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1566#endif
drh70df4fe2006-06-13 15:12:21 +00001567#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001568 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001569#endif
drh127f9d72010-02-23 01:47:00 +00001570 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001571 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001572 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001573 " column Left-aligned columns. (See .width)\n"
1574 " html HTML <table> code\n"
1575 " insert SQL insert statements for TABLE\n"
1576 " line One value per line\n"
1577 " list Values delimited by .separator string\n"
1578 " tabs Tab-separated values\n"
1579 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001580 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001581 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001582 ".output FILENAME Send output to FILENAME\n"
1583 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001584 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001585 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001586 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001587 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001588 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001589 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001590 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001591 " If TABLE specified, only show tables matching\n"
1592 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001593 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001594 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001595 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001596 ".tables ?TABLE? List names of tables\n"
1597 " If TABLE specified, only list tables matching\n"
1598 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001599 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001600 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001601 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001602 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001603;
1604
shaneb320ccd2009-10-21 03:42:58 +00001605static char zTimerHelp[] =
1606 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1607;
1608
drhdaffd0e2001-04-11 14:28:42 +00001609/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001610static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001611
drh75897232000-05-29 14:26:00 +00001612/*
drh44c2eb12003-04-30 11:38:26 +00001613** Make sure the database is open. If it is not, then open it. If
1614** the database fails to open, print an error message and exit.
1615*/
drh05782482013-10-24 15:20:20 +00001616static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001617 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001618 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001619 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001620 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001621 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1622 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1623 shellstaticFunc, 0, 0);
1624 }
1625 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001626 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001627 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001628 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001629 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001630 }
drhc2e87a32006-06-27 15:16:14 +00001631#ifndef SQLITE_OMIT_LOAD_EXTENSION
1632 sqlite3_enable_load_extension(p->db, 1);
1633#endif
drh44c2eb12003-04-30 11:38:26 +00001634 }
1635}
1636
1637/*
drhfeac5f82004-08-01 00:10:45 +00001638** Do C-language style dequoting.
1639**
1640** \t -> tab
1641** \n -> newline
1642** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001643** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001644** \NNN -> ascii character NNN in octal
1645** \\ -> backslash
1646*/
1647static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001648 int i, j;
1649 char c;
drhfeac5f82004-08-01 00:10:45 +00001650 for(i=j=0; (c = z[i])!=0; i++, j++){
1651 if( c=='\\' ){
1652 c = z[++i];
1653 if( c=='n' ){
1654 c = '\n';
1655 }else if( c=='t' ){
1656 c = '\t';
1657 }else if( c=='r' ){
1658 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001659 }else if( c=='\\' ){
1660 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001661 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001662 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001663 if( z[i+1]>='0' && z[i+1]<='7' ){
1664 i++;
1665 c = (c<<3) + z[i] - '0';
1666 if( z[i+1]>='0' && z[i+1]<='7' ){
1667 i++;
1668 c = (c<<3) + z[i] - '0';
1669 }
1670 }
1671 }
1672 }
1673 z[j] = c;
1674 }
1675 z[j] = 0;
1676}
1677
1678/*
drh348d19c2013-06-03 12:47:43 +00001679** Return the value of a hexadecimal digit. Return -1 if the input
1680** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001681*/
drh348d19c2013-06-03 12:47:43 +00001682static int hexDigitValue(char c){
1683 if( c>='0' && c<='9' ) return c - '0';
1684 if( c>='a' && c<='f' ) return c - 'a' + 10;
1685 if( c>='A' && c<='F' ) return c - 'A' + 10;
1686 return -1;
drhc28490c2006-10-26 14:25:58 +00001687}
1688
1689/*
drh7d9f3942013-04-03 01:26:54 +00001690** Interpret zArg as an integer value, possibly with suffixes.
1691*/
1692static sqlite3_int64 integerValue(const char *zArg){
1693 sqlite3_int64 v = 0;
1694 static const struct { char *zSuffix; int iMult; } aMult[] = {
1695 { "KiB", 1024 },
1696 { "MiB", 1024*1024 },
1697 { "GiB", 1024*1024*1024 },
1698 { "KB", 1000 },
1699 { "MB", 1000000 },
1700 { "GB", 1000000000 },
1701 { "K", 1000 },
1702 { "M", 1000000 },
1703 { "G", 1000000000 },
1704 };
1705 int i;
1706 int isNeg = 0;
1707 if( zArg[0]=='-' ){
1708 isNeg = 1;
1709 zArg++;
1710 }else if( zArg[0]=='+' ){
1711 zArg++;
1712 }
drh348d19c2013-06-03 12:47:43 +00001713 if( zArg[0]=='0' && zArg[1]=='x' ){
1714 int x;
1715 zArg += 2;
1716 while( (x = hexDigitValue(zArg[0]))>=0 ){
1717 v = (v<<4) + x;
1718 zArg++;
1719 }
1720 }else{
1721 while( IsDigit(zArg[0]) ){
1722 v = v*10 + zArg[0] - '0';
1723 zArg++;
1724 }
drh7d9f3942013-04-03 01:26:54 +00001725 }
drhc2bed0a2013-05-24 11:57:50 +00001726 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001727 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1728 v *= aMult[i].iMult;
1729 break;
1730 }
1731 }
1732 return isNeg? -v : v;
1733}
1734
1735/*
drh348d19c2013-06-03 12:47:43 +00001736** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1737** for TRUE and FALSE. Return the integer value if appropriate.
1738*/
1739static int booleanValue(char *zArg){
1740 int i;
1741 if( zArg[0]=='0' && zArg[1]=='x' ){
1742 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1743 }else{
1744 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1745 }
1746 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1747 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1748 return 1;
1749 }
1750 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1751 return 0;
1752 }
1753 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1754 zArg);
1755 return 0;
1756}
1757
1758/*
drh42f64e52012-04-04 16:56:23 +00001759** Close an output file, assuming it is not stderr or stdout
1760*/
1761static void output_file_close(FILE *f){
1762 if( f && f!=stdout && f!=stderr ) fclose(f);
1763}
1764
1765/*
1766** Try to open an output file. The names "stdout" and "stderr" are
1767** recognized and do the right thing. NULL is returned if the output
1768** filename is "off".
1769*/
1770static FILE *output_file_open(const char *zFile){
1771 FILE *f;
1772 if( strcmp(zFile,"stdout")==0 ){
1773 f = stdout;
1774 }else if( strcmp(zFile, "stderr")==0 ){
1775 f = stderr;
1776 }else if( strcmp(zFile, "off")==0 ){
1777 f = 0;
1778 }else{
1779 f = fopen(zFile, "wb");
1780 if( f==0 ){
1781 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1782 }
1783 }
1784 return f;
1785}
1786
1787/*
1788** A routine for handling output from sqlite3_trace().
1789*/
1790static void sql_trace_callback(void *pArg, const char *z){
1791 FILE *f = (FILE*)pArg;
1792 if( f ) fprintf(f, "%s\n", z);
1793}
1794
1795/*
drhd8621b92012-04-17 09:09:33 +00001796** A no-op routine that runs with the ".breakpoint" doc-command. This is
1797** a useful spot to set a debugger breakpoint.
1798*/
1799static void test_breakpoint(void){
1800 static int nCall = 0;
1801 nCall++;
1802}
1803
1804/*
drhdb95f682013-06-26 22:46:00 +00001805** An object used to read a CSV file
1806*/
1807typedef struct CSVReader CSVReader;
1808struct CSVReader {
1809 const char *zFile; /* Name of the input file */
1810 FILE *in; /* Read the CSV text from this input stream */
1811 char *z; /* Accumulated text for a field */
1812 int n; /* Number of bytes in z */
1813 int nAlloc; /* Space allocated for z[] */
1814 int nLine; /* Current line number */
1815 int cTerm; /* Character that terminated the most recent field */
1816 int cSeparator; /* The separator character. (Usually ",") */
1817};
1818
1819/* Append a single byte to z[] */
1820static void csv_append_char(CSVReader *p, int c){
1821 if( p->n+1>=p->nAlloc ){
1822 p->nAlloc += p->nAlloc + 100;
1823 p->z = sqlite3_realloc(p->z, p->nAlloc);
1824 if( p->z==0 ){
1825 fprintf(stderr, "out of memory\n");
1826 exit(1);
1827 }
1828 }
1829 p->z[p->n++] = (char)c;
1830}
1831
1832/* Read a single field of CSV text. Compatible with rfc4180 and extended
1833** with the option of having a separator other than ",".
1834**
1835** + Input comes from p->in.
1836** + Store results in p->z of length p->n. Space to hold p->z comes
1837** from sqlite3_malloc().
1838** + Use p->cSep as the separator. The default is ",".
1839** + Keep track of the line number in p->nLine.
1840** + Store the character that terminates the field in p->cTerm. Store
1841** EOF on end-of-file.
1842** + Report syntax errors on stderr
1843*/
1844static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001845 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001846 int cSep = p->cSeparator;
1847 p->n = 0;
1848 c = fgetc(p->in);
1849 if( c==EOF || seenInterrupt ){
1850 p->cTerm = EOF;
1851 return 0;
1852 }
1853 if( c=='"' ){
1854 int startLine = p->nLine;
1855 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001856 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001857 while( 1 ){
1858 c = fgetc(p->in);
1859 if( c=='\n' ) p->nLine++;
1860 if( c==cQuote ){
1861 if( pc==cQuote ){
1862 pc = 0;
1863 continue;
1864 }
1865 }
1866 if( (c==cSep && pc==cQuote)
1867 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001868 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001869 || (c==EOF && pc==cQuote)
1870 ){
1871 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001872 p->cTerm = c;
1873 break;
1874 }
1875 if( pc==cQuote && c!='\r' ){
1876 fprintf(stderr, "%s:%d: unescaped %c character\n",
1877 p->zFile, p->nLine, cQuote);
1878 }
1879 if( c==EOF ){
1880 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1881 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001882 p->cTerm = EOF;
1883 break;
1884 }
1885 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001886 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001887 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001888 }
drhdb95f682013-06-26 22:46:00 +00001889 }else{
drhd0a64dc2013-06-30 20:24:26 +00001890 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001891 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001892 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001893 }
1894 if( c=='\n' ){
1895 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001896 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001897 }
drhdb95f682013-06-26 22:46:00 +00001898 p->cTerm = c;
1899 }
drh8dd675e2013-07-12 21:09:24 +00001900 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001901 return p->z;
1902}
1903
1904/*
drh4bbcf102014-02-06 02:46:08 +00001905** Try to transfer data for table zTable. If an error is seen while
1906** moving forward, try to go backwards. The backwards movement won't
1907** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001908*/
mistachkine31ae902014-02-06 01:15:29 +00001909static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001910 struct callback_data *p,
1911 sqlite3 *newDb,
1912 const char *zTable
1913){
1914 sqlite3_stmt *pQuery = 0;
1915 sqlite3_stmt *pInsert = 0;
1916 char *zQuery = 0;
1917 char *zInsert = 0;
1918 int rc;
1919 int i, j, n;
1920 int nTable = (int)strlen(zTable);
1921 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001922 int cnt = 0;
1923 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001924
1925 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1926 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1927 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001928 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001929 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1930 zQuery);
1931 goto end_data_xfer;
1932 }
1933 n = sqlite3_column_count(pQuery);
1934 zInsert = sqlite3_malloc(200 + nTable + n*3);
1935 if( zInsert==0 ){
1936 fprintf(stderr, "out of memory\n");
1937 goto end_data_xfer;
1938 }
1939 sqlite3_snprintf(200+nTable,zInsert,
1940 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1941 i = (int)strlen(zInsert);
1942 for(j=1; j<n; j++){
1943 memcpy(zInsert+i, ",?", 2);
1944 i += 2;
1945 }
1946 memcpy(zInsert+i, ");", 3);
1947 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1948 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001949 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001950 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1951 zQuery);
1952 goto end_data_xfer;
1953 }
1954 for(k=0; k<2; k++){
1955 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1956 for(i=0; i<n; i++){
1957 switch( sqlite3_column_type(pQuery, i) ){
1958 case SQLITE_NULL: {
1959 sqlite3_bind_null(pInsert, i+1);
1960 break;
1961 }
1962 case SQLITE_INTEGER: {
1963 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1964 break;
1965 }
1966 case SQLITE_FLOAT: {
1967 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1968 break;
1969 }
1970 case SQLITE_TEXT: {
1971 sqlite3_bind_text(pInsert, i+1,
1972 (const char*)sqlite3_column_text(pQuery,i),
1973 -1, SQLITE_STATIC);
1974 break;
1975 }
1976 case SQLITE_BLOB: {
1977 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1978 sqlite3_column_bytes(pQuery,i),
1979 SQLITE_STATIC);
1980 break;
1981 }
1982 }
1983 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00001984 rc = sqlite3_step(pInsert);
1985 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
1986 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
1987 sqlite3_errmsg(newDb));
1988 }
drh3350ce92014-02-06 00:49:12 +00001989 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00001990 cnt++;
1991 if( (cnt%spinRate)==0 ){
1992 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
1993 fflush(stdout);
1994 }
drh3350ce92014-02-06 00:49:12 +00001995 } /* End while */
1996 if( rc==SQLITE_DONE ) break;
1997 sqlite3_finalize(pQuery);
1998 sqlite3_free(zQuery);
1999 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2000 zTable);
2001 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2002 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002003 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2004 break;
drh3350ce92014-02-06 00:49:12 +00002005 }
2006 } /* End for(k=0...) */
2007
2008end_data_xfer:
2009 sqlite3_finalize(pQuery);
2010 sqlite3_finalize(pInsert);
2011 sqlite3_free(zQuery);
2012 sqlite3_free(zInsert);
2013}
2014
2015
2016/*
2017** Try to transfer all rows of the schema that match zWhere. For
2018** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002019** If an error is encountered while moving forward through the
2020** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002021*/
mistachkine31ae902014-02-06 01:15:29 +00002022static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002023 struct callback_data *p,
2024 sqlite3 *newDb,
2025 const char *zWhere,
2026 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2027){
2028 sqlite3_stmt *pQuery = 0;
2029 char *zQuery = 0;
2030 int rc;
2031 const unsigned char *zName;
2032 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002033 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002034
2035 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2036 " WHERE %s", zWhere);
2037 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2038 if( rc ){
2039 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2040 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2041 zQuery);
2042 goto end_schema_xfer;
2043 }
2044 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2045 zName = sqlite3_column_text(pQuery, 0);
2046 zSql = sqlite3_column_text(pQuery, 1);
2047 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002048 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2049 if( zErrMsg ){
2050 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2051 sqlite3_free(zErrMsg);
2052 zErrMsg = 0;
2053 }
drh3350ce92014-02-06 00:49:12 +00002054 if( xForEach ){
2055 xForEach(p, newDb, (const char*)zName);
2056 }
2057 printf("done\n");
2058 }
2059 if( rc!=SQLITE_DONE ){
2060 sqlite3_finalize(pQuery);
2061 sqlite3_free(zQuery);
2062 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2063 " WHERE %s ORDER BY rowid DESC", zWhere);
2064 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2065 if( rc ){
2066 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2067 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2068 zQuery);
2069 goto end_schema_xfer;
2070 }
2071 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2072 zName = sqlite3_column_text(pQuery, 0);
2073 zSql = sqlite3_column_text(pQuery, 1);
2074 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002075 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2076 if( zErrMsg ){
2077 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2078 sqlite3_free(zErrMsg);
2079 zErrMsg = 0;
2080 }
drh3350ce92014-02-06 00:49:12 +00002081 if( xForEach ){
2082 xForEach(p, newDb, (const char*)zName);
2083 }
2084 printf("done\n");
2085 }
2086 }
2087end_schema_xfer:
2088 sqlite3_finalize(pQuery);
2089 sqlite3_free(zQuery);
2090}
2091
2092/*
2093** Open a new database file named "zNewDb". Try to recover as much information
2094** as possible out of the main database (which might be corrupt) and write it
2095** into zNewDb.
2096*/
mistachkine31ae902014-02-06 01:15:29 +00002097static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002098 int rc;
2099 sqlite3 *newDb = 0;
2100 if( access(zNewDb,0)==0 ){
2101 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2102 return;
2103 }
2104 rc = sqlite3_open(zNewDb, &newDb);
2105 if( rc ){
2106 fprintf(stderr, "Cannot create output database: %s\n",
2107 sqlite3_errmsg(newDb));
2108 }else{
2109 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002110 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2111 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002112 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2113 }
2114 sqlite3_close(newDb);
2115}
2116
2117/*
drh75897232000-05-29 14:26:00 +00002118** If an input line begins with "." then invoke this routine to
2119** process that line.
drh67505e72002-04-19 12:34:06 +00002120**
drh47ad6842006-11-08 12:25:42 +00002121** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002122*/
drh44c2eb12003-04-30 11:38:26 +00002123static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002124 int i = 1;
2125 int nArg = 0;
2126 int n, c;
drh67505e72002-04-19 12:34:06 +00002127 int rc = 0;
drh75897232000-05-29 14:26:00 +00002128 char *azArg[50];
2129
2130 /* Parse the input line into tokens.
2131 */
2132 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002133 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002134 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002135 if( zLine[i]=='\'' || zLine[i]=='"' ){
2136 int delim = zLine[i++];
2137 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002138 while( zLine[i] && zLine[i]!=delim ){
2139 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2140 i++;
2141 }
drh75897232000-05-29 14:26:00 +00002142 if( zLine[i]==delim ){
2143 zLine[i++] = 0;
2144 }
drhfeac5f82004-08-01 00:10:45 +00002145 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002146 }else{
2147 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002148 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002149 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002150 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002151 }
2152 }
2153
2154 /* Process the input line.
2155 */
shane9bd1b442009-10-23 01:27:39 +00002156 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002157 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002158 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002159 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2160 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2161 ){
drhbc46f022013-01-23 18:53:23 +00002162 const char *zDestFile = 0;
2163 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002164 sqlite3 *pDest;
2165 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002166 int j;
2167 for(j=1; j<nArg; j++){
2168 const char *z = azArg[j];
2169 if( z[0]=='-' ){
2170 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002171 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002172 {
2173 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2174 return 1;
2175 }
2176 }else if( zDestFile==0 ){
2177 zDestFile = azArg[j];
2178 }else if( zDb==0 ){
2179 zDb = zDestFile;
2180 zDestFile = azArg[j];
2181 }else{
2182 fprintf(stderr, "too many arguments to .backup\n");
2183 return 1;
2184 }
drh9ff849f2009-02-04 20:55:57 +00002185 }
drhbc46f022013-01-23 18:53:23 +00002186 if( zDestFile==0 ){
2187 fprintf(stderr, "missing FILENAME argument on .backup\n");
2188 return 1;
2189 }
2190 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002191 rc = sqlite3_open(zDestFile, &pDest);
2192 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002193 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002194 sqlite3_close(pDest);
2195 return 1;
2196 }
drh05782482013-10-24 15:20:20 +00002197 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002198 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2199 if( pBackup==0 ){
2200 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2201 sqlite3_close(pDest);
2202 return 1;
2203 }
2204 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2205 sqlite3_backup_finish(pBackup);
2206 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002207 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002208 }else{
2209 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002210 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002211 }
2212 sqlite3_close(pDest);
2213 }else
2214
shanehe2aa9d72009-11-06 17:20:17 +00002215 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002216 bail_on_error = booleanValue(azArg[1]);
2217 }else
2218
drhd8621b92012-04-17 09:09:33 +00002219 /* The undocumented ".breakpoint" command causes a call to the no-op
2220 ** routine named test_breakpoint().
2221 */
2222 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2223 test_breakpoint();
2224 }else
2225
mistachkine31ae902014-02-06 01:15:29 +00002226 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2227 tryToClone(p, azArg[1]);
2228 }else
2229
shanehe2aa9d72009-11-06 17:20:17 +00002230 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002231 struct callback_data data;
2232 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002233 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002234 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002235 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002236 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002237 data.colWidth[0] = 3;
2238 data.colWidth[1] = 15;
2239 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002240 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002241 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002242 if( zErrMsg ){
2243 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002244 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002245 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002246 }
2247 }else
2248
shanehe2aa9d72009-11-06 17:20:17 +00002249 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002250 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002251 /* When playing back a "dump", the content might appear in an order
2252 ** which causes immediate foreign key constraints to be violated.
2253 ** So disable foreign-key constraint enforcement to prevent problems. */
2254 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002255 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002256 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002257 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002258 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002259 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002260 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002261 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002262 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002263 );
2264 run_schema_dump_query(p,
2265 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002266 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002267 );
drh2f464a02011-10-13 00:41:49 +00002268 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002269 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002270 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002271 );
drh4c653a02000-06-07 01:27:47 +00002272 }else{
2273 int i;
drhdd3d4592004-08-30 01:54:05 +00002274 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002275 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002276 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002277 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002278 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002279 " AND sql NOT NULL");
2280 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002281 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002282 "WHERE sql NOT NULL"
2283 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002284 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002285 );
danielk1977bc6ada42004-06-30 08:20:16 +00002286 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002287 }
2288 }
drh45e29d82006-11-20 16:21:10 +00002289 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002290 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002291 p->writableSchema = 0;
2292 }
drh56197952011-10-13 16:30:13 +00002293 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2294 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002295 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002296 }else
drh75897232000-05-29 14:26:00 +00002297
shanehe2aa9d72009-11-06 17:20:17 +00002298 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002299 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002300 }else
2301
drhd3ac7d92013-01-25 18:33:43 +00002302 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002303 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002304 rc = 2;
drh75897232000-05-29 14:26:00 +00002305 }else
2306
shanehe2aa9d72009-11-06 17:20:17 +00002307 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002308 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002309 if(val == 1) {
2310 if(!p->explainPrev.valid) {
2311 p->explainPrev.valid = 1;
2312 p->explainPrev.mode = p->mode;
2313 p->explainPrev.showHeader = p->showHeader;
2314 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2315 }
2316 /* We could put this code under the !p->explainValid
2317 ** condition so that it does not execute if we are already in
2318 ** explain mode. However, always executing it allows us an easy
2319 ** was to reset to explain mode in case the user previously
2320 ** did an .explain followed by a .width, .mode or .header
2321 ** command.
2322 */
danielk19770d78bae2008-01-03 07:09:48 +00002323 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002324 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002325 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002326 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002327 p->colWidth[1] = 13; /* opcode */
2328 p->colWidth[2] = 4; /* P1 */
2329 p->colWidth[3] = 4; /* P2 */
2330 p->colWidth[4] = 4; /* P3 */
2331 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002332 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002333 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002334 }else if (p->explainPrev.valid) {
2335 p->explainPrev.valid = 0;
2336 p->mode = p->explainPrev.mode;
2337 p->showHeader = p->explainPrev.showHeader;
2338 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2339 }
drh75897232000-05-29 14:26:00 +00002340 }else
2341
drhc28490c2006-10-26 14:25:58 +00002342 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002343 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002344 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002345 }else
2346
2347 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002348 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002349 if( HAS_TIMER ){
2350 fprintf(stderr,"%s",zTimerHelp);
2351 }
drh75897232000-05-29 14:26:00 +00002352 }else
2353
shanehe2aa9d72009-11-06 17:20:17 +00002354 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002355 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002356 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002357 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002358 int nCol; /* Number of columns in the table */
2359 int nByte; /* Number of bytes in an SQL string */
2360 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002361 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002362 int nSep; /* Number of bytes in p->separator[] */
2363 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002364 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002365 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002366
drhdb95f682013-06-26 22:46:00 +00002367 seenInterrupt = 0;
2368 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002369 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002370 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002371 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002372 fprintf(stderr, "Error: non-null separator required for import\n");
2373 return 1;
drhfeac5f82004-08-01 00:10:45 +00002374 }
drhdb95f682013-06-26 22:46:00 +00002375 if( nSep>1 ){
2376 fprintf(stderr, "Error: multi-character separators not allowed"
2377 " for import\n");
2378 return 1;
2379 }
drh5bde8162013-06-27 14:07:53 +00002380 sCsv.zFile = zFile;
2381 sCsv.nLine = 1;
2382 if( sCsv.zFile[0]=='|' ){
2383 sCsv.in = popen(sCsv.zFile+1, "r");
2384 sCsv.zFile = "<pipe>";
2385 xCloser = pclose;
2386 }else{
2387 sCsv.in = fopen(sCsv.zFile, "rb");
2388 xCloser = fclose;
2389 }
drhdb95f682013-06-26 22:46:00 +00002390 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002391 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002392 return 1;
2393 }
2394 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002395 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002396 if( zSql==0 ){
2397 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002398 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002399 return 1;
2400 }
drh4f21c4a2008-12-10 22:15:00 +00002401 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002402 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002403 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2404 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2405 char cSep = '(';
2406 while( csv_read_one_field(&sCsv) ){
2407 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2408 cSep = ',';
2409 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2410 }
drh5bde8162013-06-27 14:07:53 +00002411 if( cSep=='(' ){
2412 sqlite3_free(zCreate);
2413 sqlite3_free(sCsv.z);
2414 xCloser(sCsv.in);
2415 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2416 return 1;
2417 }
drhdb95f682013-06-26 22:46:00 +00002418 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2419 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2420 sqlite3_free(zCreate);
2421 if( rc ){
2422 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2423 sqlite3_errmsg(db));
2424 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002425 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002426 return 1;
2427 }
2428 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2429 }
drhfeac5f82004-08-01 00:10:45 +00002430 sqlite3_free(zSql);
2431 if( rc ){
shane916f9612009-10-23 00:37:15 +00002432 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002433 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002434 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002435 return 1;
drhfeac5f82004-08-01 00:10:45 +00002436 }
shane916f9612009-10-23 00:37:15 +00002437 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002438 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002439 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002440 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002441 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002442 if( zSql==0 ){
2443 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002444 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002445 return 1;
2446 }
drhdb95f682013-06-26 22:46:00 +00002447 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002448 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002449 for(i=1; i<nCol; i++){
2450 zSql[j++] = ',';
2451 zSql[j++] = '?';
2452 }
2453 zSql[j++] = ')';
2454 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002455 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002456 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002457 if( rc ){
2458 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002459 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002460 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002461 return 1;
drhfeac5f82004-08-01 00:10:45 +00002462 }
drh2d463112013-08-06 14:36:36 +00002463 needCommit = sqlite3_get_autocommit(db);
2464 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002465 do{
2466 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002467 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002468 char *z = csv_read_one_field(&sCsv);
2469 if( z==0 && i==0 ) break;
2470 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2471 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2472 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2473 "filling the rest with NULL\n",
2474 sCsv.zFile, startLine, nCol, i+1);
2475 i++;
2476 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002477 }
drhfeac5f82004-08-01 00:10:45 +00002478 }
drhdb95f682013-06-26 22:46:00 +00002479 if( sCsv.cTerm==sCsv.cSeparator ){
2480 do{
2481 csv_read_one_field(&sCsv);
2482 i++;
2483 }while( sCsv.cTerm==sCsv.cSeparator );
2484 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2485 "extras ignored\n",
2486 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002487 }
drhdb95f682013-06-26 22:46:00 +00002488 if( i>=nCol ){
2489 sqlite3_step(pStmt);
2490 rc = sqlite3_reset(pStmt);
2491 if( rc!=SQLITE_OK ){
2492 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2493 sqlite3_errmsg(db));
2494 }
2495 }
2496 }while( sCsv.cTerm!=EOF );
2497
drh5bde8162013-06-27 14:07:53 +00002498 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002499 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002500 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002501 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002502 }else
2503
shanehe2aa9d72009-11-06 17:20:17 +00002504 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002505 struct callback_data data;
2506 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002507 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002508 memcpy(&data, p, sizeof(data));
2509 data.showHeader = 0;
2510 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002511 if( nArg==1 ){
2512 rc = sqlite3_exec(p->db,
2513 "SELECT name FROM sqlite_master "
2514 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2515 "UNION ALL "
2516 "SELECT name FROM sqlite_temp_master "
2517 "WHERE type='index' "
2518 "ORDER BY 1",
2519 callback, &data, &zErrMsg
2520 );
2521 }else{
2522 zShellStatic = azArg[1];
2523 rc = sqlite3_exec(p->db,
2524 "SELECT name FROM sqlite_master "
2525 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2526 "UNION ALL "
2527 "SELECT name FROM sqlite_temp_master "
2528 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2529 "ORDER BY 1",
2530 callback, &data, &zErrMsg
2531 );
2532 zShellStatic = 0;
2533 }
drh75897232000-05-29 14:26:00 +00002534 if( zErrMsg ){
2535 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002536 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002537 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002538 }else if( rc != SQLITE_OK ){
2539 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2540 rc = 1;
drh75897232000-05-29 14:26:00 +00002541 }
2542 }else
2543
drhae5e4452007-05-03 17:18:36 +00002544#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002545 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002546 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002547 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2548 iotrace = 0;
2549 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002550 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002551 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002552 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002553 iotrace = stdout;
2554 }else{
2555 iotrace = fopen(azArg[1], "w");
2556 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002557 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002558 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002559 rc = 1;
drhb0603412007-02-28 04:47:26 +00002560 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002561 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002562 }
2563 }
2564 }else
drhae5e4452007-05-03 17:18:36 +00002565#endif
drhb0603412007-02-28 04:47:26 +00002566
drh70df4fe2006-06-13 15:12:21 +00002567#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002568 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2569 const char *zFile, *zProc;
2570 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002571 zFile = azArg[1];
2572 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002573 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002574 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2575 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002576 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002577 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002578 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002579 }
2580 }else
drh70df4fe2006-06-13 15:12:21 +00002581#endif
drh1e397f82006-06-08 15:28:43 +00002582
drhc8ba2122011-03-23 11:16:22 +00002583 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002584 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002585 output_file_close(p->pLog);
2586 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002587 }else
2588
shanehe2aa9d72009-11-06 17:20:17 +00002589 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002590 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002591 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002592 ||
shanehe2aa9d72009-11-06 17:20:17 +00002593 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002594 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002595 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002596 ||
shanehe2aa9d72009-11-06 17:20:17 +00002597 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002598 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002599 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002600 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002601 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002602 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002603 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002604 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002605 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002606 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002607 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002608 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002609 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002610 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002611 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002612 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002613 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002614 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002615 }else {
shane9bd1b442009-10-23 01:27:39 +00002616 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002617 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002618 rc = 1;
drh75897232000-05-29 14:26:00 +00002619 }
2620 }else
2621
shanehe2aa9d72009-11-06 17:20:17 +00002622 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2623 int n2 = strlen30(azArg[1]);
2624 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2625 p->mode = MODE_Insert;
2626 set_table_name(p, azArg[2]);
2627 }else {
2628 fprintf(stderr, "Error: invalid arguments: "
2629 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2630 rc = 1;
2631 }
2632 }else
2633
persicom7e2dfdd2002-04-18 02:46:52 +00002634 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002635 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2636 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002637 }else
2638
drh05782482013-10-24 15:20:20 +00002639 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2640 sqlite3 *savedDb = p->db;
2641 const char *zSavedFilename = p->zDbFilename;
2642 char *zNewFilename = 0;
2643 p->db = 0;
2644 if( nArg>=2 ){
2645 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2646 }
2647 open_db(p, 1);
2648 if( p->db!=0 ){
2649 sqlite3_close(savedDb);
2650 sqlite3_free(p->zFreeOnClose);
2651 p->zFreeOnClose = zNewFilename;
2652 }else{
2653 sqlite3_free(zNewFilename);
2654 p->db = savedDb;
2655 p->zDbFilename = zSavedFilename;
2656 }
2657 }else
2658
drh75897232000-05-29 14:26:00 +00002659 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002660 if( p->outfile[0]=='|' ){
2661 pclose(p->out);
2662 }else{
2663 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002664 }
drh42f64e52012-04-04 16:56:23 +00002665 p->outfile[0] = 0;
2666 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002667 p->out = popen(&azArg[1][1], "w");
2668 if( p->out==0 ){
2669 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2670 p->out = stdout;
2671 rc = 1;
2672 }else{
2673 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2674 }
drh75897232000-05-29 14:26:00 +00002675 }else{
drh42f64e52012-04-04 16:56:23 +00002676 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002677 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002678 if( strcmp(azArg[1],"off")!=0 ){
2679 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2680 }
drh75897232000-05-29 14:26:00 +00002681 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002682 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002683 } else {
drh42f64e52012-04-04 16:56:23 +00002684 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002685 }
2686 }
2687 }else
2688
drh078b1fd2012-09-21 13:40:02 +00002689 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2690 int i;
2691 for(i=1; i<nArg; i++){
2692 if( i>1 ) fprintf(p->out, " ");
2693 fprintf(p->out, "%s", azArg[i]);
2694 }
2695 fprintf(p->out, "\n");
2696 }else
2697
drhdd45df82002-04-18 12:39:03 +00002698 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002699 if( nArg >= 2) {
2700 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2701 }
2702 if( nArg >= 3) {
2703 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2704 }
2705 }else
2706
shanehe2aa9d72009-11-06 17:20:17 +00002707 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002708 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002709 }else
2710
drh9ff849f2009-02-04 20:55:57 +00002711 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002712 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002713 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002714 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2715 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002716 }else{
shane9bd1b442009-10-23 01:27:39 +00002717 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002718 fclose(alt);
2719 }
2720 }else
2721
shanehe2aa9d72009-11-06 17:20:17 +00002722 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002723 const char *zSrcFile;
2724 const char *zDb;
2725 sqlite3 *pSrc;
2726 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002727 int nTimeout = 0;
2728
drh9ff849f2009-02-04 20:55:57 +00002729 if( nArg==2 ){
2730 zSrcFile = azArg[1];
2731 zDb = "main";
2732 }else{
2733 zSrcFile = azArg[2];
2734 zDb = azArg[1];
2735 }
2736 rc = sqlite3_open(zSrcFile, &pSrc);
2737 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002738 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002739 sqlite3_close(pSrc);
2740 return 1;
2741 }
drh05782482013-10-24 15:20:20 +00002742 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002743 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2744 if( pBackup==0 ){
2745 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2746 sqlite3_close(pSrc);
2747 return 1;
2748 }
drhdc2c4912009-02-04 22:46:47 +00002749 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2750 || rc==SQLITE_BUSY ){
2751 if( rc==SQLITE_BUSY ){
2752 if( nTimeout++ >= 3 ) break;
2753 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002754 }
2755 }
2756 sqlite3_backup_finish(pBackup);
2757 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002758 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002759 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002760 fprintf(stderr, "Error: source database is busy\n");
2761 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002762 }else{
2763 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002764 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002765 }
2766 sqlite3_close(pSrc);
2767 }else
2768
shanehe2aa9d72009-11-06 17:20:17 +00002769 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002770 struct callback_data data;
2771 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002772 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002773 memcpy(&data, p, sizeof(data));
2774 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002775 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002776 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002777 int i;
drhf0693c82011-10-11 20:41:54 +00002778 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002779 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002780 char *new_argv[2], *new_colv[2];
2781 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2782 " type text,\n"
2783 " name text,\n"
2784 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002785 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002786 " sql text\n"
2787 ")";
2788 new_argv[1] = 0;
2789 new_colv[0] = "sql";
2790 new_colv[1] = 0;
2791 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002792 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002793 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002794 char *new_argv[2], *new_colv[2];
2795 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2796 " type text,\n"
2797 " name text,\n"
2798 " tbl_name text,\n"
2799 " rootpage integer,\n"
2800 " sql text\n"
2801 ")";
2802 new_argv[1] = 0;
2803 new_colv[0] = "sql";
2804 new_colv[1] = 0;
2805 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002806 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002807 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002808 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002809 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002810 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002811 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002812 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002813 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002814 "WHERE lower(tbl_name) LIKE shellstatic()"
2815 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002816 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002817 callback, &data, &zErrMsg);
2818 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002819 }
drh75897232000-05-29 14:26:00 +00002820 }else{
shane9bd1b442009-10-23 01:27:39 +00002821 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002822 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002823 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002824 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002825 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002826 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002827 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002828 callback, &data, &zErrMsg
2829 );
drh75897232000-05-29 14:26:00 +00002830 }
drh75897232000-05-29 14:26:00 +00002831 if( zErrMsg ){
2832 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002833 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002834 rc = 1;
2835 }else if( rc != SQLITE_OK ){
2836 fprintf(stderr,"Error: querying schema information\n");
2837 rc = 1;
2838 }else{
2839 rc = 0;
drh75897232000-05-29 14:26:00 +00002840 }
2841 }else
2842
drh340f5822013-06-27 13:01:21 +00002843#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002844 /* Undocumented commands for internal testing. Subject to change
2845 ** without notice. */
2846 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2847 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2848 int i, v;
2849 for(i=1; i<nArg; i++){
2850 v = booleanValue(azArg[i]);
2851 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2852 }
2853 }
2854 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2855 int i; sqlite3_int64 v;
2856 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002857 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002858 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002859 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2860 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002861 }
2862 }
2863 }else
drh340f5822013-06-27 13:01:21 +00002864#endif
drh348d19c2013-06-03 12:47:43 +00002865
drh75897232000-05-29 14:26:00 +00002866 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002867 sqlite3_snprintf(sizeof(p->separator), p->separator,
2868 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002869 }else
2870
shanehe2aa9d72009-11-06 17:20:17 +00002871 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002872 int i;
2873 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002874 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002875 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002876 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002877 fprintf(p->out,"%9.9s: ", "nullvalue");
2878 output_c_string(p->out, p->nullvalue);
2879 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002880 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002881 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002882 fprintf(p->out,"%9.9s: ", "separator");
2883 output_c_string(p->out, p->separator);
2884 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002885 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002886 fprintf(p->out,"%9.9s: ","width");
2887 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002888 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002889 }
drhfeac5f82004-08-01 00:10:45 +00002890 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002891 }else
2892
shaneh642d8b82010-07-28 16:05:34 +00002893 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2894 p->statsOn = booleanValue(azArg[1]);
2895 }else
2896
shanehe2aa9d72009-11-06 17:20:17 +00002897 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002898 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002899 char **azResult;
drh98781232012-04-23 12:38:05 +00002900 int nRow, nAlloc;
2901 char *zSql = 0;
2902 int ii;
drh05782482013-10-24 15:20:20 +00002903 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002904 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2905 if( rc ) return rc;
2906 zSql = sqlite3_mprintf(
2907 "SELECT name FROM sqlite_master"
2908 " WHERE type IN ('table','view')"
2909 " AND name NOT LIKE 'sqlite_%%'"
2910 " AND name LIKE ?1");
2911 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2912 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2913 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2914 if( strcmp(zDbName,"temp")==0 ){
2915 zSql = sqlite3_mprintf(
2916 "%z UNION ALL "
2917 "SELECT 'temp.' || name FROM sqlite_temp_master"
2918 " WHERE type IN ('table','view')"
2919 " AND name NOT LIKE 'sqlite_%%'"
2920 " AND name LIKE ?1", zSql);
2921 }else{
2922 zSql = sqlite3_mprintf(
2923 "%z UNION ALL "
2924 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2925 " WHERE type IN ('table','view')"
2926 " AND name NOT LIKE 'sqlite_%%'"
2927 " AND name LIKE ?1", zSql, zDbName, zDbName);
2928 }
drha50da102000-08-08 20:19:09 +00002929 }
drh98781232012-04-23 12:38:05 +00002930 sqlite3_finalize(pStmt);
2931 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2932 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2933 sqlite3_free(zSql);
2934 if( rc ) return rc;
2935 nRow = nAlloc = 0;
2936 azResult = 0;
2937 if( nArg>1 ){
2938 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002939 }else{
drh98781232012-04-23 12:38:05 +00002940 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2941 }
2942 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2943 if( nRow>=nAlloc ){
2944 char **azNew;
2945 int n = nAlloc*2 + 10;
2946 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2947 if( azNew==0 ){
2948 fprintf(stderr, "Error: out of memory\n");
2949 break;
2950 }
2951 nAlloc = n;
2952 azResult = azNew;
2953 }
2954 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2955 if( azResult[nRow] ) nRow++;
2956 }
2957 sqlite3_finalize(pStmt);
2958 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002959 int len, maxlen = 0;
2960 int i, j;
2961 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002962 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002963 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002964 if( len>maxlen ) maxlen = len;
2965 }
2966 nPrintCol = 80/(maxlen+2);
2967 if( nPrintCol<1 ) nPrintCol = 1;
2968 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2969 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002970 for(j=i; j<nRow; j+=nPrintRow){
2971 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002972 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002973 }
drh151b7d52013-05-06 20:28:54 +00002974 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002975 }
2976 }
drh98781232012-04-23 12:38:05 +00002977 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2978 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002979 }else
2980
shaneh96887e12011-02-10 21:08:58 +00002981 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002982 static const struct {
2983 const char *zCtrlName; /* Name of a test-control option */
2984 int ctrlCode; /* Integer code for that option */
2985 } aCtrl[] = {
2986 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2987 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2988 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2989 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2990 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2991 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2992 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2993 { "assert", SQLITE_TESTCTRL_ASSERT },
2994 { "always", SQLITE_TESTCTRL_ALWAYS },
2995 { "reserve", SQLITE_TESTCTRL_RESERVE },
2996 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2997 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002998 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2999 };
shaneh96887e12011-02-10 21:08:58 +00003000 int testctrl = -1;
3001 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003002 int i, n;
drh05782482013-10-24 15:20:20 +00003003 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003004
drhd416fe72011-03-17 16:45:50 +00003005 /* convert testctrl text option to value. allow any unique prefix
3006 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003007 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003008 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003009 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3010 if( testctrl<0 ){
3011 testctrl = aCtrl[i].ctrlCode;
3012 }else{
drhb07028f2011-10-14 21:49:18 +00003013 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003014 testctrl = -1;
3015 break;
3016 }
3017 }
3018 }
drh348d19c2013-06-03 12:47:43 +00003019 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003020 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3021 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3022 }else{
3023 switch(testctrl){
3024
3025 /* sqlite3_test_control(int, db, int) */
3026 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3027 case SQLITE_TESTCTRL_RESERVE:
3028 if( nArg==3 ){
3029 int opt = (int)strtol(azArg[2], 0, 0);
3030 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003031 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003032 } else {
drhd416fe72011-03-17 16:45:50 +00003033 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3034 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003035 }
3036 break;
3037
3038 /* sqlite3_test_control(int) */
3039 case SQLITE_TESTCTRL_PRNG_SAVE:
3040 case SQLITE_TESTCTRL_PRNG_RESTORE:
3041 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003042 if( nArg==2 ){
3043 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003044 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003045 } else {
3046 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3047 }
3048 break;
3049
3050 /* sqlite3_test_control(int, uint) */
3051 case SQLITE_TESTCTRL_PENDING_BYTE:
3052 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003053 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003054 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003055 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003056 } else {
drhd416fe72011-03-17 16:45:50 +00003057 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3058 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003059 }
3060 break;
3061
3062 /* sqlite3_test_control(int, int) */
3063 case SQLITE_TESTCTRL_ASSERT:
3064 case SQLITE_TESTCTRL_ALWAYS:
3065 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003066 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003067 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003068 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003069 } else {
drhd416fe72011-03-17 16:45:50 +00003070 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3071 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003072 }
3073 break;
3074
3075 /* sqlite3_test_control(int, char *) */
3076#ifdef SQLITE_N_KEYWORD
3077 case SQLITE_TESTCTRL_ISKEYWORD:
3078 if( nArg==3 ){
3079 const char *opt = azArg[2];
3080 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003081 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003082 } else {
drhd416fe72011-03-17 16:45:50 +00003083 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3084 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003085 }
3086 break;
3087#endif
3088
3089 case SQLITE_TESTCTRL_BITVEC_TEST:
3090 case SQLITE_TESTCTRL_FAULT_INSTALL:
3091 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3092 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3093 default:
drhd416fe72011-03-17 16:45:50 +00003094 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3095 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003096 break;
3097 }
3098 }
3099 }else
3100
shanehe2aa9d72009-11-06 17:20:17 +00003101 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003102 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003103 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003104 }else
3105
drhd416fe72011-03-17 16:45:50 +00003106 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3107 && nArg==2
3108 ){
drh3b1a9882007-11-02 12:53:03 +00003109 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003110 }else
3111
drh42f64e52012-04-04 16:56:23 +00003112 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003113 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003114 output_file_close(p->traceOut);
3115 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003116#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003117 if( p->traceOut==0 ){
3118 sqlite3_trace(p->db, 0, 0);
3119 }else{
3120 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3121 }
3122#endif
3123 }else
3124
drh9fd301b2011-06-03 13:28:22 +00003125 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003126 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003127 sqlite3_libversion(), sqlite3_sourceid());
3128 }else
3129
drhde60fc22011-12-14 17:53:36 +00003130 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3131 const char *zDbName = nArg==2 ? azArg[1] : "main";
3132 char *zVfsName = 0;
3133 if( p->db ){
3134 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3135 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003136 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003137 sqlite3_free(zVfsName);
3138 }
3139 }
3140 }else
3141
drhcef4fc82012-09-21 22:50:45 +00003142#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3143 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3144 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003145 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003146 }else
3147#endif
3148
shanehe2aa9d72009-11-06 17:20:17 +00003149 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003150 int j;
drh43617e92006-03-06 20:55:46 +00003151 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003152 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003153 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003154 }
3155 }else
3156
3157 {
shane9bd1b442009-10-23 01:27:39 +00003158 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003159 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003160 rc = 1;
drh75897232000-05-29 14:26:00 +00003161 }
drh67505e72002-04-19 12:34:06 +00003162
3163 return rc;
drh75897232000-05-29 14:26:00 +00003164}
3165
drh67505e72002-04-19 12:34:06 +00003166/*
drh91a66392007-09-07 01:12:32 +00003167** Return TRUE if a semicolon occurs anywhere in the first N characters
3168** of string z[].
drh324ccef2003-02-05 14:06:20 +00003169*/
drh9f099fd2013-08-06 14:01:46 +00003170static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003171 int i;
3172 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3173 return 0;
drh324ccef2003-02-05 14:06:20 +00003174}
3175
3176/*
drh70c7a4b2003-04-26 03:03:06 +00003177** Test to see if a line consists entirely of whitespace.
3178*/
3179static int _all_whitespace(const char *z){
3180 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003181 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003182 if( *z=='/' && z[1]=='*' ){
3183 z += 2;
3184 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3185 if( *z==0 ) return 0;
3186 z++;
3187 continue;
3188 }
3189 if( *z=='-' && z[1]=='-' ){
3190 z += 2;
3191 while( *z && *z!='\n' ){ z++; }
3192 if( *z==0 ) return 1;
3193 continue;
3194 }
3195 return 0;
3196 }
3197 return 1;
3198}
3199
3200/*
drha9b17162003-04-29 18:01:28 +00003201** Return TRUE if the line typed in is an SQL command terminator other
3202** than a semi-colon. The SQL Server style "go" command is understood
3203** as is the Oracle "/".
3204*/
drh9f099fd2013-08-06 14:01:46 +00003205static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003206 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003207 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3208 return 1; /* Oracle */
3209 }
drhf0693c82011-10-11 20:41:54 +00003210 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003211 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003212 return 1; /* SQL Server */
3213 }
3214 return 0;
3215}
3216
3217/*
drh233a5312008-12-18 22:25:13 +00003218** Return true if zSql is a complete SQL statement. Return false if it
3219** ends in the middle of a string literal or C-style comment.
3220*/
drh9f099fd2013-08-06 14:01:46 +00003221static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003222 int rc;
3223 if( zSql==0 ) return 1;
3224 zSql[nSql] = ';';
3225 zSql[nSql+1] = 0;
3226 rc = sqlite3_complete(zSql);
3227 zSql[nSql] = 0;
3228 return rc;
3229}
3230
3231/*
drh67505e72002-04-19 12:34:06 +00003232** Read input from *in and process it. If *in==0 then input
3233** is interactive - the user is typing it it. Otherwise, input
3234** is coming from a file or device. A prompt is issued and history
3235** is saved only if input is interactive. An interrupt signal will
3236** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003237**
3238** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003239*/
drhc28490c2006-10-26 14:25:58 +00003240static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003241 char *zLine = 0; /* A single input line */
3242 char *zSql = 0; /* Accumulated SQL text */
3243 int nLine; /* Length of current line */
3244 int nSql = 0; /* Bytes of zSql[] used */
3245 int nAlloc = 0; /* Allocated zSql[] space */
3246 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3247 char *zErrMsg; /* Error message returned */
3248 int rc; /* Error code */
3249 int errCnt = 0; /* Number of errors seen */
3250 int lineno = 0; /* Current line number */
3251 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003252
3253 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3254 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003255 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003256 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003257 /* End of input */
3258 if( stdin_is_interactive ) printf("\n");
3259 break;
drhc49f44e2006-10-26 18:15:42 +00003260 }
drh67505e72002-04-19 12:34:06 +00003261 if( seenInterrupt ){
3262 if( in!=0 ) break;
3263 seenInterrupt = 0;
3264 }
drhc28490c2006-10-26 14:25:58 +00003265 lineno++;
drh849a9d92013-12-21 15:46:06 +00003266 if( nSql==0 && _all_whitespace(zLine) ){
3267 if( p->echoOn ) printf("%s\n", zLine);
3268 continue;
3269 }
drh2af0b2d2002-02-21 02:25:02 +00003270 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003271 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003272 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003273 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003274 break;
3275 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003276 errCnt++;
3277 }
drhdaffd0e2001-04-11 14:28:42 +00003278 continue;
3279 }
drh9f099fd2013-08-06 14:01:46 +00003280 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003281 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003282 }
drh9f099fd2013-08-06 14:01:46 +00003283 nLine = strlen30(zLine);
3284 if( nSql+nLine+2>=nAlloc ){
3285 nAlloc = nSql+nLine+100;
3286 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003287 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003288 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003289 exit(1);
3290 }
drhdaffd0e2001-04-11 14:28:42 +00003291 }
drh9f099fd2013-08-06 14:01:46 +00003292 nSqlPrior = nSql;
3293 if( nSql==0 ){
3294 int i;
3295 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003296 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003297 memcpy(zSql, zLine+i, nLine+1-i);
3298 startline = lineno;
3299 nSql = nLine-i;
3300 }else{
3301 zSql[nSql++] = '\n';
3302 memcpy(zSql+nSql, zLine, nLine+1);
3303 nSql += nLine;
3304 }
3305 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003306 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003307 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003308 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003309 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003310 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003311 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003312 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003313 char zPrefix[100];
3314 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003315 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003316 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003317 }else{
shane9bd1b442009-10-23 01:27:39 +00003318 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003319 }
drh7f953e22002-07-13 17:33:45 +00003320 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003321 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003322 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003323 zErrMsg = 0;
3324 }else{
shaned2bed1c2009-10-21 03:56:54 +00003325 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003326 }
drhc49f44e2006-10-26 18:15:42 +00003327 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003328 }
drhdaffd0e2001-04-11 14:28:42 +00003329 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003330 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003331 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003332 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003333 }
3334 }
drh9f099fd2013-08-06 14:01:46 +00003335 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003336 if( !_all_whitespace(zSql) ){
3337 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3338 }
drhdaffd0e2001-04-11 14:28:42 +00003339 free(zSql);
3340 }
danielk19772ac27622007-07-03 05:31:16 +00003341 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003342 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003343}
3344
drh67505e72002-04-19 12:34:06 +00003345/*
3346** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003347** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003348*/
3349static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003350 static char *home_dir = NULL;
3351 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003352
drh83905c92012-06-21 13:00:37 +00003353#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003354 {
3355 struct passwd *pwent;
3356 uid_t uid = getuid();
3357 if( (pwent=getpwuid(uid)) != NULL) {
3358 home_dir = pwent->pw_dir;
3359 }
drh67505e72002-04-19 12:34:06 +00003360 }
3361#endif
3362
chw65d3c132007-11-12 21:09:10 +00003363#if defined(_WIN32_WCE)
3364 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3365 */
drh85e72432012-04-11 11:38:53 +00003366 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003367#else
3368
drh83905c92012-06-21 13:00:37 +00003369#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003370 if (!home_dir) {
3371 home_dir = getenv("USERPROFILE");
3372 }
3373#endif
3374
drh67505e72002-04-19 12:34:06 +00003375 if (!home_dir) {
3376 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003377 }
3378
drh83905c92012-06-21 13:00:37 +00003379#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003380 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003381 char *zDrive, *zPath;
3382 int n;
3383 zDrive = getenv("HOMEDRIVE");
3384 zPath = getenv("HOMEPATH");
3385 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003386 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003387 home_dir = malloc( n );
3388 if( home_dir==0 ) return 0;
3389 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3390 return home_dir;
3391 }
3392 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003393 }
3394#endif
3395
chw65d3c132007-11-12 21:09:10 +00003396#endif /* !_WIN32_WCE */
3397
drh67505e72002-04-19 12:34:06 +00003398 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003399 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003400 char *z = malloc( n );
3401 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003402 home_dir = z;
3403 }
drhe98d4fa2002-04-21 19:06:22 +00003404
drh67505e72002-04-19 12:34:06 +00003405 return home_dir;
3406}
3407
3408/*
3409** Read input from the file given by sqliterc_override. Or if that
3410** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003411**
3412** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003413*/
shane9bd1b442009-10-23 01:27:39 +00003414static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003415 struct callback_data *p, /* Configuration data */
3416 const char *sqliterc_override /* Name of config file. NULL to use default */
3417){
persicom7e2dfdd2002-04-18 02:46:52 +00003418 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003419 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003420 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003421 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003422 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003423
3424 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003425 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003426 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003427#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003428 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003429#endif
shane9bd1b442009-10-23 01:27:39 +00003430 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003431 }
drh2f3de322012-06-27 16:41:31 +00003432 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003433 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3434 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003435 }
drha1f9b5e2004-02-14 16:31:02 +00003436 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003437 if( in ){
drhc28490c2006-10-26 14:25:58 +00003438 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003439 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003440 }
shane9bd1b442009-10-23 01:27:39 +00003441 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003442 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003443 }
drh85e72432012-04-11 11:38:53 +00003444 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003445 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003446}
3447
drh67505e72002-04-19 12:34:06 +00003448/*
drhe1e38c42003-05-04 18:30:59 +00003449** Show available command line options
3450*/
3451static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003452 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003453 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003454 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003455 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003456 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003457 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003458 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003459 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003460#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3461 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3462#endif
drhcc3b4f82012-02-07 14:13:50 +00003463 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003464 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003465 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003466 " -line set output mode to 'line'\n"
3467 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003468 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003469#ifdef SQLITE_ENABLE_MULTIPLEX
3470 " -multiplex enable the multiplexor VFS\n"
3471#endif
drh98d312f2012-10-25 15:23:14 +00003472 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3473 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003474 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003475 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003476 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003477#ifdef SQLITE_ENABLE_VFSTRACE
3478 " -vfstrace enable tracing of all VFS calls\n"
3479#endif
drhe1e38c42003-05-04 18:30:59 +00003480;
3481static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003482 fprintf(stderr,
3483 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3484 "FILENAME is the name of an SQLite database. A new database is created\n"
3485 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003486 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003487 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003488 }else{
3489 fprintf(stderr, "Use the -help option for additional information\n");
3490 }
3491 exit(1);
3492}
3493
3494/*
drh67505e72002-04-19 12:34:06 +00003495** Initialize the state information in data
3496*/
drh0850b532006-01-31 19:31:43 +00003497static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003498 memset(data, 0, sizeof(*data));
3499 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003500 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003501 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003502 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003503 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003504 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3505 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003506 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003507}
3508
drh98d312f2012-10-25 15:23:14 +00003509/*
drh5c7976f2014-02-10 19:59:27 +00003510** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003511*/
3512#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003513static void printBold(const char *zText){
3514 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3515 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3516 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3517 SetConsoleTextAttribute(out,
3518 FOREGROUND_RED|FOREGROUND_INTENSITY
3519 );
3520 printf("%s", zText);
3521 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003522}
3523#else
drh5c7976f2014-02-10 19:59:27 +00003524static void printBold(const char *zText){
3525 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003526}
3527#endif
3528
3529/*
drh98d312f2012-10-25 15:23:14 +00003530** Get the argument to an --option. Throw an error and die if no argument
3531** is available.
3532*/
3533static char *cmdline_option_value(int argc, char **argv, int i){
3534 if( i==argc ){
3535 fprintf(stderr, "%s: Error: missing argument to %s\n",
3536 argv[0], argv[argc-1]);
3537 exit(1);
3538 }
3539 return argv[i];
3540}
3541
drh75897232000-05-29 14:26:00 +00003542int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003543 char *zErrMsg = 0;
3544 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003545 const char *zInitFile = 0;
3546 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003547 int i;
drhc28490c2006-10-26 14:25:58 +00003548 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003549 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003550
drh52784bd2011-05-18 17:15:06 +00003551 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3552 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3553 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3554 exit(1);
3555 }
drhdaffd0e2001-04-11 14:28:42 +00003556 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003557 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003558 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003559
drh44c2eb12003-04-30 11:38:26 +00003560 /* Make sure we have a valid signal handler early, before anything
3561 ** else is done.
3562 */
drh4c504392000-10-16 22:06:40 +00003563#ifdef SIGINT
3564 signal(SIGINT, interrupt_handler);
3565#endif
drh44c2eb12003-04-30 11:38:26 +00003566
drh22fbcb82004-02-01 01:22:50 +00003567 /* Do an initial pass through the command-line argument to locate
3568 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003569 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003570 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003571 */
drh98d312f2012-10-25 15:23:14 +00003572 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003573 char *z;
drhc28490c2006-10-26 14:25:58 +00003574 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003575 if( z[0]!='-' ){
3576 if( data.zDbFilename==0 ){
3577 data.zDbFilename = z;
3578 continue;
3579 }
3580 if( zFirstCmd==0 ){
3581 zFirstCmd = z;
3582 continue;
3583 }
3584 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3585 fprintf(stderr,"Use -help for a list of options.\n");
3586 return 1;
3587 }
drhcc3b4f82012-02-07 14:13:50 +00003588 if( z[1]=='-' ) z++;
3589 if( strcmp(z,"-separator")==0
3590 || strcmp(z,"-nullvalue")==0
3591 || strcmp(z,"-cmd")==0
3592 ){
drh98d312f2012-10-25 15:23:14 +00003593 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003594 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003595 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003596 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003597 /* Need to check for batch mode here to so we can avoid printing
3598 ** informational messages (like from process_sqliterc) before
3599 ** we do the actual processing of arguments later in a second pass.
3600 */
shanef69573d2009-10-24 02:06:14 +00003601 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003602 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003603#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003604 const char *zSize;
3605 sqlite3_int64 szHeap;
3606
drh98d312f2012-10-25 15:23:14 +00003607 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003608 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003609 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003610 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3611#endif
drh97ae8ff2011-03-16 16:56:29 +00003612#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003613 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003614 extern int vfstrace_register(
3615 const char *zTraceName,
3616 const char *zOldVfsName,
3617 int (*xOut)(const char*,void*),
3618 void *pOutArg,
3619 int makeDefault
3620 );
drh2b625e22011-03-16 17:05:28 +00003621 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003622#endif
drh6f25e892011-07-08 17:02:57 +00003623#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003624 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003625 extern int sqlite3_multiple_initialize(const char*,int);
3626 sqlite3_multiplex_initialize(0, 1);
3627#endif
drh7d9f3942013-04-03 01:26:54 +00003628 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003629 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3630 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003631 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003632 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003633 if( pVfs ){
3634 sqlite3_vfs_register(pVfs, 1);
3635 }else{
3636 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3637 exit(1);
3638 }
drh44c2eb12003-04-30 11:38:26 +00003639 }
3640 }
drh98d312f2012-10-25 15:23:14 +00003641 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003642#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003643 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003644 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003645#else
shane86f5bdb2009-10-24 02:00:07 +00003646 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3647 return 1;
drh01b41712005-08-29 23:06:23 +00003648#endif
drh98d312f2012-10-25 15:23:14 +00003649 }
3650 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003651
drh44c2eb12003-04-30 11:38:26 +00003652 /* Go ahead and open the database file if it already exists. If the
3653 ** file does not exist, delay opening it. This prevents empty database
3654 ** files from being created if a user mistypes the database name argument
3655 ** to the sqlite command-line tool.
3656 */
drhc8d74412004-08-31 23:41:26 +00003657 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003658 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003659 }
3660
drh22fbcb82004-02-01 01:22:50 +00003661 /* Process the initialization file if there is one. If no -init option
3662 ** is given on the command line, look for a file named ~/.sqliterc and
3663 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003664 */
shane86f5bdb2009-10-24 02:00:07 +00003665 rc = process_sqliterc(&data,zInitFile);
3666 if( rc>0 ){
3667 return rc;
3668 }
drh44c2eb12003-04-30 11:38:26 +00003669
drh22fbcb82004-02-01 01:22:50 +00003670 /* Make a second pass through the command-line argument and set
3671 ** options. This second pass is delayed until after the initialization
3672 ** file is processed so that the command-line arguments will override
3673 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003674 */
drh98d312f2012-10-25 15:23:14 +00003675 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003676 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003677 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003678 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003679 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003680 i++;
3681 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003682 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003683 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003684 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003685 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003686 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003687 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003688 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003689 }else if( strcmp(z,"-csv")==0 ){
3690 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003691 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003692 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003693 sqlite3_snprintf(sizeof(data.separator), data.separator,
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,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003696 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003697 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003698 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003699 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003700 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003701 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003702 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003703 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003704 }else if( strcmp(z,"-stats")==0 ){
3705 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003706 }else if( strcmp(z,"-bail")==0 ){
3707 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003708 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003709 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003710 return 0;
drhc28490c2006-10-26 14:25:58 +00003711 }else if( strcmp(z,"-interactive")==0 ){
3712 stdin_is_interactive = 1;
3713 }else if( strcmp(z,"-batch")==0 ){
3714 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003715 }else if( strcmp(z,"-heap")==0 ){
3716 i++;
drh7d9f3942013-04-03 01:26:54 +00003717 }else if( strcmp(z,"-mmap")==0 ){
3718 i++;
drha7e61d82011-03-12 17:02:57 +00003719 }else if( strcmp(z,"-vfs")==0 ){
3720 i++;
drh6f25e892011-07-08 17:02:57 +00003721#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003722 }else if( strcmp(z,"-vfstrace")==0 ){
3723 i++;
drh6f25e892011-07-08 17:02:57 +00003724#endif
3725#ifdef SQLITE_ENABLE_MULTIPLEX
3726 }else if( strcmp(z,"-multiplex")==0 ){
3727 i++;
3728#endif
drhcc3b4f82012-02-07 14:13:50 +00003729 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003730 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003731 }else if( strcmp(z,"-cmd")==0 ){
3732 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003733 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003734 if( z[0]=='.' ){
3735 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003736 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003737 }else{
drh05782482013-10-24 15:20:20 +00003738 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003739 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3740 if( zErrMsg!=0 ){
3741 fprintf(stderr,"Error: %s\n", zErrMsg);
3742 if( bail_on_error ) return rc!=0 ? rc : 1;
3743 }else if( rc!=0 ){
3744 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3745 if( bail_on_error ) return rc;
3746 }
3747 }
drh1e5d0e92000-05-31 23:33:17 +00003748 }else{
shane86f5bdb2009-10-24 02:00:07 +00003749 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003750 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003751 return 1;
3752 }
3753 }
drh44c2eb12003-04-30 11:38:26 +00003754
drh22fbcb82004-02-01 01:22:50 +00003755 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003756 /* Run just the command that follows the database name
3757 */
drh22fbcb82004-02-01 01:22:50 +00003758 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003759 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003760 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003761 }else{
drh05782482013-10-24 15:20:20 +00003762 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003763 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003764 if( zErrMsg!=0 ){
3765 fprintf(stderr,"Error: %s\n", zErrMsg);
3766 return rc!=0 ? rc : 1;
3767 }else if( rc!=0 ){
3768 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3769 return rc;
drh6ff13852001-11-25 13:18:23 +00003770 }
drh75897232000-05-29 14:26:00 +00003771 }
3772 }else{
drh44c2eb12003-04-30 11:38:26 +00003773 /* Run commands received from standard input
3774 */
drhc28490c2006-10-26 14:25:58 +00003775 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003776 char *zHome;
3777 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003778 int nHistory;
drh75897232000-05-29 14:26:00 +00003779 printf(
drh743e0032011-12-12 16:51:50 +00003780 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003781 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003782 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003783 );
drhb3735912014-02-10 16:13:42 +00003784 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003785 printf("Connected to a ");
drh5c7976f2014-02-10 19:59:27 +00003786 printBold("transient in-memory database.");
3787 printf("\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003788 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003789 }
drh67505e72002-04-19 12:34:06 +00003790 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003791 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003792 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003793 if( (zHistory = malloc(nHistory))!=0 ){
3794 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3795 }
drh67505e72002-04-19 12:34:06 +00003796 }
drhaaa21b42014-02-11 14:37:51 +00003797#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003798 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003799#endif
drhc28490c2006-10-26 14:25:58 +00003800 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003801 if( zHistory ){
3802 stifle_history(100);
3803 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003804 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003805 }
drhdaffd0e2001-04-11 14:28:42 +00003806 }else{
drhc28490c2006-10-26 14:25:58 +00003807 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003808 }
3809 }
drh33048c02001-10-01 14:29:22 +00003810 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003811 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003812 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003813 }
drh05782482013-10-24 15:20:20 +00003814 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003815 return rc;
drh75897232000-05-29 14:26:00 +00003816}