blob: dc0589d93e4cd39ee747a2c88d8833169019e78f [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);
drh43ae8f62014-05-23 12:03:47 +0000700 seenInterrupt++;
701 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000702 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000703}
danielk19774af00c62005-01-23 23:43:21 +0000704#endif
drh4c504392000-10-16 22:06:40 +0000705
706/*
shane626a6e42009-10-22 17:30:15 +0000707** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000708** invokes for each row of a query result.
709*/
shane626a6e42009-10-22 17:30:15 +0000710static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000711 int i;
712 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000713
drh75897232000-05-29 14:26:00 +0000714 switch( p->mode ){
715 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000716 int w = 5;
drh6a535342001-10-19 16:44:56 +0000717 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000718 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000719 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000720 if( len>w ) w = len;
721 }
drh75897232000-05-29 14:26:00 +0000722 if( p->cnt++>0 ) fprintf(p->out,"\n");
723 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000724 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000725 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000726 }
727 break;
728 }
danielk19770d78bae2008-01-03 07:09:48 +0000729 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000730 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000731 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000732 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000733 int w, n;
734 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000735 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000736 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000737 w = 0;
drh75897232000-05-29 14:26:00 +0000738 }
drh078b1fd2012-09-21 13:40:02 +0000739 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000740 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000741 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000742 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000743 if( w<n ) w = n;
744 }
745 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000746 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000747 }
748 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000749 if( w<0 ){
750 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
751 }else{
752 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
753 }
drha0c66f52000-07-29 13:20:21 +0000754 }
755 }
756 if( p->showHeader ){
757 for(i=0; i<nArg; i++){
758 int w;
759 if( i<ArraySize(p->actualWidth) ){
760 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000761 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000762 }else{
763 w = 10;
764 }
765 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
766 "----------------------------------------------------------",
767 i==nArg-1 ? "\n": " ");
768 }
drh75897232000-05-29 14:26:00 +0000769 }
770 }
drh6a535342001-10-19 16:44:56 +0000771 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000772 for(i=0; i<nArg; i++){
773 int w;
drha0c66f52000-07-29 13:20:21 +0000774 if( i<ArraySize(p->actualWidth) ){
775 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000776 }else{
777 w = 10;
778 }
dana98bf362013-11-13 18:35:01 +0000779 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000780 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000781 }
dana98bf362013-11-13 18:35:01 +0000782 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000783 if( p->iIndent<p->nIndent ){
784 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000785 }
danc4650bb2013-11-18 08:41:06 +0000786 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000787 }
drh078b1fd2012-09-21 13:40:02 +0000788 if( w<0 ){
789 fprintf(p->out,"%*.*s%s",-w,-w,
790 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
791 }else{
792 fprintf(p->out,"%-*.*s%s",w,w,
793 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
794 }
drh75897232000-05-29 14:26:00 +0000795 }
796 break;
797 }
drhe3710332000-09-29 13:30:53 +0000798 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000799 case MODE_List: {
800 if( p->cnt++==0 && p->showHeader ){
801 for(i=0; i<nArg; i++){
802 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
803 }
804 }
drh6a535342001-10-19 16:44:56 +0000805 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000806 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000807 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000808 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000809 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000810 if( i<nArg-1 ){
811 fprintf(p->out, "%s", p->separator);
812 }else if( p->mode==MODE_Semi ){
813 fprintf(p->out, ";\n");
814 }else{
815 fprintf(p->out, "\n");
816 }
drh75897232000-05-29 14:26:00 +0000817 }
818 break;
819 }
drh1e5d0e92000-05-31 23:33:17 +0000820 case MODE_Html: {
821 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000822 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000823 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000824 fprintf(p->out,"<TH>");
825 output_html_string(p->out, azCol[i]);
826 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000827 }
mihailim57c591a2008-06-23 21:26:05 +0000828 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000829 }
drh6a535342001-10-19 16:44:56 +0000830 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000831 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000832 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000833 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000834 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000835 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000836 }
mihailim57c591a2008-06-23 21:26:05 +0000837 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000838 break;
839 }
drhfeac5f82004-08-01 00:10:45 +0000840 case MODE_Tcl: {
841 if( p->cnt++==0 && p->showHeader ){
842 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000843 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000844 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000845 }
846 fprintf(p->out,"\n");
847 }
848 if( azArg==0 ) break;
849 for(i=0; i<nArg; i++){
850 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000851 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000852 }
853 fprintf(p->out,"\n");
854 break;
855 }
drh8e64d1c2004-10-07 00:32:39 +0000856 case MODE_Csv: {
857 if( p->cnt++==0 && p->showHeader ){
858 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000859 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000860 }
861 fprintf(p->out,"\n");
862 }
863 if( azArg==0 ) break;
864 for(i=0; i<nArg; i++){
865 output_csv(p, azArg[i], i<nArg-1);
866 }
867 fprintf(p->out,"\n");
868 break;
869 }
drh28bd4bc2000-06-15 15:57:22 +0000870 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000871 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000872 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000873 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000874 for(i=0; i<nArg; i++){
875 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000876 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000877 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000878 }else if( aiType && aiType[i]==SQLITE_TEXT ){
879 if( zSep[0] ) fprintf(p->out,"%s",zSep);
880 output_quoted_string(p->out, azArg[i]);
881 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
882 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000883 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
884 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
885 int nBlob = sqlite3_column_bytes(p->pStmt, i);
886 if( zSep[0] ) fprintf(p->out,"%s",zSep);
887 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000888 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000889 fprintf(p->out,"%s%s",zSep, azArg[i]);
890 }else{
891 if( zSep[0] ) fprintf(p->out,"%s",zSep);
892 output_quoted_string(p->out, azArg[i]);
893 }
894 }
895 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000896 break;
drh28bd4bc2000-06-15 15:57:22 +0000897 }
persicom1d0b8722002-04-18 02:53:04 +0000898 }
drh75897232000-05-29 14:26:00 +0000899 return 0;
900}
901
902/*
shane626a6e42009-10-22 17:30:15 +0000903** This is the callback routine that the SQLite library
904** invokes for each row of a query result.
905*/
906static int callback(void *pArg, int nArg, char **azArg, char **azCol){
907 /* since we don't have type info, call the shell_callback with a NULL value */
908 return shell_callback(pArg, nArg, azArg, azCol, NULL);
909}
910
911/*
drh33048c02001-10-01 14:29:22 +0000912** Set the destination table field of the callback_data structure to
913** the name of the table given. Escape any quote characters in the
914** table name.
915*/
916static void set_table_name(struct callback_data *p, const char *zName){
917 int i, n;
918 int needQuote;
919 char *z;
920
921 if( p->zDestTable ){
922 free(p->zDestTable);
923 p->zDestTable = 0;
924 }
925 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000926 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000927 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000928 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000929 needQuote = 1;
930 if( zName[i]=='\'' ) n++;
931 }
932 }
933 if( needQuote ) n += 2;
934 z = p->zDestTable = malloc( n+1 );
935 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000936 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000937 exit(1);
938 }
939 n = 0;
940 if( needQuote ) z[n++] = '\'';
941 for(i=0; zName[i]; i++){
942 z[n++] = zName[i];
943 if( zName[i]=='\'' ) z[n++] = '\'';
944 }
945 if( needQuote ) z[n++] = '\'';
946 z[n] = 0;
947}
948
danielk19772a02e332004-06-05 08:04:36 +0000949/* zIn is either a pointer to a NULL-terminated string in memory obtained
950** from malloc(), or a NULL pointer. The string pointed to by zAppend is
951** added to zIn, and the result returned in memory obtained from malloc().
952** zIn, if it was not NULL, is freed.
953**
954** If the third argument, quote, is not '\0', then it is used as a
955** quote character for zAppend.
956*/
drhc28490c2006-10-26 14:25:58 +0000957static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000958 int len;
959 int i;
drh4f21c4a2008-12-10 22:15:00 +0000960 int nAppend = strlen30(zAppend);
961 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000962
963 len = nAppend+nIn+1;
964 if( quote ){
965 len += 2;
966 for(i=0; i<nAppend; i++){
967 if( zAppend[i]==quote ) len++;
968 }
969 }
970
971 zIn = (char *)realloc(zIn, len);
972 if( !zIn ){
973 return 0;
974 }
975
976 if( quote ){
977 char *zCsr = &zIn[nIn];
978 *zCsr++ = quote;
979 for(i=0; i<nAppend; i++){
980 *zCsr++ = zAppend[i];
981 if( zAppend[i]==quote ) *zCsr++ = quote;
982 }
983 *zCsr++ = quote;
984 *zCsr++ = '\0';
985 assert( (zCsr-zIn)==len );
986 }else{
987 memcpy(&zIn[nIn], zAppend, nAppend);
988 zIn[len-1] = '\0';
989 }
990
991 return zIn;
992}
993
drhdd3d4592004-08-30 01:54:05 +0000994
995/*
drhb21a8e42012-01-28 21:08:51 +0000996** Execute a query statement that will generate SQL output. Print
997** the result columns, comma-separated, on a line and then add a
998** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000999**
drhb21a8e42012-01-28 21:08:51 +00001000** If the number of columns is 1 and that column contains text "--"
1001** then write the semicolon on a separate line. That way, if a
1002** "--" comment occurs at the end of the statement, the comment
1003** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001004*/
drh157e29a2009-05-21 15:15:00 +00001005static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001006 struct callback_data *p, /* Query context */
1007 const char *zSelect, /* SELECT statement to extract content */
1008 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001009){
drhdd3d4592004-08-30 01:54:05 +00001010 sqlite3_stmt *pSelect;
1011 int rc;
drhb21a8e42012-01-28 21:08:51 +00001012 int nResult;
1013 int i;
1014 const char *z;
drhc7181902014-02-27 15:04:13 +00001015 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001016 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001017 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001018 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001019 return rc;
1020 }
1021 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001022 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001023 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001024 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001025 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001026 zFirstRow = 0;
1027 }
drhb21a8e42012-01-28 21:08:51 +00001028 z = (const char*)sqlite3_column_text(pSelect, 0);
1029 fprintf(p->out, "%s", z);
1030 for(i=1; i<nResult; i++){
1031 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1032 }
1033 if( z==0 ) z = "";
1034 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1035 if( z[0] ){
1036 fprintf(p->out, "\n;\n");
1037 }else{
1038 fprintf(p->out, ";\n");
1039 }
drhdd3d4592004-08-30 01:54:05 +00001040 rc = sqlite3_step(pSelect);
1041 }
drh2f464a02011-10-13 00:41:49 +00001042 rc = sqlite3_finalize(pSelect);
1043 if( rc!=SQLITE_OK ){
1044 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001045 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001046 }
1047 return rc;
drhdd3d4592004-08-30 01:54:05 +00001048}
1049
shane626a6e42009-10-22 17:30:15 +00001050/*
1051** Allocate space and save off current error string.
1052*/
1053static char *save_err_msg(
1054 sqlite3 *db /* Database to query */
1055){
1056 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1057 char *zErrMsg = sqlite3_malloc(nErrMsg);
1058 if( zErrMsg ){
1059 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1060 }
1061 return zErrMsg;
1062}
1063
1064/*
shaneh642d8b82010-07-28 16:05:34 +00001065** Display memory stats.
1066*/
1067static int display_stats(
1068 sqlite3 *db, /* Database to query */
1069 struct callback_data *pArg, /* Pointer to struct callback_data */
1070 int bReset /* True to reset the stats */
1071){
1072 int iCur;
1073 int iHiwtr;
1074
1075 if( pArg && pArg->out ){
1076
1077 iHiwtr = iCur = -1;
1078 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001079 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001080 iHiwtr = iCur = -1;
1081 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001082 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001083/*
1084** Not currently used by the CLI.
1085** iHiwtr = iCur = -1;
1086** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1087** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1088*/
1089 iHiwtr = iCur = -1;
1090 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1091 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1092/*
1093** Not currently used by the CLI.
1094** iHiwtr = iCur = -1;
1095** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1096** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1097*/
1098 iHiwtr = iCur = -1;
1099 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1100 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1101 iHiwtr = iCur = -1;
1102 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1103 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1104 iHiwtr = iCur = -1;
1105 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1106 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1107 iHiwtr = iCur = -1;
1108 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1109 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1110#ifdef YYTRACKMAXSTACKDEPTH
1111 iHiwtr = iCur = -1;
1112 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1113 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1114#endif
1115 }
1116
1117 if( pArg && pArg->out && db ){
1118 iHiwtr = iCur = -1;
1119 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1120 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001121 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1122 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1123 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1124 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1125 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1126 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001127 iHiwtr = iCur = -1;
1128 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001129 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1130 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1131 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1132 iHiwtr = iCur = -1;
1133 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1134 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001135 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001136 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1137 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1138 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001139 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1140 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1141 iHiwtr = iCur = -1;
1142 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1143 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1144 }
1145
1146 if( pArg && pArg->out && db && pArg->pStmt ){
1147 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1148 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1149 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1150 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1151 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1152 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001153 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1154 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001155 }
1156
1157 return 0;
1158}
1159
1160/*
dana98bf362013-11-13 18:35:01 +00001161** Parameter azArray points to a zero-terminated array of strings. zStr
1162** points to a single nul-terminated string. Return non-zero if zStr
1163** is equal, according to strcmp(), to any of the strings in the array.
1164** Otherwise, return zero.
1165*/
1166static int str_in_array(const char *zStr, const char **azArray){
1167 int i;
1168 for(i=0; azArray[i]; i++){
1169 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1170 }
1171 return 0;
1172}
1173
1174/*
1175** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1176** and populate the callback_data.aiIndent[] array with the number of
1177** spaces each opcode should be indented before it is output.
1178**
1179** The indenting rules are:
1180**
1181** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1182** all opcodes that occur between the p2 jump destination and the opcode
1183** itself by 2 spaces.
1184**
drh01752bc2013-11-14 23:59:33 +00001185** * For each "Goto", if the jump destination is earlier in the program
1186** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001187** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001188** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001189** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001190** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001191*/
1192static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1193 const char *zSql; /* The text of the SQL statement */
1194 const char *z; /* Used to check if this is an EXPLAIN */
1195 int *abYield = 0; /* True if op is an OP_Yield */
1196 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001197 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001198
drh8ad0de32014-03-20 18:45:27 +00001199 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1200 "NextIfOpen", "PrevIfOpen", 0 };
drhe73f0592014-01-21 22:25:45 +00001201 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001202 const char *azGoto[] = { "Goto", 0 };
1203
1204 /* Try to figure out if this is really an EXPLAIN statement. If this
1205 ** cannot be verified, return early. */
1206 zSql = sqlite3_sql(pSql);
1207 if( zSql==0 ) return;
1208 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1209 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1210
1211 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1212 int i;
danc4650bb2013-11-18 08:41:06 +00001213 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001214 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001215
1216 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1217 ** p2 is an instruction address, set variable p2op to the index of that
1218 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1219 ** the current instruction is part of a sub-program generated by an
1220 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001221 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001222 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001223
1224 /* Grow the p->aiIndent array as required */
1225 if( iOp>=nAlloc ){
1226 nAlloc += 100;
1227 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1228 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1229 }
1230 abYield[iOp] = str_in_array(zOp, azYield);
1231 p->aiIndent[iOp] = 0;
1232 p->nIndent = iOp+1;
1233
1234 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001235 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001236 }
drhfe705102014-03-06 13:38:37 +00001237 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1238 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1239 ){
drhe73f0592014-01-21 22:25:45 +00001240 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001241 }
1242 }
1243
danc4650bb2013-11-18 08:41:06 +00001244 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001245 sqlite3_free(abYield);
1246 sqlite3_reset(pSql);
1247}
1248
1249/*
1250** Free the array allocated by explain_data_prepare().
1251*/
1252static void explain_data_delete(struct callback_data *p){
1253 sqlite3_free(p->aiIndent);
1254 p->aiIndent = 0;
1255 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001256 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001257}
1258
1259/*
shane626a6e42009-10-22 17:30:15 +00001260** Execute a statement or set of statements. Print
1261** any result rows/columns depending on the current mode
1262** set via the supplied callback.
1263**
1264** This is very similar to SQLite's built-in sqlite3_exec()
1265** function except it takes a slightly different callback
1266** and callback data argument.
1267*/
1268static int shell_exec(
1269 sqlite3 *db, /* An open database */
1270 const char *zSql, /* SQL to be evaluated */
1271 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1272 /* (not the same as sqlite3_exec) */
1273 struct callback_data *pArg, /* Pointer to struct callback_data */
1274 char **pzErrMsg /* Error msg written here */
1275){
dan4564ced2010-01-05 04:59:56 +00001276 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1277 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001278 int rc2;
dan4564ced2010-01-05 04:59:56 +00001279 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001280
1281 if( pzErrMsg ){
1282 *pzErrMsg = NULL;
1283 }
1284
shaneb9fc17d2009-10-22 21:23:35 +00001285 while( zSql[0] && (SQLITE_OK == rc) ){
1286 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1287 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001288 if( pzErrMsg ){
1289 *pzErrMsg = save_err_msg(db);
1290 }
1291 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001292 if( !pStmt ){
1293 /* this happens for a comment or white-space */
1294 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001295 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001296 continue;
1297 }
shane626a6e42009-10-22 17:30:15 +00001298
shaneh642d8b82010-07-28 16:05:34 +00001299 /* save off the prepared statment handle and reset row count */
1300 if( pArg ){
1301 pArg->pStmt = pStmt;
1302 pArg->cnt = 0;
1303 }
1304
shanehb7977c52010-01-18 18:17:10 +00001305 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001306 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001307 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001308 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001309 }
shanehb7977c52010-01-18 18:17:10 +00001310
drhefbf3b12014-02-28 20:47:24 +00001311 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1312 if( pArg && pArg->autoEQP ){
1313 sqlite3_stmt *pExplain;
1314 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1315 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1316 if( rc==SQLITE_OK ){
1317 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1318 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1319 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1320 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1321 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1322 }
1323 }
1324 sqlite3_finalize(pExplain);
1325 sqlite3_free(zEQP);
1326 }
1327
drh7e02e5e2011-12-06 19:44:51 +00001328 /* Output TESTCTRL_EXPLAIN text of requested */
1329 if( pArg && pArg->mode==MODE_Explain ){
1330 const char *zExplain = 0;
1331 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1332 if( zExplain && zExplain[0] ){
1333 fprintf(pArg->out, "%s", zExplain);
1334 }
1335 }
1336
dana98bf362013-11-13 18:35:01 +00001337 /* If the shell is currently in ".explain" mode, gather the extra
1338 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001339 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001340 explain_data_prepare(pArg, pStmt);
1341 }
1342
shaneb9fc17d2009-10-22 21:23:35 +00001343 /* perform the first step. this will tell us if we
1344 ** have a result set or not and how wide it is.
1345 */
1346 rc = sqlite3_step(pStmt);
1347 /* if we have a result set... */
1348 if( SQLITE_ROW == rc ){
1349 /* if we have a callback... */
1350 if( xCallback ){
1351 /* allocate space for col name ptr, value ptr, and type */
1352 int nCol = sqlite3_column_count(pStmt);
1353 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1354 if( !pData ){
1355 rc = SQLITE_NOMEM;
1356 }else{
1357 char **azCols = (char **)pData; /* Names of result columns */
1358 char **azVals = &azCols[nCol]; /* Results */
1359 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001360 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001361 assert(sizeof(int) <= sizeof(char *));
1362 /* save off ptrs to column names */
1363 for(i=0; i<nCol; i++){
1364 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1365 }
shaneb9fc17d2009-10-22 21:23:35 +00001366 do{
1367 /* extract the data and data types */
1368 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001369 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001370 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001371 azVals[i] = "";
1372 }else{
1373 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1374 }
shaneb9fc17d2009-10-22 21:23:35 +00001375 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1376 rc = SQLITE_NOMEM;
1377 break; /* from for */
1378 }
1379 } /* end for */
1380
1381 /* if data and types extracted successfully... */
1382 if( SQLITE_ROW == rc ){
1383 /* call the supplied callback with the result row data */
1384 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1385 rc = SQLITE_ABORT;
1386 }else{
1387 rc = sqlite3_step(pStmt);
1388 }
1389 }
1390 } while( SQLITE_ROW == rc );
1391 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001392 }
1393 }else{
1394 do{
1395 rc = sqlite3_step(pStmt);
1396 } while( rc == SQLITE_ROW );
1397 }
1398 }
1399
dana98bf362013-11-13 18:35:01 +00001400 explain_data_delete(pArg);
1401
shaneh642d8b82010-07-28 16:05:34 +00001402 /* print usage stats if stats on */
1403 if( pArg && pArg->statsOn ){
1404 display_stats(db, pArg, 0);
1405 }
1406
dan4564ced2010-01-05 04:59:56 +00001407 /* Finalize the statement just executed. If this fails, save a
1408 ** copy of the error message. Otherwise, set zSql to point to the
1409 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001410 rc2 = sqlite3_finalize(pStmt);
1411 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001412 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001413 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001414 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001415 }else if( pzErrMsg ){
1416 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001417 }
shaneh642d8b82010-07-28 16:05:34 +00001418
1419 /* clear saved stmt handle */
1420 if( pArg ){
1421 pArg->pStmt = NULL;
1422 }
shane626a6e42009-10-22 17:30:15 +00001423 }
shaneb9fc17d2009-10-22 21:23:35 +00001424 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001425
1426 return rc;
1427}
1428
drhdd3d4592004-08-30 01:54:05 +00001429
drh33048c02001-10-01 14:29:22 +00001430/*
drh4c653a02000-06-07 01:27:47 +00001431** This is a different callback routine used for dumping the database.
1432** Each row received by this callback consists of a table name,
1433** the table type ("index" or "table") and SQL to create the table.
1434** This routine should print text sufficient to recreate the table.
1435*/
1436static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001437 int rc;
1438 const char *zTable;
1439 const char *zType;
1440 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001441 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001442 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001443
drh902b9ee2008-12-05 17:17:07 +00001444 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001445 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001446 zTable = azArg[0];
1447 zType = azArg[1];
1448 zSql = azArg[2];
1449
drh00b950d2005-09-11 02:03:03 +00001450 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001451 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001452 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001453 fprintf(p->out, "ANALYZE sqlite_master;\n");
1454 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1455 return 0;
drh45e29d82006-11-20 16:21:10 +00001456 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1457 char *zIns;
1458 if( !p->writableSchema ){
1459 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1460 p->writableSchema = 1;
1461 }
1462 zIns = sqlite3_mprintf(
1463 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1464 "VALUES('table','%q','%q',0,'%q');",
1465 zTable, zTable, zSql);
1466 fprintf(p->out, "%s\n", zIns);
1467 sqlite3_free(zIns);
1468 return 0;
drh00b950d2005-09-11 02:03:03 +00001469 }else{
1470 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001471 }
danielk19772a02e332004-06-05 08:04:36 +00001472
1473 if( strcmp(zType, "table")==0 ){
1474 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001475 char *zSelect = 0;
1476 char *zTableInfo = 0;
1477 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001478 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001479
1480 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1481 zTableInfo = appendText(zTableInfo, zTable, '"');
1482 zTableInfo = appendText(zTableInfo, ");", 0);
1483
drhc7181902014-02-27 15:04:13 +00001484 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001485 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001486 if( rc!=SQLITE_OK || !pTableInfo ){
1487 return 1;
1488 }
1489
1490 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001491 /* Always quote the table name, even if it appears to be pure ascii,
1492 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1493 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001494 if( zTmp ){
1495 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001496 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001497 }
1498 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1499 rc = sqlite3_step(pTableInfo);
1500 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001501 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001502 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001503 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001504 rc = sqlite3_step(pTableInfo);
1505 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001506 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001507 }else{
1508 zSelect = appendText(zSelect, ") ", 0);
1509 }
drh157e29a2009-05-21 15:15:00 +00001510 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001511 }
1512 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001513 if( rc!=SQLITE_OK || nRow==0 ){
1514 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001515 return 1;
1516 }
1517 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1518 zSelect = appendText(zSelect, zTable, '"');
1519
drh2f464a02011-10-13 00:41:49 +00001520 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001521 if( rc==SQLITE_CORRUPT ){
1522 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001523 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001524 }
drh85e72432012-04-11 11:38:53 +00001525 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001526 }
drh4c653a02000-06-07 01:27:47 +00001527 return 0;
1528}
1529
1530/*
drh45e29d82006-11-20 16:21:10 +00001531** Run zQuery. Use dump_callback() as the callback routine so that
1532** the contents of the query are output as SQL statements.
1533**
drhdd3d4592004-08-30 01:54:05 +00001534** If we get a SQLITE_CORRUPT error, rerun the query after appending
1535** "ORDER BY rowid DESC" to the end.
1536*/
1537static int run_schema_dump_query(
1538 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001539 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001540){
1541 int rc;
drh2f464a02011-10-13 00:41:49 +00001542 char *zErr = 0;
1543 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001544 if( rc==SQLITE_CORRUPT ){
1545 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001546 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001547 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1548 if( zErr ){
1549 fprintf(p->out, "/****** %s ******/\n", zErr);
1550 sqlite3_free(zErr);
1551 zErr = 0;
1552 }
drhdd3d4592004-08-30 01:54:05 +00001553 zQ2 = malloc( len+100 );
1554 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001555 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001556 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1557 if( rc ){
1558 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1559 }else{
1560 rc = SQLITE_CORRUPT;
1561 }
1562 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001563 free(zQ2);
1564 }
1565 return rc;
1566}
1567
1568/*
drh75897232000-05-29 14:26:00 +00001569** Text of a help message
1570*/
persicom1d0b8722002-04-18 02:53:04 +00001571static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001572 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001573 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001574 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001575 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001576 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001577 " If TABLE specified, only dump tables matching\n"
1578 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001579 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001580 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001581 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1582 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001583 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001584 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001585 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001586 ".indices ?TABLE? Show names of all indices\n"
1587 " If TABLE specified, only show indices for tables\n"
1588 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001589#ifdef SQLITE_ENABLE_IOTRACE
1590 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1591#endif
drh70df4fe2006-06-13 15:12:21 +00001592#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001593 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001594#endif
drh127f9d72010-02-23 01:47:00 +00001595 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001596 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001597 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001598 " column Left-aligned columns. (See .width)\n"
1599 " html HTML <table> code\n"
1600 " insert SQL insert statements for TABLE\n"
1601 " line One value per line\n"
1602 " list Values delimited by .separator string\n"
1603 " tabs Tab-separated values\n"
1604 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001605 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001606 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001607 ".output FILENAME Send output to FILENAME\n"
1608 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001609 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001610 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001611 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001612 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001613 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001614 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001615 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001616 " If TABLE specified, only show tables matching\n"
1617 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001618 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001619 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001620 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001621 ".tables ?TABLE? List names of tables\n"
1622 " If TABLE specified, only list tables matching\n"
1623 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001624 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001625 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001626 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001627 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001628;
1629
shaneb320ccd2009-10-21 03:42:58 +00001630static char zTimerHelp[] =
1631 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1632;
1633
drhdaffd0e2001-04-11 14:28:42 +00001634/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001635static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001636
drh75897232000-05-29 14:26:00 +00001637/*
drh44c2eb12003-04-30 11:38:26 +00001638** Make sure the database is open. If it is not, then open it. If
1639** the database fails to open, print an error message and exit.
1640*/
drh05782482013-10-24 15:20:20 +00001641static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001642 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001643 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001644 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001645 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001646 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1647 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1648 shellstaticFunc, 0, 0);
1649 }
1650 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001651 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001652 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001653 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001654 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001655 }
drhc2e87a32006-06-27 15:16:14 +00001656#ifndef SQLITE_OMIT_LOAD_EXTENSION
1657 sqlite3_enable_load_extension(p->db, 1);
1658#endif
drh44c2eb12003-04-30 11:38:26 +00001659 }
1660}
1661
1662/*
drhfeac5f82004-08-01 00:10:45 +00001663** Do C-language style dequoting.
1664**
1665** \t -> tab
1666** \n -> newline
1667** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001668** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001669** \NNN -> ascii character NNN in octal
1670** \\ -> backslash
1671*/
1672static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001673 int i, j;
1674 char c;
drhfeac5f82004-08-01 00:10:45 +00001675 for(i=j=0; (c = z[i])!=0; i++, j++){
1676 if( c=='\\' ){
1677 c = z[++i];
1678 if( c=='n' ){
1679 c = '\n';
1680 }else if( c=='t' ){
1681 c = '\t';
1682 }else if( c=='r' ){
1683 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001684 }else if( c=='\\' ){
1685 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001686 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001687 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001688 if( z[i+1]>='0' && z[i+1]<='7' ){
1689 i++;
1690 c = (c<<3) + z[i] - '0';
1691 if( z[i+1]>='0' && z[i+1]<='7' ){
1692 i++;
1693 c = (c<<3) + z[i] - '0';
1694 }
1695 }
1696 }
1697 }
1698 z[j] = c;
1699 }
1700 z[j] = 0;
1701}
1702
1703/*
drh348d19c2013-06-03 12:47:43 +00001704** Return the value of a hexadecimal digit. Return -1 if the input
1705** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001706*/
drh348d19c2013-06-03 12:47:43 +00001707static int hexDigitValue(char c){
1708 if( c>='0' && c<='9' ) return c - '0';
1709 if( c>='a' && c<='f' ) return c - 'a' + 10;
1710 if( c>='A' && c<='F' ) return c - 'A' + 10;
1711 return -1;
drhc28490c2006-10-26 14:25:58 +00001712}
1713
1714/*
drh7d9f3942013-04-03 01:26:54 +00001715** Interpret zArg as an integer value, possibly with suffixes.
1716*/
1717static sqlite3_int64 integerValue(const char *zArg){
1718 sqlite3_int64 v = 0;
1719 static const struct { char *zSuffix; int iMult; } aMult[] = {
1720 { "KiB", 1024 },
1721 { "MiB", 1024*1024 },
1722 { "GiB", 1024*1024*1024 },
1723 { "KB", 1000 },
1724 { "MB", 1000000 },
1725 { "GB", 1000000000 },
1726 { "K", 1000 },
1727 { "M", 1000000 },
1728 { "G", 1000000000 },
1729 };
1730 int i;
1731 int isNeg = 0;
1732 if( zArg[0]=='-' ){
1733 isNeg = 1;
1734 zArg++;
1735 }else if( zArg[0]=='+' ){
1736 zArg++;
1737 }
drh348d19c2013-06-03 12:47:43 +00001738 if( zArg[0]=='0' && zArg[1]=='x' ){
1739 int x;
1740 zArg += 2;
1741 while( (x = hexDigitValue(zArg[0]))>=0 ){
1742 v = (v<<4) + x;
1743 zArg++;
1744 }
1745 }else{
1746 while( IsDigit(zArg[0]) ){
1747 v = v*10 + zArg[0] - '0';
1748 zArg++;
1749 }
drh7d9f3942013-04-03 01:26:54 +00001750 }
drhc2bed0a2013-05-24 11:57:50 +00001751 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001752 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1753 v *= aMult[i].iMult;
1754 break;
1755 }
1756 }
1757 return isNeg? -v : v;
1758}
1759
1760/*
drh348d19c2013-06-03 12:47:43 +00001761** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1762** for TRUE and FALSE. Return the integer value if appropriate.
1763*/
1764static int booleanValue(char *zArg){
1765 int i;
1766 if( zArg[0]=='0' && zArg[1]=='x' ){
1767 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1768 }else{
1769 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1770 }
1771 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1772 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1773 return 1;
1774 }
1775 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1776 return 0;
1777 }
1778 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1779 zArg);
1780 return 0;
1781}
1782
1783/*
drh42f64e52012-04-04 16:56:23 +00001784** Close an output file, assuming it is not stderr or stdout
1785*/
1786static void output_file_close(FILE *f){
1787 if( f && f!=stdout && f!=stderr ) fclose(f);
1788}
1789
1790/*
1791** Try to open an output file. The names "stdout" and "stderr" are
1792** recognized and do the right thing. NULL is returned if the output
1793** filename is "off".
1794*/
1795static FILE *output_file_open(const char *zFile){
1796 FILE *f;
1797 if( strcmp(zFile,"stdout")==0 ){
1798 f = stdout;
1799 }else if( strcmp(zFile, "stderr")==0 ){
1800 f = stderr;
1801 }else if( strcmp(zFile, "off")==0 ){
1802 f = 0;
1803 }else{
1804 f = fopen(zFile, "wb");
1805 if( f==0 ){
1806 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1807 }
1808 }
1809 return f;
1810}
1811
1812/*
1813** A routine for handling output from sqlite3_trace().
1814*/
1815static void sql_trace_callback(void *pArg, const char *z){
1816 FILE *f = (FILE*)pArg;
1817 if( f ) fprintf(f, "%s\n", z);
1818}
1819
1820/*
drhd8621b92012-04-17 09:09:33 +00001821** A no-op routine that runs with the ".breakpoint" doc-command. This is
1822** a useful spot to set a debugger breakpoint.
1823*/
1824static void test_breakpoint(void){
1825 static int nCall = 0;
1826 nCall++;
1827}
1828
1829/*
drhdb95f682013-06-26 22:46:00 +00001830** An object used to read a CSV file
1831*/
1832typedef struct CSVReader CSVReader;
1833struct CSVReader {
1834 const char *zFile; /* Name of the input file */
1835 FILE *in; /* Read the CSV text from this input stream */
1836 char *z; /* Accumulated text for a field */
1837 int n; /* Number of bytes in z */
1838 int nAlloc; /* Space allocated for z[] */
1839 int nLine; /* Current line number */
1840 int cTerm; /* Character that terminated the most recent field */
1841 int cSeparator; /* The separator character. (Usually ",") */
1842};
1843
1844/* Append a single byte to z[] */
1845static void csv_append_char(CSVReader *p, int c){
1846 if( p->n+1>=p->nAlloc ){
1847 p->nAlloc += p->nAlloc + 100;
1848 p->z = sqlite3_realloc(p->z, p->nAlloc);
1849 if( p->z==0 ){
1850 fprintf(stderr, "out of memory\n");
1851 exit(1);
1852 }
1853 }
1854 p->z[p->n++] = (char)c;
1855}
1856
1857/* Read a single field of CSV text. Compatible with rfc4180 and extended
1858** with the option of having a separator other than ",".
1859**
1860** + Input comes from p->in.
1861** + Store results in p->z of length p->n. Space to hold p->z comes
1862** from sqlite3_malloc().
1863** + Use p->cSep as the separator. The default is ",".
1864** + Keep track of the line number in p->nLine.
1865** + Store the character that terminates the field in p->cTerm. Store
1866** EOF on end-of-file.
1867** + Report syntax errors on stderr
1868*/
1869static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001870 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001871 int cSep = p->cSeparator;
1872 p->n = 0;
1873 c = fgetc(p->in);
1874 if( c==EOF || seenInterrupt ){
1875 p->cTerm = EOF;
1876 return 0;
1877 }
1878 if( c=='"' ){
1879 int startLine = p->nLine;
1880 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001881 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001882 while( 1 ){
1883 c = fgetc(p->in);
1884 if( c=='\n' ) p->nLine++;
1885 if( c==cQuote ){
1886 if( pc==cQuote ){
1887 pc = 0;
1888 continue;
1889 }
1890 }
1891 if( (c==cSep && pc==cQuote)
1892 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001893 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001894 || (c==EOF && pc==cQuote)
1895 ){
1896 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001897 p->cTerm = c;
1898 break;
1899 }
1900 if( pc==cQuote && c!='\r' ){
1901 fprintf(stderr, "%s:%d: unescaped %c character\n",
1902 p->zFile, p->nLine, cQuote);
1903 }
1904 if( c==EOF ){
1905 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1906 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001907 p->cTerm = EOF;
1908 break;
1909 }
1910 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001911 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001912 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001913 }
drhdb95f682013-06-26 22:46:00 +00001914 }else{
drhd0a64dc2013-06-30 20:24:26 +00001915 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001916 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001917 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001918 }
1919 if( c=='\n' ){
1920 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001921 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001922 }
drhdb95f682013-06-26 22:46:00 +00001923 p->cTerm = c;
1924 }
drh8dd675e2013-07-12 21:09:24 +00001925 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001926 return p->z;
1927}
1928
1929/*
drh4bbcf102014-02-06 02:46:08 +00001930** Try to transfer data for table zTable. If an error is seen while
1931** moving forward, try to go backwards. The backwards movement won't
1932** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001933*/
mistachkine31ae902014-02-06 01:15:29 +00001934static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001935 struct callback_data *p,
1936 sqlite3 *newDb,
1937 const char *zTable
1938){
1939 sqlite3_stmt *pQuery = 0;
1940 sqlite3_stmt *pInsert = 0;
1941 char *zQuery = 0;
1942 char *zInsert = 0;
1943 int rc;
1944 int i, j, n;
1945 int nTable = (int)strlen(zTable);
1946 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001947 int cnt = 0;
1948 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001949
1950 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1951 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1952 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001953 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001954 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1955 zQuery);
1956 goto end_data_xfer;
1957 }
1958 n = sqlite3_column_count(pQuery);
1959 zInsert = sqlite3_malloc(200 + nTable + n*3);
1960 if( zInsert==0 ){
1961 fprintf(stderr, "out of memory\n");
1962 goto end_data_xfer;
1963 }
1964 sqlite3_snprintf(200+nTable,zInsert,
1965 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1966 i = (int)strlen(zInsert);
1967 for(j=1; j<n; j++){
1968 memcpy(zInsert+i, ",?", 2);
1969 i += 2;
1970 }
1971 memcpy(zInsert+i, ");", 3);
1972 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1973 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001974 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001975 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1976 zQuery);
1977 goto end_data_xfer;
1978 }
1979 for(k=0; k<2; k++){
1980 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1981 for(i=0; i<n; i++){
1982 switch( sqlite3_column_type(pQuery, i) ){
1983 case SQLITE_NULL: {
1984 sqlite3_bind_null(pInsert, i+1);
1985 break;
1986 }
1987 case SQLITE_INTEGER: {
1988 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1989 break;
1990 }
1991 case SQLITE_FLOAT: {
1992 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1993 break;
1994 }
1995 case SQLITE_TEXT: {
1996 sqlite3_bind_text(pInsert, i+1,
1997 (const char*)sqlite3_column_text(pQuery,i),
1998 -1, SQLITE_STATIC);
1999 break;
2000 }
2001 case SQLITE_BLOB: {
2002 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2003 sqlite3_column_bytes(pQuery,i),
2004 SQLITE_STATIC);
2005 break;
2006 }
2007 }
2008 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002009 rc = sqlite3_step(pInsert);
2010 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2011 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2012 sqlite3_errmsg(newDb));
2013 }
drh3350ce92014-02-06 00:49:12 +00002014 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002015 cnt++;
2016 if( (cnt%spinRate)==0 ){
2017 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2018 fflush(stdout);
2019 }
drh3350ce92014-02-06 00:49:12 +00002020 } /* End while */
2021 if( rc==SQLITE_DONE ) break;
2022 sqlite3_finalize(pQuery);
2023 sqlite3_free(zQuery);
2024 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2025 zTable);
2026 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2027 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002028 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2029 break;
drh3350ce92014-02-06 00:49:12 +00002030 }
2031 } /* End for(k=0...) */
2032
2033end_data_xfer:
2034 sqlite3_finalize(pQuery);
2035 sqlite3_finalize(pInsert);
2036 sqlite3_free(zQuery);
2037 sqlite3_free(zInsert);
2038}
2039
2040
2041/*
2042** Try to transfer all rows of the schema that match zWhere. For
2043** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002044** If an error is encountered while moving forward through the
2045** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002046*/
mistachkine31ae902014-02-06 01:15:29 +00002047static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002048 struct callback_data *p,
2049 sqlite3 *newDb,
2050 const char *zWhere,
2051 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2052){
2053 sqlite3_stmt *pQuery = 0;
2054 char *zQuery = 0;
2055 int rc;
2056 const unsigned char *zName;
2057 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002058 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002059
2060 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2061 " WHERE %s", zWhere);
2062 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2063 if( rc ){
2064 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2065 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2066 zQuery);
2067 goto end_schema_xfer;
2068 }
2069 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2070 zName = sqlite3_column_text(pQuery, 0);
2071 zSql = sqlite3_column_text(pQuery, 1);
2072 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002073 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2074 if( zErrMsg ){
2075 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2076 sqlite3_free(zErrMsg);
2077 zErrMsg = 0;
2078 }
drh3350ce92014-02-06 00:49:12 +00002079 if( xForEach ){
2080 xForEach(p, newDb, (const char*)zName);
2081 }
2082 printf("done\n");
2083 }
2084 if( rc!=SQLITE_DONE ){
2085 sqlite3_finalize(pQuery);
2086 sqlite3_free(zQuery);
2087 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2088 " WHERE %s ORDER BY rowid DESC", zWhere);
2089 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2090 if( rc ){
2091 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2092 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2093 zQuery);
2094 goto end_schema_xfer;
2095 }
2096 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2097 zName = sqlite3_column_text(pQuery, 0);
2098 zSql = sqlite3_column_text(pQuery, 1);
2099 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002100 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2101 if( zErrMsg ){
2102 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2103 sqlite3_free(zErrMsg);
2104 zErrMsg = 0;
2105 }
drh3350ce92014-02-06 00:49:12 +00002106 if( xForEach ){
2107 xForEach(p, newDb, (const char*)zName);
2108 }
2109 printf("done\n");
2110 }
2111 }
2112end_schema_xfer:
2113 sqlite3_finalize(pQuery);
2114 sqlite3_free(zQuery);
2115}
2116
2117/*
2118** Open a new database file named "zNewDb". Try to recover as much information
2119** as possible out of the main database (which might be corrupt) and write it
2120** into zNewDb.
2121*/
mistachkine31ae902014-02-06 01:15:29 +00002122static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002123 int rc;
2124 sqlite3 *newDb = 0;
2125 if( access(zNewDb,0)==0 ){
2126 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2127 return;
2128 }
2129 rc = sqlite3_open(zNewDb, &newDb);
2130 if( rc ){
2131 fprintf(stderr, "Cannot create output database: %s\n",
2132 sqlite3_errmsg(newDb));
2133 }else{
drh54d0d2d2014-04-03 00:32:13 +00002134 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002135 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002136 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2137 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002138 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002139 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002140 }
2141 sqlite3_close(newDb);
2142}
2143
2144/*
drh75897232000-05-29 14:26:00 +00002145** If an input line begins with "." then invoke this routine to
2146** process that line.
drh67505e72002-04-19 12:34:06 +00002147**
drh47ad6842006-11-08 12:25:42 +00002148** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002149*/
drh44c2eb12003-04-30 11:38:26 +00002150static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002151 int i = 1;
2152 int nArg = 0;
2153 int n, c;
drh67505e72002-04-19 12:34:06 +00002154 int rc = 0;
drh75897232000-05-29 14:26:00 +00002155 char *azArg[50];
2156
2157 /* Parse the input line into tokens.
2158 */
2159 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002160 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002161 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002162 if( zLine[i]=='\'' || zLine[i]=='"' ){
2163 int delim = zLine[i++];
2164 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002165 while( zLine[i] && zLine[i]!=delim ){
2166 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2167 i++;
2168 }
drh75897232000-05-29 14:26:00 +00002169 if( zLine[i]==delim ){
2170 zLine[i++] = 0;
2171 }
drhfeac5f82004-08-01 00:10:45 +00002172 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002173 }else{
2174 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002175 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002176 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002177 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002178 }
2179 }
2180
2181 /* Process the input line.
2182 */
shane9bd1b442009-10-23 01:27:39 +00002183 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002184 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002185 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002186 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2187 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2188 ){
drhbc46f022013-01-23 18:53:23 +00002189 const char *zDestFile = 0;
2190 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002191 sqlite3 *pDest;
2192 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002193 int j;
2194 for(j=1; j<nArg; j++){
2195 const char *z = azArg[j];
2196 if( z[0]=='-' ){
2197 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002198 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002199 {
2200 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2201 return 1;
2202 }
2203 }else if( zDestFile==0 ){
2204 zDestFile = azArg[j];
2205 }else if( zDb==0 ){
2206 zDb = zDestFile;
2207 zDestFile = azArg[j];
2208 }else{
2209 fprintf(stderr, "too many arguments to .backup\n");
2210 return 1;
2211 }
drh9ff849f2009-02-04 20:55:57 +00002212 }
drhbc46f022013-01-23 18:53:23 +00002213 if( zDestFile==0 ){
2214 fprintf(stderr, "missing FILENAME argument on .backup\n");
2215 return 1;
2216 }
2217 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002218 rc = sqlite3_open(zDestFile, &pDest);
2219 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002220 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002221 sqlite3_close(pDest);
2222 return 1;
2223 }
drh05782482013-10-24 15:20:20 +00002224 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002225 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2226 if( pBackup==0 ){
2227 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2228 sqlite3_close(pDest);
2229 return 1;
2230 }
2231 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2232 sqlite3_backup_finish(pBackup);
2233 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002234 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002235 }else{
2236 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002237 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002238 }
2239 sqlite3_close(pDest);
2240 }else
2241
shanehe2aa9d72009-11-06 17:20:17 +00002242 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002243 bail_on_error = booleanValue(azArg[1]);
2244 }else
2245
drhd8621b92012-04-17 09:09:33 +00002246 /* The undocumented ".breakpoint" command causes a call to the no-op
2247 ** routine named test_breakpoint().
2248 */
2249 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2250 test_breakpoint();
2251 }else
2252
mistachkine31ae902014-02-06 01:15:29 +00002253 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2254 tryToClone(p, azArg[1]);
2255 }else
2256
shanehe2aa9d72009-11-06 17:20:17 +00002257 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002258 struct callback_data data;
2259 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002260 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002261 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002262 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002263 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002264 data.colWidth[0] = 3;
2265 data.colWidth[1] = 15;
2266 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002267 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002268 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002269 if( zErrMsg ){
2270 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002271 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002272 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002273 }
2274 }else
2275
shanehe2aa9d72009-11-06 17:20:17 +00002276 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002277 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002278 /* When playing back a "dump", the content might appear in an order
2279 ** which causes immediate foreign key constraints to be violated.
2280 ** So disable foreign-key constraint enforcement to prevent problems. */
2281 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002282 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002283 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002284 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002285 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002286 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002287 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002288 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002289 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002290 );
2291 run_schema_dump_query(p,
2292 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002293 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002294 );
drh2f464a02011-10-13 00:41:49 +00002295 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002296 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002297 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002298 );
drh4c653a02000-06-07 01:27:47 +00002299 }else{
2300 int i;
drhdd3d4592004-08-30 01:54:05 +00002301 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002302 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002303 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002304 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002305 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002306 " AND sql NOT NULL");
2307 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002308 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002309 "WHERE sql NOT NULL"
2310 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002311 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002312 );
danielk1977bc6ada42004-06-30 08:20:16 +00002313 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002314 }
2315 }
drh45e29d82006-11-20 16:21:10 +00002316 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002317 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002318 p->writableSchema = 0;
2319 }
drh56197952011-10-13 16:30:13 +00002320 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2321 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002322 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002323 }else
drh75897232000-05-29 14:26:00 +00002324
shanehe2aa9d72009-11-06 17:20:17 +00002325 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002326 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002327 }else
2328
drhefbf3b12014-02-28 20:47:24 +00002329 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 && nArg>1 && nArg<3 ){
2330 p->autoEQP = booleanValue(azArg[1]);
2331 }else
2332
drhd3ac7d92013-01-25 18:33:43 +00002333 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002334 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002335 rc = 2;
drh75897232000-05-29 14:26:00 +00002336 }else
2337
shanehe2aa9d72009-11-06 17:20:17 +00002338 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002339 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002340 if(val == 1) {
2341 if(!p->explainPrev.valid) {
2342 p->explainPrev.valid = 1;
2343 p->explainPrev.mode = p->mode;
2344 p->explainPrev.showHeader = p->showHeader;
2345 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2346 }
2347 /* We could put this code under the !p->explainValid
2348 ** condition so that it does not execute if we are already in
2349 ** explain mode. However, always executing it allows us an easy
2350 ** was to reset to explain mode in case the user previously
2351 ** did an .explain followed by a .width, .mode or .header
2352 ** command.
2353 */
danielk19770d78bae2008-01-03 07:09:48 +00002354 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002355 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002356 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002357 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002358 p->colWidth[1] = 13; /* opcode */
2359 p->colWidth[2] = 4; /* P1 */
2360 p->colWidth[3] = 4; /* P2 */
2361 p->colWidth[4] = 4; /* P3 */
2362 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002363 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002364 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002365 }else if (p->explainPrev.valid) {
2366 p->explainPrev.valid = 0;
2367 p->mode = p->explainPrev.mode;
2368 p->showHeader = p->explainPrev.showHeader;
2369 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2370 }
drh75897232000-05-29 14:26:00 +00002371 }else
2372
drhc28490c2006-10-26 14:25:58 +00002373 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002374 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002375 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002376 }else
2377
2378 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002379 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002380 if( HAS_TIMER ){
2381 fprintf(stderr,"%s",zTimerHelp);
2382 }
drh75897232000-05-29 14:26:00 +00002383 }else
2384
shanehe2aa9d72009-11-06 17:20:17 +00002385 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002386 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002387 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002388 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002389 int nCol; /* Number of columns in the table */
2390 int nByte; /* Number of bytes in an SQL string */
2391 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002392 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002393 int nSep; /* Number of bytes in p->separator[] */
2394 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002395 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002396 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002397
drhdb95f682013-06-26 22:46:00 +00002398 seenInterrupt = 0;
2399 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002400 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002401 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002402 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002403 fprintf(stderr, "Error: non-null separator required for import\n");
2404 return 1;
drhfeac5f82004-08-01 00:10:45 +00002405 }
drhdb95f682013-06-26 22:46:00 +00002406 if( nSep>1 ){
2407 fprintf(stderr, "Error: multi-character separators not allowed"
2408 " for import\n");
2409 return 1;
2410 }
drh5bde8162013-06-27 14:07:53 +00002411 sCsv.zFile = zFile;
2412 sCsv.nLine = 1;
2413 if( sCsv.zFile[0]=='|' ){
2414 sCsv.in = popen(sCsv.zFile+1, "r");
2415 sCsv.zFile = "<pipe>";
2416 xCloser = pclose;
2417 }else{
2418 sCsv.in = fopen(sCsv.zFile, "rb");
2419 xCloser = fclose;
2420 }
drhdb95f682013-06-26 22:46:00 +00002421 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002422 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002423 return 1;
2424 }
2425 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002426 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002427 if( zSql==0 ){
2428 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002429 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002430 return 1;
2431 }
drh4f21c4a2008-12-10 22:15:00 +00002432 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002433 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002434 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2435 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2436 char cSep = '(';
2437 while( csv_read_one_field(&sCsv) ){
2438 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2439 cSep = ',';
2440 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2441 }
drh5bde8162013-06-27 14:07:53 +00002442 if( cSep=='(' ){
2443 sqlite3_free(zCreate);
2444 sqlite3_free(sCsv.z);
2445 xCloser(sCsv.in);
2446 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2447 return 1;
2448 }
drhdb95f682013-06-26 22:46:00 +00002449 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2450 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2451 sqlite3_free(zCreate);
2452 if( rc ){
2453 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2454 sqlite3_errmsg(db));
2455 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002456 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002457 return 1;
2458 }
drhc7181902014-02-27 15:04:13 +00002459 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002460 }
drhfeac5f82004-08-01 00:10:45 +00002461 sqlite3_free(zSql);
2462 if( rc ){
shane916f9612009-10-23 00:37:15 +00002463 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002464 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002465 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002466 return 1;
drhfeac5f82004-08-01 00:10:45 +00002467 }
shane916f9612009-10-23 00:37:15 +00002468 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002469 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002470 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002471 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002472 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002473 if( zSql==0 ){
2474 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002475 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002476 return 1;
2477 }
drhdb95f682013-06-26 22:46:00 +00002478 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002479 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002480 for(i=1; i<nCol; i++){
2481 zSql[j++] = ',';
2482 zSql[j++] = '?';
2483 }
2484 zSql[j++] = ')';
2485 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002486 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002487 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002488 if( rc ){
2489 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002490 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002491 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002492 return 1;
drhfeac5f82004-08-01 00:10:45 +00002493 }
drh2d463112013-08-06 14:36:36 +00002494 needCommit = sqlite3_get_autocommit(db);
2495 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002496 do{
2497 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002498 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002499 char *z = csv_read_one_field(&sCsv);
2500 if( z==0 && i==0 ) break;
2501 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2502 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2503 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2504 "filling the rest with NULL\n",
2505 sCsv.zFile, startLine, nCol, i+1);
2506 i++;
2507 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002508 }
drhfeac5f82004-08-01 00:10:45 +00002509 }
drhdb95f682013-06-26 22:46:00 +00002510 if( sCsv.cTerm==sCsv.cSeparator ){
2511 do{
2512 csv_read_one_field(&sCsv);
2513 i++;
2514 }while( sCsv.cTerm==sCsv.cSeparator );
2515 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2516 "extras ignored\n",
2517 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002518 }
drhdb95f682013-06-26 22:46:00 +00002519 if( i>=nCol ){
2520 sqlite3_step(pStmt);
2521 rc = sqlite3_reset(pStmt);
2522 if( rc!=SQLITE_OK ){
2523 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2524 sqlite3_errmsg(db));
2525 }
2526 }
2527 }while( sCsv.cTerm!=EOF );
2528
drh5bde8162013-06-27 14:07:53 +00002529 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002530 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002531 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002532 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002533 }else
2534
shanehe2aa9d72009-11-06 17:20:17 +00002535 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002536 struct callback_data data;
2537 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002538 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002539 memcpy(&data, p, sizeof(data));
2540 data.showHeader = 0;
2541 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002542 if( nArg==1 ){
2543 rc = sqlite3_exec(p->db,
2544 "SELECT name FROM sqlite_master "
2545 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2546 "UNION ALL "
2547 "SELECT name FROM sqlite_temp_master "
2548 "WHERE type='index' "
2549 "ORDER BY 1",
2550 callback, &data, &zErrMsg
2551 );
2552 }else{
2553 zShellStatic = azArg[1];
2554 rc = sqlite3_exec(p->db,
2555 "SELECT name FROM sqlite_master "
2556 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2557 "UNION ALL "
2558 "SELECT name FROM sqlite_temp_master "
2559 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2560 "ORDER BY 1",
2561 callback, &data, &zErrMsg
2562 );
2563 zShellStatic = 0;
2564 }
drh75897232000-05-29 14:26:00 +00002565 if( zErrMsg ){
2566 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002567 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002568 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002569 }else if( rc != SQLITE_OK ){
2570 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2571 rc = 1;
drh75897232000-05-29 14:26:00 +00002572 }
2573 }else
2574
drhae5e4452007-05-03 17:18:36 +00002575#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002576 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002577 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002578 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2579 iotrace = 0;
2580 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002581 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002582 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002583 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002584 iotrace = stdout;
2585 }else{
2586 iotrace = fopen(azArg[1], "w");
2587 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002588 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002589 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002590 rc = 1;
drhb0603412007-02-28 04:47:26 +00002591 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002592 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002593 }
2594 }
2595 }else
drhae5e4452007-05-03 17:18:36 +00002596#endif
drhb0603412007-02-28 04:47:26 +00002597
drh70df4fe2006-06-13 15:12:21 +00002598#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002599 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2600 const char *zFile, *zProc;
2601 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002602 zFile = azArg[1];
2603 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002604 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002605 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2606 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002607 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002608 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002609 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002610 }
2611 }else
drh70df4fe2006-06-13 15:12:21 +00002612#endif
drh1e397f82006-06-08 15:28:43 +00002613
drhc8ba2122011-03-23 11:16:22 +00002614 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002615 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002616 output_file_close(p->pLog);
2617 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002618 }else
2619
shanehe2aa9d72009-11-06 17:20:17 +00002620 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002621 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002622 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002623 ||
shanehe2aa9d72009-11-06 17:20:17 +00002624 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002625 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002626 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002627 ||
shanehe2aa9d72009-11-06 17:20:17 +00002628 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002629 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002630 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002631 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002632 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002633 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002634 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002635 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002636 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002637 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002638 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002639 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002640 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002641 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002642 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002643 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002644 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002645 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002646 }else {
shane9bd1b442009-10-23 01:27:39 +00002647 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002648 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002649 rc = 1;
drh75897232000-05-29 14:26:00 +00002650 }
2651 }else
2652
shanehe2aa9d72009-11-06 17:20:17 +00002653 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2654 int n2 = strlen30(azArg[1]);
2655 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2656 p->mode = MODE_Insert;
2657 set_table_name(p, azArg[2]);
2658 }else {
2659 fprintf(stderr, "Error: invalid arguments: "
2660 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2661 rc = 1;
2662 }
2663 }else
2664
persicom7e2dfdd2002-04-18 02:46:52 +00002665 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002666 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2667 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002668 }else
2669
drh05782482013-10-24 15:20:20 +00002670 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2671 sqlite3 *savedDb = p->db;
2672 const char *zSavedFilename = p->zDbFilename;
2673 char *zNewFilename = 0;
2674 p->db = 0;
2675 if( nArg>=2 ){
2676 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2677 }
2678 open_db(p, 1);
2679 if( p->db!=0 ){
2680 sqlite3_close(savedDb);
2681 sqlite3_free(p->zFreeOnClose);
2682 p->zFreeOnClose = zNewFilename;
2683 }else{
2684 sqlite3_free(zNewFilename);
2685 p->db = savedDb;
2686 p->zDbFilename = zSavedFilename;
2687 }
2688 }else
2689
drh75897232000-05-29 14:26:00 +00002690 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002691 if( p->outfile[0]=='|' ){
2692 pclose(p->out);
2693 }else{
2694 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002695 }
drh42f64e52012-04-04 16:56:23 +00002696 p->outfile[0] = 0;
2697 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002698 p->out = popen(&azArg[1][1], "w");
2699 if( p->out==0 ){
2700 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2701 p->out = stdout;
2702 rc = 1;
2703 }else{
2704 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2705 }
drh75897232000-05-29 14:26:00 +00002706 }else{
drh42f64e52012-04-04 16:56:23 +00002707 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002708 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002709 if( strcmp(azArg[1],"off")!=0 ){
2710 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2711 }
drh75897232000-05-29 14:26:00 +00002712 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002713 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002714 } else {
drh42f64e52012-04-04 16:56:23 +00002715 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002716 }
2717 }
2718 }else
2719
drh078b1fd2012-09-21 13:40:02 +00002720 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2721 int i;
2722 for(i=1; i<nArg; i++){
2723 if( i>1 ) fprintf(p->out, " ");
2724 fprintf(p->out, "%s", azArg[i]);
2725 }
2726 fprintf(p->out, "\n");
2727 }else
2728
drhdd45df82002-04-18 12:39:03 +00002729 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002730 if( nArg >= 2) {
2731 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2732 }
2733 if( nArg >= 3) {
2734 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2735 }
2736 }else
2737
shanehe2aa9d72009-11-06 17:20:17 +00002738 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002739 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002740 }else
2741
drh9ff849f2009-02-04 20:55:57 +00002742 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002743 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002744 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002745 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2746 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002747 }else{
shane9bd1b442009-10-23 01:27:39 +00002748 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002749 fclose(alt);
2750 }
2751 }else
2752
shanehe2aa9d72009-11-06 17:20:17 +00002753 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002754 const char *zSrcFile;
2755 const char *zDb;
2756 sqlite3 *pSrc;
2757 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002758 int nTimeout = 0;
2759
drh9ff849f2009-02-04 20:55:57 +00002760 if( nArg==2 ){
2761 zSrcFile = azArg[1];
2762 zDb = "main";
2763 }else{
2764 zSrcFile = azArg[2];
2765 zDb = azArg[1];
2766 }
2767 rc = sqlite3_open(zSrcFile, &pSrc);
2768 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002769 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002770 sqlite3_close(pSrc);
2771 return 1;
2772 }
drh05782482013-10-24 15:20:20 +00002773 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002774 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2775 if( pBackup==0 ){
2776 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2777 sqlite3_close(pSrc);
2778 return 1;
2779 }
drhdc2c4912009-02-04 22:46:47 +00002780 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2781 || rc==SQLITE_BUSY ){
2782 if( rc==SQLITE_BUSY ){
2783 if( nTimeout++ >= 3 ) break;
2784 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002785 }
2786 }
2787 sqlite3_backup_finish(pBackup);
2788 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002789 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002790 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002791 fprintf(stderr, "Error: source database is busy\n");
2792 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002793 }else{
2794 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002795 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002796 }
2797 sqlite3_close(pSrc);
2798 }else
2799
shanehe2aa9d72009-11-06 17:20:17 +00002800 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002801 struct callback_data data;
2802 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002803 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002804 memcpy(&data, p, sizeof(data));
2805 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002806 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002807 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002808 int i;
drhf0693c82011-10-11 20:41:54 +00002809 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002810 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002811 char *new_argv[2], *new_colv[2];
2812 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2813 " type text,\n"
2814 " name text,\n"
2815 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002816 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002817 " sql text\n"
2818 ")";
2819 new_argv[1] = 0;
2820 new_colv[0] = "sql";
2821 new_colv[1] = 0;
2822 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002823 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002824 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002825 char *new_argv[2], *new_colv[2];
2826 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2827 " type text,\n"
2828 " name text,\n"
2829 " tbl_name text,\n"
2830 " rootpage integer,\n"
2831 " sql text\n"
2832 ")";
2833 new_argv[1] = 0;
2834 new_colv[0] = "sql";
2835 new_colv[1] = 0;
2836 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002837 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002838 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002839 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002840 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002841 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002842 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002843 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002844 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002845 "WHERE lower(tbl_name) LIKE shellstatic()"
2846 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002847 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002848 callback, &data, &zErrMsg);
2849 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002850 }
drh75897232000-05-29 14:26:00 +00002851 }else{
shane9bd1b442009-10-23 01:27:39 +00002852 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002853 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002854 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002855 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002856 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002857 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002858 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002859 callback, &data, &zErrMsg
2860 );
drh75897232000-05-29 14:26:00 +00002861 }
drh75897232000-05-29 14:26:00 +00002862 if( zErrMsg ){
2863 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002864 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002865 rc = 1;
2866 }else if( rc != SQLITE_OK ){
2867 fprintf(stderr,"Error: querying schema information\n");
2868 rc = 1;
2869 }else{
2870 rc = 0;
drh75897232000-05-29 14:26:00 +00002871 }
2872 }else
2873
drh340f5822013-06-27 13:01:21 +00002874#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002875 /* Undocumented commands for internal testing. Subject to change
2876 ** without notice. */
2877 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2878 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2879 int i, v;
2880 for(i=1; i<nArg; i++){
2881 v = booleanValue(azArg[i]);
2882 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2883 }
2884 }
2885 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2886 int i; sqlite3_int64 v;
2887 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002888 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002889 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002890 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2891 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002892 }
2893 }
2894 }else
drh340f5822013-06-27 13:01:21 +00002895#endif
drh348d19c2013-06-03 12:47:43 +00002896
drh75897232000-05-29 14:26:00 +00002897 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002898 sqlite3_snprintf(sizeof(p->separator), p->separator,
2899 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002900 }else
2901
shanehe2aa9d72009-11-06 17:20:17 +00002902 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002903 int i;
2904 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00002905 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002906 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002907 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002908 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002909 fprintf(p->out,"%9.9s: ", "nullvalue");
2910 output_c_string(p->out, p->nullvalue);
2911 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002912 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002913 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002914 fprintf(p->out,"%9.9s: ", "separator");
2915 output_c_string(p->out, p->separator);
2916 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002917 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002918 fprintf(p->out,"%9.9s: ","width");
2919 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002920 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002921 }
drhfeac5f82004-08-01 00:10:45 +00002922 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002923 }else
2924
shaneh642d8b82010-07-28 16:05:34 +00002925 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2926 p->statsOn = booleanValue(azArg[1]);
2927 }else
2928
shanehe2aa9d72009-11-06 17:20:17 +00002929 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002930 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002931 char **azResult;
drh98781232012-04-23 12:38:05 +00002932 int nRow, nAlloc;
2933 char *zSql = 0;
2934 int ii;
drh05782482013-10-24 15:20:20 +00002935 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002936 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2937 if( rc ) return rc;
2938 zSql = sqlite3_mprintf(
2939 "SELECT name FROM sqlite_master"
2940 " WHERE type IN ('table','view')"
2941 " AND name NOT LIKE 'sqlite_%%'"
2942 " AND name LIKE ?1");
2943 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2944 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2945 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2946 if( strcmp(zDbName,"temp")==0 ){
2947 zSql = sqlite3_mprintf(
2948 "%z UNION ALL "
2949 "SELECT 'temp.' || name FROM sqlite_temp_master"
2950 " WHERE type IN ('table','view')"
2951 " AND name NOT LIKE 'sqlite_%%'"
2952 " AND name LIKE ?1", zSql);
2953 }else{
2954 zSql = sqlite3_mprintf(
2955 "%z UNION ALL "
2956 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2957 " WHERE type IN ('table','view')"
2958 " AND name NOT LIKE 'sqlite_%%'"
2959 " AND name LIKE ?1", zSql, zDbName, zDbName);
2960 }
drha50da102000-08-08 20:19:09 +00002961 }
drh98781232012-04-23 12:38:05 +00002962 sqlite3_finalize(pStmt);
2963 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2964 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2965 sqlite3_free(zSql);
2966 if( rc ) return rc;
2967 nRow = nAlloc = 0;
2968 azResult = 0;
2969 if( nArg>1 ){
2970 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002971 }else{
drh98781232012-04-23 12:38:05 +00002972 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2973 }
2974 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2975 if( nRow>=nAlloc ){
2976 char **azNew;
2977 int n = nAlloc*2 + 10;
2978 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2979 if( azNew==0 ){
2980 fprintf(stderr, "Error: out of memory\n");
2981 break;
2982 }
2983 nAlloc = n;
2984 azResult = azNew;
2985 }
2986 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2987 if( azResult[nRow] ) nRow++;
2988 }
2989 sqlite3_finalize(pStmt);
2990 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002991 int len, maxlen = 0;
2992 int i, j;
2993 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002994 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002995 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002996 if( len>maxlen ) maxlen = len;
2997 }
2998 nPrintCol = 80/(maxlen+2);
2999 if( nPrintCol<1 ) nPrintCol = 1;
3000 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3001 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003002 for(j=i; j<nRow; j+=nPrintRow){
3003 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003004 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003005 }
drh151b7d52013-05-06 20:28:54 +00003006 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003007 }
3008 }
drh98781232012-04-23 12:38:05 +00003009 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3010 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003011 }else
3012
shaneh96887e12011-02-10 21:08:58 +00003013 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003014 static const struct {
3015 const char *zCtrlName; /* Name of a test-control option */
3016 int ctrlCode; /* Integer code for that option */
3017 } aCtrl[] = {
3018 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3019 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3020 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3021 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3022 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3023 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3024 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3025 { "assert", SQLITE_TESTCTRL_ASSERT },
3026 { "always", SQLITE_TESTCTRL_ALWAYS },
3027 { "reserve", SQLITE_TESTCTRL_RESERVE },
3028 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3029 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003030 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003031 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003032 };
shaneh96887e12011-02-10 21:08:58 +00003033 int testctrl = -1;
3034 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003035 int i, n;
drh05782482013-10-24 15:20:20 +00003036 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003037
drhd416fe72011-03-17 16:45:50 +00003038 /* convert testctrl text option to value. allow any unique prefix
3039 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003040 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003041 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003042 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3043 if( testctrl<0 ){
3044 testctrl = aCtrl[i].ctrlCode;
3045 }else{
drhb07028f2011-10-14 21:49:18 +00003046 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003047 testctrl = -1;
3048 break;
3049 }
3050 }
3051 }
drh348d19c2013-06-03 12:47:43 +00003052 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003053 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3054 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3055 }else{
3056 switch(testctrl){
3057
3058 /* sqlite3_test_control(int, db, int) */
3059 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3060 case SQLITE_TESTCTRL_RESERVE:
3061 if( nArg==3 ){
3062 int opt = (int)strtol(azArg[2], 0, 0);
3063 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003064 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003065 } else {
drhd416fe72011-03-17 16:45:50 +00003066 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3067 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003068 }
3069 break;
3070
3071 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003072 case SQLITE_TESTCTRL_PRNG_SAVE:
3073 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003074 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003075 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003076 if( nArg==2 ){
3077 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003078 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003079 } else {
3080 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3081 }
3082 break;
3083
3084 /* sqlite3_test_control(int, uint) */
3085 case SQLITE_TESTCTRL_PENDING_BYTE:
3086 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003087 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003088 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003089 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003090 } else {
drhd416fe72011-03-17 16:45:50 +00003091 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3092 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003093 }
3094 break;
3095
3096 /* sqlite3_test_control(int, int) */
3097 case SQLITE_TESTCTRL_ASSERT:
3098 case SQLITE_TESTCTRL_ALWAYS:
3099 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003100 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003101 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003102 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003103 } else {
drhd416fe72011-03-17 16:45:50 +00003104 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3105 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003106 }
3107 break;
3108
3109 /* sqlite3_test_control(int, char *) */
3110#ifdef SQLITE_N_KEYWORD
3111 case SQLITE_TESTCTRL_ISKEYWORD:
3112 if( nArg==3 ){
3113 const char *opt = azArg[2];
3114 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003115 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003116 } else {
drhd416fe72011-03-17 16:45:50 +00003117 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3118 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003119 }
3120 break;
3121#endif
3122
3123 case SQLITE_TESTCTRL_BITVEC_TEST:
3124 case SQLITE_TESTCTRL_FAULT_INSTALL:
3125 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3126 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3127 default:
drhd416fe72011-03-17 16:45:50 +00003128 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3129 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003130 break;
3131 }
3132 }
3133 }else
3134
shanehe2aa9d72009-11-06 17:20:17 +00003135 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003136 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003137 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003138 }else
3139
drhd416fe72011-03-17 16:45:50 +00003140 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3141 && nArg==2
3142 ){
drh3b1a9882007-11-02 12:53:03 +00003143 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003144 }else
3145
drh42f64e52012-04-04 16:56:23 +00003146 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003147 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003148 output_file_close(p->traceOut);
3149 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003150#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003151 if( p->traceOut==0 ){
3152 sqlite3_trace(p->db, 0, 0);
3153 }else{
3154 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3155 }
3156#endif
3157 }else
3158
drh9fd301b2011-06-03 13:28:22 +00003159 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003160 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003161 sqlite3_libversion(), sqlite3_sourceid());
3162 }else
3163
drhde60fc22011-12-14 17:53:36 +00003164 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3165 const char *zDbName = nArg==2 ? azArg[1] : "main";
3166 char *zVfsName = 0;
3167 if( p->db ){
3168 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3169 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003170 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003171 sqlite3_free(zVfsName);
3172 }
3173 }
3174 }else
3175
drhcef4fc82012-09-21 22:50:45 +00003176#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3177 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3178 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003179 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003180 }else
3181#endif
3182
shanehe2aa9d72009-11-06 17:20:17 +00003183 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003184 int j;
drh43617e92006-03-06 20:55:46 +00003185 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003186 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003187 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003188 }
3189 }else
3190
3191 {
shane9bd1b442009-10-23 01:27:39 +00003192 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003193 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003194 rc = 1;
drh75897232000-05-29 14:26:00 +00003195 }
drh67505e72002-04-19 12:34:06 +00003196
3197 return rc;
drh75897232000-05-29 14:26:00 +00003198}
3199
drh67505e72002-04-19 12:34:06 +00003200/*
drh91a66392007-09-07 01:12:32 +00003201** Return TRUE if a semicolon occurs anywhere in the first N characters
3202** of string z[].
drh324ccef2003-02-05 14:06:20 +00003203*/
drh9f099fd2013-08-06 14:01:46 +00003204static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003205 int i;
3206 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3207 return 0;
drh324ccef2003-02-05 14:06:20 +00003208}
3209
3210/*
drh70c7a4b2003-04-26 03:03:06 +00003211** Test to see if a line consists entirely of whitespace.
3212*/
3213static int _all_whitespace(const char *z){
3214 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003215 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003216 if( *z=='/' && z[1]=='*' ){
3217 z += 2;
3218 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3219 if( *z==0 ) return 0;
3220 z++;
3221 continue;
3222 }
3223 if( *z=='-' && z[1]=='-' ){
3224 z += 2;
3225 while( *z && *z!='\n' ){ z++; }
3226 if( *z==0 ) return 1;
3227 continue;
3228 }
3229 return 0;
3230 }
3231 return 1;
3232}
3233
3234/*
drha9b17162003-04-29 18:01:28 +00003235** Return TRUE if the line typed in is an SQL command terminator other
3236** than a semi-colon. The SQL Server style "go" command is understood
3237** as is the Oracle "/".
3238*/
drh9f099fd2013-08-06 14:01:46 +00003239static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003240 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003241 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3242 return 1; /* Oracle */
3243 }
drhf0693c82011-10-11 20:41:54 +00003244 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003245 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003246 return 1; /* SQL Server */
3247 }
3248 return 0;
3249}
3250
3251/*
drh233a5312008-12-18 22:25:13 +00003252** Return true if zSql is a complete SQL statement. Return false if it
3253** ends in the middle of a string literal or C-style comment.
3254*/
drh9f099fd2013-08-06 14:01:46 +00003255static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003256 int rc;
3257 if( zSql==0 ) return 1;
3258 zSql[nSql] = ';';
3259 zSql[nSql+1] = 0;
3260 rc = sqlite3_complete(zSql);
3261 zSql[nSql] = 0;
3262 return rc;
3263}
3264
3265/*
drh67505e72002-04-19 12:34:06 +00003266** Read input from *in and process it. If *in==0 then input
3267** is interactive - the user is typing it it. Otherwise, input
3268** is coming from a file or device. A prompt is issued and history
3269** is saved only if input is interactive. An interrupt signal will
3270** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003271**
3272** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003273*/
drhc28490c2006-10-26 14:25:58 +00003274static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003275 char *zLine = 0; /* A single input line */
3276 char *zSql = 0; /* Accumulated SQL text */
3277 int nLine; /* Length of current line */
3278 int nSql = 0; /* Bytes of zSql[] used */
3279 int nAlloc = 0; /* Allocated zSql[] space */
3280 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3281 char *zErrMsg; /* Error message returned */
3282 int rc; /* Error code */
3283 int errCnt = 0; /* Number of errors seen */
3284 int lineno = 0; /* Current line number */
3285 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003286
3287 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3288 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003289 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003290 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003291 /* End of input */
3292 if( stdin_is_interactive ) printf("\n");
3293 break;
drhc49f44e2006-10-26 18:15:42 +00003294 }
drh67505e72002-04-19 12:34:06 +00003295 if( seenInterrupt ){
3296 if( in!=0 ) break;
3297 seenInterrupt = 0;
3298 }
drhc28490c2006-10-26 14:25:58 +00003299 lineno++;
drh849a9d92013-12-21 15:46:06 +00003300 if( nSql==0 && _all_whitespace(zLine) ){
3301 if( p->echoOn ) printf("%s\n", zLine);
3302 continue;
3303 }
drh2af0b2d2002-02-21 02:25:02 +00003304 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003305 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003306 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003307 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003308 break;
3309 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003310 errCnt++;
3311 }
drhdaffd0e2001-04-11 14:28:42 +00003312 continue;
3313 }
drh9f099fd2013-08-06 14:01:46 +00003314 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003315 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003316 }
drh9f099fd2013-08-06 14:01:46 +00003317 nLine = strlen30(zLine);
3318 if( nSql+nLine+2>=nAlloc ){
3319 nAlloc = nSql+nLine+100;
3320 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003321 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003322 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003323 exit(1);
3324 }
drhdaffd0e2001-04-11 14:28:42 +00003325 }
drh9f099fd2013-08-06 14:01:46 +00003326 nSqlPrior = nSql;
3327 if( nSql==0 ){
3328 int i;
3329 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003330 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003331 memcpy(zSql, zLine+i, nLine+1-i);
3332 startline = lineno;
3333 nSql = nLine-i;
3334 }else{
3335 zSql[nSql++] = '\n';
3336 memcpy(zSql+nSql, zLine, nLine+1);
3337 nSql += nLine;
3338 }
3339 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003340 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003341 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003342 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003343 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003344 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003345 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003346 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003347 char zPrefix[100];
3348 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003349 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003350 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003351 }else{
shane9bd1b442009-10-23 01:27:39 +00003352 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003353 }
drh7f953e22002-07-13 17:33:45 +00003354 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003355 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003356 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003357 zErrMsg = 0;
3358 }else{
shaned2bed1c2009-10-21 03:56:54 +00003359 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003360 }
drhc49f44e2006-10-26 18:15:42 +00003361 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003362 }
drhdaffd0e2001-04-11 14:28:42 +00003363 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003364 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003365 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003366 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003367 }
3368 }
drh9f099fd2013-08-06 14:01:46 +00003369 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003370 if( !_all_whitespace(zSql) ){
3371 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3372 }
drhdaffd0e2001-04-11 14:28:42 +00003373 free(zSql);
3374 }
danielk19772ac27622007-07-03 05:31:16 +00003375 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003376 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003377}
3378
drh67505e72002-04-19 12:34:06 +00003379/*
3380** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003381** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003382*/
3383static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003384 static char *home_dir = NULL;
3385 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003386
drh83905c92012-06-21 13:00:37 +00003387#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003388 {
3389 struct passwd *pwent;
3390 uid_t uid = getuid();
3391 if( (pwent=getpwuid(uid)) != NULL) {
3392 home_dir = pwent->pw_dir;
3393 }
drh67505e72002-04-19 12:34:06 +00003394 }
3395#endif
3396
chw65d3c132007-11-12 21:09:10 +00003397#if defined(_WIN32_WCE)
3398 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3399 */
drh85e72432012-04-11 11:38:53 +00003400 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003401#else
3402
drh83905c92012-06-21 13:00:37 +00003403#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003404 if (!home_dir) {
3405 home_dir = getenv("USERPROFILE");
3406 }
3407#endif
3408
drh67505e72002-04-19 12:34:06 +00003409 if (!home_dir) {
3410 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003411 }
3412
drh83905c92012-06-21 13:00:37 +00003413#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003414 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003415 char *zDrive, *zPath;
3416 int n;
3417 zDrive = getenv("HOMEDRIVE");
3418 zPath = getenv("HOMEPATH");
3419 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003420 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003421 home_dir = malloc( n );
3422 if( home_dir==0 ) return 0;
3423 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3424 return home_dir;
3425 }
3426 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003427 }
3428#endif
3429
chw65d3c132007-11-12 21:09:10 +00003430#endif /* !_WIN32_WCE */
3431
drh67505e72002-04-19 12:34:06 +00003432 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003433 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003434 char *z = malloc( n );
3435 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003436 home_dir = z;
3437 }
drhe98d4fa2002-04-21 19:06:22 +00003438
drh67505e72002-04-19 12:34:06 +00003439 return home_dir;
3440}
3441
3442/*
3443** Read input from the file given by sqliterc_override. Or if that
3444** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003445**
3446** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003447*/
shane9bd1b442009-10-23 01:27:39 +00003448static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003449 struct callback_data *p, /* Configuration data */
3450 const char *sqliterc_override /* Name of config file. NULL to use default */
3451){
persicom7e2dfdd2002-04-18 02:46:52 +00003452 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003453 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003454 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003455 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003456 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003457
3458 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003459 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003460 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003461#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003462 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003463#endif
shane9bd1b442009-10-23 01:27:39 +00003464 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003465 }
drh2f3de322012-06-27 16:41:31 +00003466 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003467 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3468 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003469 }
drha1f9b5e2004-02-14 16:31:02 +00003470 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003471 if( in ){
drhc28490c2006-10-26 14:25:58 +00003472 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003473 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003474 }
shane9bd1b442009-10-23 01:27:39 +00003475 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003476 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003477 }
drh85e72432012-04-11 11:38:53 +00003478 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003479 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003480}
3481
drh67505e72002-04-19 12:34:06 +00003482/*
drhe1e38c42003-05-04 18:30:59 +00003483** Show available command line options
3484*/
3485static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003486 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003487 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003488 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003489 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003490 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003491 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003492 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003493 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003494#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3495 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3496#endif
drhcc3b4f82012-02-07 14:13:50 +00003497 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003498 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003499 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003500 " -line set output mode to 'line'\n"
3501 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003502 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003503#ifdef SQLITE_ENABLE_MULTIPLEX
3504 " -multiplex enable the multiplexor VFS\n"
3505#endif
drh98d312f2012-10-25 15:23:14 +00003506 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3507 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003508 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003509 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003510 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003511#ifdef SQLITE_ENABLE_VFSTRACE
3512 " -vfstrace enable tracing of all VFS calls\n"
3513#endif
drhe1e38c42003-05-04 18:30:59 +00003514;
3515static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003516 fprintf(stderr,
3517 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3518 "FILENAME is the name of an SQLite database. A new database is created\n"
3519 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003520 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003521 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003522 }else{
3523 fprintf(stderr, "Use the -help option for additional information\n");
3524 }
3525 exit(1);
3526}
3527
3528/*
drh67505e72002-04-19 12:34:06 +00003529** Initialize the state information in data
3530*/
drh0850b532006-01-31 19:31:43 +00003531static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003532 memset(data, 0, sizeof(*data));
3533 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003534 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003535 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003536 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003537 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003538 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3539 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003540 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003541}
3542
drh98d312f2012-10-25 15:23:14 +00003543/*
drh5c7976f2014-02-10 19:59:27 +00003544** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003545*/
3546#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003547static void printBold(const char *zText){
3548 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3549 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3550 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3551 SetConsoleTextAttribute(out,
3552 FOREGROUND_RED|FOREGROUND_INTENSITY
3553 );
3554 printf("%s", zText);
3555 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003556}
3557#else
drh5c7976f2014-02-10 19:59:27 +00003558static void printBold(const char *zText){
3559 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003560}
3561#endif
3562
3563/*
drh98d312f2012-10-25 15:23:14 +00003564** Get the argument to an --option. Throw an error and die if no argument
3565** is available.
3566*/
3567static char *cmdline_option_value(int argc, char **argv, int i){
3568 if( i==argc ){
3569 fprintf(stderr, "%s: Error: missing argument to %s\n",
3570 argv[0], argv[argc-1]);
3571 exit(1);
3572 }
3573 return argv[i];
3574}
3575
drh75897232000-05-29 14:26:00 +00003576int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003577 char *zErrMsg = 0;
3578 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003579 const char *zInitFile = 0;
3580 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003581 int i;
drhc28490c2006-10-26 14:25:58 +00003582 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003583 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003584
drh69b30ab2014-02-27 15:11:52 +00003585#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003586 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3587 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3588 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3589 exit(1);
3590 }
drhc7181902014-02-27 15:04:13 +00003591#endif
drhdaffd0e2001-04-11 14:28:42 +00003592 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003593 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003594 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003595
drh44c2eb12003-04-30 11:38:26 +00003596 /* Make sure we have a valid signal handler early, before anything
3597 ** else is done.
3598 */
drh4c504392000-10-16 22:06:40 +00003599#ifdef SIGINT
3600 signal(SIGINT, interrupt_handler);
3601#endif
drh44c2eb12003-04-30 11:38:26 +00003602
drh22fbcb82004-02-01 01:22:50 +00003603 /* Do an initial pass through the command-line argument to locate
3604 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003605 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003606 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003607 */
drh98d312f2012-10-25 15:23:14 +00003608 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003609 char *z;
drhc28490c2006-10-26 14:25:58 +00003610 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003611 if( z[0]!='-' ){
3612 if( data.zDbFilename==0 ){
3613 data.zDbFilename = z;
3614 continue;
3615 }
3616 if( zFirstCmd==0 ){
3617 zFirstCmd = z;
3618 continue;
3619 }
3620 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3621 fprintf(stderr,"Use -help for a list of options.\n");
3622 return 1;
3623 }
drhcc3b4f82012-02-07 14:13:50 +00003624 if( z[1]=='-' ) z++;
3625 if( strcmp(z,"-separator")==0
3626 || strcmp(z,"-nullvalue")==0
3627 || strcmp(z,"-cmd")==0
3628 ){
drh98d312f2012-10-25 15:23:14 +00003629 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003630 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003631 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003632 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003633 /* Need to check for batch mode here to so we can avoid printing
3634 ** informational messages (like from process_sqliterc) before
3635 ** we do the actual processing of arguments later in a second pass.
3636 */
shanef69573d2009-10-24 02:06:14 +00003637 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003638 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003639#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003640 const char *zSize;
3641 sqlite3_int64 szHeap;
3642
drh98d312f2012-10-25 15:23:14 +00003643 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003644 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003645 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003646 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3647#endif
drh97ae8ff2011-03-16 16:56:29 +00003648#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003649 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003650 extern int vfstrace_register(
3651 const char *zTraceName,
3652 const char *zOldVfsName,
3653 int (*xOut)(const char*,void*),
3654 void *pOutArg,
3655 int makeDefault
3656 );
drh2b625e22011-03-16 17:05:28 +00003657 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003658#endif
drh6f25e892011-07-08 17:02:57 +00003659#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003660 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003661 extern int sqlite3_multiple_initialize(const char*,int);
3662 sqlite3_multiplex_initialize(0, 1);
3663#endif
drh7d9f3942013-04-03 01:26:54 +00003664 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003665 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3666 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003667 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003668 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003669 if( pVfs ){
3670 sqlite3_vfs_register(pVfs, 1);
3671 }else{
3672 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3673 exit(1);
3674 }
drh44c2eb12003-04-30 11:38:26 +00003675 }
3676 }
drh98d312f2012-10-25 15:23:14 +00003677 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003678#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003679 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003680 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003681#else
shane86f5bdb2009-10-24 02:00:07 +00003682 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3683 return 1;
drh01b41712005-08-29 23:06:23 +00003684#endif
drhc7181902014-02-27 15:04:13 +00003685#ifdef SQLITE_SHELL_DBNAME_PROC
3686 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3687 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3688 warnInmemoryDb = 0; }
3689#endif
drh98d312f2012-10-25 15:23:14 +00003690 }
3691 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003692
drh44c2eb12003-04-30 11:38:26 +00003693 /* Go ahead and open the database file if it already exists. If the
3694 ** file does not exist, delay opening it. This prevents empty database
3695 ** files from being created if a user mistypes the database name argument
3696 ** to the sqlite command-line tool.
3697 */
drhc8d74412004-08-31 23:41:26 +00003698 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003699 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003700 }
3701
drh22fbcb82004-02-01 01:22:50 +00003702 /* Process the initialization file if there is one. If no -init option
3703 ** is given on the command line, look for a file named ~/.sqliterc and
3704 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003705 */
shane86f5bdb2009-10-24 02:00:07 +00003706 rc = process_sqliterc(&data,zInitFile);
3707 if( rc>0 ){
3708 return rc;
3709 }
drh44c2eb12003-04-30 11:38:26 +00003710
drh22fbcb82004-02-01 01:22:50 +00003711 /* Make a second pass through the command-line argument and set
3712 ** options. This second pass is delayed until after the initialization
3713 ** file is processed so that the command-line arguments will override
3714 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003715 */
drh98d312f2012-10-25 15:23:14 +00003716 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003717 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003718 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003719 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003720 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003721 i++;
3722 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003723 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003724 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003725 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003726 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003727 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003728 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003729 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003730 }else if( strcmp(z,"-csv")==0 ){
3731 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003732 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003733 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003734 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003735 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003736 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003737 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003738 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003739 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003740 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003741 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003742 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003743 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003744 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00003745 }else if( strcmp(z,"-eqp")==0 ){
3746 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00003747 }else if( strcmp(z,"-stats")==0 ){
3748 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003749 }else if( strcmp(z,"-bail")==0 ){
3750 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003751 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003752 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003753 return 0;
drhc28490c2006-10-26 14:25:58 +00003754 }else if( strcmp(z,"-interactive")==0 ){
3755 stdin_is_interactive = 1;
3756 }else if( strcmp(z,"-batch")==0 ){
3757 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003758 }else if( strcmp(z,"-heap")==0 ){
3759 i++;
drh7d9f3942013-04-03 01:26:54 +00003760 }else if( strcmp(z,"-mmap")==0 ){
3761 i++;
drha7e61d82011-03-12 17:02:57 +00003762 }else if( strcmp(z,"-vfs")==0 ){
3763 i++;
drh6f25e892011-07-08 17:02:57 +00003764#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003765 }else if( strcmp(z,"-vfstrace")==0 ){
3766 i++;
drh6f25e892011-07-08 17:02:57 +00003767#endif
3768#ifdef SQLITE_ENABLE_MULTIPLEX
3769 }else if( strcmp(z,"-multiplex")==0 ){
3770 i++;
3771#endif
drhcc3b4f82012-02-07 14:13:50 +00003772 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003773 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003774 }else if( strcmp(z,"-cmd")==0 ){
3775 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003776 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003777 if( z[0]=='.' ){
3778 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003779 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003780 }else{
drh05782482013-10-24 15:20:20 +00003781 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003782 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3783 if( zErrMsg!=0 ){
3784 fprintf(stderr,"Error: %s\n", zErrMsg);
3785 if( bail_on_error ) return rc!=0 ? rc : 1;
3786 }else if( rc!=0 ){
3787 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3788 if( bail_on_error ) return rc;
3789 }
3790 }
drh1e5d0e92000-05-31 23:33:17 +00003791 }else{
shane86f5bdb2009-10-24 02:00:07 +00003792 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003793 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003794 return 1;
3795 }
3796 }
drh44c2eb12003-04-30 11:38:26 +00003797
drh22fbcb82004-02-01 01:22:50 +00003798 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003799 /* Run just the command that follows the database name
3800 */
drh22fbcb82004-02-01 01:22:50 +00003801 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003802 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003803 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003804 }else{
drh05782482013-10-24 15:20:20 +00003805 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003806 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003807 if( zErrMsg!=0 ){
3808 fprintf(stderr,"Error: %s\n", zErrMsg);
3809 return rc!=0 ? rc : 1;
3810 }else if( rc!=0 ){
3811 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3812 return rc;
drh6ff13852001-11-25 13:18:23 +00003813 }
drh75897232000-05-29 14:26:00 +00003814 }
3815 }else{
drh44c2eb12003-04-30 11:38:26 +00003816 /* Run commands received from standard input
3817 */
drhc28490c2006-10-26 14:25:58 +00003818 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003819 char *zHome;
3820 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003821 int nHistory;
drh75897232000-05-29 14:26:00 +00003822 printf(
drh743e0032011-12-12 16:51:50 +00003823 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003824 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003825 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003826 );
drhb3735912014-02-10 16:13:42 +00003827 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003828 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00003829 printBold("transient in-memory database");
3830 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003831 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003832 }
drh67505e72002-04-19 12:34:06 +00003833 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003834 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003835 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003836 if( (zHistory = malloc(nHistory))!=0 ){
3837 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3838 }
drh67505e72002-04-19 12:34:06 +00003839 }
drhaaa21b42014-02-11 14:37:51 +00003840#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003841 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003842#endif
drhc28490c2006-10-26 14:25:58 +00003843 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003844 if( zHistory ){
3845 stifle_history(100);
3846 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003847 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003848 }
drhdaffd0e2001-04-11 14:28:42 +00003849 }else{
drhc28490c2006-10-26 14:25:58 +00003850 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003851 }
3852 }
drh33048c02001-10-01 14:29:22 +00003853 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003854 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003855 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003856 }
drh05782482013-10-24 15:20:20 +00003857 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003858 return rc;
drh75897232000-05-29 14:26:00 +00003859}