blob: 1313112709fd096ac43cf5e34aceb8cb816ba0fb [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)
drh07901eb2014-02-28 19:37:45 +000068#ifndef access
69# define access(f,m) _access((f),(m))
70#endif
drh67ceaa62012-08-27 21:19:03 +000071#undef popen
drh53371f92013-07-25 17:07:03 +000072#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000073#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000074#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000075#else
drh4328c8b2003-04-26 02:50:11 +000076/* Make sure isatty() has a prototype.
77*/
drhb2acc3b2011-10-13 16:36:29 +000078extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000079
drh53371f92013-07-25 17:07:03 +000080/* popen and pclose are not C89 functions and so are sometimes omitted from
81** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000082extern FILE *popen(const char*,const char*);
83extern int pclose(FILE*);
84#endif
drh53371f92013-07-25 17:07:03 +000085
chw65d3c132007-11-12 21:09:10 +000086#if defined(_WIN32_WCE)
87/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
88 * thus we always assume that we have a console. That can be
89 * overridden with the -batch command line option.
90 */
91#define isatty(x) 1
92#endif
93
drhf0693c82011-10-11 20:41:54 +000094/* ctype macros that work with signed characters */
95#define IsSpace(X) isspace((unsigned char)X)
96#define IsDigit(X) isdigit((unsigned char)X)
97#define ToLower(X) (char)tolower((unsigned char)X)
98
drh43408312013-10-30 12:43:36 +000099
100/* True if the timer is enabled */
101static int enableTimer = 0;
102
103/* Return the current wall-clock time */
104static sqlite3_int64 timeOfDay(void){
105 static sqlite3_vfs *clockVfs = 0;
106 sqlite3_int64 t;
107 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
108 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
109 clockVfs->xCurrentTimeInt64(clockVfs, &t);
110 }else{
111 double r;
112 clockVfs->xCurrentTime(clockVfs, &r);
113 t = (sqlite3_int64)(r*86400000.0);
114 }
115 return t;
116}
117
drhd5d0f642013-02-20 00:54:21 +0000118#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
119 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000120#include <sys/time.h>
121#include <sys/resource.h>
122
drhda108222009-02-25 19:07:24 +0000123/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000124static struct rusage sBegin; /* CPU time at start */
125static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000126
drhda108222009-02-25 19:07:24 +0000127/*
128** Begin timing an operation
129*/
130static void beginTimer(void){
131 if( enableTimer ){
132 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000133 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000134 }
135}
136
137/* Return the difference of two time_structs in seconds */
138static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
139 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
140 (double)(pEnd->tv_sec - pStart->tv_sec);
141}
142
143/*
144** Print the timing results.
145*/
146static void endTimer(void){
147 if( enableTimer ){
148 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000149 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000150 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000151 printf("Run Time: real %.3f user %f sys %f\n",
152 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000153 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
154 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
155 }
156}
shaneb320ccd2009-10-21 03:42:58 +0000157
drhda108222009-02-25 19:07:24 +0000158#define BEGIN_TIMER beginTimer()
159#define END_TIMER endTimer()
160#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000161
162#elif (defined(_WIN32) || defined(WIN32))
163
164#include <windows.h>
165
166/* Saved resource information for the beginning of an operation */
167static HANDLE hProcess;
168static FILETIME ftKernelBegin;
169static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000170static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000171typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
172static GETPROCTIMES getProcessTimesAddr = NULL;
173
shaneb320ccd2009-10-21 03:42:58 +0000174/*
175** Check to see if we have timer support. Return 1 if necessary
176** support found (or found previously).
177*/
178static int hasTimer(void){
179 if( getProcessTimesAddr ){
180 return 1;
181 } else {
182 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
183 ** See if the version we are running on has it, and if it does, save off
184 ** a pointer to it and the current process handle.
185 */
186 hProcess = GetCurrentProcess();
187 if( hProcess ){
188 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
189 if( NULL != hinstLib ){
190 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
191 if( NULL != getProcessTimesAddr ){
192 return 1;
193 }
194 FreeLibrary(hinstLib);
195 }
196 }
197 }
198 return 0;
199}
200
201/*
202** Begin timing an operation
203*/
204static void beginTimer(void){
205 if( enableTimer && getProcessTimesAddr ){
206 FILETIME ftCreation, ftExit;
207 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000208 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000209 }
210}
211
212/* Return the difference of two FILETIME structs in seconds */
213static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
214 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
215 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
216 return (double) ((i64End - i64Start) / 10000000.0);
217}
218
219/*
220** Print the timing results.
221*/
222static void endTimer(void){
223 if( enableTimer && getProcessTimesAddr){
224 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000225 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000226 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000227 printf("Run Time: real %.3f user %f sys %f\n",
228 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000229 timeDiff(&ftUserBegin, &ftUserEnd),
230 timeDiff(&ftKernelBegin, &ftKernelEnd));
231 }
232}
233
234#define BEGIN_TIMER beginTimer()
235#define END_TIMER endTimer()
236#define HAS_TIMER hasTimer()
237
drhda108222009-02-25 19:07:24 +0000238#else
239#define BEGIN_TIMER
240#define END_TIMER
241#define HAS_TIMER 0
242#endif
243
shanec0688ea2009-03-05 03:48:06 +0000244/*
245** Used to prevent warnings about unused parameters
246*/
247#define UNUSED_PARAMETER(x) (void)(x)
248
drhe91d16b2008-12-08 18:27:31 +0000249/*
drhc49f44e2006-10-26 18:15:42 +0000250** If the following flag is set, then command execution stops
251** at an error if we are not interactive.
252*/
253static int bail_on_error = 0;
254
255/*
drhc28490c2006-10-26 14:25:58 +0000256** Threat stdin as an interactive input if the following variable
257** is true. Otherwise, assume stdin is connected to a file or pipe.
258*/
259static int stdin_is_interactive = 1;
260
261/*
drh4c504392000-10-16 22:06:40 +0000262** The following is the open SQLite database. We make a pointer
263** to this database a static variable so that it can be accessed
264** by the SIGINT handler to interrupt database processing.
265*/
danielk197792f9a1b2004-06-19 09:08:16 +0000266static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000267
268/*
drh67505e72002-04-19 12:34:06 +0000269** True if an interrupt (Control-C) has been received.
270*/
drh43617e92006-03-06 20:55:46 +0000271static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000272
273/*
persicom7e2dfdd2002-04-18 02:46:52 +0000274** This is the name of our program. It is set in main(), used
275** in a number of other places, mostly for error messages.
276*/
277static char *Argv0;
278
279/*
280** Prompt strings. Initialized in main. Settable with
281** .prompt main continue
282*/
283static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
284static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
285
drhb0603412007-02-28 04:47:26 +0000286/*
287** Write I/O traces to the following stream.
288*/
rsebe0a9092007-07-30 18:24:38 +0000289#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000290static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000291#endif
drhb0603412007-02-28 04:47:26 +0000292
293/*
294** This routine works like printf in that its first argument is a
295** format string and subsequent arguments are values to be substituted
296** in place of % fields. The result of formatting this string
297** is written to iotrace.
298*/
rsebe0a9092007-07-30 18:24:38 +0000299#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000300static void iotracePrintf(const char *zFormat, ...){
301 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000302 char *z;
drhb0603412007-02-28 04:47:26 +0000303 if( iotrace==0 ) return;
304 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000305 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000306 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000307 fprintf(iotrace, "%s", z);
308 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000309}
rsebe0a9092007-07-30 18:24:38 +0000310#endif
drhb0603412007-02-28 04:47:26 +0000311
drh44c2eb12003-04-30 11:38:26 +0000312
persicom7e2dfdd2002-04-18 02:46:52 +0000313/*
drh83965662003-04-17 02:54:13 +0000314** Determines if a string is a number of not.
315*/
danielk19772e588c72005-12-09 14:25:08 +0000316static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000317 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000318 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000319 return 0;
320 }
321 z++;
322 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000323 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='.' ){
325 z++;
drhf0693c82011-10-11 20:41:54 +0000326 if( !IsDigit(*z) ) return 0;
327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( realnum ) *realnum = 1;
329 }
330 if( *z=='e' || *z=='E' ){
331 z++;
332 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 return *z==0;
338}
drh83965662003-04-17 02:54:13 +0000339
340/*
danielk1977bc6ada42004-06-30 08:20:16 +0000341** A global char* and an SQL function to access its current value
342** from within an SQL statement. This program used to use the
343** sqlite_exec_printf() API to substitue a string into an SQL statement.
344** The correct way to do this with sqlite3 is to use the bind API, but
345** since the shell is built around the callback paradigm it would be a lot
346** of work. Instead just use this hack, which is quite harmless.
347*/
348static const char *zShellStatic = 0;
349static void shellstaticFunc(
350 sqlite3_context *context,
351 int argc,
352 sqlite3_value **argv
353){
354 assert( 0==argc );
355 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000356 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000357 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000358 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
359}
360
361
362/*
drhfeac5f82004-08-01 00:10:45 +0000363** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000364** the text in memory obtained from malloc() and returns a pointer
365** to the text. NULL is returned at end of file, or if malloc()
366** fails.
367**
drh9f099fd2013-08-06 14:01:46 +0000368** If zLine is not NULL then it is a malloced buffer returned from
369** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000370*/
drh9f099fd2013-08-06 14:01:46 +0000371static char *local_getline(char *zLine, FILE *in){
372 int nLine = zLine==0 ? 0 : 100;
373 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000374
drhb07028f2011-10-14 21:49:18 +0000375 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000376 if( n+100>nLine ){
377 nLine = nLine*2 + 100;
378 zLine = realloc(zLine, nLine);
379 if( zLine==0 ) return 0;
380 }
drhdaffd0e2001-04-11 14:28:42 +0000381 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000382 if( n==0 ){
383 free(zLine);
384 return 0;
385 }
386 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000387 break;
388 }
drh9f099fd2013-08-06 14:01:46 +0000389 while( zLine[n] ) n++;
390 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000391 n--;
shaneh13b36022009-12-17 21:07:15 +0000392 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000393 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000394 break;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 }
drh8e7e7a22000-05-30 18:45:23 +0000397 return zLine;
398}
399
400/*
drhc28490c2006-10-26 14:25:58 +0000401** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000402**
drh9f099fd2013-08-06 14:01:46 +0000403** If in==0 then read from standard input and prompt before each line.
404** If isContinuation is true, then a continuation prompt is appropriate.
405** If isContinuation is zero, then the main prompt should be used.
406**
407** If zPrior is not NULL then it is a buffer from a prior call to this
408** routine that can be reused.
409**
410** The result is stored in space obtained from malloc() and must either
411** be freed by the caller or else passed back into this routine via the
412** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000413*/
drh9f099fd2013-08-06 14:01:46 +0000414static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000415 char *zPrompt;
416 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000417 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000418 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000419 }else{
drh9f099fd2013-08-06 14:01:46 +0000420 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000421#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000422 free(zPrior);
423 zResult = readline(zPrompt);
424 if( zResult && *zResult ) add_history(zResult);
425#else
426 printf("%s", zPrompt);
427 fflush(stdout);
428 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000429#endif
drh9f099fd2013-08-06 14:01:46 +0000430 }
drh8e7e7a22000-05-30 18:45:23 +0000431 return zResult;
432}
433
persicom7e2dfdd2002-04-18 02:46:52 +0000434struct previous_mode_data {
435 int valid; /* Is there legit data in here? */
436 int mode;
437 int showHeader;
438 int colWidth[100];
439};
drh45e29d82006-11-20 16:21:10 +0000440
drh8e7e7a22000-05-30 18:45:23 +0000441/*
drh75897232000-05-29 14:26:00 +0000442** An pointer to an instance of this structure is passed from
443** the main program to the callback. This is used to communicate
444** state and mode information.
445*/
446struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000447 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000448 int echoOn; /* True to echo input commands */
drhefbf3b12014-02-28 20:47:24 +0000449 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL statement */
shaneh642d8b82010-07-28 16:05:34 +0000450 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000451 int cnt; /* Number of records displayed so far */
452 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000453 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000454 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000455 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000456 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000457 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000458 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000459 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000460 int colWidth[100]; /* Requested width of each column when in column mode*/
461 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000462 char nullvalue[20]; /* The text to print when a NULL comes back from
463 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000464 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000465 /* Holds the mode information just before
466 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000467 char outfile[FILENAME_MAX]; /* Filename for *out */
468 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000469 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000470 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000471 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000472 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000473 int *aiIndent; /* Array of indents used in MODE_Explain */
474 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000475 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000476};
477
478/*
479** These are the allowed modes.
480*/
drh967e8b72000-06-21 13:59:10 +0000481#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000482#define MODE_Column 1 /* One record per line in neat columns */
483#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000484#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
485#define MODE_Html 4 /* Generate an XHTML table */
486#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000487#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000488#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000489#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000490
drh66ce4d02008-02-15 17:38:06 +0000491static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000492 "line",
493 "column",
494 "list",
495 "semi",
496 "html",
drhfeac5f82004-08-01 00:10:45 +0000497 "insert",
498 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000499 "csv",
drh66ce4d02008-02-15 17:38:06 +0000500 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000501};
drh75897232000-05-29 14:26:00 +0000502
503/*
504** Number of elements in an array
505*/
drh902b9ee2008-12-05 17:17:07 +0000506#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000507
508/*
drhea678832008-12-10 19:26:22 +0000509** Compute a string length that is limited to what can be stored in
510** lower 30 bits of a 32-bit signed integer.
511*/
drh4f21c4a2008-12-10 22:15:00 +0000512static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000513 const char *z2 = z;
514 while( *z2 ){ z2++; }
515 return 0x3fffffff & (int)(z2 - z);
516}
517
518/*
drh127f9d72010-02-23 01:47:00 +0000519** A callback for the sqlite3_log() interface.
520*/
521static void shellLog(void *pArg, int iErrCode, const char *zMsg){
522 struct callback_data *p = (struct callback_data*)pArg;
523 if( p->pLog==0 ) return;
524 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
525 fflush(p->pLog);
526}
527
528/*
shane626a6e42009-10-22 17:30:15 +0000529** Output the given string as a hex-encoded blob (eg. X'1234' )
530*/
531static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
532 int i;
533 char *zBlob = (char *)pBlob;
534 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000535 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000536 fprintf(out,"'");
537}
538
539/*
drh28bd4bc2000-06-15 15:57:22 +0000540** Output the given string as a quoted string using SQL quoting conventions.
541*/
542static void output_quoted_string(FILE *out, const char *z){
543 int i;
544 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000545 for(i=0; z[i]; i++){
546 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000547 }
548 if( nSingle==0 ){
549 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000550 }else{
551 fprintf(out,"'");
552 while( *z ){
553 for(i=0; z[i] && z[i]!='\''; i++){}
554 if( i==0 ){
555 fprintf(out,"''");
556 z++;
557 }else if( z[i]=='\'' ){
558 fprintf(out,"%.*s''",i,z);
559 z += i+1;
560 }else{
drhcd7d2732002-02-26 23:24:26 +0000561 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000562 break;
563 }
564 }
drhcd7d2732002-02-26 23:24:26 +0000565 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000566 }
567}
568
569/*
drhfeac5f82004-08-01 00:10:45 +0000570** Output the given string as a quoted according to C or TCL quoting rules.
571*/
572static void output_c_string(FILE *out, const char *z){
573 unsigned int c;
574 fputc('"', out);
575 while( (c = *(z++))!=0 ){
576 if( c=='\\' ){
577 fputc(c, out);
578 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000579 }else if( c=='"' ){
580 fputc('\\', out);
581 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000582 }else if( c=='\t' ){
583 fputc('\\', out);
584 fputc('t', out);
585 }else if( c=='\n' ){
586 fputc('\\', out);
587 fputc('n', out);
588 }else if( c=='\r' ){
589 fputc('\\', out);
590 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000591 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000592 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000593 }else{
594 fputc(c, out);
595 }
596 }
597 fputc('"', out);
598}
599
600/*
drhc08a4f12000-06-15 16:49:48 +0000601** Output the given string with characters that are special to
602** HTML escaped.
603*/
604static void output_html_string(FILE *out, const char *z){
605 int i;
drhc3d6ba42014-01-13 20:38:35 +0000606 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000607 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000608 for(i=0; z[i]
609 && z[i]!='<'
610 && z[i]!='&'
611 && z[i]!='>'
612 && z[i]!='\"'
613 && z[i]!='\'';
614 i++){}
drhc08a4f12000-06-15 16:49:48 +0000615 if( i>0 ){
616 fprintf(out,"%.*s",i,z);
617 }
618 if( z[i]=='<' ){
619 fprintf(out,"&lt;");
620 }else if( z[i]=='&' ){
621 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000622 }else if( z[i]=='>' ){
623 fprintf(out,"&gt;");
624 }else if( z[i]=='\"' ){
625 fprintf(out,"&quot;");
626 }else if( z[i]=='\'' ){
627 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000628 }else{
629 break;
630 }
631 z += i + 1;
632 }
633}
634
635/*
drhc49f44e2006-10-26 18:15:42 +0000636** If a field contains any character identified by a 1 in the following
637** array, then the string must be quoted for CSV.
638*/
639static const char needCsvQuote[] = {
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 0, 1, 0, 0, 0, 0, 1, 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, 0,
645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
656};
657
658/*
drh8e64d1c2004-10-07 00:32:39 +0000659** Output a single term of CSV. Actually, p->separator is used for
660** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000661** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000662*/
663static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000664 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000665 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000666 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000667 }else{
drhc49f44e2006-10-26 18:15:42 +0000668 int i;
drh4f21c4a2008-12-10 22:15:00 +0000669 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000670 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000671 if( needCsvQuote[((unsigned char*)z)[i]]
672 || (z[i]==p->separator[0] &&
673 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000674 i = 0;
675 break;
676 }
677 }
678 if( i==0 ){
679 putc('"', out);
680 for(i=0; z[i]; i++){
681 if( z[i]=='"' ) putc('"', out);
682 putc(z[i], out);
683 }
684 putc('"', out);
685 }else{
686 fprintf(out, "%s", z);
687 }
drh8e64d1c2004-10-07 00:32:39 +0000688 }
689 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000690 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000691 }
692}
693
danielk19774af00c62005-01-23 23:43:21 +0000694#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000695/*
drh4c504392000-10-16 22:06:40 +0000696** This routine runs when the user presses Ctrl-C
697*/
698static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000699 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000700 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000701 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000702}
danielk19774af00c62005-01-23 23:43:21 +0000703#endif
drh4c504392000-10-16 22:06:40 +0000704
705/*
shane626a6e42009-10-22 17:30:15 +0000706** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000707** invokes for each row of a query result.
708*/
shane626a6e42009-10-22 17:30:15 +0000709static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000710 int i;
711 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000712
drh75897232000-05-29 14:26:00 +0000713 switch( p->mode ){
714 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000715 int w = 5;
drh6a535342001-10-19 16:44:56 +0000716 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000717 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000718 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000719 if( len>w ) w = len;
720 }
drh75897232000-05-29 14:26:00 +0000721 if( p->cnt++>0 ) fprintf(p->out,"\n");
722 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000723 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000724 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000725 }
726 break;
727 }
danielk19770d78bae2008-01-03 07:09:48 +0000728 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000729 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000730 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000731 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000732 int w, n;
733 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000734 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000735 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000736 w = 0;
drh75897232000-05-29 14:26:00 +0000737 }
drh078b1fd2012-09-21 13:40:02 +0000738 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000739 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000740 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000741 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000742 if( w<n ) w = n;
743 }
744 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000745 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000746 }
747 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000748 if( w<0 ){
749 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
750 }else{
751 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
752 }
drha0c66f52000-07-29 13:20:21 +0000753 }
754 }
755 if( p->showHeader ){
756 for(i=0; i<nArg; i++){
757 int w;
758 if( i<ArraySize(p->actualWidth) ){
759 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000760 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000761 }else{
762 w = 10;
763 }
764 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
765 "----------------------------------------------------------",
766 i==nArg-1 ? "\n": " ");
767 }
drh75897232000-05-29 14:26:00 +0000768 }
769 }
drh6a535342001-10-19 16:44:56 +0000770 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000771 for(i=0; i<nArg; i++){
772 int w;
drha0c66f52000-07-29 13:20:21 +0000773 if( i<ArraySize(p->actualWidth) ){
774 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000775 }else{
776 w = 10;
777 }
dana98bf362013-11-13 18:35:01 +0000778 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000779 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000780 }
dana98bf362013-11-13 18:35:01 +0000781 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000782 if( p->iIndent<p->nIndent ){
783 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000784 }
danc4650bb2013-11-18 08:41:06 +0000785 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000786 }
drh078b1fd2012-09-21 13:40:02 +0000787 if( w<0 ){
788 fprintf(p->out,"%*.*s%s",-w,-w,
789 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
790 }else{
791 fprintf(p->out,"%-*.*s%s",w,w,
792 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
793 }
drh75897232000-05-29 14:26:00 +0000794 }
795 break;
796 }
drhe3710332000-09-29 13:30:53 +0000797 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000798 case MODE_List: {
799 if( p->cnt++==0 && p->showHeader ){
800 for(i=0; i<nArg; i++){
801 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
802 }
803 }
drh6a535342001-10-19 16:44:56 +0000804 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000805 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000806 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000807 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000808 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000809 if( i<nArg-1 ){
810 fprintf(p->out, "%s", p->separator);
811 }else if( p->mode==MODE_Semi ){
812 fprintf(p->out, ";\n");
813 }else{
814 fprintf(p->out, "\n");
815 }
drh75897232000-05-29 14:26:00 +0000816 }
817 break;
818 }
drh1e5d0e92000-05-31 23:33:17 +0000819 case MODE_Html: {
820 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000821 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000822 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000823 fprintf(p->out,"<TH>");
824 output_html_string(p->out, azCol[i]);
825 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000826 }
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000828 }
drh6a535342001-10-19 16:44:56 +0000829 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000830 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000831 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000832 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000833 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000834 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000835 }
mihailim57c591a2008-06-23 21:26:05 +0000836 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000837 break;
838 }
drhfeac5f82004-08-01 00:10:45 +0000839 case MODE_Tcl: {
840 if( p->cnt++==0 && p->showHeader ){
841 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000842 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000843 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000844 }
845 fprintf(p->out,"\n");
846 }
847 if( azArg==0 ) break;
848 for(i=0; i<nArg; i++){
849 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000850 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000851 }
852 fprintf(p->out,"\n");
853 break;
854 }
drh8e64d1c2004-10-07 00:32:39 +0000855 case MODE_Csv: {
856 if( p->cnt++==0 && p->showHeader ){
857 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000858 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000859 }
860 fprintf(p->out,"\n");
861 }
862 if( azArg==0 ) break;
863 for(i=0; i<nArg; i++){
864 output_csv(p, azArg[i], i<nArg-1);
865 }
866 fprintf(p->out,"\n");
867 break;
868 }
drh28bd4bc2000-06-15 15:57:22 +0000869 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000870 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000871 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000872 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000873 for(i=0; i<nArg; i++){
874 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000875 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000876 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000877 }else if( aiType && aiType[i]==SQLITE_TEXT ){
878 if( zSep[0] ) fprintf(p->out,"%s",zSep);
879 output_quoted_string(p->out, azArg[i]);
880 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
881 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000882 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
883 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
884 int nBlob = sqlite3_column_bytes(p->pStmt, i);
885 if( zSep[0] ) fprintf(p->out,"%s",zSep);
886 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000887 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000888 fprintf(p->out,"%s%s",zSep, azArg[i]);
889 }else{
890 if( zSep[0] ) fprintf(p->out,"%s",zSep);
891 output_quoted_string(p->out, azArg[i]);
892 }
893 }
894 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000895 break;
drh28bd4bc2000-06-15 15:57:22 +0000896 }
persicom1d0b8722002-04-18 02:53:04 +0000897 }
drh75897232000-05-29 14:26:00 +0000898 return 0;
899}
900
901/*
shane626a6e42009-10-22 17:30:15 +0000902** This is the callback routine that the SQLite library
903** invokes for each row of a query result.
904*/
905static int callback(void *pArg, int nArg, char **azArg, char **azCol){
906 /* since we don't have type info, call the shell_callback with a NULL value */
907 return shell_callback(pArg, nArg, azArg, azCol, NULL);
908}
909
910/*
drh33048c02001-10-01 14:29:22 +0000911** Set the destination table field of the callback_data structure to
912** the name of the table given. Escape any quote characters in the
913** table name.
914*/
915static void set_table_name(struct callback_data *p, const char *zName){
916 int i, n;
917 int needQuote;
918 char *z;
919
920 if( p->zDestTable ){
921 free(p->zDestTable);
922 p->zDestTable = 0;
923 }
924 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000925 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000926 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000927 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000928 needQuote = 1;
929 if( zName[i]=='\'' ) n++;
930 }
931 }
932 if( needQuote ) n += 2;
933 z = p->zDestTable = malloc( n+1 );
934 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000935 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000936 exit(1);
937 }
938 n = 0;
939 if( needQuote ) z[n++] = '\'';
940 for(i=0; zName[i]; i++){
941 z[n++] = zName[i];
942 if( zName[i]=='\'' ) z[n++] = '\'';
943 }
944 if( needQuote ) z[n++] = '\'';
945 z[n] = 0;
946}
947
danielk19772a02e332004-06-05 08:04:36 +0000948/* zIn is either a pointer to a NULL-terminated string in memory obtained
949** from malloc(), or a NULL pointer. The string pointed to by zAppend is
950** added to zIn, and the result returned in memory obtained from malloc().
951** zIn, if it was not NULL, is freed.
952**
953** If the third argument, quote, is not '\0', then it is used as a
954** quote character for zAppend.
955*/
drhc28490c2006-10-26 14:25:58 +0000956static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000957 int len;
958 int i;
drh4f21c4a2008-12-10 22:15:00 +0000959 int nAppend = strlen30(zAppend);
960 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000961
962 len = nAppend+nIn+1;
963 if( quote ){
964 len += 2;
965 for(i=0; i<nAppend; i++){
966 if( zAppend[i]==quote ) len++;
967 }
968 }
969
970 zIn = (char *)realloc(zIn, len);
971 if( !zIn ){
972 return 0;
973 }
974
975 if( quote ){
976 char *zCsr = &zIn[nIn];
977 *zCsr++ = quote;
978 for(i=0; i<nAppend; i++){
979 *zCsr++ = zAppend[i];
980 if( zAppend[i]==quote ) *zCsr++ = quote;
981 }
982 *zCsr++ = quote;
983 *zCsr++ = '\0';
984 assert( (zCsr-zIn)==len );
985 }else{
986 memcpy(&zIn[nIn], zAppend, nAppend);
987 zIn[len-1] = '\0';
988 }
989
990 return zIn;
991}
992
drhdd3d4592004-08-30 01:54:05 +0000993
994/*
drhb21a8e42012-01-28 21:08:51 +0000995** Execute a query statement that will generate SQL output. Print
996** the result columns, comma-separated, on a line and then add a
997** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000998**
drhb21a8e42012-01-28 21:08:51 +0000999** If the number of columns is 1 and that column contains text "--"
1000** then write the semicolon on a separate line. That way, if a
1001** "--" comment occurs at the end of the statement, the comment
1002** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001003*/
drh157e29a2009-05-21 15:15:00 +00001004static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001005 struct callback_data *p, /* Query context */
1006 const char *zSelect, /* SELECT statement to extract content */
1007 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001008){
drhdd3d4592004-08-30 01:54:05 +00001009 sqlite3_stmt *pSelect;
1010 int rc;
drhb21a8e42012-01-28 21:08:51 +00001011 int nResult;
1012 int i;
1013 const char *z;
drhc7181902014-02-27 15:04:13 +00001014 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001015 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001016 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001017 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001018 return rc;
1019 }
1020 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001021 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001022 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001023 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001024 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001025 zFirstRow = 0;
1026 }
drhb21a8e42012-01-28 21:08:51 +00001027 z = (const char*)sqlite3_column_text(pSelect, 0);
1028 fprintf(p->out, "%s", z);
1029 for(i=1; i<nResult; i++){
1030 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1031 }
1032 if( z==0 ) z = "";
1033 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1034 if( z[0] ){
1035 fprintf(p->out, "\n;\n");
1036 }else{
1037 fprintf(p->out, ";\n");
1038 }
drhdd3d4592004-08-30 01:54:05 +00001039 rc = sqlite3_step(pSelect);
1040 }
drh2f464a02011-10-13 00:41:49 +00001041 rc = sqlite3_finalize(pSelect);
1042 if( rc!=SQLITE_OK ){
1043 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001044 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001045 }
1046 return rc;
drhdd3d4592004-08-30 01:54:05 +00001047}
1048
shane626a6e42009-10-22 17:30:15 +00001049/*
1050** Allocate space and save off current error string.
1051*/
1052static char *save_err_msg(
1053 sqlite3 *db /* Database to query */
1054){
1055 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1056 char *zErrMsg = sqlite3_malloc(nErrMsg);
1057 if( zErrMsg ){
1058 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1059 }
1060 return zErrMsg;
1061}
1062
1063/*
shaneh642d8b82010-07-28 16:05:34 +00001064** Display memory stats.
1065*/
1066static int display_stats(
1067 sqlite3 *db, /* Database to query */
1068 struct callback_data *pArg, /* Pointer to struct callback_data */
1069 int bReset /* True to reset the stats */
1070){
1071 int iCur;
1072 int iHiwtr;
1073
1074 if( pArg && pArg->out ){
1075
1076 iHiwtr = iCur = -1;
1077 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001078 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001079 iHiwtr = iCur = -1;
1080 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001081 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001082/*
1083** Not currently used by the CLI.
1084** iHiwtr = iCur = -1;
1085** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1086** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1087*/
1088 iHiwtr = iCur = -1;
1089 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1090 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1091/*
1092** Not currently used by the CLI.
1093** iHiwtr = iCur = -1;
1094** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1095** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1096*/
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1106 iHiwtr = iCur = -1;
1107 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1108 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1109#ifdef YYTRACKMAXSTACKDEPTH
1110 iHiwtr = iCur = -1;
1111 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1112 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1113#endif
1114 }
1115
1116 if( pArg && pArg->out && db ){
1117 iHiwtr = iCur = -1;
1118 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001120 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1121 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1122 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1123 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1125 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001126 iHiwtr = iCur = -1;
1127 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001128 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1131 iHiwtr = iCur = -1;
1132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001134 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1136 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1137 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001138 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1140 iHiwtr = iCur = -1;
1141 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1142 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1143 }
1144
1145 if( pArg && pArg->out && db && pArg->pStmt ){
1146 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1147 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1148 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1149 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1150 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1151 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001152 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1153 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001154 }
1155
1156 return 0;
1157}
1158
1159/*
dana98bf362013-11-13 18:35:01 +00001160** Parameter azArray points to a zero-terminated array of strings. zStr
1161** points to a single nul-terminated string. Return non-zero if zStr
1162** is equal, according to strcmp(), to any of the strings in the array.
1163** Otherwise, return zero.
1164*/
1165static int str_in_array(const char *zStr, const char **azArray){
1166 int i;
1167 for(i=0; azArray[i]; i++){
1168 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1169 }
1170 return 0;
1171}
1172
1173/*
1174** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1175** and populate the callback_data.aiIndent[] array with the number of
1176** spaces each opcode should be indented before it is output.
1177**
1178** The indenting rules are:
1179**
1180** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1181** all opcodes that occur between the p2 jump destination and the opcode
1182** itself by 2 spaces.
1183**
drh01752bc2013-11-14 23:59:33 +00001184** * For each "Goto", if the jump destination is earlier in the program
1185** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001186** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001187** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001188** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001189** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001190*/
1191static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1192 const char *zSql; /* The text of the SQL statement */
1193 const char *z; /* Used to check if this is an EXPLAIN */
1194 int *abYield = 0; /* True if op is an OP_Yield */
1195 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001196 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001197
drh8ad0de32014-03-20 18:45:27 +00001198 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1199 "NextIfOpen", "PrevIfOpen", 0 };
drhe73f0592014-01-21 22:25:45 +00001200 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001201 const char *azGoto[] = { "Goto", 0 };
1202
1203 /* Try to figure out if this is really an EXPLAIN statement. If this
1204 ** cannot be verified, return early. */
1205 zSql = sqlite3_sql(pSql);
1206 if( zSql==0 ) return;
1207 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1208 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1209
1210 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1211 int i;
danc4650bb2013-11-18 08:41:06 +00001212 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001213 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001214
1215 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1216 ** p2 is an instruction address, set variable p2op to the index of that
1217 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1218 ** the current instruction is part of a sub-program generated by an
1219 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001220 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001221 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001222
1223 /* Grow the p->aiIndent array as required */
1224 if( iOp>=nAlloc ){
1225 nAlloc += 100;
1226 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1227 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1228 }
1229 abYield[iOp] = str_in_array(zOp, azYield);
1230 p->aiIndent[iOp] = 0;
1231 p->nIndent = iOp+1;
1232
1233 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001234 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001235 }
drhfe705102014-03-06 13:38:37 +00001236 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1237 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1238 ){
drhe73f0592014-01-21 22:25:45 +00001239 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001240 }
1241 }
1242
danc4650bb2013-11-18 08:41:06 +00001243 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001244 sqlite3_free(abYield);
1245 sqlite3_reset(pSql);
1246}
1247
1248/*
1249** Free the array allocated by explain_data_prepare().
1250*/
1251static void explain_data_delete(struct callback_data *p){
1252 sqlite3_free(p->aiIndent);
1253 p->aiIndent = 0;
1254 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001255 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001256}
1257
1258/*
shane626a6e42009-10-22 17:30:15 +00001259** Execute a statement or set of statements. Print
1260** any result rows/columns depending on the current mode
1261** set via the supplied callback.
1262**
1263** This is very similar to SQLite's built-in sqlite3_exec()
1264** function except it takes a slightly different callback
1265** and callback data argument.
1266*/
1267static int shell_exec(
1268 sqlite3 *db, /* An open database */
1269 const char *zSql, /* SQL to be evaluated */
1270 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1271 /* (not the same as sqlite3_exec) */
1272 struct callback_data *pArg, /* Pointer to struct callback_data */
1273 char **pzErrMsg /* Error msg written here */
1274){
dan4564ced2010-01-05 04:59:56 +00001275 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1276 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001277 int rc2;
dan4564ced2010-01-05 04:59:56 +00001278 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001279
1280 if( pzErrMsg ){
1281 *pzErrMsg = NULL;
1282 }
1283
shaneb9fc17d2009-10-22 21:23:35 +00001284 while( zSql[0] && (SQLITE_OK == rc) ){
1285 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1286 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001287 if( pzErrMsg ){
1288 *pzErrMsg = save_err_msg(db);
1289 }
1290 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001291 if( !pStmt ){
1292 /* this happens for a comment or white-space */
1293 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001294 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001295 continue;
1296 }
shane626a6e42009-10-22 17:30:15 +00001297
shaneh642d8b82010-07-28 16:05:34 +00001298 /* save off the prepared statment handle and reset row count */
1299 if( pArg ){
1300 pArg->pStmt = pStmt;
1301 pArg->cnt = 0;
1302 }
1303
shanehb7977c52010-01-18 18:17:10 +00001304 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001305 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001306 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001307 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001308 }
shanehb7977c52010-01-18 18:17:10 +00001309
drhefbf3b12014-02-28 20:47:24 +00001310 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1311 if( pArg && pArg->autoEQP ){
1312 sqlite3_stmt *pExplain;
1313 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1314 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1315 if( rc==SQLITE_OK ){
1316 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1317 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1318 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1319 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1320 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1321 }
1322 }
1323 sqlite3_finalize(pExplain);
1324 sqlite3_free(zEQP);
1325 }
1326
drh7e02e5e2011-12-06 19:44:51 +00001327 /* Output TESTCTRL_EXPLAIN text of requested */
1328 if( pArg && pArg->mode==MODE_Explain ){
1329 const char *zExplain = 0;
1330 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1331 if( zExplain && zExplain[0] ){
1332 fprintf(pArg->out, "%s", zExplain);
1333 }
1334 }
1335
dana98bf362013-11-13 18:35:01 +00001336 /* If the shell is currently in ".explain" mode, gather the extra
1337 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001338 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001339 explain_data_prepare(pArg, pStmt);
1340 }
1341
shaneb9fc17d2009-10-22 21:23:35 +00001342 /* perform the first step. this will tell us if we
1343 ** have a result set or not and how wide it is.
1344 */
1345 rc = sqlite3_step(pStmt);
1346 /* if we have a result set... */
1347 if( SQLITE_ROW == rc ){
1348 /* if we have a callback... */
1349 if( xCallback ){
1350 /* allocate space for col name ptr, value ptr, and type */
1351 int nCol = sqlite3_column_count(pStmt);
1352 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1353 if( !pData ){
1354 rc = SQLITE_NOMEM;
1355 }else{
1356 char **azCols = (char **)pData; /* Names of result columns */
1357 char **azVals = &azCols[nCol]; /* Results */
1358 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001359 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001360 assert(sizeof(int) <= sizeof(char *));
1361 /* save off ptrs to column names */
1362 for(i=0; i<nCol; i++){
1363 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1364 }
shaneb9fc17d2009-10-22 21:23:35 +00001365 do{
1366 /* extract the data and data types */
1367 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001368 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001369 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001370 azVals[i] = "";
1371 }else{
1372 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1373 }
shaneb9fc17d2009-10-22 21:23:35 +00001374 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1375 rc = SQLITE_NOMEM;
1376 break; /* from for */
1377 }
1378 } /* end for */
1379
1380 /* if data and types extracted successfully... */
1381 if( SQLITE_ROW == rc ){
1382 /* call the supplied callback with the result row data */
1383 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1384 rc = SQLITE_ABORT;
1385 }else{
1386 rc = sqlite3_step(pStmt);
1387 }
1388 }
1389 } while( SQLITE_ROW == rc );
1390 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001391 }
1392 }else{
1393 do{
1394 rc = sqlite3_step(pStmt);
1395 } while( rc == SQLITE_ROW );
1396 }
1397 }
1398
dana98bf362013-11-13 18:35:01 +00001399 explain_data_delete(pArg);
1400
shaneh642d8b82010-07-28 16:05:34 +00001401 /* print usage stats if stats on */
1402 if( pArg && pArg->statsOn ){
1403 display_stats(db, pArg, 0);
1404 }
1405
dan4564ced2010-01-05 04:59:56 +00001406 /* Finalize the statement just executed. If this fails, save a
1407 ** copy of the error message. Otherwise, set zSql to point to the
1408 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001409 rc2 = sqlite3_finalize(pStmt);
1410 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001411 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001412 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001413 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001414 }else if( pzErrMsg ){
1415 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001416 }
shaneh642d8b82010-07-28 16:05:34 +00001417
1418 /* clear saved stmt handle */
1419 if( pArg ){
1420 pArg->pStmt = NULL;
1421 }
shane626a6e42009-10-22 17:30:15 +00001422 }
shaneb9fc17d2009-10-22 21:23:35 +00001423 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001424
1425 return rc;
1426}
1427
drhdd3d4592004-08-30 01:54:05 +00001428
drh33048c02001-10-01 14:29:22 +00001429/*
drh4c653a02000-06-07 01:27:47 +00001430** This is a different callback routine used for dumping the database.
1431** Each row received by this callback consists of a table name,
1432** the table type ("index" or "table") and SQL to create the table.
1433** This routine should print text sufficient to recreate the table.
1434*/
1435static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001436 int rc;
1437 const char *zTable;
1438 const char *zType;
1439 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001440 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001441 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001442
drh902b9ee2008-12-05 17:17:07 +00001443 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001444 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001445 zTable = azArg[0];
1446 zType = azArg[1];
1447 zSql = azArg[2];
1448
drh00b950d2005-09-11 02:03:03 +00001449 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001450 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001451 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001452 fprintf(p->out, "ANALYZE sqlite_master;\n");
1453 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1454 return 0;
drh45e29d82006-11-20 16:21:10 +00001455 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1456 char *zIns;
1457 if( !p->writableSchema ){
1458 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1459 p->writableSchema = 1;
1460 }
1461 zIns = sqlite3_mprintf(
1462 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1463 "VALUES('table','%q','%q',0,'%q');",
1464 zTable, zTable, zSql);
1465 fprintf(p->out, "%s\n", zIns);
1466 sqlite3_free(zIns);
1467 return 0;
drh00b950d2005-09-11 02:03:03 +00001468 }else{
1469 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001470 }
danielk19772a02e332004-06-05 08:04:36 +00001471
1472 if( strcmp(zType, "table")==0 ){
1473 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001474 char *zSelect = 0;
1475 char *zTableInfo = 0;
1476 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001477 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001478
1479 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1480 zTableInfo = appendText(zTableInfo, zTable, '"');
1481 zTableInfo = appendText(zTableInfo, ");", 0);
1482
drhc7181902014-02-27 15:04:13 +00001483 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001484 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001485 if( rc!=SQLITE_OK || !pTableInfo ){
1486 return 1;
1487 }
1488
1489 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001490 /* Always quote the table name, even if it appears to be pure ascii,
1491 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1492 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001493 if( zTmp ){
1494 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001495 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001496 }
1497 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1498 rc = sqlite3_step(pTableInfo);
1499 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001500 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001501 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001502 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001503 rc = sqlite3_step(pTableInfo);
1504 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001505 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001506 }else{
1507 zSelect = appendText(zSelect, ") ", 0);
1508 }
drh157e29a2009-05-21 15:15:00 +00001509 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001510 }
1511 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001512 if( rc!=SQLITE_OK || nRow==0 ){
1513 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001514 return 1;
1515 }
1516 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1517 zSelect = appendText(zSelect, zTable, '"');
1518
drh2f464a02011-10-13 00:41:49 +00001519 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001520 if( rc==SQLITE_CORRUPT ){
1521 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001522 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001523 }
drh85e72432012-04-11 11:38:53 +00001524 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001525 }
drh4c653a02000-06-07 01:27:47 +00001526 return 0;
1527}
1528
1529/*
drh45e29d82006-11-20 16:21:10 +00001530** Run zQuery. Use dump_callback() as the callback routine so that
1531** the contents of the query are output as SQL statements.
1532**
drhdd3d4592004-08-30 01:54:05 +00001533** If we get a SQLITE_CORRUPT error, rerun the query after appending
1534** "ORDER BY rowid DESC" to the end.
1535*/
1536static int run_schema_dump_query(
1537 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001538 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001539){
1540 int rc;
drh2f464a02011-10-13 00:41:49 +00001541 char *zErr = 0;
1542 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001543 if( rc==SQLITE_CORRUPT ){
1544 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001545 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001546 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1547 if( zErr ){
1548 fprintf(p->out, "/****** %s ******/\n", zErr);
1549 sqlite3_free(zErr);
1550 zErr = 0;
1551 }
drhdd3d4592004-08-30 01:54:05 +00001552 zQ2 = malloc( len+100 );
1553 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001554 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001555 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1556 if( rc ){
1557 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1558 }else{
1559 rc = SQLITE_CORRUPT;
1560 }
1561 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001562 free(zQ2);
1563 }
1564 return rc;
1565}
1566
1567/*
drh75897232000-05-29 14:26:00 +00001568** Text of a help message
1569*/
persicom1d0b8722002-04-18 02:53:04 +00001570static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001571 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001572 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001573 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001574 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001575 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001576 " If TABLE specified, only dump tables matching\n"
1577 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001578 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001579 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001580 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1581 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001582 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001583 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001584 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001585 ".indices ?TABLE? Show names of all indices\n"
1586 " If TABLE specified, only show indices for tables\n"
1587 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001588#ifdef SQLITE_ENABLE_IOTRACE
1589 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1590#endif
drh70df4fe2006-06-13 15:12:21 +00001591#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001592 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001593#endif
drh127f9d72010-02-23 01:47:00 +00001594 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001595 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001596 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001597 " column Left-aligned columns. (See .width)\n"
1598 " html HTML <table> code\n"
1599 " insert SQL insert statements for TABLE\n"
1600 " line One value per line\n"
1601 " list Values delimited by .separator string\n"
1602 " tabs Tab-separated values\n"
1603 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001604 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001605 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001606 ".output FILENAME Send output to FILENAME\n"
1607 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001608 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001609 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001610 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001611 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001612 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001613 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001614 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001615 " If TABLE specified, only show tables matching\n"
1616 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001617 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001618 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001619 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001620 ".tables ?TABLE? List names of tables\n"
1621 " If TABLE specified, only list tables matching\n"
1622 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001623 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001624 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001625 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001626 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001627;
1628
shaneb320ccd2009-10-21 03:42:58 +00001629static char zTimerHelp[] =
1630 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1631;
1632
drhdaffd0e2001-04-11 14:28:42 +00001633/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001634static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001635
drh75897232000-05-29 14:26:00 +00001636/*
drh44c2eb12003-04-30 11:38:26 +00001637** Make sure the database is open. If it is not, then open it. If
1638** the database fails to open, print an error message and exit.
1639*/
drh05782482013-10-24 15:20:20 +00001640static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001641 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001642 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001643 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001644 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001645 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1646 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1647 shellstaticFunc, 0, 0);
1648 }
1649 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001650 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001651 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001652 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001653 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001654 }
drhc2e87a32006-06-27 15:16:14 +00001655#ifndef SQLITE_OMIT_LOAD_EXTENSION
1656 sqlite3_enable_load_extension(p->db, 1);
1657#endif
drh44c2eb12003-04-30 11:38:26 +00001658 }
1659}
1660
1661/*
drhfeac5f82004-08-01 00:10:45 +00001662** Do C-language style dequoting.
1663**
1664** \t -> tab
1665** \n -> newline
1666** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001667** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001668** \NNN -> ascii character NNN in octal
1669** \\ -> backslash
1670*/
1671static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001672 int i, j;
1673 char c;
drhfeac5f82004-08-01 00:10:45 +00001674 for(i=j=0; (c = z[i])!=0; i++, j++){
1675 if( c=='\\' ){
1676 c = z[++i];
1677 if( c=='n' ){
1678 c = '\n';
1679 }else if( c=='t' ){
1680 c = '\t';
1681 }else if( c=='r' ){
1682 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001683 }else if( c=='\\' ){
1684 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001685 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001686 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001687 if( z[i+1]>='0' && z[i+1]<='7' ){
1688 i++;
1689 c = (c<<3) + z[i] - '0';
1690 if( z[i+1]>='0' && z[i+1]<='7' ){
1691 i++;
1692 c = (c<<3) + z[i] - '0';
1693 }
1694 }
1695 }
1696 }
1697 z[j] = c;
1698 }
1699 z[j] = 0;
1700}
1701
1702/*
drh348d19c2013-06-03 12:47:43 +00001703** Return the value of a hexadecimal digit. Return -1 if the input
1704** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001705*/
drh348d19c2013-06-03 12:47:43 +00001706static int hexDigitValue(char c){
1707 if( c>='0' && c<='9' ) return c - '0';
1708 if( c>='a' && c<='f' ) return c - 'a' + 10;
1709 if( c>='A' && c<='F' ) return c - 'A' + 10;
1710 return -1;
drhc28490c2006-10-26 14:25:58 +00001711}
1712
1713/*
drh7d9f3942013-04-03 01:26:54 +00001714** Interpret zArg as an integer value, possibly with suffixes.
1715*/
1716static sqlite3_int64 integerValue(const char *zArg){
1717 sqlite3_int64 v = 0;
1718 static const struct { char *zSuffix; int iMult; } aMult[] = {
1719 { "KiB", 1024 },
1720 { "MiB", 1024*1024 },
1721 { "GiB", 1024*1024*1024 },
1722 { "KB", 1000 },
1723 { "MB", 1000000 },
1724 { "GB", 1000000000 },
1725 { "K", 1000 },
1726 { "M", 1000000 },
1727 { "G", 1000000000 },
1728 };
1729 int i;
1730 int isNeg = 0;
1731 if( zArg[0]=='-' ){
1732 isNeg = 1;
1733 zArg++;
1734 }else if( zArg[0]=='+' ){
1735 zArg++;
1736 }
drh348d19c2013-06-03 12:47:43 +00001737 if( zArg[0]=='0' && zArg[1]=='x' ){
1738 int x;
1739 zArg += 2;
1740 while( (x = hexDigitValue(zArg[0]))>=0 ){
1741 v = (v<<4) + x;
1742 zArg++;
1743 }
1744 }else{
1745 while( IsDigit(zArg[0]) ){
1746 v = v*10 + zArg[0] - '0';
1747 zArg++;
1748 }
drh7d9f3942013-04-03 01:26:54 +00001749 }
drhc2bed0a2013-05-24 11:57:50 +00001750 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001751 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1752 v *= aMult[i].iMult;
1753 break;
1754 }
1755 }
1756 return isNeg? -v : v;
1757}
1758
1759/*
drh348d19c2013-06-03 12:47:43 +00001760** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1761** for TRUE and FALSE. Return the integer value if appropriate.
1762*/
1763static int booleanValue(char *zArg){
1764 int i;
1765 if( zArg[0]=='0' && zArg[1]=='x' ){
1766 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1767 }else{
1768 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1769 }
1770 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1771 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1772 return 1;
1773 }
1774 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1775 return 0;
1776 }
1777 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1778 zArg);
1779 return 0;
1780}
1781
1782/*
drh42f64e52012-04-04 16:56:23 +00001783** Close an output file, assuming it is not stderr or stdout
1784*/
1785static void output_file_close(FILE *f){
1786 if( f && f!=stdout && f!=stderr ) fclose(f);
1787}
1788
1789/*
1790** Try to open an output file. The names "stdout" and "stderr" are
1791** recognized and do the right thing. NULL is returned if the output
1792** filename is "off".
1793*/
1794static FILE *output_file_open(const char *zFile){
1795 FILE *f;
1796 if( strcmp(zFile,"stdout")==0 ){
1797 f = stdout;
1798 }else if( strcmp(zFile, "stderr")==0 ){
1799 f = stderr;
1800 }else if( strcmp(zFile, "off")==0 ){
1801 f = 0;
1802 }else{
1803 f = fopen(zFile, "wb");
1804 if( f==0 ){
1805 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1806 }
1807 }
1808 return f;
1809}
1810
1811/*
1812** A routine for handling output from sqlite3_trace().
1813*/
1814static void sql_trace_callback(void *pArg, const char *z){
1815 FILE *f = (FILE*)pArg;
1816 if( f ) fprintf(f, "%s\n", z);
1817}
1818
1819/*
drhd8621b92012-04-17 09:09:33 +00001820** A no-op routine that runs with the ".breakpoint" doc-command. This is
1821** a useful spot to set a debugger breakpoint.
1822*/
1823static void test_breakpoint(void){
1824 static int nCall = 0;
1825 nCall++;
1826}
1827
1828/*
drhdb95f682013-06-26 22:46:00 +00001829** An object used to read a CSV file
1830*/
1831typedef struct CSVReader CSVReader;
1832struct CSVReader {
1833 const char *zFile; /* Name of the input file */
1834 FILE *in; /* Read the CSV text from this input stream */
1835 char *z; /* Accumulated text for a field */
1836 int n; /* Number of bytes in z */
1837 int nAlloc; /* Space allocated for z[] */
1838 int nLine; /* Current line number */
1839 int cTerm; /* Character that terminated the most recent field */
1840 int cSeparator; /* The separator character. (Usually ",") */
1841};
1842
1843/* Append a single byte to z[] */
1844static void csv_append_char(CSVReader *p, int c){
1845 if( p->n+1>=p->nAlloc ){
1846 p->nAlloc += p->nAlloc + 100;
1847 p->z = sqlite3_realloc(p->z, p->nAlloc);
1848 if( p->z==0 ){
1849 fprintf(stderr, "out of memory\n");
1850 exit(1);
1851 }
1852 }
1853 p->z[p->n++] = (char)c;
1854}
1855
1856/* Read a single field of CSV text. Compatible with rfc4180 and extended
1857** with the option of having a separator other than ",".
1858**
1859** + Input comes from p->in.
1860** + Store results in p->z of length p->n. Space to hold p->z comes
1861** from sqlite3_malloc().
1862** + Use p->cSep as the separator. The default is ",".
1863** + Keep track of the line number in p->nLine.
1864** + Store the character that terminates the field in p->cTerm. Store
1865** EOF on end-of-file.
1866** + Report syntax errors on stderr
1867*/
1868static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001869 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001870 int cSep = p->cSeparator;
1871 p->n = 0;
1872 c = fgetc(p->in);
1873 if( c==EOF || seenInterrupt ){
1874 p->cTerm = EOF;
1875 return 0;
1876 }
1877 if( c=='"' ){
1878 int startLine = p->nLine;
1879 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001880 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001881 while( 1 ){
1882 c = fgetc(p->in);
1883 if( c=='\n' ) p->nLine++;
1884 if( c==cQuote ){
1885 if( pc==cQuote ){
1886 pc = 0;
1887 continue;
1888 }
1889 }
1890 if( (c==cSep && pc==cQuote)
1891 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001892 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001893 || (c==EOF && pc==cQuote)
1894 ){
1895 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001896 p->cTerm = c;
1897 break;
1898 }
1899 if( pc==cQuote && c!='\r' ){
1900 fprintf(stderr, "%s:%d: unescaped %c character\n",
1901 p->zFile, p->nLine, cQuote);
1902 }
1903 if( c==EOF ){
1904 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1905 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001906 p->cTerm = EOF;
1907 break;
1908 }
1909 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001910 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001911 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001912 }
drhdb95f682013-06-26 22:46:00 +00001913 }else{
drhd0a64dc2013-06-30 20:24:26 +00001914 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001915 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001916 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001917 }
1918 if( c=='\n' ){
1919 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001920 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001921 }
drhdb95f682013-06-26 22:46:00 +00001922 p->cTerm = c;
1923 }
drh8dd675e2013-07-12 21:09:24 +00001924 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001925 return p->z;
1926}
1927
1928/*
drh4bbcf102014-02-06 02:46:08 +00001929** Try to transfer data for table zTable. If an error is seen while
1930** moving forward, try to go backwards. The backwards movement won't
1931** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001932*/
mistachkine31ae902014-02-06 01:15:29 +00001933static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001934 struct callback_data *p,
1935 sqlite3 *newDb,
1936 const char *zTable
1937){
1938 sqlite3_stmt *pQuery = 0;
1939 sqlite3_stmt *pInsert = 0;
1940 char *zQuery = 0;
1941 char *zInsert = 0;
1942 int rc;
1943 int i, j, n;
1944 int nTable = (int)strlen(zTable);
1945 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001946 int cnt = 0;
1947 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001948
1949 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1950 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1951 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001952 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001953 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1954 zQuery);
1955 goto end_data_xfer;
1956 }
1957 n = sqlite3_column_count(pQuery);
1958 zInsert = sqlite3_malloc(200 + nTable + n*3);
1959 if( zInsert==0 ){
1960 fprintf(stderr, "out of memory\n");
1961 goto end_data_xfer;
1962 }
1963 sqlite3_snprintf(200+nTable,zInsert,
1964 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1965 i = (int)strlen(zInsert);
1966 for(j=1; j<n; j++){
1967 memcpy(zInsert+i, ",?", 2);
1968 i += 2;
1969 }
1970 memcpy(zInsert+i, ");", 3);
1971 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1972 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001973 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001974 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1975 zQuery);
1976 goto end_data_xfer;
1977 }
1978 for(k=0; k<2; k++){
1979 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1980 for(i=0; i<n; i++){
1981 switch( sqlite3_column_type(pQuery, i) ){
1982 case SQLITE_NULL: {
1983 sqlite3_bind_null(pInsert, i+1);
1984 break;
1985 }
1986 case SQLITE_INTEGER: {
1987 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1988 break;
1989 }
1990 case SQLITE_FLOAT: {
1991 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1992 break;
1993 }
1994 case SQLITE_TEXT: {
1995 sqlite3_bind_text(pInsert, i+1,
1996 (const char*)sqlite3_column_text(pQuery,i),
1997 -1, SQLITE_STATIC);
1998 break;
1999 }
2000 case SQLITE_BLOB: {
2001 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2002 sqlite3_column_bytes(pQuery,i),
2003 SQLITE_STATIC);
2004 break;
2005 }
2006 }
2007 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002008 rc = sqlite3_step(pInsert);
2009 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2010 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2011 sqlite3_errmsg(newDb));
2012 }
drh3350ce92014-02-06 00:49:12 +00002013 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002014 cnt++;
2015 if( (cnt%spinRate)==0 ){
2016 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2017 fflush(stdout);
2018 }
drh3350ce92014-02-06 00:49:12 +00002019 } /* End while */
2020 if( rc==SQLITE_DONE ) break;
2021 sqlite3_finalize(pQuery);
2022 sqlite3_free(zQuery);
2023 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2024 zTable);
2025 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2026 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002027 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2028 break;
drh3350ce92014-02-06 00:49:12 +00002029 }
2030 } /* End for(k=0...) */
2031
2032end_data_xfer:
2033 sqlite3_finalize(pQuery);
2034 sqlite3_finalize(pInsert);
2035 sqlite3_free(zQuery);
2036 sqlite3_free(zInsert);
2037}
2038
2039
2040/*
2041** Try to transfer all rows of the schema that match zWhere. For
2042** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002043** If an error is encountered while moving forward through the
2044** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002045*/
mistachkine31ae902014-02-06 01:15:29 +00002046static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002047 struct callback_data *p,
2048 sqlite3 *newDb,
2049 const char *zWhere,
2050 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2051){
2052 sqlite3_stmt *pQuery = 0;
2053 char *zQuery = 0;
2054 int rc;
2055 const unsigned char *zName;
2056 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002057 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002058
2059 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2060 " WHERE %s", zWhere);
2061 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2062 if( rc ){
2063 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2064 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2065 zQuery);
2066 goto end_schema_xfer;
2067 }
2068 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2069 zName = sqlite3_column_text(pQuery, 0);
2070 zSql = sqlite3_column_text(pQuery, 1);
2071 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002072 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2073 if( zErrMsg ){
2074 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2075 sqlite3_free(zErrMsg);
2076 zErrMsg = 0;
2077 }
drh3350ce92014-02-06 00:49:12 +00002078 if( xForEach ){
2079 xForEach(p, newDb, (const char*)zName);
2080 }
2081 printf("done\n");
2082 }
2083 if( rc!=SQLITE_DONE ){
2084 sqlite3_finalize(pQuery);
2085 sqlite3_free(zQuery);
2086 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2087 " WHERE %s ORDER BY rowid DESC", zWhere);
2088 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2089 if( rc ){
2090 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2091 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2092 zQuery);
2093 goto end_schema_xfer;
2094 }
2095 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2096 zName = sqlite3_column_text(pQuery, 0);
2097 zSql = sqlite3_column_text(pQuery, 1);
2098 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002099 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2100 if( zErrMsg ){
2101 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2102 sqlite3_free(zErrMsg);
2103 zErrMsg = 0;
2104 }
drh3350ce92014-02-06 00:49:12 +00002105 if( xForEach ){
2106 xForEach(p, newDb, (const char*)zName);
2107 }
2108 printf("done\n");
2109 }
2110 }
2111end_schema_xfer:
2112 sqlite3_finalize(pQuery);
2113 sqlite3_free(zQuery);
2114}
2115
2116/*
2117** Open a new database file named "zNewDb". Try to recover as much information
2118** as possible out of the main database (which might be corrupt) and write it
2119** into zNewDb.
2120*/
mistachkine31ae902014-02-06 01:15:29 +00002121static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002122 int rc;
2123 sqlite3 *newDb = 0;
2124 if( access(zNewDb,0)==0 ){
2125 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2126 return;
2127 }
2128 rc = sqlite3_open(zNewDb, &newDb);
2129 if( rc ){
2130 fprintf(stderr, "Cannot create output database: %s\n",
2131 sqlite3_errmsg(newDb));
2132 }else{
2133 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002134 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2135 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002136 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2137 }
2138 sqlite3_close(newDb);
2139}
2140
2141/*
drh75897232000-05-29 14:26:00 +00002142** If an input line begins with "." then invoke this routine to
2143** process that line.
drh67505e72002-04-19 12:34:06 +00002144**
drh47ad6842006-11-08 12:25:42 +00002145** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002146*/
drh44c2eb12003-04-30 11:38:26 +00002147static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002148 int i = 1;
2149 int nArg = 0;
2150 int n, c;
drh67505e72002-04-19 12:34:06 +00002151 int rc = 0;
drh75897232000-05-29 14:26:00 +00002152 char *azArg[50];
2153
2154 /* Parse the input line into tokens.
2155 */
2156 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002157 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002158 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002159 if( zLine[i]=='\'' || zLine[i]=='"' ){
2160 int delim = zLine[i++];
2161 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002162 while( zLine[i] && zLine[i]!=delim ){
2163 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2164 i++;
2165 }
drh75897232000-05-29 14:26:00 +00002166 if( zLine[i]==delim ){
2167 zLine[i++] = 0;
2168 }
drhfeac5f82004-08-01 00:10:45 +00002169 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002170 }else{
2171 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002172 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002173 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002174 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002175 }
2176 }
2177
2178 /* Process the input line.
2179 */
shane9bd1b442009-10-23 01:27:39 +00002180 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002181 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002182 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002183 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2184 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2185 ){
drhbc46f022013-01-23 18:53:23 +00002186 const char *zDestFile = 0;
2187 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002188 sqlite3 *pDest;
2189 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002190 int j;
2191 for(j=1; j<nArg; j++){
2192 const char *z = azArg[j];
2193 if( z[0]=='-' ){
2194 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002195 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002196 {
2197 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2198 return 1;
2199 }
2200 }else if( zDestFile==0 ){
2201 zDestFile = azArg[j];
2202 }else if( zDb==0 ){
2203 zDb = zDestFile;
2204 zDestFile = azArg[j];
2205 }else{
2206 fprintf(stderr, "too many arguments to .backup\n");
2207 return 1;
2208 }
drh9ff849f2009-02-04 20:55:57 +00002209 }
drhbc46f022013-01-23 18:53:23 +00002210 if( zDestFile==0 ){
2211 fprintf(stderr, "missing FILENAME argument on .backup\n");
2212 return 1;
2213 }
2214 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002215 rc = sqlite3_open(zDestFile, &pDest);
2216 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002217 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002218 sqlite3_close(pDest);
2219 return 1;
2220 }
drh05782482013-10-24 15:20:20 +00002221 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002222 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2223 if( pBackup==0 ){
2224 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2225 sqlite3_close(pDest);
2226 return 1;
2227 }
2228 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2229 sqlite3_backup_finish(pBackup);
2230 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002231 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002232 }else{
2233 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002234 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002235 }
2236 sqlite3_close(pDest);
2237 }else
2238
shanehe2aa9d72009-11-06 17:20:17 +00002239 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002240 bail_on_error = booleanValue(azArg[1]);
2241 }else
2242
drhd8621b92012-04-17 09:09:33 +00002243 /* The undocumented ".breakpoint" command causes a call to the no-op
2244 ** routine named test_breakpoint().
2245 */
2246 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2247 test_breakpoint();
2248 }else
2249
mistachkine31ae902014-02-06 01:15:29 +00002250 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2251 tryToClone(p, azArg[1]);
2252 }else
2253
shanehe2aa9d72009-11-06 17:20:17 +00002254 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002255 struct callback_data data;
2256 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002257 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002258 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002259 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002260 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002261 data.colWidth[0] = 3;
2262 data.colWidth[1] = 15;
2263 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002264 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002265 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002266 if( zErrMsg ){
2267 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002268 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002269 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002270 }
2271 }else
2272
shanehe2aa9d72009-11-06 17:20:17 +00002273 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002274 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002275 /* When playing back a "dump", the content might appear in an order
2276 ** which causes immediate foreign key constraints to be violated.
2277 ** So disable foreign-key constraint enforcement to prevent problems. */
2278 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002279 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002280 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002281 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002282 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002283 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002284 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002285 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002286 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002287 );
2288 run_schema_dump_query(p,
2289 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002290 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002291 );
drh2f464a02011-10-13 00:41:49 +00002292 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002293 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002294 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002295 );
drh4c653a02000-06-07 01:27:47 +00002296 }else{
2297 int i;
drhdd3d4592004-08-30 01:54:05 +00002298 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002299 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002300 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002301 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002302 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002303 " AND sql NOT NULL");
2304 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002305 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002306 "WHERE sql NOT NULL"
2307 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002308 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002309 );
danielk1977bc6ada42004-06-30 08:20:16 +00002310 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002311 }
2312 }
drh45e29d82006-11-20 16:21:10 +00002313 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002314 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002315 p->writableSchema = 0;
2316 }
drh56197952011-10-13 16:30:13 +00002317 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2318 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002319 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002320 }else
drh75897232000-05-29 14:26:00 +00002321
shanehe2aa9d72009-11-06 17:20:17 +00002322 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002323 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002324 }else
2325
drhefbf3b12014-02-28 20:47:24 +00002326 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 && nArg>1 && nArg<3 ){
2327 p->autoEQP = booleanValue(azArg[1]);
2328 }else
2329
drhd3ac7d92013-01-25 18:33:43 +00002330 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002331 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002332 rc = 2;
drh75897232000-05-29 14:26:00 +00002333 }else
2334
shanehe2aa9d72009-11-06 17:20:17 +00002335 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002336 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002337 if(val == 1) {
2338 if(!p->explainPrev.valid) {
2339 p->explainPrev.valid = 1;
2340 p->explainPrev.mode = p->mode;
2341 p->explainPrev.showHeader = p->showHeader;
2342 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2343 }
2344 /* We could put this code under the !p->explainValid
2345 ** condition so that it does not execute if we are already in
2346 ** explain mode. However, always executing it allows us an easy
2347 ** was to reset to explain mode in case the user previously
2348 ** did an .explain followed by a .width, .mode or .header
2349 ** command.
2350 */
danielk19770d78bae2008-01-03 07:09:48 +00002351 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002352 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002353 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002354 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002355 p->colWidth[1] = 13; /* opcode */
2356 p->colWidth[2] = 4; /* P1 */
2357 p->colWidth[3] = 4; /* P2 */
2358 p->colWidth[4] = 4; /* P3 */
2359 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002360 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002361 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002362 }else if (p->explainPrev.valid) {
2363 p->explainPrev.valid = 0;
2364 p->mode = p->explainPrev.mode;
2365 p->showHeader = p->explainPrev.showHeader;
2366 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2367 }
drh75897232000-05-29 14:26:00 +00002368 }else
2369
drhc28490c2006-10-26 14:25:58 +00002370 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002371 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002372 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002373 }else
2374
2375 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002376 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002377 if( HAS_TIMER ){
2378 fprintf(stderr,"%s",zTimerHelp);
2379 }
drh75897232000-05-29 14:26:00 +00002380 }else
2381
shanehe2aa9d72009-11-06 17:20:17 +00002382 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002383 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002384 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002385 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002386 int nCol; /* Number of columns in the table */
2387 int nByte; /* Number of bytes in an SQL string */
2388 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002389 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002390 int nSep; /* Number of bytes in p->separator[] */
2391 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002392 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002393 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002394
drhdb95f682013-06-26 22:46:00 +00002395 seenInterrupt = 0;
2396 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002397 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002398 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002399 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002400 fprintf(stderr, "Error: non-null separator required for import\n");
2401 return 1;
drhfeac5f82004-08-01 00:10:45 +00002402 }
drhdb95f682013-06-26 22:46:00 +00002403 if( nSep>1 ){
2404 fprintf(stderr, "Error: multi-character separators not allowed"
2405 " for import\n");
2406 return 1;
2407 }
drh5bde8162013-06-27 14:07:53 +00002408 sCsv.zFile = zFile;
2409 sCsv.nLine = 1;
2410 if( sCsv.zFile[0]=='|' ){
2411 sCsv.in = popen(sCsv.zFile+1, "r");
2412 sCsv.zFile = "<pipe>";
2413 xCloser = pclose;
2414 }else{
2415 sCsv.in = fopen(sCsv.zFile, "rb");
2416 xCloser = fclose;
2417 }
drhdb95f682013-06-26 22:46:00 +00002418 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002419 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002420 return 1;
2421 }
2422 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002423 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002424 if( zSql==0 ){
2425 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002426 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002427 return 1;
2428 }
drh4f21c4a2008-12-10 22:15:00 +00002429 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002430 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002431 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2432 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2433 char cSep = '(';
2434 while( csv_read_one_field(&sCsv) ){
2435 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2436 cSep = ',';
2437 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2438 }
drh5bde8162013-06-27 14:07:53 +00002439 if( cSep=='(' ){
2440 sqlite3_free(zCreate);
2441 sqlite3_free(sCsv.z);
2442 xCloser(sCsv.in);
2443 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2444 return 1;
2445 }
drhdb95f682013-06-26 22:46:00 +00002446 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2447 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2448 sqlite3_free(zCreate);
2449 if( rc ){
2450 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2451 sqlite3_errmsg(db));
2452 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002453 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002454 return 1;
2455 }
drhc7181902014-02-27 15:04:13 +00002456 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002457 }
drhfeac5f82004-08-01 00:10:45 +00002458 sqlite3_free(zSql);
2459 if( rc ){
shane916f9612009-10-23 00:37:15 +00002460 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002461 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002462 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002463 return 1;
drhfeac5f82004-08-01 00:10:45 +00002464 }
shane916f9612009-10-23 00:37:15 +00002465 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002466 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002467 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002468 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002469 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002470 if( zSql==0 ){
2471 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002472 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002473 return 1;
2474 }
drhdb95f682013-06-26 22:46:00 +00002475 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002476 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002477 for(i=1; i<nCol; i++){
2478 zSql[j++] = ',';
2479 zSql[j++] = '?';
2480 }
2481 zSql[j++] = ')';
2482 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002483 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002484 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002485 if( rc ){
2486 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002487 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002488 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002489 return 1;
drhfeac5f82004-08-01 00:10:45 +00002490 }
drh2d463112013-08-06 14:36:36 +00002491 needCommit = sqlite3_get_autocommit(db);
2492 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002493 do{
2494 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002495 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002496 char *z = csv_read_one_field(&sCsv);
2497 if( z==0 && i==0 ) break;
2498 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2499 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2500 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2501 "filling the rest with NULL\n",
2502 sCsv.zFile, startLine, nCol, i+1);
2503 i++;
2504 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002505 }
drhfeac5f82004-08-01 00:10:45 +00002506 }
drhdb95f682013-06-26 22:46:00 +00002507 if( sCsv.cTerm==sCsv.cSeparator ){
2508 do{
2509 csv_read_one_field(&sCsv);
2510 i++;
2511 }while( sCsv.cTerm==sCsv.cSeparator );
2512 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2513 "extras ignored\n",
2514 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002515 }
drhdb95f682013-06-26 22:46:00 +00002516 if( i>=nCol ){
2517 sqlite3_step(pStmt);
2518 rc = sqlite3_reset(pStmt);
2519 if( rc!=SQLITE_OK ){
2520 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2521 sqlite3_errmsg(db));
2522 }
2523 }
2524 }while( sCsv.cTerm!=EOF );
2525
drh5bde8162013-06-27 14:07:53 +00002526 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002527 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002528 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002529 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002530 }else
2531
shanehe2aa9d72009-11-06 17:20:17 +00002532 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002533 struct callback_data data;
2534 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002535 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002536 memcpy(&data, p, sizeof(data));
2537 data.showHeader = 0;
2538 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002539 if( nArg==1 ){
2540 rc = sqlite3_exec(p->db,
2541 "SELECT name FROM sqlite_master "
2542 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2543 "UNION ALL "
2544 "SELECT name FROM sqlite_temp_master "
2545 "WHERE type='index' "
2546 "ORDER BY 1",
2547 callback, &data, &zErrMsg
2548 );
2549 }else{
2550 zShellStatic = azArg[1];
2551 rc = sqlite3_exec(p->db,
2552 "SELECT name FROM sqlite_master "
2553 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2554 "UNION ALL "
2555 "SELECT name FROM sqlite_temp_master "
2556 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2557 "ORDER BY 1",
2558 callback, &data, &zErrMsg
2559 );
2560 zShellStatic = 0;
2561 }
drh75897232000-05-29 14:26:00 +00002562 if( zErrMsg ){
2563 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002564 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002565 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002566 }else if( rc != SQLITE_OK ){
2567 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2568 rc = 1;
drh75897232000-05-29 14:26:00 +00002569 }
2570 }else
2571
drhae5e4452007-05-03 17:18:36 +00002572#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002573 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002574 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002575 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2576 iotrace = 0;
2577 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002578 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002579 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002580 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002581 iotrace = stdout;
2582 }else{
2583 iotrace = fopen(azArg[1], "w");
2584 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002585 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002586 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002587 rc = 1;
drhb0603412007-02-28 04:47:26 +00002588 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002589 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002590 }
2591 }
2592 }else
drhae5e4452007-05-03 17:18:36 +00002593#endif
drhb0603412007-02-28 04:47:26 +00002594
drh70df4fe2006-06-13 15:12:21 +00002595#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002596 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2597 const char *zFile, *zProc;
2598 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002599 zFile = azArg[1];
2600 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002601 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002602 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2603 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002604 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002605 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002606 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002607 }
2608 }else
drh70df4fe2006-06-13 15:12:21 +00002609#endif
drh1e397f82006-06-08 15:28:43 +00002610
drhc8ba2122011-03-23 11:16:22 +00002611 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002612 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002613 output_file_close(p->pLog);
2614 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002615 }else
2616
shanehe2aa9d72009-11-06 17:20:17 +00002617 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002618 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002619 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002620 ||
shanehe2aa9d72009-11-06 17:20:17 +00002621 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002622 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002623 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002624 ||
shanehe2aa9d72009-11-06 17:20:17 +00002625 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002626 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002627 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002628 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002629 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002630 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002631 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002632 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002633 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002634 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002635 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002636 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002637 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002638 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002639 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002640 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002641 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002642 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002643 }else {
shane9bd1b442009-10-23 01:27:39 +00002644 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002645 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002646 rc = 1;
drh75897232000-05-29 14:26:00 +00002647 }
2648 }else
2649
shanehe2aa9d72009-11-06 17:20:17 +00002650 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2651 int n2 = strlen30(azArg[1]);
2652 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2653 p->mode = MODE_Insert;
2654 set_table_name(p, azArg[2]);
2655 }else {
2656 fprintf(stderr, "Error: invalid arguments: "
2657 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2658 rc = 1;
2659 }
2660 }else
2661
persicom7e2dfdd2002-04-18 02:46:52 +00002662 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002663 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2664 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002665 }else
2666
drh05782482013-10-24 15:20:20 +00002667 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2668 sqlite3 *savedDb = p->db;
2669 const char *zSavedFilename = p->zDbFilename;
2670 char *zNewFilename = 0;
2671 p->db = 0;
2672 if( nArg>=2 ){
2673 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2674 }
2675 open_db(p, 1);
2676 if( p->db!=0 ){
2677 sqlite3_close(savedDb);
2678 sqlite3_free(p->zFreeOnClose);
2679 p->zFreeOnClose = zNewFilename;
2680 }else{
2681 sqlite3_free(zNewFilename);
2682 p->db = savedDb;
2683 p->zDbFilename = zSavedFilename;
2684 }
2685 }else
2686
drh75897232000-05-29 14:26:00 +00002687 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002688 if( p->outfile[0]=='|' ){
2689 pclose(p->out);
2690 }else{
2691 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002692 }
drh42f64e52012-04-04 16:56:23 +00002693 p->outfile[0] = 0;
2694 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002695 p->out = popen(&azArg[1][1], "w");
2696 if( p->out==0 ){
2697 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2698 p->out = stdout;
2699 rc = 1;
2700 }else{
2701 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2702 }
drh75897232000-05-29 14:26:00 +00002703 }else{
drh42f64e52012-04-04 16:56:23 +00002704 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002705 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002706 if( strcmp(azArg[1],"off")!=0 ){
2707 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2708 }
drh75897232000-05-29 14:26:00 +00002709 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002710 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002711 } else {
drh42f64e52012-04-04 16:56:23 +00002712 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002713 }
2714 }
2715 }else
2716
drh078b1fd2012-09-21 13:40:02 +00002717 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2718 int i;
2719 for(i=1; i<nArg; i++){
2720 if( i>1 ) fprintf(p->out, " ");
2721 fprintf(p->out, "%s", azArg[i]);
2722 }
2723 fprintf(p->out, "\n");
2724 }else
2725
drhdd45df82002-04-18 12:39:03 +00002726 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002727 if( nArg >= 2) {
2728 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2729 }
2730 if( nArg >= 3) {
2731 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2732 }
2733 }else
2734
shanehe2aa9d72009-11-06 17:20:17 +00002735 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002736 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002737 }else
2738
drh9ff849f2009-02-04 20:55:57 +00002739 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002740 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002741 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002742 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2743 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002744 }else{
shane9bd1b442009-10-23 01:27:39 +00002745 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002746 fclose(alt);
2747 }
2748 }else
2749
shanehe2aa9d72009-11-06 17:20:17 +00002750 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002751 const char *zSrcFile;
2752 const char *zDb;
2753 sqlite3 *pSrc;
2754 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002755 int nTimeout = 0;
2756
drh9ff849f2009-02-04 20:55:57 +00002757 if( nArg==2 ){
2758 zSrcFile = azArg[1];
2759 zDb = "main";
2760 }else{
2761 zSrcFile = azArg[2];
2762 zDb = azArg[1];
2763 }
2764 rc = sqlite3_open(zSrcFile, &pSrc);
2765 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002766 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002767 sqlite3_close(pSrc);
2768 return 1;
2769 }
drh05782482013-10-24 15:20:20 +00002770 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002771 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2772 if( pBackup==0 ){
2773 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2774 sqlite3_close(pSrc);
2775 return 1;
2776 }
drhdc2c4912009-02-04 22:46:47 +00002777 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2778 || rc==SQLITE_BUSY ){
2779 if( rc==SQLITE_BUSY ){
2780 if( nTimeout++ >= 3 ) break;
2781 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002782 }
2783 }
2784 sqlite3_backup_finish(pBackup);
2785 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002786 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002787 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002788 fprintf(stderr, "Error: source database is busy\n");
2789 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002790 }else{
2791 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002792 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002793 }
2794 sqlite3_close(pSrc);
2795 }else
2796
shanehe2aa9d72009-11-06 17:20:17 +00002797 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002798 struct callback_data data;
2799 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002800 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002801 memcpy(&data, p, sizeof(data));
2802 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002803 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002804 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002805 int i;
drhf0693c82011-10-11 20:41:54 +00002806 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002807 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002808 char *new_argv[2], *new_colv[2];
2809 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2810 " type text,\n"
2811 " name text,\n"
2812 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002813 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002814 " sql text\n"
2815 ")";
2816 new_argv[1] = 0;
2817 new_colv[0] = "sql";
2818 new_colv[1] = 0;
2819 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002820 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002821 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002822 char *new_argv[2], *new_colv[2];
2823 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2824 " type text,\n"
2825 " name text,\n"
2826 " tbl_name text,\n"
2827 " rootpage integer,\n"
2828 " sql text\n"
2829 ")";
2830 new_argv[1] = 0;
2831 new_colv[0] = "sql";
2832 new_colv[1] = 0;
2833 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002834 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002835 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002836 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002837 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002838 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002839 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002840 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002841 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002842 "WHERE lower(tbl_name) LIKE shellstatic()"
2843 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002844 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002845 callback, &data, &zErrMsg);
2846 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002847 }
drh75897232000-05-29 14:26:00 +00002848 }else{
shane9bd1b442009-10-23 01:27:39 +00002849 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002850 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002851 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002852 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002853 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002854 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002855 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002856 callback, &data, &zErrMsg
2857 );
drh75897232000-05-29 14:26:00 +00002858 }
drh75897232000-05-29 14:26:00 +00002859 if( zErrMsg ){
2860 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002861 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002862 rc = 1;
2863 }else if( rc != SQLITE_OK ){
2864 fprintf(stderr,"Error: querying schema information\n");
2865 rc = 1;
2866 }else{
2867 rc = 0;
drh75897232000-05-29 14:26:00 +00002868 }
2869 }else
2870
drh340f5822013-06-27 13:01:21 +00002871#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002872 /* Undocumented commands for internal testing. Subject to change
2873 ** without notice. */
2874 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2875 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2876 int i, v;
2877 for(i=1; i<nArg; i++){
2878 v = booleanValue(azArg[i]);
2879 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2880 }
2881 }
2882 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2883 int i; sqlite3_int64 v;
2884 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002885 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002886 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002887 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2888 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002889 }
2890 }
2891 }else
drh340f5822013-06-27 13:01:21 +00002892#endif
drh348d19c2013-06-03 12:47:43 +00002893
drh75897232000-05-29 14:26:00 +00002894 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002895 sqlite3_snprintf(sizeof(p->separator), p->separator,
2896 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002897 }else
2898
shanehe2aa9d72009-11-06 17:20:17 +00002899 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002900 int i;
2901 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00002902 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002903 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002904 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002905 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002906 fprintf(p->out,"%9.9s: ", "nullvalue");
2907 output_c_string(p->out, p->nullvalue);
2908 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002909 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002910 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002911 fprintf(p->out,"%9.9s: ", "separator");
2912 output_c_string(p->out, p->separator);
2913 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002914 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002915 fprintf(p->out,"%9.9s: ","width");
2916 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002917 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002918 }
drhfeac5f82004-08-01 00:10:45 +00002919 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002920 }else
2921
shaneh642d8b82010-07-28 16:05:34 +00002922 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2923 p->statsOn = booleanValue(azArg[1]);
2924 }else
2925
shanehe2aa9d72009-11-06 17:20:17 +00002926 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002927 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002928 char **azResult;
drh98781232012-04-23 12:38:05 +00002929 int nRow, nAlloc;
2930 char *zSql = 0;
2931 int ii;
drh05782482013-10-24 15:20:20 +00002932 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002933 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2934 if( rc ) return rc;
2935 zSql = sqlite3_mprintf(
2936 "SELECT name FROM sqlite_master"
2937 " WHERE type IN ('table','view')"
2938 " AND name NOT LIKE 'sqlite_%%'"
2939 " AND name LIKE ?1");
2940 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2941 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2942 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2943 if( strcmp(zDbName,"temp")==0 ){
2944 zSql = sqlite3_mprintf(
2945 "%z UNION ALL "
2946 "SELECT 'temp.' || name FROM sqlite_temp_master"
2947 " WHERE type IN ('table','view')"
2948 " AND name NOT LIKE 'sqlite_%%'"
2949 " AND name LIKE ?1", zSql);
2950 }else{
2951 zSql = sqlite3_mprintf(
2952 "%z UNION ALL "
2953 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2954 " WHERE type IN ('table','view')"
2955 " AND name NOT LIKE 'sqlite_%%'"
2956 " AND name LIKE ?1", zSql, zDbName, zDbName);
2957 }
drha50da102000-08-08 20:19:09 +00002958 }
drh98781232012-04-23 12:38:05 +00002959 sqlite3_finalize(pStmt);
2960 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2961 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2962 sqlite3_free(zSql);
2963 if( rc ) return rc;
2964 nRow = nAlloc = 0;
2965 azResult = 0;
2966 if( nArg>1 ){
2967 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002968 }else{
drh98781232012-04-23 12:38:05 +00002969 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2970 }
2971 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2972 if( nRow>=nAlloc ){
2973 char **azNew;
2974 int n = nAlloc*2 + 10;
2975 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2976 if( azNew==0 ){
2977 fprintf(stderr, "Error: out of memory\n");
2978 break;
2979 }
2980 nAlloc = n;
2981 azResult = azNew;
2982 }
2983 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2984 if( azResult[nRow] ) nRow++;
2985 }
2986 sqlite3_finalize(pStmt);
2987 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002988 int len, maxlen = 0;
2989 int i, j;
2990 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002991 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002992 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002993 if( len>maxlen ) maxlen = len;
2994 }
2995 nPrintCol = 80/(maxlen+2);
2996 if( nPrintCol<1 ) nPrintCol = 1;
2997 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2998 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002999 for(j=i; j<nRow; j+=nPrintRow){
3000 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003001 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003002 }
drh151b7d52013-05-06 20:28:54 +00003003 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003004 }
3005 }
drh98781232012-04-23 12:38:05 +00003006 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3007 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003008 }else
3009
shaneh96887e12011-02-10 21:08:58 +00003010 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003011 static const struct {
3012 const char *zCtrlName; /* Name of a test-control option */
3013 int ctrlCode; /* Integer code for that option */
3014 } aCtrl[] = {
3015 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3016 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3017 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3018 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3019 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3020 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3021 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3022 { "assert", SQLITE_TESTCTRL_ASSERT },
3023 { "always", SQLITE_TESTCTRL_ALWAYS },
3024 { "reserve", SQLITE_TESTCTRL_RESERVE },
3025 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3026 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003027 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
3028 };
shaneh96887e12011-02-10 21:08:58 +00003029 int testctrl = -1;
3030 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003031 int i, n;
drh05782482013-10-24 15:20:20 +00003032 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003033
drhd416fe72011-03-17 16:45:50 +00003034 /* convert testctrl text option to value. allow any unique prefix
3035 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003036 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003037 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003038 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3039 if( testctrl<0 ){
3040 testctrl = aCtrl[i].ctrlCode;
3041 }else{
drhb07028f2011-10-14 21:49:18 +00003042 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003043 testctrl = -1;
3044 break;
3045 }
3046 }
3047 }
drh348d19c2013-06-03 12:47:43 +00003048 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003049 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3050 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3051 }else{
3052 switch(testctrl){
3053
3054 /* sqlite3_test_control(int, db, int) */
3055 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3056 case SQLITE_TESTCTRL_RESERVE:
3057 if( nArg==3 ){
3058 int opt = (int)strtol(azArg[2], 0, 0);
3059 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003060 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003061 } else {
drhd416fe72011-03-17 16:45:50 +00003062 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3063 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003064 }
3065 break;
3066
3067 /* sqlite3_test_control(int) */
3068 case SQLITE_TESTCTRL_PRNG_SAVE:
3069 case SQLITE_TESTCTRL_PRNG_RESTORE:
3070 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003071 if( nArg==2 ){
3072 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003073 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003074 } else {
3075 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3076 }
3077 break;
3078
3079 /* sqlite3_test_control(int, uint) */
3080 case SQLITE_TESTCTRL_PENDING_BYTE:
3081 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003082 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003083 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003084 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003085 } else {
drhd416fe72011-03-17 16:45:50 +00003086 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3087 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003088 }
3089 break;
3090
3091 /* sqlite3_test_control(int, int) */
3092 case SQLITE_TESTCTRL_ASSERT:
3093 case SQLITE_TESTCTRL_ALWAYS:
3094 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003095 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003096 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003097 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003098 } else {
drhd416fe72011-03-17 16:45:50 +00003099 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3100 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003101 }
3102 break;
3103
3104 /* sqlite3_test_control(int, char *) */
3105#ifdef SQLITE_N_KEYWORD
3106 case SQLITE_TESTCTRL_ISKEYWORD:
3107 if( nArg==3 ){
3108 const char *opt = azArg[2];
3109 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003110 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003111 } else {
drhd416fe72011-03-17 16:45:50 +00003112 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3113 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003114 }
3115 break;
3116#endif
3117
3118 case SQLITE_TESTCTRL_BITVEC_TEST:
3119 case SQLITE_TESTCTRL_FAULT_INSTALL:
3120 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3121 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3122 default:
drhd416fe72011-03-17 16:45:50 +00003123 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3124 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003125 break;
3126 }
3127 }
3128 }else
3129
shanehe2aa9d72009-11-06 17:20:17 +00003130 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003131 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003132 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003133 }else
3134
drhd416fe72011-03-17 16:45:50 +00003135 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3136 && nArg==2
3137 ){
drh3b1a9882007-11-02 12:53:03 +00003138 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003139 }else
3140
drh42f64e52012-04-04 16:56:23 +00003141 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003142 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003143 output_file_close(p->traceOut);
3144 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003145#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003146 if( p->traceOut==0 ){
3147 sqlite3_trace(p->db, 0, 0);
3148 }else{
3149 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3150 }
3151#endif
3152 }else
3153
drh9fd301b2011-06-03 13:28:22 +00003154 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003155 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003156 sqlite3_libversion(), sqlite3_sourceid());
3157 }else
3158
drhde60fc22011-12-14 17:53:36 +00003159 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3160 const char *zDbName = nArg==2 ? azArg[1] : "main";
3161 char *zVfsName = 0;
3162 if( p->db ){
3163 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3164 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003165 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003166 sqlite3_free(zVfsName);
3167 }
3168 }
3169 }else
3170
drhcef4fc82012-09-21 22:50:45 +00003171#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3172 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3173 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003174 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003175 }else
3176#endif
3177
shanehe2aa9d72009-11-06 17:20:17 +00003178 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003179 int j;
drh43617e92006-03-06 20:55:46 +00003180 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003181 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003182 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003183 }
3184 }else
3185
3186 {
shane9bd1b442009-10-23 01:27:39 +00003187 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003188 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003189 rc = 1;
drh75897232000-05-29 14:26:00 +00003190 }
drh67505e72002-04-19 12:34:06 +00003191
3192 return rc;
drh75897232000-05-29 14:26:00 +00003193}
3194
drh67505e72002-04-19 12:34:06 +00003195/*
drh91a66392007-09-07 01:12:32 +00003196** Return TRUE if a semicolon occurs anywhere in the first N characters
3197** of string z[].
drh324ccef2003-02-05 14:06:20 +00003198*/
drh9f099fd2013-08-06 14:01:46 +00003199static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003200 int i;
3201 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3202 return 0;
drh324ccef2003-02-05 14:06:20 +00003203}
3204
3205/*
drh70c7a4b2003-04-26 03:03:06 +00003206** Test to see if a line consists entirely of whitespace.
3207*/
3208static int _all_whitespace(const char *z){
3209 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003210 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003211 if( *z=='/' && z[1]=='*' ){
3212 z += 2;
3213 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3214 if( *z==0 ) return 0;
3215 z++;
3216 continue;
3217 }
3218 if( *z=='-' && z[1]=='-' ){
3219 z += 2;
3220 while( *z && *z!='\n' ){ z++; }
3221 if( *z==0 ) return 1;
3222 continue;
3223 }
3224 return 0;
3225 }
3226 return 1;
3227}
3228
3229/*
drha9b17162003-04-29 18:01:28 +00003230** Return TRUE if the line typed in is an SQL command terminator other
3231** than a semi-colon. The SQL Server style "go" command is understood
3232** as is the Oracle "/".
3233*/
drh9f099fd2013-08-06 14:01:46 +00003234static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003235 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003236 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3237 return 1; /* Oracle */
3238 }
drhf0693c82011-10-11 20:41:54 +00003239 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003240 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003241 return 1; /* SQL Server */
3242 }
3243 return 0;
3244}
3245
3246/*
drh233a5312008-12-18 22:25:13 +00003247** Return true if zSql is a complete SQL statement. Return false if it
3248** ends in the middle of a string literal or C-style comment.
3249*/
drh9f099fd2013-08-06 14:01:46 +00003250static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003251 int rc;
3252 if( zSql==0 ) return 1;
3253 zSql[nSql] = ';';
3254 zSql[nSql+1] = 0;
3255 rc = sqlite3_complete(zSql);
3256 zSql[nSql] = 0;
3257 return rc;
3258}
3259
3260/*
drh67505e72002-04-19 12:34:06 +00003261** Read input from *in and process it. If *in==0 then input
3262** is interactive - the user is typing it it. Otherwise, input
3263** is coming from a file or device. A prompt is issued and history
3264** is saved only if input is interactive. An interrupt signal will
3265** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003266**
3267** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003268*/
drhc28490c2006-10-26 14:25:58 +00003269static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003270 char *zLine = 0; /* A single input line */
3271 char *zSql = 0; /* Accumulated SQL text */
3272 int nLine; /* Length of current line */
3273 int nSql = 0; /* Bytes of zSql[] used */
3274 int nAlloc = 0; /* Allocated zSql[] space */
3275 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3276 char *zErrMsg; /* Error message returned */
3277 int rc; /* Error code */
3278 int errCnt = 0; /* Number of errors seen */
3279 int lineno = 0; /* Current line number */
3280 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003281
3282 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3283 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003284 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003285 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003286 /* End of input */
3287 if( stdin_is_interactive ) printf("\n");
3288 break;
drhc49f44e2006-10-26 18:15:42 +00003289 }
drh67505e72002-04-19 12:34:06 +00003290 if( seenInterrupt ){
3291 if( in!=0 ) break;
3292 seenInterrupt = 0;
3293 }
drhc28490c2006-10-26 14:25:58 +00003294 lineno++;
drh849a9d92013-12-21 15:46:06 +00003295 if( nSql==0 && _all_whitespace(zLine) ){
3296 if( p->echoOn ) printf("%s\n", zLine);
3297 continue;
3298 }
drh2af0b2d2002-02-21 02:25:02 +00003299 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003300 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003301 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003302 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003303 break;
3304 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003305 errCnt++;
3306 }
drhdaffd0e2001-04-11 14:28:42 +00003307 continue;
3308 }
drh9f099fd2013-08-06 14:01:46 +00003309 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003310 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003311 }
drh9f099fd2013-08-06 14:01:46 +00003312 nLine = strlen30(zLine);
3313 if( nSql+nLine+2>=nAlloc ){
3314 nAlloc = nSql+nLine+100;
3315 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003316 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003317 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003318 exit(1);
3319 }
drhdaffd0e2001-04-11 14:28:42 +00003320 }
drh9f099fd2013-08-06 14:01:46 +00003321 nSqlPrior = nSql;
3322 if( nSql==0 ){
3323 int i;
3324 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003325 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003326 memcpy(zSql, zLine+i, nLine+1-i);
3327 startline = lineno;
3328 nSql = nLine-i;
3329 }else{
3330 zSql[nSql++] = '\n';
3331 memcpy(zSql+nSql, zLine, nLine+1);
3332 nSql += nLine;
3333 }
3334 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003335 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003336 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003337 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003338 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003339 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003340 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003341 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003342 char zPrefix[100];
3343 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003344 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003345 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003346 }else{
shane9bd1b442009-10-23 01:27:39 +00003347 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003348 }
drh7f953e22002-07-13 17:33:45 +00003349 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003350 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003351 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003352 zErrMsg = 0;
3353 }else{
shaned2bed1c2009-10-21 03:56:54 +00003354 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003355 }
drhc49f44e2006-10-26 18:15:42 +00003356 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003357 }
drhdaffd0e2001-04-11 14:28:42 +00003358 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003359 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003360 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003361 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003362 }
3363 }
drh9f099fd2013-08-06 14:01:46 +00003364 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003365 if( !_all_whitespace(zSql) ){
3366 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3367 }
drhdaffd0e2001-04-11 14:28:42 +00003368 free(zSql);
3369 }
danielk19772ac27622007-07-03 05:31:16 +00003370 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003371 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003372}
3373
drh67505e72002-04-19 12:34:06 +00003374/*
3375** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003376** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003377*/
3378static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003379 static char *home_dir = NULL;
3380 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003381
drh83905c92012-06-21 13:00:37 +00003382#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003383 {
3384 struct passwd *pwent;
3385 uid_t uid = getuid();
3386 if( (pwent=getpwuid(uid)) != NULL) {
3387 home_dir = pwent->pw_dir;
3388 }
drh67505e72002-04-19 12:34:06 +00003389 }
3390#endif
3391
chw65d3c132007-11-12 21:09:10 +00003392#if defined(_WIN32_WCE)
3393 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3394 */
drh85e72432012-04-11 11:38:53 +00003395 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003396#else
3397
drh83905c92012-06-21 13:00:37 +00003398#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003399 if (!home_dir) {
3400 home_dir = getenv("USERPROFILE");
3401 }
3402#endif
3403
drh67505e72002-04-19 12:34:06 +00003404 if (!home_dir) {
3405 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003406 }
3407
drh83905c92012-06-21 13:00:37 +00003408#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003409 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003410 char *zDrive, *zPath;
3411 int n;
3412 zDrive = getenv("HOMEDRIVE");
3413 zPath = getenv("HOMEPATH");
3414 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003415 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003416 home_dir = malloc( n );
3417 if( home_dir==0 ) return 0;
3418 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3419 return home_dir;
3420 }
3421 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003422 }
3423#endif
3424
chw65d3c132007-11-12 21:09:10 +00003425#endif /* !_WIN32_WCE */
3426
drh67505e72002-04-19 12:34:06 +00003427 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003428 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003429 char *z = malloc( n );
3430 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003431 home_dir = z;
3432 }
drhe98d4fa2002-04-21 19:06:22 +00003433
drh67505e72002-04-19 12:34:06 +00003434 return home_dir;
3435}
3436
3437/*
3438** Read input from the file given by sqliterc_override. Or if that
3439** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003440**
3441** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003442*/
shane9bd1b442009-10-23 01:27:39 +00003443static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003444 struct callback_data *p, /* Configuration data */
3445 const char *sqliterc_override /* Name of config file. NULL to use default */
3446){
persicom7e2dfdd2002-04-18 02:46:52 +00003447 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003448 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003449 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003450 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003451 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003452
3453 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003454 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003455 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003456#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003457 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003458#endif
shane9bd1b442009-10-23 01:27:39 +00003459 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003460 }
drh2f3de322012-06-27 16:41:31 +00003461 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003462 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3463 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003464 }
drha1f9b5e2004-02-14 16:31:02 +00003465 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003466 if( in ){
drhc28490c2006-10-26 14:25:58 +00003467 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003468 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003469 }
shane9bd1b442009-10-23 01:27:39 +00003470 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003471 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003472 }
drh85e72432012-04-11 11:38:53 +00003473 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003474 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003475}
3476
drh67505e72002-04-19 12:34:06 +00003477/*
drhe1e38c42003-05-04 18:30:59 +00003478** Show available command line options
3479*/
3480static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003481 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003482 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003483 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003484 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003485 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003486 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003487 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003488 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003489#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3490 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3491#endif
drhcc3b4f82012-02-07 14:13:50 +00003492 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003493 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003494 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003495 " -line set output mode to 'line'\n"
3496 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003497 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003498#ifdef SQLITE_ENABLE_MULTIPLEX
3499 " -multiplex enable the multiplexor VFS\n"
3500#endif
drh98d312f2012-10-25 15:23:14 +00003501 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3502 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003503 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003504 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003505 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003506#ifdef SQLITE_ENABLE_VFSTRACE
3507 " -vfstrace enable tracing of all VFS calls\n"
3508#endif
drhe1e38c42003-05-04 18:30:59 +00003509;
3510static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003511 fprintf(stderr,
3512 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3513 "FILENAME is the name of an SQLite database. A new database is created\n"
3514 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003515 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003516 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003517 }else{
3518 fprintf(stderr, "Use the -help option for additional information\n");
3519 }
3520 exit(1);
3521}
3522
3523/*
drh67505e72002-04-19 12:34:06 +00003524** Initialize the state information in data
3525*/
drh0850b532006-01-31 19:31:43 +00003526static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003527 memset(data, 0, sizeof(*data));
3528 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003529 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003530 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003531 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003532 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003533 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3534 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003535 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003536}
3537
drh98d312f2012-10-25 15:23:14 +00003538/*
drh5c7976f2014-02-10 19:59:27 +00003539** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003540*/
3541#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003542static void printBold(const char *zText){
3543 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3544 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3545 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3546 SetConsoleTextAttribute(out,
3547 FOREGROUND_RED|FOREGROUND_INTENSITY
3548 );
3549 printf("%s", zText);
3550 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003551}
3552#else
drh5c7976f2014-02-10 19:59:27 +00003553static void printBold(const char *zText){
3554 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003555}
3556#endif
3557
3558/*
drh98d312f2012-10-25 15:23:14 +00003559** Get the argument to an --option. Throw an error and die if no argument
3560** is available.
3561*/
3562static char *cmdline_option_value(int argc, char **argv, int i){
3563 if( i==argc ){
3564 fprintf(stderr, "%s: Error: missing argument to %s\n",
3565 argv[0], argv[argc-1]);
3566 exit(1);
3567 }
3568 return argv[i];
3569}
3570
drh75897232000-05-29 14:26:00 +00003571int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003572 char *zErrMsg = 0;
3573 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003574 const char *zInitFile = 0;
3575 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003576 int i;
drhc28490c2006-10-26 14:25:58 +00003577 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003578 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003579
drh69b30ab2014-02-27 15:11:52 +00003580#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003581 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3582 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3583 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3584 exit(1);
3585 }
drhc7181902014-02-27 15:04:13 +00003586#endif
drhdaffd0e2001-04-11 14:28:42 +00003587 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003588 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003589 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003590
drh44c2eb12003-04-30 11:38:26 +00003591 /* Make sure we have a valid signal handler early, before anything
3592 ** else is done.
3593 */
drh4c504392000-10-16 22:06:40 +00003594#ifdef SIGINT
3595 signal(SIGINT, interrupt_handler);
3596#endif
drh44c2eb12003-04-30 11:38:26 +00003597
drh22fbcb82004-02-01 01:22:50 +00003598 /* Do an initial pass through the command-line argument to locate
3599 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003600 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003601 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003602 */
drh98d312f2012-10-25 15:23:14 +00003603 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003604 char *z;
drhc28490c2006-10-26 14:25:58 +00003605 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003606 if( z[0]!='-' ){
3607 if( data.zDbFilename==0 ){
3608 data.zDbFilename = z;
3609 continue;
3610 }
3611 if( zFirstCmd==0 ){
3612 zFirstCmd = z;
3613 continue;
3614 }
3615 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3616 fprintf(stderr,"Use -help for a list of options.\n");
3617 return 1;
3618 }
drhcc3b4f82012-02-07 14:13:50 +00003619 if( z[1]=='-' ) z++;
3620 if( strcmp(z,"-separator")==0
3621 || strcmp(z,"-nullvalue")==0
3622 || strcmp(z,"-cmd")==0
3623 ){
drh98d312f2012-10-25 15:23:14 +00003624 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003625 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003626 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003627 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003628 /* Need to check for batch mode here to so we can avoid printing
3629 ** informational messages (like from process_sqliterc) before
3630 ** we do the actual processing of arguments later in a second pass.
3631 */
shanef69573d2009-10-24 02:06:14 +00003632 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003633 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003634#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003635 const char *zSize;
3636 sqlite3_int64 szHeap;
3637
drh98d312f2012-10-25 15:23:14 +00003638 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003639 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003640 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003641 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3642#endif
drh97ae8ff2011-03-16 16:56:29 +00003643#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003644 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003645 extern int vfstrace_register(
3646 const char *zTraceName,
3647 const char *zOldVfsName,
3648 int (*xOut)(const char*,void*),
3649 void *pOutArg,
3650 int makeDefault
3651 );
drh2b625e22011-03-16 17:05:28 +00003652 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003653#endif
drh6f25e892011-07-08 17:02:57 +00003654#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003655 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003656 extern int sqlite3_multiple_initialize(const char*,int);
3657 sqlite3_multiplex_initialize(0, 1);
3658#endif
drh7d9f3942013-04-03 01:26:54 +00003659 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003660 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3661 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003662 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003663 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003664 if( pVfs ){
3665 sqlite3_vfs_register(pVfs, 1);
3666 }else{
3667 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3668 exit(1);
3669 }
drh44c2eb12003-04-30 11:38:26 +00003670 }
3671 }
drh98d312f2012-10-25 15:23:14 +00003672 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003673#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003674 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003675 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003676#else
shane86f5bdb2009-10-24 02:00:07 +00003677 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3678 return 1;
drh01b41712005-08-29 23:06:23 +00003679#endif
drhc7181902014-02-27 15:04:13 +00003680#ifdef SQLITE_SHELL_DBNAME_PROC
3681 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3682 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3683 warnInmemoryDb = 0; }
3684#endif
drh98d312f2012-10-25 15:23:14 +00003685 }
3686 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003687
drh44c2eb12003-04-30 11:38:26 +00003688 /* Go ahead and open the database file if it already exists. If the
3689 ** file does not exist, delay opening it. This prevents empty database
3690 ** files from being created if a user mistypes the database name argument
3691 ** to the sqlite command-line tool.
3692 */
drhc8d74412004-08-31 23:41:26 +00003693 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003694 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003695 }
3696
drh22fbcb82004-02-01 01:22:50 +00003697 /* Process the initialization file if there is one. If no -init option
3698 ** is given on the command line, look for a file named ~/.sqliterc and
3699 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003700 */
shane86f5bdb2009-10-24 02:00:07 +00003701 rc = process_sqliterc(&data,zInitFile);
3702 if( rc>0 ){
3703 return rc;
3704 }
drh44c2eb12003-04-30 11:38:26 +00003705
drh22fbcb82004-02-01 01:22:50 +00003706 /* Make a second pass through the command-line argument and set
3707 ** options. This second pass is delayed until after the initialization
3708 ** file is processed so that the command-line arguments will override
3709 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003710 */
drh98d312f2012-10-25 15:23:14 +00003711 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003712 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003713 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003714 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003715 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003716 i++;
3717 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003718 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003719 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003720 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003721 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003722 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003723 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003724 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003725 }else if( strcmp(z,"-csv")==0 ){
3726 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003727 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003728 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003729 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003730 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003731 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003732 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003733 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003734 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003735 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003736 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003737 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003738 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003739 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00003740 }else if( strcmp(z,"-eqp")==0 ){
3741 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00003742 }else if( strcmp(z,"-stats")==0 ){
3743 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003744 }else if( strcmp(z,"-bail")==0 ){
3745 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003746 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003747 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003748 return 0;
drhc28490c2006-10-26 14:25:58 +00003749 }else if( strcmp(z,"-interactive")==0 ){
3750 stdin_is_interactive = 1;
3751 }else if( strcmp(z,"-batch")==0 ){
3752 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003753 }else if( strcmp(z,"-heap")==0 ){
3754 i++;
drh7d9f3942013-04-03 01:26:54 +00003755 }else if( strcmp(z,"-mmap")==0 ){
3756 i++;
drha7e61d82011-03-12 17:02:57 +00003757 }else if( strcmp(z,"-vfs")==0 ){
3758 i++;
drh6f25e892011-07-08 17:02:57 +00003759#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003760 }else if( strcmp(z,"-vfstrace")==0 ){
3761 i++;
drh6f25e892011-07-08 17:02:57 +00003762#endif
3763#ifdef SQLITE_ENABLE_MULTIPLEX
3764 }else if( strcmp(z,"-multiplex")==0 ){
3765 i++;
3766#endif
drhcc3b4f82012-02-07 14:13:50 +00003767 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003768 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003769 }else if( strcmp(z,"-cmd")==0 ){
3770 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003771 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003772 if( z[0]=='.' ){
3773 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003774 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003775 }else{
drh05782482013-10-24 15:20:20 +00003776 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003777 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3778 if( zErrMsg!=0 ){
3779 fprintf(stderr,"Error: %s\n", zErrMsg);
3780 if( bail_on_error ) return rc!=0 ? rc : 1;
3781 }else if( rc!=0 ){
3782 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3783 if( bail_on_error ) return rc;
3784 }
3785 }
drh1e5d0e92000-05-31 23:33:17 +00003786 }else{
shane86f5bdb2009-10-24 02:00:07 +00003787 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003788 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003789 return 1;
3790 }
3791 }
drh44c2eb12003-04-30 11:38:26 +00003792
drh22fbcb82004-02-01 01:22:50 +00003793 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003794 /* Run just the command that follows the database name
3795 */
drh22fbcb82004-02-01 01:22:50 +00003796 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003797 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003798 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003799 }else{
drh05782482013-10-24 15:20:20 +00003800 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003801 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003802 if( zErrMsg!=0 ){
3803 fprintf(stderr,"Error: %s\n", zErrMsg);
3804 return rc!=0 ? rc : 1;
3805 }else if( rc!=0 ){
3806 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3807 return rc;
drh6ff13852001-11-25 13:18:23 +00003808 }
drh75897232000-05-29 14:26:00 +00003809 }
3810 }else{
drh44c2eb12003-04-30 11:38:26 +00003811 /* Run commands received from standard input
3812 */
drhc28490c2006-10-26 14:25:58 +00003813 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003814 char *zHome;
3815 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003816 int nHistory;
drh75897232000-05-29 14:26:00 +00003817 printf(
drh743e0032011-12-12 16:51:50 +00003818 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003819 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003820 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003821 );
drhb3735912014-02-10 16:13:42 +00003822 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003823 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00003824 printBold("transient in-memory database");
3825 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003826 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003827 }
drh67505e72002-04-19 12:34:06 +00003828 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003829 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003830 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003831 if( (zHistory = malloc(nHistory))!=0 ){
3832 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3833 }
drh67505e72002-04-19 12:34:06 +00003834 }
drhaaa21b42014-02-11 14:37:51 +00003835#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003836 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003837#endif
drhc28490c2006-10-26 14:25:58 +00003838 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003839 if( zHistory ){
3840 stifle_history(100);
3841 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003842 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003843 }
drhdaffd0e2001-04-11 14:28:42 +00003844 }else{
drhc28490c2006-10-26 14:25:58 +00003845 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003846 }
3847 }
drh33048c02001-10-01 14:29:22 +00003848 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003849 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003850 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003851 }
drh05782482013-10-24 15:20:20 +00003852 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003853 return rc;
drh75897232000-05-29 14:26:00 +00003854}