blob: f3f80bfd717c882c3fb6c469ddb2bbf377d23345 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000068#ifndef access
69# define access(f,m) _access((f),(m))
70#endif
drh67ceaa62012-08-27 21:19:03 +000071#undef popen
drh53371f92013-07-25 17:07:03 +000072#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000073#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000074#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000075#else
drh4328c8b2003-04-26 02:50:11 +000076/* Make sure isatty() has a prototype.
77*/
drhb2acc3b2011-10-13 16:36:29 +000078extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000079
drh53371f92013-07-25 17:07:03 +000080/* popen and pclose are not C89 functions and so are sometimes omitted from
81** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000082extern FILE *popen(const char*,const char*);
83extern int pclose(FILE*);
84#endif
drh53371f92013-07-25 17:07:03 +000085
chw65d3c132007-11-12 21:09:10 +000086#if defined(_WIN32_WCE)
87/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
88 * thus we always assume that we have a console. That can be
89 * overridden with the -batch command line option.
90 */
91#define isatty(x) 1
92#endif
93
drhf0693c82011-10-11 20:41:54 +000094/* ctype macros that work with signed characters */
95#define IsSpace(X) isspace((unsigned char)X)
96#define IsDigit(X) isdigit((unsigned char)X)
97#define ToLower(X) (char)tolower((unsigned char)X)
98
drh43408312013-10-30 12:43:36 +000099
100/* True if the timer is enabled */
101static int enableTimer = 0;
102
103/* Return the current wall-clock time */
104static sqlite3_int64 timeOfDay(void){
105 static sqlite3_vfs *clockVfs = 0;
106 sqlite3_int64 t;
107 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
108 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
109 clockVfs->xCurrentTimeInt64(clockVfs, &t);
110 }else{
111 double r;
112 clockVfs->xCurrentTime(clockVfs, &r);
113 t = (sqlite3_int64)(r*86400000.0);
114 }
115 return t;
116}
117
drhd5d0f642013-02-20 00:54:21 +0000118#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
119 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000120#include <sys/time.h>
121#include <sys/resource.h>
122
drhda108222009-02-25 19:07:24 +0000123/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000124static struct rusage sBegin; /* CPU time at start */
125static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000126
drhda108222009-02-25 19:07:24 +0000127/*
128** Begin timing an operation
129*/
130static void beginTimer(void){
131 if( enableTimer ){
132 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000133 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000134 }
135}
136
137/* Return the difference of two time_structs in seconds */
138static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
139 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
140 (double)(pEnd->tv_sec - pStart->tv_sec);
141}
142
143/*
144** Print the timing results.
145*/
146static void endTimer(void){
147 if( enableTimer ){
148 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000149 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000150 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000151 printf("Run Time: real %.3f user %f sys %f\n",
152 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000153 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
154 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
155 }
156}
shaneb320ccd2009-10-21 03:42:58 +0000157
drhda108222009-02-25 19:07:24 +0000158#define BEGIN_TIMER beginTimer()
159#define END_TIMER endTimer()
160#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000161
162#elif (defined(_WIN32) || defined(WIN32))
163
164#include <windows.h>
165
166/* Saved resource information for the beginning of an operation */
167static HANDLE hProcess;
168static FILETIME ftKernelBegin;
169static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000170static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000171typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
172static GETPROCTIMES getProcessTimesAddr = NULL;
173
shaneb320ccd2009-10-21 03:42:58 +0000174/*
175** Check to see if we have timer support. Return 1 if necessary
176** support found (or found previously).
177*/
178static int hasTimer(void){
179 if( getProcessTimesAddr ){
180 return 1;
181 } else {
182 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
183 ** See if the version we are running on has it, and if it does, save off
184 ** a pointer to it and the current process handle.
185 */
186 hProcess = GetCurrentProcess();
187 if( hProcess ){
188 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
189 if( NULL != hinstLib ){
190 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
191 if( NULL != getProcessTimesAddr ){
192 return 1;
193 }
194 FreeLibrary(hinstLib);
195 }
196 }
197 }
198 return 0;
199}
200
201/*
202** Begin timing an operation
203*/
204static void beginTimer(void){
205 if( enableTimer && getProcessTimesAddr ){
206 FILETIME ftCreation, ftExit;
207 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000208 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000209 }
210}
211
212/* Return the difference of two FILETIME structs in seconds */
213static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
214 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
215 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
216 return (double) ((i64End - i64Start) / 10000000.0);
217}
218
219/*
220** Print the timing results.
221*/
222static void endTimer(void){
223 if( enableTimer && getProcessTimesAddr){
224 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000225 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000226 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000227 printf("Run Time: real %.3f user %f sys %f\n",
228 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000229 timeDiff(&ftUserBegin, &ftUserEnd),
230 timeDiff(&ftKernelBegin, &ftKernelEnd));
231 }
232}
233
234#define BEGIN_TIMER beginTimer()
235#define END_TIMER endTimer()
236#define HAS_TIMER hasTimer()
237
drhda108222009-02-25 19:07:24 +0000238#else
239#define BEGIN_TIMER
240#define END_TIMER
241#define HAS_TIMER 0
242#endif
243
shanec0688ea2009-03-05 03:48:06 +0000244/*
245** Used to prevent warnings about unused parameters
246*/
247#define UNUSED_PARAMETER(x) (void)(x)
248
drhe91d16b2008-12-08 18:27:31 +0000249/*
drhc49f44e2006-10-26 18:15:42 +0000250** If the following flag is set, then command execution stops
251** at an error if we are not interactive.
252*/
253static int bail_on_error = 0;
254
255/*
drhc28490c2006-10-26 14:25:58 +0000256** Threat stdin as an interactive input if the following variable
257** is true. Otherwise, assume stdin is connected to a file or pipe.
258*/
259static int stdin_is_interactive = 1;
260
261/*
drh4c504392000-10-16 22:06:40 +0000262** The following is the open SQLite database. We make a pointer
263** to this database a static variable so that it can be accessed
264** by the SIGINT handler to interrupt database processing.
265*/
danielk197792f9a1b2004-06-19 09:08:16 +0000266static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000267
268/*
drh67505e72002-04-19 12:34:06 +0000269** True if an interrupt (Control-C) has been received.
270*/
drh43617e92006-03-06 20:55:46 +0000271static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000272
273/*
persicom7e2dfdd2002-04-18 02:46:52 +0000274** This is the name of our program. It is set in main(), used
275** in a number of other places, mostly for error messages.
276*/
277static char *Argv0;
278
279/*
280** Prompt strings. Initialized in main. Settable with
281** .prompt main continue
282*/
283static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
284static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
285
drhb0603412007-02-28 04:47:26 +0000286/*
287** Write I/O traces to the following stream.
288*/
rsebe0a9092007-07-30 18:24:38 +0000289#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000290static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000291#endif
drhb0603412007-02-28 04:47:26 +0000292
293/*
294** This routine works like printf in that its first argument is a
295** format string and subsequent arguments are values to be substituted
296** in place of % fields. The result of formatting this string
297** is written to iotrace.
298*/
rsebe0a9092007-07-30 18:24:38 +0000299#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000300static void iotracePrintf(const char *zFormat, ...){
301 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000302 char *z;
drhb0603412007-02-28 04:47:26 +0000303 if( iotrace==0 ) return;
304 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000305 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000306 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000307 fprintf(iotrace, "%s", z);
308 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000309}
rsebe0a9092007-07-30 18:24:38 +0000310#endif
drhb0603412007-02-28 04:47:26 +0000311
drh44c2eb12003-04-30 11:38:26 +0000312
persicom7e2dfdd2002-04-18 02:46:52 +0000313/*
drh83965662003-04-17 02:54:13 +0000314** Determines if a string is a number of not.
315*/
danielk19772e588c72005-12-09 14:25:08 +0000316static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000317 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000318 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000319 return 0;
320 }
321 z++;
322 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000323 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='.' ){
325 z++;
drhf0693c82011-10-11 20:41:54 +0000326 if( !IsDigit(*z) ) return 0;
327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( realnum ) *realnum = 1;
329 }
330 if( *z=='e' || *z=='E' ){
331 z++;
332 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 return *z==0;
338}
drh83965662003-04-17 02:54:13 +0000339
340/*
danielk1977bc6ada42004-06-30 08:20:16 +0000341** A global char* and an SQL function to access its current value
342** from within an SQL statement. This program used to use the
343** sqlite_exec_printf() API to substitue a string into an SQL statement.
344** The correct way to do this with sqlite3 is to use the bind API, but
345** since the shell is built around the callback paradigm it would be a lot
346** of work. Instead just use this hack, which is quite harmless.
347*/
348static const char *zShellStatic = 0;
349static void shellstaticFunc(
350 sqlite3_context *context,
351 int argc,
352 sqlite3_value **argv
353){
354 assert( 0==argc );
355 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000356 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000357 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000358 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
359}
360
361
362/*
drhfeac5f82004-08-01 00:10:45 +0000363** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000364** the text in memory obtained from malloc() and returns a pointer
365** to the text. NULL is returned at end of file, or if malloc()
366** fails.
367**
drh9f099fd2013-08-06 14:01:46 +0000368** If zLine is not NULL then it is a malloced buffer returned from
369** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000370*/
drh9f099fd2013-08-06 14:01:46 +0000371static char *local_getline(char *zLine, FILE *in){
372 int nLine = zLine==0 ? 0 : 100;
373 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000374
drhb07028f2011-10-14 21:49:18 +0000375 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000376 if( n+100>nLine ){
377 nLine = nLine*2 + 100;
378 zLine = realloc(zLine, nLine);
379 if( zLine==0 ) return 0;
380 }
drhdaffd0e2001-04-11 14:28:42 +0000381 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000382 if( n==0 ){
383 free(zLine);
384 return 0;
385 }
386 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000387 break;
388 }
drh9f099fd2013-08-06 14:01:46 +0000389 while( zLine[n] ) n++;
390 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000391 n--;
shaneh13b36022009-12-17 21:07:15 +0000392 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000393 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000394 break;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 }
drh8e7e7a22000-05-30 18:45:23 +0000397 return zLine;
398}
399
400/*
drhc28490c2006-10-26 14:25:58 +0000401** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000402**
drh9f099fd2013-08-06 14:01:46 +0000403** If in==0 then read from standard input and prompt before each line.
404** If isContinuation is true, then a continuation prompt is appropriate.
405** If isContinuation is zero, then the main prompt should be used.
406**
407** If zPrior is not NULL then it is a buffer from a prior call to this
408** routine that can be reused.
409**
410** The result is stored in space obtained from malloc() and must either
411** be freed by the caller or else passed back into this routine via the
412** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000413*/
drh9f099fd2013-08-06 14:01:46 +0000414static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000415 char *zPrompt;
416 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000417 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000418 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000419 }else{
drh9f099fd2013-08-06 14:01:46 +0000420 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000421#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000422 free(zPrior);
423 zResult = readline(zPrompt);
424 if( zResult && *zResult ) add_history(zResult);
425#else
426 printf("%s", zPrompt);
427 fflush(stdout);
428 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000429#endif
drh9f099fd2013-08-06 14:01:46 +0000430 }
drh8e7e7a22000-05-30 18:45:23 +0000431 return zResult;
432}
433
persicom7e2dfdd2002-04-18 02:46:52 +0000434struct previous_mode_data {
435 int valid; /* Is there legit data in here? */
436 int mode;
437 int showHeader;
438 int colWidth[100];
439};
drh45e29d82006-11-20 16:21:10 +0000440
drh8e7e7a22000-05-30 18:45:23 +0000441/*
drh75897232000-05-29 14:26:00 +0000442** An pointer to an instance of this structure is passed from
443** the main program to the callback. This is used to communicate
444** state and mode information.
445*/
446struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000447 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000448 int echoOn; /* True to echo input commands */
drhefbf3b12014-02-28 20:47:24 +0000449 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL statement */
shaneh642d8b82010-07-28 16:05:34 +0000450 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000451 int cnt; /* Number of records displayed so far */
452 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000453 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000454 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000455 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000456 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000457 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000458 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000459 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000460 int colWidth[100]; /* Requested width of each column when in column mode*/
461 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000462 char nullvalue[20]; /* The text to print when a NULL comes back from
463 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000464 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000465 /* Holds the mode information just before
466 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000467 char outfile[FILENAME_MAX]; /* Filename for *out */
468 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000469 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000470 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000471 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000472 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000473 int *aiIndent; /* Array of indents used in MODE_Explain */
474 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000475 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000476};
477
478/*
479** These are the allowed modes.
480*/
drh967e8b72000-06-21 13:59:10 +0000481#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000482#define MODE_Column 1 /* One record per line in neat columns */
483#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000484#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
485#define MODE_Html 4 /* Generate an XHTML table */
486#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000487#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000488#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000489#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000490
drh66ce4d02008-02-15 17:38:06 +0000491static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000492 "line",
493 "column",
494 "list",
495 "semi",
496 "html",
drhfeac5f82004-08-01 00:10:45 +0000497 "insert",
498 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000499 "csv",
drh66ce4d02008-02-15 17:38:06 +0000500 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000501};
drh75897232000-05-29 14:26:00 +0000502
503/*
504** Number of elements in an array
505*/
drh902b9ee2008-12-05 17:17:07 +0000506#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000507
508/*
drhea678832008-12-10 19:26:22 +0000509** Compute a string length that is limited to what can be stored in
510** lower 30 bits of a 32-bit signed integer.
511*/
drh4f21c4a2008-12-10 22:15:00 +0000512static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000513 const char *z2 = z;
514 while( *z2 ){ z2++; }
515 return 0x3fffffff & (int)(z2 - z);
516}
517
518/*
drh127f9d72010-02-23 01:47:00 +0000519** A callback for the sqlite3_log() interface.
520*/
521static void shellLog(void *pArg, int iErrCode, const char *zMsg){
522 struct callback_data *p = (struct callback_data*)pArg;
523 if( p->pLog==0 ) return;
524 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
525 fflush(p->pLog);
526}
527
528/*
shane626a6e42009-10-22 17:30:15 +0000529** Output the given string as a hex-encoded blob (eg. X'1234' )
530*/
531static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
532 int i;
533 char *zBlob = (char *)pBlob;
534 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000535 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000536 fprintf(out,"'");
537}
538
539/*
drh28bd4bc2000-06-15 15:57:22 +0000540** Output the given string as a quoted string using SQL quoting conventions.
541*/
542static void output_quoted_string(FILE *out, const char *z){
543 int i;
544 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000545 for(i=0; z[i]; i++){
546 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000547 }
548 if( nSingle==0 ){
549 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000550 }else{
551 fprintf(out,"'");
552 while( *z ){
553 for(i=0; z[i] && z[i]!='\''; i++){}
554 if( i==0 ){
555 fprintf(out,"''");
556 z++;
557 }else if( z[i]=='\'' ){
558 fprintf(out,"%.*s''",i,z);
559 z += i+1;
560 }else{
drhcd7d2732002-02-26 23:24:26 +0000561 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000562 break;
563 }
564 }
drhcd7d2732002-02-26 23:24:26 +0000565 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000566 }
567}
568
569/*
drhfeac5f82004-08-01 00:10:45 +0000570** Output the given string as a quoted according to C or TCL quoting rules.
571*/
572static void output_c_string(FILE *out, const char *z){
573 unsigned int c;
574 fputc('"', out);
575 while( (c = *(z++))!=0 ){
576 if( c=='\\' ){
577 fputc(c, out);
578 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000579 }else if( c=='"' ){
580 fputc('\\', out);
581 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000582 }else if( c=='\t' ){
583 fputc('\\', out);
584 fputc('t', out);
585 }else if( c=='\n' ){
586 fputc('\\', out);
587 fputc('n', out);
588 }else if( c=='\r' ){
589 fputc('\\', out);
590 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000591 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000592 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000593 }else{
594 fputc(c, out);
595 }
596 }
597 fputc('"', out);
598}
599
600/*
drhc08a4f12000-06-15 16:49:48 +0000601** Output the given string with characters that are special to
602** HTML escaped.
603*/
604static void output_html_string(FILE *out, const char *z){
605 int i;
drhc3d6ba42014-01-13 20:38:35 +0000606 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000607 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000608 for(i=0; z[i]
609 && z[i]!='<'
610 && z[i]!='&'
611 && z[i]!='>'
612 && z[i]!='\"'
613 && z[i]!='\'';
614 i++){}
drhc08a4f12000-06-15 16:49:48 +0000615 if( i>0 ){
616 fprintf(out,"%.*s",i,z);
617 }
618 if( z[i]=='<' ){
619 fprintf(out,"&lt;");
620 }else if( z[i]=='&' ){
621 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000622 }else if( z[i]=='>' ){
623 fprintf(out,"&gt;");
624 }else if( z[i]=='\"' ){
625 fprintf(out,"&quot;");
626 }else if( z[i]=='\'' ){
627 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000628 }else{
629 break;
630 }
631 z += i + 1;
632 }
633}
634
635/*
drhc49f44e2006-10-26 18:15:42 +0000636** If a field contains any character identified by a 1 in the following
637** array, then the string must be quoted for CSV.
638*/
639static const char needCsvQuote[] = {
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
656};
657
658/*
drh8e64d1c2004-10-07 00:32:39 +0000659** Output a single term of CSV. Actually, p->separator is used for
660** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000661** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000662*/
663static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000664 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000665 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000666 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000667 }else{
drhc49f44e2006-10-26 18:15:42 +0000668 int i;
drh4f21c4a2008-12-10 22:15:00 +0000669 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000670 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000671 if( needCsvQuote[((unsigned char*)z)[i]]
672 || (z[i]==p->separator[0] &&
673 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000674 i = 0;
675 break;
676 }
677 }
678 if( i==0 ){
679 putc('"', out);
680 for(i=0; z[i]; i++){
681 if( z[i]=='"' ) putc('"', out);
682 putc(z[i], out);
683 }
684 putc('"', out);
685 }else{
686 fprintf(out, "%s", z);
687 }
drh8e64d1c2004-10-07 00:32:39 +0000688 }
689 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000690 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000691 }
692}
693
danielk19774af00c62005-01-23 23:43:21 +0000694#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000695/*
drh4c504392000-10-16 22:06:40 +0000696** This routine runs when the user presses Ctrl-C
697*/
698static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000699 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000700 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000701 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000702}
danielk19774af00c62005-01-23 23:43:21 +0000703#endif
drh4c504392000-10-16 22:06:40 +0000704
705/*
shane626a6e42009-10-22 17:30:15 +0000706** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000707** invokes for each row of a query result.
708*/
shane626a6e42009-10-22 17:30:15 +0000709static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000710 int i;
711 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000712
drh75897232000-05-29 14:26:00 +0000713 switch( p->mode ){
714 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000715 int w = 5;
drh6a535342001-10-19 16:44:56 +0000716 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000717 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000718 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000719 if( len>w ) w = len;
720 }
drh75897232000-05-29 14:26:00 +0000721 if( p->cnt++>0 ) fprintf(p->out,"\n");
722 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000723 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000724 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000725 }
726 break;
727 }
danielk19770d78bae2008-01-03 07:09:48 +0000728 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000729 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000730 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000731 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000732 int w, n;
733 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000734 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000735 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000736 w = 0;
drh75897232000-05-29 14:26:00 +0000737 }
drh078b1fd2012-09-21 13:40:02 +0000738 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000739 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000740 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000741 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000742 if( w<n ) w = n;
743 }
744 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000745 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000746 }
747 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000748 if( w<0 ){
749 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
750 }else{
751 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
752 }
drha0c66f52000-07-29 13:20:21 +0000753 }
754 }
755 if( p->showHeader ){
756 for(i=0; i<nArg; i++){
757 int w;
758 if( i<ArraySize(p->actualWidth) ){
759 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000760 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000761 }else{
762 w = 10;
763 }
764 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
765 "----------------------------------------------------------",
766 i==nArg-1 ? "\n": " ");
767 }
drh75897232000-05-29 14:26:00 +0000768 }
769 }
drh6a535342001-10-19 16:44:56 +0000770 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000771 for(i=0; i<nArg; i++){
772 int w;
drha0c66f52000-07-29 13:20:21 +0000773 if( i<ArraySize(p->actualWidth) ){
774 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000775 }else{
776 w = 10;
777 }
dana98bf362013-11-13 18:35:01 +0000778 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000779 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000780 }
dana98bf362013-11-13 18:35:01 +0000781 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000782 if( p->iIndent<p->nIndent ){
783 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000784 }
danc4650bb2013-11-18 08:41:06 +0000785 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000786 }
drh078b1fd2012-09-21 13:40:02 +0000787 if( w<0 ){
788 fprintf(p->out,"%*.*s%s",-w,-w,
789 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
790 }else{
791 fprintf(p->out,"%-*.*s%s",w,w,
792 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
793 }
drh75897232000-05-29 14:26:00 +0000794 }
795 break;
796 }
drhe3710332000-09-29 13:30:53 +0000797 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000798 case MODE_List: {
799 if( p->cnt++==0 && p->showHeader ){
800 for(i=0; i<nArg; i++){
801 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
802 }
803 }
drh6a535342001-10-19 16:44:56 +0000804 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000805 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000806 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000807 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000808 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000809 if( i<nArg-1 ){
810 fprintf(p->out, "%s", p->separator);
811 }else if( p->mode==MODE_Semi ){
812 fprintf(p->out, ";\n");
813 }else{
814 fprintf(p->out, "\n");
815 }
drh75897232000-05-29 14:26:00 +0000816 }
817 break;
818 }
drh1e5d0e92000-05-31 23:33:17 +0000819 case MODE_Html: {
820 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000821 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000822 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000823 fprintf(p->out,"<TH>");
824 output_html_string(p->out, azCol[i]);
825 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000826 }
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000828 }
drh6a535342001-10-19 16:44:56 +0000829 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000830 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000831 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000832 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000833 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000834 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000835 }
mihailim57c591a2008-06-23 21:26:05 +0000836 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000837 break;
838 }
drhfeac5f82004-08-01 00:10:45 +0000839 case MODE_Tcl: {
840 if( p->cnt++==0 && p->showHeader ){
841 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000842 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000843 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000844 }
845 fprintf(p->out,"\n");
846 }
847 if( azArg==0 ) break;
848 for(i=0; i<nArg; i++){
849 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000850 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000851 }
852 fprintf(p->out,"\n");
853 break;
854 }
drh8e64d1c2004-10-07 00:32:39 +0000855 case MODE_Csv: {
856 if( p->cnt++==0 && p->showHeader ){
857 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000858 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000859 }
860 fprintf(p->out,"\n");
861 }
862 if( azArg==0 ) break;
863 for(i=0; i<nArg; i++){
864 output_csv(p, azArg[i], i<nArg-1);
865 }
866 fprintf(p->out,"\n");
867 break;
868 }
drh28bd4bc2000-06-15 15:57:22 +0000869 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000870 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000871 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000872 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000873 for(i=0; i<nArg; i++){
874 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000875 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000876 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000877 }else if( aiType && aiType[i]==SQLITE_TEXT ){
878 if( zSep[0] ) fprintf(p->out,"%s",zSep);
879 output_quoted_string(p->out, azArg[i]);
880 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
881 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000882 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
883 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
884 int nBlob = sqlite3_column_bytes(p->pStmt, i);
885 if( zSep[0] ) fprintf(p->out,"%s",zSep);
886 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000887 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000888 fprintf(p->out,"%s%s",zSep, azArg[i]);
889 }else{
890 if( zSep[0] ) fprintf(p->out,"%s",zSep);
891 output_quoted_string(p->out, azArg[i]);
892 }
893 }
894 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000895 break;
drh28bd4bc2000-06-15 15:57:22 +0000896 }
persicom1d0b8722002-04-18 02:53:04 +0000897 }
drh75897232000-05-29 14:26:00 +0000898 return 0;
899}
900
901/*
shane626a6e42009-10-22 17:30:15 +0000902** This is the callback routine that the SQLite library
903** invokes for each row of a query result.
904*/
905static int callback(void *pArg, int nArg, char **azArg, char **azCol){
906 /* since we don't have type info, call the shell_callback with a NULL value */
907 return shell_callback(pArg, nArg, azArg, azCol, NULL);
908}
909
910/*
drh33048c02001-10-01 14:29:22 +0000911** Set the destination table field of the callback_data structure to
912** the name of the table given. Escape any quote characters in the
913** table name.
914*/
915static void set_table_name(struct callback_data *p, const char *zName){
916 int i, n;
917 int needQuote;
918 char *z;
919
920 if( p->zDestTable ){
921 free(p->zDestTable);
922 p->zDestTable = 0;
923 }
924 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000925 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000926 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000927 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000928 needQuote = 1;
929 if( zName[i]=='\'' ) n++;
930 }
931 }
932 if( needQuote ) n += 2;
933 z = p->zDestTable = malloc( n+1 );
934 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000935 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000936 exit(1);
937 }
938 n = 0;
939 if( needQuote ) z[n++] = '\'';
940 for(i=0; zName[i]; i++){
941 z[n++] = zName[i];
942 if( zName[i]=='\'' ) z[n++] = '\'';
943 }
944 if( needQuote ) z[n++] = '\'';
945 z[n] = 0;
946}
947
danielk19772a02e332004-06-05 08:04:36 +0000948/* zIn is either a pointer to a NULL-terminated string in memory obtained
949** from malloc(), or a NULL pointer. The string pointed to by zAppend is
950** added to zIn, and the result returned in memory obtained from malloc().
951** zIn, if it was not NULL, is freed.
952**
953** If the third argument, quote, is not '\0', then it is used as a
954** quote character for zAppend.
955*/
drhc28490c2006-10-26 14:25:58 +0000956static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000957 int len;
958 int i;
drh4f21c4a2008-12-10 22:15:00 +0000959 int nAppend = strlen30(zAppend);
960 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000961
962 len = nAppend+nIn+1;
963 if( quote ){
964 len += 2;
965 for(i=0; i<nAppend; i++){
966 if( zAppend[i]==quote ) len++;
967 }
968 }
969
970 zIn = (char *)realloc(zIn, len);
971 if( !zIn ){
972 return 0;
973 }
974
975 if( quote ){
976 char *zCsr = &zIn[nIn];
977 *zCsr++ = quote;
978 for(i=0; i<nAppend; i++){
979 *zCsr++ = zAppend[i];
980 if( zAppend[i]==quote ) *zCsr++ = quote;
981 }
982 *zCsr++ = quote;
983 *zCsr++ = '\0';
984 assert( (zCsr-zIn)==len );
985 }else{
986 memcpy(&zIn[nIn], zAppend, nAppend);
987 zIn[len-1] = '\0';
988 }
989
990 return zIn;
991}
992
drhdd3d4592004-08-30 01:54:05 +0000993
994/*
drhb21a8e42012-01-28 21:08:51 +0000995** Execute a query statement that will generate SQL output. Print
996** the result columns, comma-separated, on a line and then add a
997** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000998**
drhb21a8e42012-01-28 21:08:51 +0000999** If the number of columns is 1 and that column contains text "--"
1000** then write the semicolon on a separate line. That way, if a
1001** "--" comment occurs at the end of the statement, the comment
1002** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001003*/
drh157e29a2009-05-21 15:15:00 +00001004static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001005 struct callback_data *p, /* Query context */
1006 const char *zSelect, /* SELECT statement to extract content */
1007 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001008){
drhdd3d4592004-08-30 01:54:05 +00001009 sqlite3_stmt *pSelect;
1010 int rc;
drhb21a8e42012-01-28 21:08:51 +00001011 int nResult;
1012 int i;
1013 const char *z;
drhc7181902014-02-27 15:04:13 +00001014 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001015 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001016 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001017 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001018 return rc;
1019 }
1020 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001021 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001022 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001023 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001024 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001025 zFirstRow = 0;
1026 }
drhb21a8e42012-01-28 21:08:51 +00001027 z = (const char*)sqlite3_column_text(pSelect, 0);
1028 fprintf(p->out, "%s", z);
1029 for(i=1; i<nResult; i++){
1030 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1031 }
1032 if( z==0 ) z = "";
1033 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1034 if( z[0] ){
1035 fprintf(p->out, "\n;\n");
1036 }else{
1037 fprintf(p->out, ";\n");
1038 }
drhdd3d4592004-08-30 01:54:05 +00001039 rc = sqlite3_step(pSelect);
1040 }
drh2f464a02011-10-13 00:41:49 +00001041 rc = sqlite3_finalize(pSelect);
1042 if( rc!=SQLITE_OK ){
1043 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001044 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001045 }
1046 return rc;
drhdd3d4592004-08-30 01:54:05 +00001047}
1048
shane626a6e42009-10-22 17:30:15 +00001049/*
1050** Allocate space and save off current error string.
1051*/
1052static char *save_err_msg(
1053 sqlite3 *db /* Database to query */
1054){
1055 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1056 char *zErrMsg = sqlite3_malloc(nErrMsg);
1057 if( zErrMsg ){
1058 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1059 }
1060 return zErrMsg;
1061}
1062
1063/*
shaneh642d8b82010-07-28 16:05:34 +00001064** Display memory stats.
1065*/
1066static int display_stats(
1067 sqlite3 *db, /* Database to query */
1068 struct callback_data *pArg, /* Pointer to struct callback_data */
1069 int bReset /* True to reset the stats */
1070){
1071 int iCur;
1072 int iHiwtr;
1073
1074 if( pArg && pArg->out ){
1075
1076 iHiwtr = iCur = -1;
1077 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001078 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001079 iHiwtr = iCur = -1;
1080 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001081 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001082/*
1083** Not currently used by the CLI.
1084** iHiwtr = iCur = -1;
1085** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1086** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1087*/
1088 iHiwtr = iCur = -1;
1089 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1090 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1091/*
1092** Not currently used by the CLI.
1093** iHiwtr = iCur = -1;
1094** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1095** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1096*/
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1106 iHiwtr = iCur = -1;
1107 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1108 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1109#ifdef YYTRACKMAXSTACKDEPTH
1110 iHiwtr = iCur = -1;
1111 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1112 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1113#endif
1114 }
1115
1116 if( pArg && pArg->out && db ){
1117 iHiwtr = iCur = -1;
1118 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001120 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1121 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1122 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1123 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1125 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001126 iHiwtr = iCur = -1;
1127 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001128 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1131 iHiwtr = iCur = -1;
1132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001134 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1136 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1137 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001138 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1140 iHiwtr = iCur = -1;
1141 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1142 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1143 }
1144
1145 if( pArg && pArg->out && db && pArg->pStmt ){
1146 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1147 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1148 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1149 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1150 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1151 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001152 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1153 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001154 }
1155
1156 return 0;
1157}
1158
1159/*
dana98bf362013-11-13 18:35:01 +00001160** Parameter azArray points to a zero-terminated array of strings. zStr
1161** points to a single nul-terminated string. Return non-zero if zStr
1162** is equal, according to strcmp(), to any of the strings in the array.
1163** Otherwise, return zero.
1164*/
1165static int str_in_array(const char *zStr, const char **azArray){
1166 int i;
1167 for(i=0; azArray[i]; i++){
1168 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1169 }
1170 return 0;
1171}
1172
1173/*
1174** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1175** and populate the callback_data.aiIndent[] array with the number of
1176** spaces each opcode should be indented before it is output.
1177**
1178** The indenting rules are:
1179**
1180** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1181** all opcodes that occur between the p2 jump destination and the opcode
1182** itself by 2 spaces.
1183**
drh01752bc2013-11-14 23:59:33 +00001184** * For each "Goto", if the jump destination is earlier in the program
1185** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001186** Yield SeekGt SeekLt RowSetRead Rewind
drh01752bc2013-11-14 23:59:33 +00001187** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001188** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001189*/
1190static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1191 const char *zSql; /* The text of the SQL statement */
1192 const char *z; /* Used to check if this is an EXPLAIN */
1193 int *abYield = 0; /* True if op is an OP_Yield */
1194 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001195 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001196
drh602320e2013-11-15 03:16:34 +00001197 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001198 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001199 const char *azGoto[] = { "Goto", 0 };
1200
1201 /* Try to figure out if this is really an EXPLAIN statement. If this
1202 ** cannot be verified, return early. */
1203 zSql = sqlite3_sql(pSql);
1204 if( zSql==0 ) return;
1205 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1206 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1207
1208 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1209 int i;
danc4650bb2013-11-18 08:41:06 +00001210 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001211 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001212
1213 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1214 ** p2 is an instruction address, set variable p2op to the index of that
1215 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1216 ** the current instruction is part of a sub-program generated by an
1217 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001218 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001219 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001220
1221 /* Grow the p->aiIndent array as required */
1222 if( iOp>=nAlloc ){
1223 nAlloc += 100;
1224 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1225 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1226 }
1227 abYield[iOp] = str_in_array(zOp, azYield);
1228 p->aiIndent[iOp] = 0;
1229 p->nIndent = iOp+1;
1230
1231 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001232 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001233 }
danc4650bb2013-11-18 08:41:06 +00001234 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
drhe73f0592014-01-21 22:25:45 +00001235 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001236 }
1237 }
1238
danc4650bb2013-11-18 08:41:06 +00001239 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001240 sqlite3_free(abYield);
1241 sqlite3_reset(pSql);
1242}
1243
1244/*
1245** Free the array allocated by explain_data_prepare().
1246*/
1247static void explain_data_delete(struct callback_data *p){
1248 sqlite3_free(p->aiIndent);
1249 p->aiIndent = 0;
1250 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001251 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001252}
1253
1254/*
shane626a6e42009-10-22 17:30:15 +00001255** Execute a statement or set of statements. Print
1256** any result rows/columns depending on the current mode
1257** set via the supplied callback.
1258**
1259** This is very similar to SQLite's built-in sqlite3_exec()
1260** function except it takes a slightly different callback
1261** and callback data argument.
1262*/
1263static int shell_exec(
1264 sqlite3 *db, /* An open database */
1265 const char *zSql, /* SQL to be evaluated */
1266 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1267 /* (not the same as sqlite3_exec) */
1268 struct callback_data *pArg, /* Pointer to struct callback_data */
1269 char **pzErrMsg /* Error msg written here */
1270){
dan4564ced2010-01-05 04:59:56 +00001271 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1272 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001273 int rc2;
dan4564ced2010-01-05 04:59:56 +00001274 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001275
1276 if( pzErrMsg ){
1277 *pzErrMsg = NULL;
1278 }
1279
shaneb9fc17d2009-10-22 21:23:35 +00001280 while( zSql[0] && (SQLITE_OK == rc) ){
1281 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1282 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001283 if( pzErrMsg ){
1284 *pzErrMsg = save_err_msg(db);
1285 }
1286 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001287 if( !pStmt ){
1288 /* this happens for a comment or white-space */
1289 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001290 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001291 continue;
1292 }
shane626a6e42009-10-22 17:30:15 +00001293
shaneh642d8b82010-07-28 16:05:34 +00001294 /* save off the prepared statment handle and reset row count */
1295 if( pArg ){
1296 pArg->pStmt = pStmt;
1297 pArg->cnt = 0;
1298 }
1299
shanehb7977c52010-01-18 18:17:10 +00001300 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001301 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001302 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001303 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001304 }
shanehb7977c52010-01-18 18:17:10 +00001305
drhefbf3b12014-02-28 20:47:24 +00001306 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1307 if( pArg && pArg->autoEQP ){
1308 sqlite3_stmt *pExplain;
1309 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1310 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1311 if( rc==SQLITE_OK ){
1312 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1313 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1314 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1315 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1316 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1317 }
1318 }
1319 sqlite3_finalize(pExplain);
1320 sqlite3_free(zEQP);
1321 }
1322
drh7e02e5e2011-12-06 19:44:51 +00001323 /* Output TESTCTRL_EXPLAIN text of requested */
1324 if( pArg && pArg->mode==MODE_Explain ){
1325 const char *zExplain = 0;
1326 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1327 if( zExplain && zExplain[0] ){
1328 fprintf(pArg->out, "%s", zExplain);
1329 }
1330 }
1331
dana98bf362013-11-13 18:35:01 +00001332 /* If the shell is currently in ".explain" mode, gather the extra
1333 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001334 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001335 explain_data_prepare(pArg, pStmt);
1336 }
1337
shaneb9fc17d2009-10-22 21:23:35 +00001338 /* perform the first step. this will tell us if we
1339 ** have a result set or not and how wide it is.
1340 */
1341 rc = sqlite3_step(pStmt);
1342 /* if we have a result set... */
1343 if( SQLITE_ROW == rc ){
1344 /* if we have a callback... */
1345 if( xCallback ){
1346 /* allocate space for col name ptr, value ptr, and type */
1347 int nCol = sqlite3_column_count(pStmt);
1348 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1349 if( !pData ){
1350 rc = SQLITE_NOMEM;
1351 }else{
1352 char **azCols = (char **)pData; /* Names of result columns */
1353 char **azVals = &azCols[nCol]; /* Results */
1354 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001355 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001356 assert(sizeof(int) <= sizeof(char *));
1357 /* save off ptrs to column names */
1358 for(i=0; i<nCol; i++){
1359 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1360 }
shaneb9fc17d2009-10-22 21:23:35 +00001361 do{
1362 /* extract the data and data types */
1363 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001364 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001365 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001366 azVals[i] = "";
1367 }else{
1368 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1369 }
shaneb9fc17d2009-10-22 21:23:35 +00001370 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1371 rc = SQLITE_NOMEM;
1372 break; /* from for */
1373 }
1374 } /* end for */
1375
1376 /* if data and types extracted successfully... */
1377 if( SQLITE_ROW == rc ){
1378 /* call the supplied callback with the result row data */
1379 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1380 rc = SQLITE_ABORT;
1381 }else{
1382 rc = sqlite3_step(pStmt);
1383 }
1384 }
1385 } while( SQLITE_ROW == rc );
1386 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001387 }
1388 }else{
1389 do{
1390 rc = sqlite3_step(pStmt);
1391 } while( rc == SQLITE_ROW );
1392 }
1393 }
1394
dana98bf362013-11-13 18:35:01 +00001395 explain_data_delete(pArg);
1396
shaneh642d8b82010-07-28 16:05:34 +00001397 /* print usage stats if stats on */
1398 if( pArg && pArg->statsOn ){
1399 display_stats(db, pArg, 0);
1400 }
1401
dan4564ced2010-01-05 04:59:56 +00001402 /* Finalize the statement just executed. If this fails, save a
1403 ** copy of the error message. Otherwise, set zSql to point to the
1404 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001405 rc2 = sqlite3_finalize(pStmt);
1406 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001407 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001408 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001409 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001410 }else if( pzErrMsg ){
1411 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001412 }
shaneh642d8b82010-07-28 16:05:34 +00001413
1414 /* clear saved stmt handle */
1415 if( pArg ){
1416 pArg->pStmt = NULL;
1417 }
shane626a6e42009-10-22 17:30:15 +00001418 }
shaneb9fc17d2009-10-22 21:23:35 +00001419 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001420
1421 return rc;
1422}
1423
drhdd3d4592004-08-30 01:54:05 +00001424
drh33048c02001-10-01 14:29:22 +00001425/*
drh4c653a02000-06-07 01:27:47 +00001426** This is a different callback routine used for dumping the database.
1427** Each row received by this callback consists of a table name,
1428** the table type ("index" or "table") and SQL to create the table.
1429** This routine should print text sufficient to recreate the table.
1430*/
1431static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001432 int rc;
1433 const char *zTable;
1434 const char *zType;
1435 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001436 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001437 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001438
drh902b9ee2008-12-05 17:17:07 +00001439 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001440 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001441 zTable = azArg[0];
1442 zType = azArg[1];
1443 zSql = azArg[2];
1444
drh00b950d2005-09-11 02:03:03 +00001445 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001446 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001447 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001448 fprintf(p->out, "ANALYZE sqlite_master;\n");
1449 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1450 return 0;
drh45e29d82006-11-20 16:21:10 +00001451 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1452 char *zIns;
1453 if( !p->writableSchema ){
1454 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1455 p->writableSchema = 1;
1456 }
1457 zIns = sqlite3_mprintf(
1458 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1459 "VALUES('table','%q','%q',0,'%q');",
1460 zTable, zTable, zSql);
1461 fprintf(p->out, "%s\n", zIns);
1462 sqlite3_free(zIns);
1463 return 0;
drh00b950d2005-09-11 02:03:03 +00001464 }else{
1465 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001466 }
danielk19772a02e332004-06-05 08:04:36 +00001467
1468 if( strcmp(zType, "table")==0 ){
1469 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001470 char *zSelect = 0;
1471 char *zTableInfo = 0;
1472 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001473 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001474
1475 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1476 zTableInfo = appendText(zTableInfo, zTable, '"');
1477 zTableInfo = appendText(zTableInfo, ");", 0);
1478
drhc7181902014-02-27 15:04:13 +00001479 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001480 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001481 if( rc!=SQLITE_OK || !pTableInfo ){
1482 return 1;
1483 }
1484
1485 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001486 /* Always quote the table name, even if it appears to be pure ascii,
1487 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1488 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001489 if( zTmp ){
1490 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001491 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001492 }
1493 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1494 rc = sqlite3_step(pTableInfo);
1495 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001496 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001497 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001498 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001499 rc = sqlite3_step(pTableInfo);
1500 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001501 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001502 }else{
1503 zSelect = appendText(zSelect, ") ", 0);
1504 }
drh157e29a2009-05-21 15:15:00 +00001505 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001506 }
1507 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001508 if( rc!=SQLITE_OK || nRow==0 ){
1509 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001510 return 1;
1511 }
1512 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1513 zSelect = appendText(zSelect, zTable, '"');
1514
drh2f464a02011-10-13 00:41:49 +00001515 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001516 if( rc==SQLITE_CORRUPT ){
1517 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001518 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001519 }
drh85e72432012-04-11 11:38:53 +00001520 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001521 }
drh4c653a02000-06-07 01:27:47 +00001522 return 0;
1523}
1524
1525/*
drh45e29d82006-11-20 16:21:10 +00001526** Run zQuery. Use dump_callback() as the callback routine so that
1527** the contents of the query are output as SQL statements.
1528**
drhdd3d4592004-08-30 01:54:05 +00001529** If we get a SQLITE_CORRUPT error, rerun the query after appending
1530** "ORDER BY rowid DESC" to the end.
1531*/
1532static int run_schema_dump_query(
1533 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001534 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001535){
1536 int rc;
drh2f464a02011-10-13 00:41:49 +00001537 char *zErr = 0;
1538 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001539 if( rc==SQLITE_CORRUPT ){
1540 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001541 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001542 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1543 if( zErr ){
1544 fprintf(p->out, "/****** %s ******/\n", zErr);
1545 sqlite3_free(zErr);
1546 zErr = 0;
1547 }
drhdd3d4592004-08-30 01:54:05 +00001548 zQ2 = malloc( len+100 );
1549 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001550 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001551 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1552 if( rc ){
1553 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1554 }else{
1555 rc = SQLITE_CORRUPT;
1556 }
1557 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001558 free(zQ2);
1559 }
1560 return rc;
1561}
1562
1563/*
drh75897232000-05-29 14:26:00 +00001564** Text of a help message
1565*/
persicom1d0b8722002-04-18 02:53:04 +00001566static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001567 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001568 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001569 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001570 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001571 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001572 " If TABLE specified, only dump tables matching\n"
1573 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001574 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001575 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001576 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1577 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001578 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001579 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001580 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001581 ".indices ?TABLE? Show names of all indices\n"
1582 " If TABLE specified, only show indices for tables\n"
1583 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001584#ifdef SQLITE_ENABLE_IOTRACE
1585 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1586#endif
drh70df4fe2006-06-13 15:12:21 +00001587#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001588 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001589#endif
drh127f9d72010-02-23 01:47:00 +00001590 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001591 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001592 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001593 " column Left-aligned columns. (See .width)\n"
1594 " html HTML <table> code\n"
1595 " insert SQL insert statements for TABLE\n"
1596 " line One value per line\n"
1597 " list Values delimited by .separator string\n"
1598 " tabs Tab-separated values\n"
1599 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001600 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001601 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001602 ".output FILENAME Send output to FILENAME\n"
1603 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001604 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001605 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001606 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001607 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001608 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001609 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001610 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001611 " If TABLE specified, only show tables matching\n"
1612 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001613 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001614 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001615 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001616 ".tables ?TABLE? List names of tables\n"
1617 " If TABLE specified, only list tables matching\n"
1618 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001619 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001620 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001621 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001622 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001623;
1624
shaneb320ccd2009-10-21 03:42:58 +00001625static char zTimerHelp[] =
1626 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1627;
1628
drhdaffd0e2001-04-11 14:28:42 +00001629/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001630static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001631
drh75897232000-05-29 14:26:00 +00001632/*
drh44c2eb12003-04-30 11:38:26 +00001633** Make sure the database is open. If it is not, then open it. If
1634** the database fails to open, print an error message and exit.
1635*/
drh05782482013-10-24 15:20:20 +00001636static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001637 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001638 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001639 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001640 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001641 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1642 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1643 shellstaticFunc, 0, 0);
1644 }
1645 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001646 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001647 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001648 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001649 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001650 }
drhc2e87a32006-06-27 15:16:14 +00001651#ifndef SQLITE_OMIT_LOAD_EXTENSION
1652 sqlite3_enable_load_extension(p->db, 1);
1653#endif
drh44c2eb12003-04-30 11:38:26 +00001654 }
1655}
1656
1657/*
drhfeac5f82004-08-01 00:10:45 +00001658** Do C-language style dequoting.
1659**
1660** \t -> tab
1661** \n -> newline
1662** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001663** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001664** \NNN -> ascii character NNN in octal
1665** \\ -> backslash
1666*/
1667static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001668 int i, j;
1669 char c;
drhfeac5f82004-08-01 00:10:45 +00001670 for(i=j=0; (c = z[i])!=0; i++, j++){
1671 if( c=='\\' ){
1672 c = z[++i];
1673 if( c=='n' ){
1674 c = '\n';
1675 }else if( c=='t' ){
1676 c = '\t';
1677 }else if( c=='r' ){
1678 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001679 }else if( c=='\\' ){
1680 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001681 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001682 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001683 if( z[i+1]>='0' && z[i+1]<='7' ){
1684 i++;
1685 c = (c<<3) + z[i] - '0';
1686 if( z[i+1]>='0' && z[i+1]<='7' ){
1687 i++;
1688 c = (c<<3) + z[i] - '0';
1689 }
1690 }
1691 }
1692 }
1693 z[j] = c;
1694 }
1695 z[j] = 0;
1696}
1697
1698/*
drh348d19c2013-06-03 12:47:43 +00001699** Return the value of a hexadecimal digit. Return -1 if the input
1700** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001701*/
drh348d19c2013-06-03 12:47:43 +00001702static int hexDigitValue(char c){
1703 if( c>='0' && c<='9' ) return c - '0';
1704 if( c>='a' && c<='f' ) return c - 'a' + 10;
1705 if( c>='A' && c<='F' ) return c - 'A' + 10;
1706 return -1;
drhc28490c2006-10-26 14:25:58 +00001707}
1708
1709/*
drh7d9f3942013-04-03 01:26:54 +00001710** Interpret zArg as an integer value, possibly with suffixes.
1711*/
1712static sqlite3_int64 integerValue(const char *zArg){
1713 sqlite3_int64 v = 0;
1714 static const struct { char *zSuffix; int iMult; } aMult[] = {
1715 { "KiB", 1024 },
1716 { "MiB", 1024*1024 },
1717 { "GiB", 1024*1024*1024 },
1718 { "KB", 1000 },
1719 { "MB", 1000000 },
1720 { "GB", 1000000000 },
1721 { "K", 1000 },
1722 { "M", 1000000 },
1723 { "G", 1000000000 },
1724 };
1725 int i;
1726 int isNeg = 0;
1727 if( zArg[0]=='-' ){
1728 isNeg = 1;
1729 zArg++;
1730 }else if( zArg[0]=='+' ){
1731 zArg++;
1732 }
drh348d19c2013-06-03 12:47:43 +00001733 if( zArg[0]=='0' && zArg[1]=='x' ){
1734 int x;
1735 zArg += 2;
1736 while( (x = hexDigitValue(zArg[0]))>=0 ){
1737 v = (v<<4) + x;
1738 zArg++;
1739 }
1740 }else{
1741 while( IsDigit(zArg[0]) ){
1742 v = v*10 + zArg[0] - '0';
1743 zArg++;
1744 }
drh7d9f3942013-04-03 01:26:54 +00001745 }
drhc2bed0a2013-05-24 11:57:50 +00001746 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001747 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1748 v *= aMult[i].iMult;
1749 break;
1750 }
1751 }
1752 return isNeg? -v : v;
1753}
1754
1755/*
drh348d19c2013-06-03 12:47:43 +00001756** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1757** for TRUE and FALSE. Return the integer value if appropriate.
1758*/
1759static int booleanValue(char *zArg){
1760 int i;
1761 if( zArg[0]=='0' && zArg[1]=='x' ){
1762 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1763 }else{
1764 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1765 }
1766 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1767 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1768 return 1;
1769 }
1770 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1771 return 0;
1772 }
1773 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1774 zArg);
1775 return 0;
1776}
1777
1778/*
drh42f64e52012-04-04 16:56:23 +00001779** Close an output file, assuming it is not stderr or stdout
1780*/
1781static void output_file_close(FILE *f){
1782 if( f && f!=stdout && f!=stderr ) fclose(f);
1783}
1784
1785/*
1786** Try to open an output file. The names "stdout" and "stderr" are
1787** recognized and do the right thing. NULL is returned if the output
1788** filename is "off".
1789*/
1790static FILE *output_file_open(const char *zFile){
1791 FILE *f;
1792 if( strcmp(zFile,"stdout")==0 ){
1793 f = stdout;
1794 }else if( strcmp(zFile, "stderr")==0 ){
1795 f = stderr;
1796 }else if( strcmp(zFile, "off")==0 ){
1797 f = 0;
1798 }else{
1799 f = fopen(zFile, "wb");
1800 if( f==0 ){
1801 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1802 }
1803 }
1804 return f;
1805}
1806
1807/*
1808** A routine for handling output from sqlite3_trace().
1809*/
1810static void sql_trace_callback(void *pArg, const char *z){
1811 FILE *f = (FILE*)pArg;
1812 if( f ) fprintf(f, "%s\n", z);
1813}
1814
1815/*
drhd8621b92012-04-17 09:09:33 +00001816** A no-op routine that runs with the ".breakpoint" doc-command. This is
1817** a useful spot to set a debugger breakpoint.
1818*/
1819static void test_breakpoint(void){
1820 static int nCall = 0;
1821 nCall++;
1822}
1823
1824/*
drhdb95f682013-06-26 22:46:00 +00001825** An object used to read a CSV file
1826*/
1827typedef struct CSVReader CSVReader;
1828struct CSVReader {
1829 const char *zFile; /* Name of the input file */
1830 FILE *in; /* Read the CSV text from this input stream */
1831 char *z; /* Accumulated text for a field */
1832 int n; /* Number of bytes in z */
1833 int nAlloc; /* Space allocated for z[] */
1834 int nLine; /* Current line number */
1835 int cTerm; /* Character that terminated the most recent field */
1836 int cSeparator; /* The separator character. (Usually ",") */
1837};
1838
1839/* Append a single byte to z[] */
1840static void csv_append_char(CSVReader *p, int c){
1841 if( p->n+1>=p->nAlloc ){
1842 p->nAlloc += p->nAlloc + 100;
1843 p->z = sqlite3_realloc(p->z, p->nAlloc);
1844 if( p->z==0 ){
1845 fprintf(stderr, "out of memory\n");
1846 exit(1);
1847 }
1848 }
1849 p->z[p->n++] = (char)c;
1850}
1851
1852/* Read a single field of CSV text. Compatible with rfc4180 and extended
1853** with the option of having a separator other than ",".
1854**
1855** + Input comes from p->in.
1856** + Store results in p->z of length p->n. Space to hold p->z comes
1857** from sqlite3_malloc().
1858** + Use p->cSep as the separator. The default is ",".
1859** + Keep track of the line number in p->nLine.
1860** + Store the character that terminates the field in p->cTerm. Store
1861** EOF on end-of-file.
1862** + Report syntax errors on stderr
1863*/
1864static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001865 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001866 int cSep = p->cSeparator;
1867 p->n = 0;
1868 c = fgetc(p->in);
1869 if( c==EOF || seenInterrupt ){
1870 p->cTerm = EOF;
1871 return 0;
1872 }
1873 if( c=='"' ){
1874 int startLine = p->nLine;
1875 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001876 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001877 while( 1 ){
1878 c = fgetc(p->in);
1879 if( c=='\n' ) p->nLine++;
1880 if( c==cQuote ){
1881 if( pc==cQuote ){
1882 pc = 0;
1883 continue;
1884 }
1885 }
1886 if( (c==cSep && pc==cQuote)
1887 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001888 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001889 || (c==EOF && pc==cQuote)
1890 ){
1891 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001892 p->cTerm = c;
1893 break;
1894 }
1895 if( pc==cQuote && c!='\r' ){
1896 fprintf(stderr, "%s:%d: unescaped %c character\n",
1897 p->zFile, p->nLine, cQuote);
1898 }
1899 if( c==EOF ){
1900 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1901 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001902 p->cTerm = EOF;
1903 break;
1904 }
1905 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001906 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001907 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001908 }
drhdb95f682013-06-26 22:46:00 +00001909 }else{
drhd0a64dc2013-06-30 20:24:26 +00001910 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001911 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001912 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001913 }
1914 if( c=='\n' ){
1915 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001916 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001917 }
drhdb95f682013-06-26 22:46:00 +00001918 p->cTerm = c;
1919 }
drh8dd675e2013-07-12 21:09:24 +00001920 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001921 return p->z;
1922}
1923
1924/*
drh4bbcf102014-02-06 02:46:08 +00001925** Try to transfer data for table zTable. If an error is seen while
1926** moving forward, try to go backwards. The backwards movement won't
1927** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001928*/
mistachkine31ae902014-02-06 01:15:29 +00001929static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001930 struct callback_data *p,
1931 sqlite3 *newDb,
1932 const char *zTable
1933){
1934 sqlite3_stmt *pQuery = 0;
1935 sqlite3_stmt *pInsert = 0;
1936 char *zQuery = 0;
1937 char *zInsert = 0;
1938 int rc;
1939 int i, j, n;
1940 int nTable = (int)strlen(zTable);
1941 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001942 int cnt = 0;
1943 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001944
1945 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1946 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1947 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001948 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001949 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1950 zQuery);
1951 goto end_data_xfer;
1952 }
1953 n = sqlite3_column_count(pQuery);
1954 zInsert = sqlite3_malloc(200 + nTable + n*3);
1955 if( zInsert==0 ){
1956 fprintf(stderr, "out of memory\n");
1957 goto end_data_xfer;
1958 }
1959 sqlite3_snprintf(200+nTable,zInsert,
1960 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1961 i = (int)strlen(zInsert);
1962 for(j=1; j<n; j++){
1963 memcpy(zInsert+i, ",?", 2);
1964 i += 2;
1965 }
1966 memcpy(zInsert+i, ");", 3);
1967 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1968 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001969 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001970 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1971 zQuery);
1972 goto end_data_xfer;
1973 }
1974 for(k=0; k<2; k++){
1975 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1976 for(i=0; i<n; i++){
1977 switch( sqlite3_column_type(pQuery, i) ){
1978 case SQLITE_NULL: {
1979 sqlite3_bind_null(pInsert, i+1);
1980 break;
1981 }
1982 case SQLITE_INTEGER: {
1983 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1984 break;
1985 }
1986 case SQLITE_FLOAT: {
1987 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1988 break;
1989 }
1990 case SQLITE_TEXT: {
1991 sqlite3_bind_text(pInsert, i+1,
1992 (const char*)sqlite3_column_text(pQuery,i),
1993 -1, SQLITE_STATIC);
1994 break;
1995 }
1996 case SQLITE_BLOB: {
1997 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1998 sqlite3_column_bytes(pQuery,i),
1999 SQLITE_STATIC);
2000 break;
2001 }
2002 }
2003 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002004 rc = sqlite3_step(pInsert);
2005 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2006 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2007 sqlite3_errmsg(newDb));
2008 }
drh3350ce92014-02-06 00:49:12 +00002009 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002010 cnt++;
2011 if( (cnt%spinRate)==0 ){
2012 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2013 fflush(stdout);
2014 }
drh3350ce92014-02-06 00:49:12 +00002015 } /* End while */
2016 if( rc==SQLITE_DONE ) break;
2017 sqlite3_finalize(pQuery);
2018 sqlite3_free(zQuery);
2019 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2020 zTable);
2021 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2022 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002023 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2024 break;
drh3350ce92014-02-06 00:49:12 +00002025 }
2026 } /* End for(k=0...) */
2027
2028end_data_xfer:
2029 sqlite3_finalize(pQuery);
2030 sqlite3_finalize(pInsert);
2031 sqlite3_free(zQuery);
2032 sqlite3_free(zInsert);
2033}
2034
2035
2036/*
2037** Try to transfer all rows of the schema that match zWhere. For
2038** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002039** If an error is encountered while moving forward through the
2040** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002041*/
mistachkine31ae902014-02-06 01:15:29 +00002042static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002043 struct callback_data *p,
2044 sqlite3 *newDb,
2045 const char *zWhere,
2046 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2047){
2048 sqlite3_stmt *pQuery = 0;
2049 char *zQuery = 0;
2050 int rc;
2051 const unsigned char *zName;
2052 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002053 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002054
2055 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2056 " WHERE %s", zWhere);
2057 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2058 if( rc ){
2059 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2060 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2061 zQuery);
2062 goto end_schema_xfer;
2063 }
2064 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2065 zName = sqlite3_column_text(pQuery, 0);
2066 zSql = sqlite3_column_text(pQuery, 1);
2067 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002068 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2069 if( zErrMsg ){
2070 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2071 sqlite3_free(zErrMsg);
2072 zErrMsg = 0;
2073 }
drh3350ce92014-02-06 00:49:12 +00002074 if( xForEach ){
2075 xForEach(p, newDb, (const char*)zName);
2076 }
2077 printf("done\n");
2078 }
2079 if( rc!=SQLITE_DONE ){
2080 sqlite3_finalize(pQuery);
2081 sqlite3_free(zQuery);
2082 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2083 " WHERE %s ORDER BY rowid DESC", zWhere);
2084 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2085 if( rc ){
2086 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2087 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2088 zQuery);
2089 goto end_schema_xfer;
2090 }
2091 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2092 zName = sqlite3_column_text(pQuery, 0);
2093 zSql = sqlite3_column_text(pQuery, 1);
2094 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002095 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2096 if( zErrMsg ){
2097 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2098 sqlite3_free(zErrMsg);
2099 zErrMsg = 0;
2100 }
drh3350ce92014-02-06 00:49:12 +00002101 if( xForEach ){
2102 xForEach(p, newDb, (const char*)zName);
2103 }
2104 printf("done\n");
2105 }
2106 }
2107end_schema_xfer:
2108 sqlite3_finalize(pQuery);
2109 sqlite3_free(zQuery);
2110}
2111
2112/*
2113** Open a new database file named "zNewDb". Try to recover as much information
2114** as possible out of the main database (which might be corrupt) and write it
2115** into zNewDb.
2116*/
mistachkine31ae902014-02-06 01:15:29 +00002117static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002118 int rc;
2119 sqlite3 *newDb = 0;
2120 if( access(zNewDb,0)==0 ){
2121 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2122 return;
2123 }
2124 rc = sqlite3_open(zNewDb, &newDb);
2125 if( rc ){
2126 fprintf(stderr, "Cannot create output database: %s\n",
2127 sqlite3_errmsg(newDb));
2128 }else{
2129 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002130 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2131 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002132 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2133 }
2134 sqlite3_close(newDb);
2135}
2136
2137/*
drh75897232000-05-29 14:26:00 +00002138** If an input line begins with "." then invoke this routine to
2139** process that line.
drh67505e72002-04-19 12:34:06 +00002140**
drh47ad6842006-11-08 12:25:42 +00002141** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002142*/
drh44c2eb12003-04-30 11:38:26 +00002143static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002144 int i = 1;
2145 int nArg = 0;
2146 int n, c;
drh67505e72002-04-19 12:34:06 +00002147 int rc = 0;
drh75897232000-05-29 14:26:00 +00002148 char *azArg[50];
2149
2150 /* Parse the input line into tokens.
2151 */
2152 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002153 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002154 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002155 if( zLine[i]=='\'' || zLine[i]=='"' ){
2156 int delim = zLine[i++];
2157 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002158 while( zLine[i] && zLine[i]!=delim ){
2159 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2160 i++;
2161 }
drh75897232000-05-29 14:26:00 +00002162 if( zLine[i]==delim ){
2163 zLine[i++] = 0;
2164 }
drhfeac5f82004-08-01 00:10:45 +00002165 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002166 }else{
2167 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002168 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002169 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002170 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002171 }
2172 }
2173
2174 /* Process the input line.
2175 */
shane9bd1b442009-10-23 01:27:39 +00002176 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002177 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002178 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002179 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2180 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2181 ){
drhbc46f022013-01-23 18:53:23 +00002182 const char *zDestFile = 0;
2183 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002184 sqlite3 *pDest;
2185 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002186 int j;
2187 for(j=1; j<nArg; j++){
2188 const char *z = azArg[j];
2189 if( z[0]=='-' ){
2190 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002191 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002192 {
2193 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2194 return 1;
2195 }
2196 }else if( zDestFile==0 ){
2197 zDestFile = azArg[j];
2198 }else if( zDb==0 ){
2199 zDb = zDestFile;
2200 zDestFile = azArg[j];
2201 }else{
2202 fprintf(stderr, "too many arguments to .backup\n");
2203 return 1;
2204 }
drh9ff849f2009-02-04 20:55:57 +00002205 }
drhbc46f022013-01-23 18:53:23 +00002206 if( zDestFile==0 ){
2207 fprintf(stderr, "missing FILENAME argument on .backup\n");
2208 return 1;
2209 }
2210 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002211 rc = sqlite3_open(zDestFile, &pDest);
2212 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002213 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002214 sqlite3_close(pDest);
2215 return 1;
2216 }
drh05782482013-10-24 15:20:20 +00002217 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002218 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2219 if( pBackup==0 ){
2220 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2221 sqlite3_close(pDest);
2222 return 1;
2223 }
2224 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2225 sqlite3_backup_finish(pBackup);
2226 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002227 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002228 }else{
2229 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002230 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002231 }
2232 sqlite3_close(pDest);
2233 }else
2234
shanehe2aa9d72009-11-06 17:20:17 +00002235 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002236 bail_on_error = booleanValue(azArg[1]);
2237 }else
2238
drhd8621b92012-04-17 09:09:33 +00002239 /* The undocumented ".breakpoint" command causes a call to the no-op
2240 ** routine named test_breakpoint().
2241 */
2242 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2243 test_breakpoint();
2244 }else
2245
mistachkine31ae902014-02-06 01:15:29 +00002246 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2247 tryToClone(p, azArg[1]);
2248 }else
2249
shanehe2aa9d72009-11-06 17:20:17 +00002250 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002251 struct callback_data data;
2252 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002253 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002254 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002255 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002256 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002257 data.colWidth[0] = 3;
2258 data.colWidth[1] = 15;
2259 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002260 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002261 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002262 if( zErrMsg ){
2263 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002264 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002265 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002266 }
2267 }else
2268
shanehe2aa9d72009-11-06 17:20:17 +00002269 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002270 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002271 /* When playing back a "dump", the content might appear in an order
2272 ** which causes immediate foreign key constraints to be violated.
2273 ** So disable foreign-key constraint enforcement to prevent problems. */
2274 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002275 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002276 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002277 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002278 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002279 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002280 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002281 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002282 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002283 );
2284 run_schema_dump_query(p,
2285 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002286 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002287 );
drh2f464a02011-10-13 00:41:49 +00002288 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002289 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002290 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002291 );
drh4c653a02000-06-07 01:27:47 +00002292 }else{
2293 int i;
drhdd3d4592004-08-30 01:54:05 +00002294 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002295 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002296 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002297 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002298 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002299 " AND sql NOT NULL");
2300 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002301 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002302 "WHERE sql NOT NULL"
2303 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002304 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002305 );
danielk1977bc6ada42004-06-30 08:20:16 +00002306 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002307 }
2308 }
drh45e29d82006-11-20 16:21:10 +00002309 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002310 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002311 p->writableSchema = 0;
2312 }
drh56197952011-10-13 16:30:13 +00002313 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2314 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002315 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002316 }else
drh75897232000-05-29 14:26:00 +00002317
shanehe2aa9d72009-11-06 17:20:17 +00002318 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002319 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002320 }else
2321
drhefbf3b12014-02-28 20:47:24 +00002322 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 && nArg>1 && nArg<3 ){
2323 p->autoEQP = booleanValue(azArg[1]);
2324 }else
2325
drhd3ac7d92013-01-25 18:33:43 +00002326 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002327 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002328 rc = 2;
drh75897232000-05-29 14:26:00 +00002329 }else
2330
shanehe2aa9d72009-11-06 17:20:17 +00002331 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002332 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002333 if(val == 1) {
2334 if(!p->explainPrev.valid) {
2335 p->explainPrev.valid = 1;
2336 p->explainPrev.mode = p->mode;
2337 p->explainPrev.showHeader = p->showHeader;
2338 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2339 }
2340 /* We could put this code under the !p->explainValid
2341 ** condition so that it does not execute if we are already in
2342 ** explain mode. However, always executing it allows us an easy
2343 ** was to reset to explain mode in case the user previously
2344 ** did an .explain followed by a .width, .mode or .header
2345 ** command.
2346 */
danielk19770d78bae2008-01-03 07:09:48 +00002347 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002348 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002349 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002350 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002351 p->colWidth[1] = 13; /* opcode */
2352 p->colWidth[2] = 4; /* P1 */
2353 p->colWidth[3] = 4; /* P2 */
2354 p->colWidth[4] = 4; /* P3 */
2355 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002356 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002357 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002358 }else if (p->explainPrev.valid) {
2359 p->explainPrev.valid = 0;
2360 p->mode = p->explainPrev.mode;
2361 p->showHeader = p->explainPrev.showHeader;
2362 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2363 }
drh75897232000-05-29 14:26:00 +00002364 }else
2365
drhc28490c2006-10-26 14:25:58 +00002366 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002367 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002368 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002369 }else
2370
2371 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002372 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002373 if( HAS_TIMER ){
2374 fprintf(stderr,"%s",zTimerHelp);
2375 }
drh75897232000-05-29 14:26:00 +00002376 }else
2377
shanehe2aa9d72009-11-06 17:20:17 +00002378 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002379 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002380 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002381 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002382 int nCol; /* Number of columns in the table */
2383 int nByte; /* Number of bytes in an SQL string */
2384 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002385 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002386 int nSep; /* Number of bytes in p->separator[] */
2387 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002388 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002389 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002390
drhdb95f682013-06-26 22:46:00 +00002391 seenInterrupt = 0;
2392 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002393 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002394 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002395 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002396 fprintf(stderr, "Error: non-null separator required for import\n");
2397 return 1;
drhfeac5f82004-08-01 00:10:45 +00002398 }
drhdb95f682013-06-26 22:46:00 +00002399 if( nSep>1 ){
2400 fprintf(stderr, "Error: multi-character separators not allowed"
2401 " for import\n");
2402 return 1;
2403 }
drh5bde8162013-06-27 14:07:53 +00002404 sCsv.zFile = zFile;
2405 sCsv.nLine = 1;
2406 if( sCsv.zFile[0]=='|' ){
2407 sCsv.in = popen(sCsv.zFile+1, "r");
2408 sCsv.zFile = "<pipe>";
2409 xCloser = pclose;
2410 }else{
2411 sCsv.in = fopen(sCsv.zFile, "rb");
2412 xCloser = fclose;
2413 }
drhdb95f682013-06-26 22:46:00 +00002414 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002415 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002416 return 1;
2417 }
2418 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002419 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002420 if( zSql==0 ){
2421 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002422 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002423 return 1;
2424 }
drh4f21c4a2008-12-10 22:15:00 +00002425 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002426 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002427 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2428 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2429 char cSep = '(';
2430 while( csv_read_one_field(&sCsv) ){
2431 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2432 cSep = ',';
2433 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2434 }
drh5bde8162013-06-27 14:07:53 +00002435 if( cSep=='(' ){
2436 sqlite3_free(zCreate);
2437 sqlite3_free(sCsv.z);
2438 xCloser(sCsv.in);
2439 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2440 return 1;
2441 }
drhdb95f682013-06-26 22:46:00 +00002442 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2443 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2444 sqlite3_free(zCreate);
2445 if( rc ){
2446 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2447 sqlite3_errmsg(db));
2448 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002449 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002450 return 1;
2451 }
drhc7181902014-02-27 15:04:13 +00002452 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002453 }
drhfeac5f82004-08-01 00:10:45 +00002454 sqlite3_free(zSql);
2455 if( rc ){
shane916f9612009-10-23 00:37:15 +00002456 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002457 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002458 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002459 return 1;
drhfeac5f82004-08-01 00:10:45 +00002460 }
shane916f9612009-10-23 00:37:15 +00002461 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002462 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002463 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002464 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002465 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002466 if( zSql==0 ){
2467 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002468 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002469 return 1;
2470 }
drhdb95f682013-06-26 22:46:00 +00002471 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002472 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002473 for(i=1; i<nCol; i++){
2474 zSql[j++] = ',';
2475 zSql[j++] = '?';
2476 }
2477 zSql[j++] = ')';
2478 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002479 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002480 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002481 if( rc ){
2482 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002483 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002484 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002485 return 1;
drhfeac5f82004-08-01 00:10:45 +00002486 }
drh2d463112013-08-06 14:36:36 +00002487 needCommit = sqlite3_get_autocommit(db);
2488 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002489 do{
2490 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002491 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002492 char *z = csv_read_one_field(&sCsv);
2493 if( z==0 && i==0 ) break;
2494 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2495 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2496 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2497 "filling the rest with NULL\n",
2498 sCsv.zFile, startLine, nCol, i+1);
2499 i++;
2500 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002501 }
drhfeac5f82004-08-01 00:10:45 +00002502 }
drhdb95f682013-06-26 22:46:00 +00002503 if( sCsv.cTerm==sCsv.cSeparator ){
2504 do{
2505 csv_read_one_field(&sCsv);
2506 i++;
2507 }while( sCsv.cTerm==sCsv.cSeparator );
2508 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2509 "extras ignored\n",
2510 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002511 }
drhdb95f682013-06-26 22:46:00 +00002512 if( i>=nCol ){
2513 sqlite3_step(pStmt);
2514 rc = sqlite3_reset(pStmt);
2515 if( rc!=SQLITE_OK ){
2516 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2517 sqlite3_errmsg(db));
2518 }
2519 }
2520 }while( sCsv.cTerm!=EOF );
2521
drh5bde8162013-06-27 14:07:53 +00002522 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002523 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002524 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002525 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002526 }else
2527
shanehe2aa9d72009-11-06 17:20:17 +00002528 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002529 struct callback_data data;
2530 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002531 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002532 memcpy(&data, p, sizeof(data));
2533 data.showHeader = 0;
2534 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002535 if( nArg==1 ){
2536 rc = sqlite3_exec(p->db,
2537 "SELECT name FROM sqlite_master "
2538 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2539 "UNION ALL "
2540 "SELECT name FROM sqlite_temp_master "
2541 "WHERE type='index' "
2542 "ORDER BY 1",
2543 callback, &data, &zErrMsg
2544 );
2545 }else{
2546 zShellStatic = azArg[1];
2547 rc = sqlite3_exec(p->db,
2548 "SELECT name FROM sqlite_master "
2549 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2550 "UNION ALL "
2551 "SELECT name FROM sqlite_temp_master "
2552 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2553 "ORDER BY 1",
2554 callback, &data, &zErrMsg
2555 );
2556 zShellStatic = 0;
2557 }
drh75897232000-05-29 14:26:00 +00002558 if( zErrMsg ){
2559 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002560 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002561 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002562 }else if( rc != SQLITE_OK ){
2563 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2564 rc = 1;
drh75897232000-05-29 14:26:00 +00002565 }
2566 }else
2567
drhae5e4452007-05-03 17:18:36 +00002568#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002569 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002570 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002571 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2572 iotrace = 0;
2573 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002574 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002575 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002576 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002577 iotrace = stdout;
2578 }else{
2579 iotrace = fopen(azArg[1], "w");
2580 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002581 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002582 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002583 rc = 1;
drhb0603412007-02-28 04:47:26 +00002584 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002585 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002586 }
2587 }
2588 }else
drhae5e4452007-05-03 17:18:36 +00002589#endif
drhb0603412007-02-28 04:47:26 +00002590
drh70df4fe2006-06-13 15:12:21 +00002591#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002592 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2593 const char *zFile, *zProc;
2594 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002595 zFile = azArg[1];
2596 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002597 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002598 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2599 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002600 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002601 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002602 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002603 }
2604 }else
drh70df4fe2006-06-13 15:12:21 +00002605#endif
drh1e397f82006-06-08 15:28:43 +00002606
drhc8ba2122011-03-23 11:16:22 +00002607 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002608 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002609 output_file_close(p->pLog);
2610 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002611 }else
2612
shanehe2aa9d72009-11-06 17:20:17 +00002613 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002614 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002615 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002616 ||
shanehe2aa9d72009-11-06 17:20:17 +00002617 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002618 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002619 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002620 ||
shanehe2aa9d72009-11-06 17:20:17 +00002621 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002622 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002623 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002624 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002625 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002626 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002627 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002628 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002629 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002630 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002631 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002632 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002633 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002634 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002635 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002636 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002637 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002638 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002639 }else {
shane9bd1b442009-10-23 01:27:39 +00002640 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002641 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002642 rc = 1;
drh75897232000-05-29 14:26:00 +00002643 }
2644 }else
2645
shanehe2aa9d72009-11-06 17:20:17 +00002646 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2647 int n2 = strlen30(azArg[1]);
2648 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2649 p->mode = MODE_Insert;
2650 set_table_name(p, azArg[2]);
2651 }else {
2652 fprintf(stderr, "Error: invalid arguments: "
2653 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2654 rc = 1;
2655 }
2656 }else
2657
persicom7e2dfdd2002-04-18 02:46:52 +00002658 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002659 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2660 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002661 }else
2662
drh05782482013-10-24 15:20:20 +00002663 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2664 sqlite3 *savedDb = p->db;
2665 const char *zSavedFilename = p->zDbFilename;
2666 char *zNewFilename = 0;
2667 p->db = 0;
2668 if( nArg>=2 ){
2669 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2670 }
2671 open_db(p, 1);
2672 if( p->db!=0 ){
2673 sqlite3_close(savedDb);
2674 sqlite3_free(p->zFreeOnClose);
2675 p->zFreeOnClose = zNewFilename;
2676 }else{
2677 sqlite3_free(zNewFilename);
2678 p->db = savedDb;
2679 p->zDbFilename = zSavedFilename;
2680 }
2681 }else
2682
drh75897232000-05-29 14:26:00 +00002683 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002684 if( p->outfile[0]=='|' ){
2685 pclose(p->out);
2686 }else{
2687 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002688 }
drh42f64e52012-04-04 16:56:23 +00002689 p->outfile[0] = 0;
2690 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002691 p->out = popen(&azArg[1][1], "w");
2692 if( p->out==0 ){
2693 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2694 p->out = stdout;
2695 rc = 1;
2696 }else{
2697 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2698 }
drh75897232000-05-29 14:26:00 +00002699 }else{
drh42f64e52012-04-04 16:56:23 +00002700 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002701 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002702 if( strcmp(azArg[1],"off")!=0 ){
2703 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2704 }
drh75897232000-05-29 14:26:00 +00002705 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002706 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002707 } else {
drh42f64e52012-04-04 16:56:23 +00002708 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002709 }
2710 }
2711 }else
2712
drh078b1fd2012-09-21 13:40:02 +00002713 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2714 int i;
2715 for(i=1; i<nArg; i++){
2716 if( i>1 ) fprintf(p->out, " ");
2717 fprintf(p->out, "%s", azArg[i]);
2718 }
2719 fprintf(p->out, "\n");
2720 }else
2721
drhdd45df82002-04-18 12:39:03 +00002722 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002723 if( nArg >= 2) {
2724 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2725 }
2726 if( nArg >= 3) {
2727 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2728 }
2729 }else
2730
shanehe2aa9d72009-11-06 17:20:17 +00002731 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002732 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002733 }else
2734
drh9ff849f2009-02-04 20:55:57 +00002735 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002736 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002737 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002738 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2739 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002740 }else{
shane9bd1b442009-10-23 01:27:39 +00002741 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002742 fclose(alt);
2743 }
2744 }else
2745
shanehe2aa9d72009-11-06 17:20:17 +00002746 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002747 const char *zSrcFile;
2748 const char *zDb;
2749 sqlite3 *pSrc;
2750 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002751 int nTimeout = 0;
2752
drh9ff849f2009-02-04 20:55:57 +00002753 if( nArg==2 ){
2754 zSrcFile = azArg[1];
2755 zDb = "main";
2756 }else{
2757 zSrcFile = azArg[2];
2758 zDb = azArg[1];
2759 }
2760 rc = sqlite3_open(zSrcFile, &pSrc);
2761 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002762 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002763 sqlite3_close(pSrc);
2764 return 1;
2765 }
drh05782482013-10-24 15:20:20 +00002766 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002767 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2768 if( pBackup==0 ){
2769 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2770 sqlite3_close(pSrc);
2771 return 1;
2772 }
drhdc2c4912009-02-04 22:46:47 +00002773 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2774 || rc==SQLITE_BUSY ){
2775 if( rc==SQLITE_BUSY ){
2776 if( nTimeout++ >= 3 ) break;
2777 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002778 }
2779 }
2780 sqlite3_backup_finish(pBackup);
2781 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002782 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002783 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002784 fprintf(stderr, "Error: source database is busy\n");
2785 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002786 }else{
2787 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002788 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002789 }
2790 sqlite3_close(pSrc);
2791 }else
2792
shanehe2aa9d72009-11-06 17:20:17 +00002793 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002794 struct callback_data data;
2795 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002796 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002797 memcpy(&data, p, sizeof(data));
2798 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002799 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002800 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002801 int i;
drhf0693c82011-10-11 20:41:54 +00002802 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002803 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002804 char *new_argv[2], *new_colv[2];
2805 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2806 " type text,\n"
2807 " name text,\n"
2808 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002809 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002810 " sql text\n"
2811 ")";
2812 new_argv[1] = 0;
2813 new_colv[0] = "sql";
2814 new_colv[1] = 0;
2815 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002816 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002817 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002818 char *new_argv[2], *new_colv[2];
2819 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2820 " type text,\n"
2821 " name text,\n"
2822 " tbl_name text,\n"
2823 " rootpage integer,\n"
2824 " sql text\n"
2825 ")";
2826 new_argv[1] = 0;
2827 new_colv[0] = "sql";
2828 new_colv[1] = 0;
2829 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002830 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002831 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002832 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002833 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002834 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002835 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002836 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002837 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002838 "WHERE lower(tbl_name) LIKE shellstatic()"
2839 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002840 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002841 callback, &data, &zErrMsg);
2842 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002843 }
drh75897232000-05-29 14:26:00 +00002844 }else{
shane9bd1b442009-10-23 01:27:39 +00002845 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002846 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002847 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002848 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002849 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002850 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002851 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002852 callback, &data, &zErrMsg
2853 );
drh75897232000-05-29 14:26:00 +00002854 }
drh75897232000-05-29 14:26:00 +00002855 if( zErrMsg ){
2856 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002857 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002858 rc = 1;
2859 }else if( rc != SQLITE_OK ){
2860 fprintf(stderr,"Error: querying schema information\n");
2861 rc = 1;
2862 }else{
2863 rc = 0;
drh75897232000-05-29 14:26:00 +00002864 }
2865 }else
2866
drh340f5822013-06-27 13:01:21 +00002867#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002868 /* Undocumented commands for internal testing. Subject to change
2869 ** without notice. */
2870 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2871 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2872 int i, v;
2873 for(i=1; i<nArg; i++){
2874 v = booleanValue(azArg[i]);
2875 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2876 }
2877 }
2878 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2879 int i; sqlite3_int64 v;
2880 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002881 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002882 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002883 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2884 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002885 }
2886 }
2887 }else
drh340f5822013-06-27 13:01:21 +00002888#endif
drh348d19c2013-06-03 12:47:43 +00002889
drh75897232000-05-29 14:26:00 +00002890 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002891 sqlite3_snprintf(sizeof(p->separator), p->separator,
2892 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002893 }else
2894
shanehe2aa9d72009-11-06 17:20:17 +00002895 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002896 int i;
2897 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00002898 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002899 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002900 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002901 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002902 fprintf(p->out,"%9.9s: ", "nullvalue");
2903 output_c_string(p->out, p->nullvalue);
2904 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002905 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002906 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002907 fprintf(p->out,"%9.9s: ", "separator");
2908 output_c_string(p->out, p->separator);
2909 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002910 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002911 fprintf(p->out,"%9.9s: ","width");
2912 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002913 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002914 }
drhfeac5f82004-08-01 00:10:45 +00002915 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002916 }else
2917
shaneh642d8b82010-07-28 16:05:34 +00002918 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2919 p->statsOn = booleanValue(azArg[1]);
2920 }else
2921
shanehe2aa9d72009-11-06 17:20:17 +00002922 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002923 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002924 char **azResult;
drh98781232012-04-23 12:38:05 +00002925 int nRow, nAlloc;
2926 char *zSql = 0;
2927 int ii;
drh05782482013-10-24 15:20:20 +00002928 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002929 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2930 if( rc ) return rc;
2931 zSql = sqlite3_mprintf(
2932 "SELECT name FROM sqlite_master"
2933 " WHERE type IN ('table','view')"
2934 " AND name NOT LIKE 'sqlite_%%'"
2935 " AND name LIKE ?1");
2936 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2937 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2938 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2939 if( strcmp(zDbName,"temp")==0 ){
2940 zSql = sqlite3_mprintf(
2941 "%z UNION ALL "
2942 "SELECT 'temp.' || name FROM sqlite_temp_master"
2943 " WHERE type IN ('table','view')"
2944 " AND name NOT LIKE 'sqlite_%%'"
2945 " AND name LIKE ?1", zSql);
2946 }else{
2947 zSql = sqlite3_mprintf(
2948 "%z UNION ALL "
2949 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2950 " WHERE type IN ('table','view')"
2951 " AND name NOT LIKE 'sqlite_%%'"
2952 " AND name LIKE ?1", zSql, zDbName, zDbName);
2953 }
drha50da102000-08-08 20:19:09 +00002954 }
drh98781232012-04-23 12:38:05 +00002955 sqlite3_finalize(pStmt);
2956 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2957 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2958 sqlite3_free(zSql);
2959 if( rc ) return rc;
2960 nRow = nAlloc = 0;
2961 azResult = 0;
2962 if( nArg>1 ){
2963 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002964 }else{
drh98781232012-04-23 12:38:05 +00002965 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2966 }
2967 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2968 if( nRow>=nAlloc ){
2969 char **azNew;
2970 int n = nAlloc*2 + 10;
2971 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2972 if( azNew==0 ){
2973 fprintf(stderr, "Error: out of memory\n");
2974 break;
2975 }
2976 nAlloc = n;
2977 azResult = azNew;
2978 }
2979 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2980 if( azResult[nRow] ) nRow++;
2981 }
2982 sqlite3_finalize(pStmt);
2983 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002984 int len, maxlen = 0;
2985 int i, j;
2986 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002987 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002988 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002989 if( len>maxlen ) maxlen = len;
2990 }
2991 nPrintCol = 80/(maxlen+2);
2992 if( nPrintCol<1 ) nPrintCol = 1;
2993 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2994 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002995 for(j=i; j<nRow; j+=nPrintRow){
2996 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002997 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002998 }
drh151b7d52013-05-06 20:28:54 +00002999 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003000 }
3001 }
drh98781232012-04-23 12:38:05 +00003002 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3003 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003004 }else
3005
shaneh96887e12011-02-10 21:08:58 +00003006 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003007 static const struct {
3008 const char *zCtrlName; /* Name of a test-control option */
3009 int ctrlCode; /* Integer code for that option */
3010 } aCtrl[] = {
3011 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3012 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3013 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3014 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3015 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3016 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3017 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3018 { "assert", SQLITE_TESTCTRL_ASSERT },
3019 { "always", SQLITE_TESTCTRL_ALWAYS },
3020 { "reserve", SQLITE_TESTCTRL_RESERVE },
3021 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3022 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003023 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
3024 };
shaneh96887e12011-02-10 21:08:58 +00003025 int testctrl = -1;
3026 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003027 int i, n;
drh05782482013-10-24 15:20:20 +00003028 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003029
drhd416fe72011-03-17 16:45:50 +00003030 /* convert testctrl text option to value. allow any unique prefix
3031 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003032 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003033 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003034 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3035 if( testctrl<0 ){
3036 testctrl = aCtrl[i].ctrlCode;
3037 }else{
drhb07028f2011-10-14 21:49:18 +00003038 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003039 testctrl = -1;
3040 break;
3041 }
3042 }
3043 }
drh348d19c2013-06-03 12:47:43 +00003044 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003045 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3046 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3047 }else{
3048 switch(testctrl){
3049
3050 /* sqlite3_test_control(int, db, int) */
3051 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3052 case SQLITE_TESTCTRL_RESERVE:
3053 if( nArg==3 ){
3054 int opt = (int)strtol(azArg[2], 0, 0);
3055 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003056 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003057 } else {
drhd416fe72011-03-17 16:45:50 +00003058 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3059 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003060 }
3061 break;
3062
3063 /* sqlite3_test_control(int) */
3064 case SQLITE_TESTCTRL_PRNG_SAVE:
3065 case SQLITE_TESTCTRL_PRNG_RESTORE:
3066 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003067 if( nArg==2 ){
3068 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003069 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003070 } else {
3071 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3072 }
3073 break;
3074
3075 /* sqlite3_test_control(int, uint) */
3076 case SQLITE_TESTCTRL_PENDING_BYTE:
3077 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003078 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003079 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003080 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003081 } else {
drhd416fe72011-03-17 16:45:50 +00003082 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3083 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003084 }
3085 break;
3086
3087 /* sqlite3_test_control(int, int) */
3088 case SQLITE_TESTCTRL_ASSERT:
3089 case SQLITE_TESTCTRL_ALWAYS:
3090 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003091 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003092 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003093 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003094 } else {
drhd416fe72011-03-17 16:45:50 +00003095 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3096 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003097 }
3098 break;
3099
3100 /* sqlite3_test_control(int, char *) */
3101#ifdef SQLITE_N_KEYWORD
3102 case SQLITE_TESTCTRL_ISKEYWORD:
3103 if( nArg==3 ){
3104 const char *opt = azArg[2];
3105 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003106 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003107 } else {
drhd416fe72011-03-17 16:45:50 +00003108 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3109 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003110 }
3111 break;
3112#endif
3113
3114 case SQLITE_TESTCTRL_BITVEC_TEST:
3115 case SQLITE_TESTCTRL_FAULT_INSTALL:
3116 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3117 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3118 default:
drhd416fe72011-03-17 16:45:50 +00003119 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3120 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003121 break;
3122 }
3123 }
3124 }else
3125
shanehe2aa9d72009-11-06 17:20:17 +00003126 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003127 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003128 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003129 }else
3130
drhd416fe72011-03-17 16:45:50 +00003131 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3132 && nArg==2
3133 ){
drh3b1a9882007-11-02 12:53:03 +00003134 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003135 }else
3136
drh42f64e52012-04-04 16:56:23 +00003137 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003138 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003139 output_file_close(p->traceOut);
3140 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003141#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003142 if( p->traceOut==0 ){
3143 sqlite3_trace(p->db, 0, 0);
3144 }else{
3145 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3146 }
3147#endif
3148 }else
3149
drh9fd301b2011-06-03 13:28:22 +00003150 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003151 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003152 sqlite3_libversion(), sqlite3_sourceid());
3153 }else
3154
drhde60fc22011-12-14 17:53:36 +00003155 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3156 const char *zDbName = nArg==2 ? azArg[1] : "main";
3157 char *zVfsName = 0;
3158 if( p->db ){
3159 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3160 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003161 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003162 sqlite3_free(zVfsName);
3163 }
3164 }
3165 }else
3166
drhcef4fc82012-09-21 22:50:45 +00003167#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3168 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3169 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003170 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003171 }else
3172#endif
3173
shanehe2aa9d72009-11-06 17:20:17 +00003174 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003175 int j;
drh43617e92006-03-06 20:55:46 +00003176 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003177 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003178 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003179 }
3180 }else
3181
3182 {
shane9bd1b442009-10-23 01:27:39 +00003183 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003184 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003185 rc = 1;
drh75897232000-05-29 14:26:00 +00003186 }
drh67505e72002-04-19 12:34:06 +00003187
3188 return rc;
drh75897232000-05-29 14:26:00 +00003189}
3190
drh67505e72002-04-19 12:34:06 +00003191/*
drh91a66392007-09-07 01:12:32 +00003192** Return TRUE if a semicolon occurs anywhere in the first N characters
3193** of string z[].
drh324ccef2003-02-05 14:06:20 +00003194*/
drh9f099fd2013-08-06 14:01:46 +00003195static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003196 int i;
3197 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3198 return 0;
drh324ccef2003-02-05 14:06:20 +00003199}
3200
3201/*
drh70c7a4b2003-04-26 03:03:06 +00003202** Test to see if a line consists entirely of whitespace.
3203*/
3204static int _all_whitespace(const char *z){
3205 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003206 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003207 if( *z=='/' && z[1]=='*' ){
3208 z += 2;
3209 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3210 if( *z==0 ) return 0;
3211 z++;
3212 continue;
3213 }
3214 if( *z=='-' && z[1]=='-' ){
3215 z += 2;
3216 while( *z && *z!='\n' ){ z++; }
3217 if( *z==0 ) return 1;
3218 continue;
3219 }
3220 return 0;
3221 }
3222 return 1;
3223}
3224
3225/*
drha9b17162003-04-29 18:01:28 +00003226** Return TRUE if the line typed in is an SQL command terminator other
3227** than a semi-colon. The SQL Server style "go" command is understood
3228** as is the Oracle "/".
3229*/
drh9f099fd2013-08-06 14:01:46 +00003230static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003231 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003232 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3233 return 1; /* Oracle */
3234 }
drhf0693c82011-10-11 20:41:54 +00003235 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003236 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003237 return 1; /* SQL Server */
3238 }
3239 return 0;
3240}
3241
3242/*
drh233a5312008-12-18 22:25:13 +00003243** Return true if zSql is a complete SQL statement. Return false if it
3244** ends in the middle of a string literal or C-style comment.
3245*/
drh9f099fd2013-08-06 14:01:46 +00003246static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003247 int rc;
3248 if( zSql==0 ) return 1;
3249 zSql[nSql] = ';';
3250 zSql[nSql+1] = 0;
3251 rc = sqlite3_complete(zSql);
3252 zSql[nSql] = 0;
3253 return rc;
3254}
3255
3256/*
drh67505e72002-04-19 12:34:06 +00003257** Read input from *in and process it. If *in==0 then input
3258** is interactive - the user is typing it it. Otherwise, input
3259** is coming from a file or device. A prompt is issued and history
3260** is saved only if input is interactive. An interrupt signal will
3261** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003262**
3263** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003264*/
drhc28490c2006-10-26 14:25:58 +00003265static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003266 char *zLine = 0; /* A single input line */
3267 char *zSql = 0; /* Accumulated SQL text */
3268 int nLine; /* Length of current line */
3269 int nSql = 0; /* Bytes of zSql[] used */
3270 int nAlloc = 0; /* Allocated zSql[] space */
3271 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3272 char *zErrMsg; /* Error message returned */
3273 int rc; /* Error code */
3274 int errCnt = 0; /* Number of errors seen */
3275 int lineno = 0; /* Current line number */
3276 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003277
3278 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3279 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003280 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003281 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003282 /* End of input */
3283 if( stdin_is_interactive ) printf("\n");
3284 break;
drhc49f44e2006-10-26 18:15:42 +00003285 }
drh67505e72002-04-19 12:34:06 +00003286 if( seenInterrupt ){
3287 if( in!=0 ) break;
3288 seenInterrupt = 0;
3289 }
drhc28490c2006-10-26 14:25:58 +00003290 lineno++;
drh849a9d92013-12-21 15:46:06 +00003291 if( nSql==0 && _all_whitespace(zLine) ){
3292 if( p->echoOn ) printf("%s\n", zLine);
3293 continue;
3294 }
drh2af0b2d2002-02-21 02:25:02 +00003295 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003296 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003297 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003298 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003299 break;
3300 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003301 errCnt++;
3302 }
drhdaffd0e2001-04-11 14:28:42 +00003303 continue;
3304 }
drh9f099fd2013-08-06 14:01:46 +00003305 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003306 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003307 }
drh9f099fd2013-08-06 14:01:46 +00003308 nLine = strlen30(zLine);
3309 if( nSql+nLine+2>=nAlloc ){
3310 nAlloc = nSql+nLine+100;
3311 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003312 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003313 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003314 exit(1);
3315 }
drhdaffd0e2001-04-11 14:28:42 +00003316 }
drh9f099fd2013-08-06 14:01:46 +00003317 nSqlPrior = nSql;
3318 if( nSql==0 ){
3319 int i;
3320 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003321 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003322 memcpy(zSql, zLine+i, nLine+1-i);
3323 startline = lineno;
3324 nSql = nLine-i;
3325 }else{
3326 zSql[nSql++] = '\n';
3327 memcpy(zSql+nSql, zLine, nLine+1);
3328 nSql += nLine;
3329 }
3330 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003331 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003332 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003333 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003334 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003335 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003336 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003337 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003338 char zPrefix[100];
3339 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003340 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003341 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003342 }else{
shane9bd1b442009-10-23 01:27:39 +00003343 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003344 }
drh7f953e22002-07-13 17:33:45 +00003345 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003346 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003347 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003348 zErrMsg = 0;
3349 }else{
shaned2bed1c2009-10-21 03:56:54 +00003350 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003351 }
drhc49f44e2006-10-26 18:15:42 +00003352 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003353 }
drhdaffd0e2001-04-11 14:28:42 +00003354 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003355 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003356 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003357 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003358 }
3359 }
drh9f099fd2013-08-06 14:01:46 +00003360 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003361 if( !_all_whitespace(zSql) ){
3362 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3363 }
drhdaffd0e2001-04-11 14:28:42 +00003364 free(zSql);
3365 }
danielk19772ac27622007-07-03 05:31:16 +00003366 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003367 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003368}
3369
drh67505e72002-04-19 12:34:06 +00003370/*
3371** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003372** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003373*/
3374static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003375 static char *home_dir = NULL;
3376 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003377
drh83905c92012-06-21 13:00:37 +00003378#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003379 {
3380 struct passwd *pwent;
3381 uid_t uid = getuid();
3382 if( (pwent=getpwuid(uid)) != NULL) {
3383 home_dir = pwent->pw_dir;
3384 }
drh67505e72002-04-19 12:34:06 +00003385 }
3386#endif
3387
chw65d3c132007-11-12 21:09:10 +00003388#if defined(_WIN32_WCE)
3389 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3390 */
drh85e72432012-04-11 11:38:53 +00003391 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003392#else
3393
drh83905c92012-06-21 13:00:37 +00003394#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003395 if (!home_dir) {
3396 home_dir = getenv("USERPROFILE");
3397 }
3398#endif
3399
drh67505e72002-04-19 12:34:06 +00003400 if (!home_dir) {
3401 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003402 }
3403
drh83905c92012-06-21 13:00:37 +00003404#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003405 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003406 char *zDrive, *zPath;
3407 int n;
3408 zDrive = getenv("HOMEDRIVE");
3409 zPath = getenv("HOMEPATH");
3410 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003411 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003412 home_dir = malloc( n );
3413 if( home_dir==0 ) return 0;
3414 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3415 return home_dir;
3416 }
3417 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003418 }
3419#endif
3420
chw65d3c132007-11-12 21:09:10 +00003421#endif /* !_WIN32_WCE */
3422
drh67505e72002-04-19 12:34:06 +00003423 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003424 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003425 char *z = malloc( n );
3426 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003427 home_dir = z;
3428 }
drhe98d4fa2002-04-21 19:06:22 +00003429
drh67505e72002-04-19 12:34:06 +00003430 return home_dir;
3431}
3432
3433/*
3434** Read input from the file given by sqliterc_override. Or if that
3435** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003436**
3437** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003438*/
shane9bd1b442009-10-23 01:27:39 +00003439static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003440 struct callback_data *p, /* Configuration data */
3441 const char *sqliterc_override /* Name of config file. NULL to use default */
3442){
persicom7e2dfdd2002-04-18 02:46:52 +00003443 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003444 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003445 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003446 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003447 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003448
3449 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003450 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003451 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003452#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003453 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003454#endif
shane9bd1b442009-10-23 01:27:39 +00003455 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003456 }
drh2f3de322012-06-27 16:41:31 +00003457 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003458 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3459 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003460 }
drha1f9b5e2004-02-14 16:31:02 +00003461 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003462 if( in ){
drhc28490c2006-10-26 14:25:58 +00003463 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003464 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003465 }
shane9bd1b442009-10-23 01:27:39 +00003466 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003467 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003468 }
drh85e72432012-04-11 11:38:53 +00003469 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003470 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003471}
3472
drh67505e72002-04-19 12:34:06 +00003473/*
drhe1e38c42003-05-04 18:30:59 +00003474** Show available command line options
3475*/
3476static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003477 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003478 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003479 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003480 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003481 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003482 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003483 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003484 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003485#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3486 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3487#endif
drhcc3b4f82012-02-07 14:13:50 +00003488 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003489 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003490 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003491 " -line set output mode to 'line'\n"
3492 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003493 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003494#ifdef SQLITE_ENABLE_MULTIPLEX
3495 " -multiplex enable the multiplexor VFS\n"
3496#endif
drh98d312f2012-10-25 15:23:14 +00003497 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3498 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003499 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003500 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003501 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003502#ifdef SQLITE_ENABLE_VFSTRACE
3503 " -vfstrace enable tracing of all VFS calls\n"
3504#endif
drhe1e38c42003-05-04 18:30:59 +00003505;
3506static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003507 fprintf(stderr,
3508 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3509 "FILENAME is the name of an SQLite database. A new database is created\n"
3510 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003511 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003512 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003513 }else{
3514 fprintf(stderr, "Use the -help option for additional information\n");
3515 }
3516 exit(1);
3517}
3518
3519/*
drh67505e72002-04-19 12:34:06 +00003520** Initialize the state information in data
3521*/
drh0850b532006-01-31 19:31:43 +00003522static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003523 memset(data, 0, sizeof(*data));
3524 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003525 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003526 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003527 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003528 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003529 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3530 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003531 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003532}
3533
drh98d312f2012-10-25 15:23:14 +00003534/*
drh5c7976f2014-02-10 19:59:27 +00003535** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003536*/
3537#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003538static void printBold(const char *zText){
3539 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3540 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3541 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3542 SetConsoleTextAttribute(out,
3543 FOREGROUND_RED|FOREGROUND_INTENSITY
3544 );
3545 printf("%s", zText);
3546 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003547}
3548#else
drh5c7976f2014-02-10 19:59:27 +00003549static void printBold(const char *zText){
3550 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003551}
3552#endif
3553
3554/*
drh98d312f2012-10-25 15:23:14 +00003555** Get the argument to an --option. Throw an error and die if no argument
3556** is available.
3557*/
3558static char *cmdline_option_value(int argc, char **argv, int i){
3559 if( i==argc ){
3560 fprintf(stderr, "%s: Error: missing argument to %s\n",
3561 argv[0], argv[argc-1]);
3562 exit(1);
3563 }
3564 return argv[i];
3565}
3566
drh75897232000-05-29 14:26:00 +00003567int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003568 char *zErrMsg = 0;
3569 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003570 const char *zInitFile = 0;
3571 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003572 int i;
drhc28490c2006-10-26 14:25:58 +00003573 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003574 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003575
drh69b30ab2014-02-27 15:11:52 +00003576#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003577 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3578 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3579 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3580 exit(1);
3581 }
drhc7181902014-02-27 15:04:13 +00003582#endif
drhdaffd0e2001-04-11 14:28:42 +00003583 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003584 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003585 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003586
drh44c2eb12003-04-30 11:38:26 +00003587 /* Make sure we have a valid signal handler early, before anything
3588 ** else is done.
3589 */
drh4c504392000-10-16 22:06:40 +00003590#ifdef SIGINT
3591 signal(SIGINT, interrupt_handler);
3592#endif
drh44c2eb12003-04-30 11:38:26 +00003593
drh22fbcb82004-02-01 01:22:50 +00003594 /* Do an initial pass through the command-line argument to locate
3595 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003596 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003597 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003598 */
drh98d312f2012-10-25 15:23:14 +00003599 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003600 char *z;
drhc28490c2006-10-26 14:25:58 +00003601 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003602 if( z[0]!='-' ){
3603 if( data.zDbFilename==0 ){
3604 data.zDbFilename = z;
3605 continue;
3606 }
3607 if( zFirstCmd==0 ){
3608 zFirstCmd = z;
3609 continue;
3610 }
3611 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3612 fprintf(stderr,"Use -help for a list of options.\n");
3613 return 1;
3614 }
drhcc3b4f82012-02-07 14:13:50 +00003615 if( z[1]=='-' ) z++;
3616 if( strcmp(z,"-separator")==0
3617 || strcmp(z,"-nullvalue")==0
3618 || strcmp(z,"-cmd")==0
3619 ){
drh98d312f2012-10-25 15:23:14 +00003620 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003621 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003622 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003623 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003624 /* Need to check for batch mode here to so we can avoid printing
3625 ** informational messages (like from process_sqliterc) before
3626 ** we do the actual processing of arguments later in a second pass.
3627 */
shanef69573d2009-10-24 02:06:14 +00003628 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003629 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003630#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003631 const char *zSize;
3632 sqlite3_int64 szHeap;
3633
drh98d312f2012-10-25 15:23:14 +00003634 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003635 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003636 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003637 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3638#endif
drh97ae8ff2011-03-16 16:56:29 +00003639#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003640 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003641 extern int vfstrace_register(
3642 const char *zTraceName,
3643 const char *zOldVfsName,
3644 int (*xOut)(const char*,void*),
3645 void *pOutArg,
3646 int makeDefault
3647 );
drh2b625e22011-03-16 17:05:28 +00003648 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003649#endif
drh6f25e892011-07-08 17:02:57 +00003650#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003651 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003652 extern int sqlite3_multiple_initialize(const char*,int);
3653 sqlite3_multiplex_initialize(0, 1);
3654#endif
drh7d9f3942013-04-03 01:26:54 +00003655 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003656 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3657 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003658 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003659 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003660 if( pVfs ){
3661 sqlite3_vfs_register(pVfs, 1);
3662 }else{
3663 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3664 exit(1);
3665 }
drh44c2eb12003-04-30 11:38:26 +00003666 }
3667 }
drh98d312f2012-10-25 15:23:14 +00003668 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003669#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003670 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003671 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003672#else
shane86f5bdb2009-10-24 02:00:07 +00003673 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3674 return 1;
drh01b41712005-08-29 23:06:23 +00003675#endif
drhc7181902014-02-27 15:04:13 +00003676#ifdef SQLITE_SHELL_DBNAME_PROC
3677 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3678 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3679 warnInmemoryDb = 0; }
3680#endif
drh98d312f2012-10-25 15:23:14 +00003681 }
3682 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003683
drh44c2eb12003-04-30 11:38:26 +00003684 /* Go ahead and open the database file if it already exists. If the
3685 ** file does not exist, delay opening it. This prevents empty database
3686 ** files from being created if a user mistypes the database name argument
3687 ** to the sqlite command-line tool.
3688 */
drhc8d74412004-08-31 23:41:26 +00003689 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003690 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003691 }
3692
drh22fbcb82004-02-01 01:22:50 +00003693 /* Process the initialization file if there is one. If no -init option
3694 ** is given on the command line, look for a file named ~/.sqliterc and
3695 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003696 */
shane86f5bdb2009-10-24 02:00:07 +00003697 rc = process_sqliterc(&data,zInitFile);
3698 if( rc>0 ){
3699 return rc;
3700 }
drh44c2eb12003-04-30 11:38:26 +00003701
drh22fbcb82004-02-01 01:22:50 +00003702 /* Make a second pass through the command-line argument and set
3703 ** options. This second pass is delayed until after the initialization
3704 ** file is processed so that the command-line arguments will override
3705 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003706 */
drh98d312f2012-10-25 15:23:14 +00003707 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003708 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003709 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003710 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003711 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003712 i++;
3713 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003714 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003715 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003716 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003717 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003718 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003719 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003720 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003721 }else if( strcmp(z,"-csv")==0 ){
3722 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003723 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003724 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003725 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003726 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003727 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003728 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003729 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003730 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003731 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003732 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003733 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003734 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003735 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00003736 }else if( strcmp(z,"-eqp")==0 ){
3737 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00003738 }else if( strcmp(z,"-stats")==0 ){
3739 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003740 }else if( strcmp(z,"-bail")==0 ){
3741 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003742 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003743 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003744 return 0;
drhc28490c2006-10-26 14:25:58 +00003745 }else if( strcmp(z,"-interactive")==0 ){
3746 stdin_is_interactive = 1;
3747 }else if( strcmp(z,"-batch")==0 ){
3748 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003749 }else if( strcmp(z,"-heap")==0 ){
3750 i++;
drh7d9f3942013-04-03 01:26:54 +00003751 }else if( strcmp(z,"-mmap")==0 ){
3752 i++;
drha7e61d82011-03-12 17:02:57 +00003753 }else if( strcmp(z,"-vfs")==0 ){
3754 i++;
drh6f25e892011-07-08 17:02:57 +00003755#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003756 }else if( strcmp(z,"-vfstrace")==0 ){
3757 i++;
drh6f25e892011-07-08 17:02:57 +00003758#endif
3759#ifdef SQLITE_ENABLE_MULTIPLEX
3760 }else if( strcmp(z,"-multiplex")==0 ){
3761 i++;
3762#endif
drhcc3b4f82012-02-07 14:13:50 +00003763 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003764 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003765 }else if( strcmp(z,"-cmd")==0 ){
3766 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003767 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003768 if( z[0]=='.' ){
3769 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003770 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003771 }else{
drh05782482013-10-24 15:20:20 +00003772 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003773 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3774 if( zErrMsg!=0 ){
3775 fprintf(stderr,"Error: %s\n", zErrMsg);
3776 if( bail_on_error ) return rc!=0 ? rc : 1;
3777 }else if( rc!=0 ){
3778 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3779 if( bail_on_error ) return rc;
3780 }
3781 }
drh1e5d0e92000-05-31 23:33:17 +00003782 }else{
shane86f5bdb2009-10-24 02:00:07 +00003783 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003784 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003785 return 1;
3786 }
3787 }
drh44c2eb12003-04-30 11:38:26 +00003788
drh22fbcb82004-02-01 01:22:50 +00003789 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003790 /* Run just the command that follows the database name
3791 */
drh22fbcb82004-02-01 01:22:50 +00003792 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003793 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003794 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003795 }else{
drh05782482013-10-24 15:20:20 +00003796 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003797 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003798 if( zErrMsg!=0 ){
3799 fprintf(stderr,"Error: %s\n", zErrMsg);
3800 return rc!=0 ? rc : 1;
3801 }else if( rc!=0 ){
3802 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3803 return rc;
drh6ff13852001-11-25 13:18:23 +00003804 }
drh75897232000-05-29 14:26:00 +00003805 }
3806 }else{
drh44c2eb12003-04-30 11:38:26 +00003807 /* Run commands received from standard input
3808 */
drhc28490c2006-10-26 14:25:58 +00003809 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003810 char *zHome;
3811 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003812 int nHistory;
drh75897232000-05-29 14:26:00 +00003813 printf(
drh743e0032011-12-12 16:51:50 +00003814 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003815 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003816 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003817 );
drhb3735912014-02-10 16:13:42 +00003818 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003819 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00003820 printBold("transient in-memory database");
3821 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003822 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003823 }
drh67505e72002-04-19 12:34:06 +00003824 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003825 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003826 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003827 if( (zHistory = malloc(nHistory))!=0 ){
3828 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3829 }
drh67505e72002-04-19 12:34:06 +00003830 }
drhaaa21b42014-02-11 14:37:51 +00003831#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003832 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003833#endif
drhc28490c2006-10-26 14:25:58 +00003834 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003835 if( zHistory ){
3836 stifle_history(100);
3837 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003838 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003839 }
drhdaffd0e2001-04-11 14:28:42 +00003840 }else{
drhc28490c2006-10-26 14:25:58 +00003841 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003842 }
3843 }
drh33048c02001-10-01 14:29:22 +00003844 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003845 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003846 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003847 }
drh05782482013-10-24 15:20:20 +00003848 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003849 return rc;
drh75897232000-05-29 14:26:00 +00003850}