blob: 2cff102e91c506a03599256e4430f444484ddbf0 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000068#ifndef access
69# define access(f,m) _access((f),(m))
70#endif
drh67ceaa62012-08-27 21:19:03 +000071#undef popen
drh53371f92013-07-25 17:07:03 +000072#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000073#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000074#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000075#else
drh4328c8b2003-04-26 02:50:11 +000076/* Make sure isatty() has a prototype.
77*/
drhb2acc3b2011-10-13 16:36:29 +000078extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000079
drh53371f92013-07-25 17:07:03 +000080/* popen and pclose are not C89 functions and so are sometimes omitted from
81** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000082extern FILE *popen(const char*,const char*);
83extern int pclose(FILE*);
84#endif
drh53371f92013-07-25 17:07:03 +000085
chw65d3c132007-11-12 21:09:10 +000086#if defined(_WIN32_WCE)
87/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
88 * thus we always assume that we have a console. That can be
89 * overridden with the -batch command line option.
90 */
91#define isatty(x) 1
92#endif
93
drhf0693c82011-10-11 20:41:54 +000094/* ctype macros that work with signed characters */
95#define IsSpace(X) isspace((unsigned char)X)
96#define IsDigit(X) isdigit((unsigned char)X)
97#define ToLower(X) (char)tolower((unsigned char)X)
98
drh43408312013-10-30 12:43:36 +000099
100/* True if the timer is enabled */
101static int enableTimer = 0;
102
103/* Return the current wall-clock time */
104static sqlite3_int64 timeOfDay(void){
105 static sqlite3_vfs *clockVfs = 0;
106 sqlite3_int64 t;
107 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
108 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
109 clockVfs->xCurrentTimeInt64(clockVfs, &t);
110 }else{
111 double r;
112 clockVfs->xCurrentTime(clockVfs, &r);
113 t = (sqlite3_int64)(r*86400000.0);
114 }
115 return t;
116}
117
drhd5d0f642013-02-20 00:54:21 +0000118#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
119 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000120#include <sys/time.h>
121#include <sys/resource.h>
122
drhda108222009-02-25 19:07:24 +0000123/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000124static struct rusage sBegin; /* CPU time at start */
125static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000126
drhda108222009-02-25 19:07:24 +0000127/*
128** Begin timing an operation
129*/
130static void beginTimer(void){
131 if( enableTimer ){
132 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000133 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000134 }
135}
136
137/* Return the difference of two time_structs in seconds */
138static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
139 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
140 (double)(pEnd->tv_sec - pStart->tv_sec);
141}
142
143/*
144** Print the timing results.
145*/
146static void endTimer(void){
147 if( enableTimer ){
148 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000149 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000150 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000151 printf("Run Time: real %.3f user %f sys %f\n",
152 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000153 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
154 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
155 }
156}
shaneb320ccd2009-10-21 03:42:58 +0000157
drhda108222009-02-25 19:07:24 +0000158#define BEGIN_TIMER beginTimer()
159#define END_TIMER endTimer()
160#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000161
162#elif (defined(_WIN32) || defined(WIN32))
163
164#include <windows.h>
165
166/* Saved resource information for the beginning of an operation */
167static HANDLE hProcess;
168static FILETIME ftKernelBegin;
169static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000170static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000171typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
172static GETPROCTIMES getProcessTimesAddr = NULL;
173
shaneb320ccd2009-10-21 03:42:58 +0000174/*
175** Check to see if we have timer support. Return 1 if necessary
176** support found (or found previously).
177*/
178static int hasTimer(void){
179 if( getProcessTimesAddr ){
180 return 1;
181 } else {
182 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
183 ** See if the version we are running on has it, and if it does, save off
184 ** a pointer to it and the current process handle.
185 */
186 hProcess = GetCurrentProcess();
187 if( hProcess ){
188 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
189 if( NULL != hinstLib ){
190 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
191 if( NULL != getProcessTimesAddr ){
192 return 1;
193 }
194 FreeLibrary(hinstLib);
195 }
196 }
197 }
198 return 0;
199}
200
201/*
202** Begin timing an operation
203*/
204static void beginTimer(void){
205 if( enableTimer && getProcessTimesAddr ){
206 FILETIME ftCreation, ftExit;
207 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000208 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000209 }
210}
211
212/* Return the difference of two FILETIME structs in seconds */
213static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
214 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
215 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
216 return (double) ((i64End - i64Start) / 10000000.0);
217}
218
219/*
220** Print the timing results.
221*/
222static void endTimer(void){
223 if( enableTimer && getProcessTimesAddr){
224 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000225 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000226 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000227 printf("Run Time: real %.3f user %f sys %f\n",
228 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000229 timeDiff(&ftUserBegin, &ftUserEnd),
230 timeDiff(&ftKernelBegin, &ftKernelEnd));
231 }
232}
233
234#define BEGIN_TIMER beginTimer()
235#define END_TIMER endTimer()
236#define HAS_TIMER hasTimer()
237
drhda108222009-02-25 19:07:24 +0000238#else
239#define BEGIN_TIMER
240#define END_TIMER
241#define HAS_TIMER 0
242#endif
243
shanec0688ea2009-03-05 03:48:06 +0000244/*
245** Used to prevent warnings about unused parameters
246*/
247#define UNUSED_PARAMETER(x) (void)(x)
248
drhe91d16b2008-12-08 18:27:31 +0000249/*
drhc49f44e2006-10-26 18:15:42 +0000250** If the following flag is set, then command execution stops
251** at an error if we are not interactive.
252*/
253static int bail_on_error = 0;
254
255/*
drhc28490c2006-10-26 14:25:58 +0000256** Threat stdin as an interactive input if the following variable
257** is true. Otherwise, assume stdin is connected to a file or pipe.
258*/
259static int stdin_is_interactive = 1;
260
261/*
drh4c504392000-10-16 22:06:40 +0000262** The following is the open SQLite database. We make a pointer
263** to this database a static variable so that it can be accessed
264** by the SIGINT handler to interrupt database processing.
265*/
danielk197792f9a1b2004-06-19 09:08:16 +0000266static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000267
268/*
drh67505e72002-04-19 12:34:06 +0000269** True if an interrupt (Control-C) has been received.
270*/
drh43617e92006-03-06 20:55:46 +0000271static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000272
273/*
persicom7e2dfdd2002-04-18 02:46:52 +0000274** This is the name of our program. It is set in main(), used
275** in a number of other places, mostly for error messages.
276*/
277static char *Argv0;
278
279/*
280** Prompt strings. Initialized in main. Settable with
281** .prompt main continue
282*/
283static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
284static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
285
drhb0603412007-02-28 04:47:26 +0000286/*
287** Write I/O traces to the following stream.
288*/
rsebe0a9092007-07-30 18:24:38 +0000289#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000290static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000291#endif
drhb0603412007-02-28 04:47:26 +0000292
293/*
294** This routine works like printf in that its first argument is a
295** format string and subsequent arguments are values to be substituted
296** in place of % fields. The result of formatting this string
297** is written to iotrace.
298*/
rsebe0a9092007-07-30 18:24:38 +0000299#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000300static void iotracePrintf(const char *zFormat, ...){
301 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000302 char *z;
drhb0603412007-02-28 04:47:26 +0000303 if( iotrace==0 ) return;
304 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000305 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000306 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000307 fprintf(iotrace, "%s", z);
308 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000309}
rsebe0a9092007-07-30 18:24:38 +0000310#endif
drhb0603412007-02-28 04:47:26 +0000311
drh44c2eb12003-04-30 11:38:26 +0000312
persicom7e2dfdd2002-04-18 02:46:52 +0000313/*
drh83965662003-04-17 02:54:13 +0000314** Determines if a string is a number of not.
315*/
danielk19772e588c72005-12-09 14:25:08 +0000316static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000317 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000318 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000319 return 0;
320 }
321 z++;
322 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000323 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='.' ){
325 z++;
drhf0693c82011-10-11 20:41:54 +0000326 if( !IsDigit(*z) ) return 0;
327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( realnum ) *realnum = 1;
329 }
330 if( *z=='e' || *z=='E' ){
331 z++;
332 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 return *z==0;
338}
drh83965662003-04-17 02:54:13 +0000339
340/*
danielk1977bc6ada42004-06-30 08:20:16 +0000341** A global char* and an SQL function to access its current value
342** from within an SQL statement. This program used to use the
343** sqlite_exec_printf() API to substitue a string into an SQL statement.
344** The correct way to do this with sqlite3 is to use the bind API, but
345** since the shell is built around the callback paradigm it would be a lot
346** of work. Instead just use this hack, which is quite harmless.
347*/
348static const char *zShellStatic = 0;
349static void shellstaticFunc(
350 sqlite3_context *context,
351 int argc,
352 sqlite3_value **argv
353){
354 assert( 0==argc );
355 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000356 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000357 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000358 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
359}
360
361
362/*
drhfeac5f82004-08-01 00:10:45 +0000363** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000364** the text in memory obtained from malloc() and returns a pointer
365** to the text. NULL is returned at end of file, or if malloc()
366** fails.
367**
drh9f099fd2013-08-06 14:01:46 +0000368** If zLine is not NULL then it is a malloced buffer returned from
369** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000370*/
drh9f099fd2013-08-06 14:01:46 +0000371static char *local_getline(char *zLine, FILE *in){
372 int nLine = zLine==0 ? 0 : 100;
373 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000374
drhb07028f2011-10-14 21:49:18 +0000375 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000376 if( n+100>nLine ){
377 nLine = nLine*2 + 100;
378 zLine = realloc(zLine, nLine);
379 if( zLine==0 ) return 0;
380 }
drhdaffd0e2001-04-11 14:28:42 +0000381 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000382 if( n==0 ){
383 free(zLine);
384 return 0;
385 }
386 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000387 break;
388 }
drh9f099fd2013-08-06 14:01:46 +0000389 while( zLine[n] ) n++;
390 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000391 n--;
shaneh13b36022009-12-17 21:07:15 +0000392 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000393 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000394 break;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 }
drh8e7e7a22000-05-30 18:45:23 +0000397 return zLine;
398}
399
400/*
drhc28490c2006-10-26 14:25:58 +0000401** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000402**
drh9f099fd2013-08-06 14:01:46 +0000403** If in==0 then read from standard input and prompt before each line.
404** If isContinuation is true, then a continuation prompt is appropriate.
405** If isContinuation is zero, then the main prompt should be used.
406**
407** If zPrior is not NULL then it is a buffer from a prior call to this
408** routine that can be reused.
409**
410** The result is stored in space obtained from malloc() and must either
411** be freed by the caller or else passed back into this routine via the
412** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000413*/
drh9f099fd2013-08-06 14:01:46 +0000414static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000415 char *zPrompt;
416 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000417 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000418 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000419 }else{
drh9f099fd2013-08-06 14:01:46 +0000420 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000421#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000422 free(zPrior);
423 zResult = readline(zPrompt);
424 if( zResult && *zResult ) add_history(zResult);
425#else
426 printf("%s", zPrompt);
427 fflush(stdout);
428 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000429#endif
drh9f099fd2013-08-06 14:01:46 +0000430 }
drh8e7e7a22000-05-30 18:45:23 +0000431 return zResult;
432}
433
persicom7e2dfdd2002-04-18 02:46:52 +0000434struct previous_mode_data {
435 int valid; /* Is there legit data in here? */
436 int mode;
437 int showHeader;
438 int colWidth[100];
439};
drh45e29d82006-11-20 16:21:10 +0000440
drh8e7e7a22000-05-30 18:45:23 +0000441/*
drh75897232000-05-29 14:26:00 +0000442** An pointer to an instance of this structure is passed from
443** the main program to the callback. This is used to communicate
444** state and mode information.
445*/
446struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000447 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000448 int echoOn; /* True to echo input commands */
drhefbf3b12014-02-28 20:47:24 +0000449 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL statement */
shaneh642d8b82010-07-28 16:05:34 +0000450 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000451 int cnt; /* Number of records displayed so far */
452 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000453 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000454 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000455 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000456 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000457 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000458 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000459 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000460 int colWidth[100]; /* Requested width of each column when in column mode*/
461 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000462 char nullvalue[20]; /* The text to print when a NULL comes back from
463 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000464 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000465 /* Holds the mode information just before
466 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000467 char outfile[FILENAME_MAX]; /* Filename for *out */
468 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000469 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000470 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000471 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000472 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000473 int *aiIndent; /* Array of indents used in MODE_Explain */
474 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000475 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000476};
477
478/*
479** These are the allowed modes.
480*/
drh967e8b72000-06-21 13:59:10 +0000481#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000482#define MODE_Column 1 /* One record per line in neat columns */
483#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000484#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
485#define MODE_Html 4 /* Generate an XHTML table */
486#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000487#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000488#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000489#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000490
drh66ce4d02008-02-15 17:38:06 +0000491static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000492 "line",
493 "column",
494 "list",
495 "semi",
496 "html",
drhfeac5f82004-08-01 00:10:45 +0000497 "insert",
498 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000499 "csv",
drh66ce4d02008-02-15 17:38:06 +0000500 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000501};
drh75897232000-05-29 14:26:00 +0000502
503/*
504** Number of elements in an array
505*/
drh902b9ee2008-12-05 17:17:07 +0000506#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000507
508/*
drhea678832008-12-10 19:26:22 +0000509** Compute a string length that is limited to what can be stored in
510** lower 30 bits of a 32-bit signed integer.
511*/
drh4f21c4a2008-12-10 22:15:00 +0000512static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000513 const char *z2 = z;
514 while( *z2 ){ z2++; }
515 return 0x3fffffff & (int)(z2 - z);
516}
517
518/*
drh127f9d72010-02-23 01:47:00 +0000519** A callback for the sqlite3_log() interface.
520*/
521static void shellLog(void *pArg, int iErrCode, const char *zMsg){
522 struct callback_data *p = (struct callback_data*)pArg;
523 if( p->pLog==0 ) return;
524 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
525 fflush(p->pLog);
526}
527
528/*
shane626a6e42009-10-22 17:30:15 +0000529** Output the given string as a hex-encoded blob (eg. X'1234' )
530*/
531static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
532 int i;
533 char *zBlob = (char *)pBlob;
534 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000535 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000536 fprintf(out,"'");
537}
538
539/*
drh28bd4bc2000-06-15 15:57:22 +0000540** Output the given string as a quoted string using SQL quoting conventions.
541*/
542static void output_quoted_string(FILE *out, const char *z){
543 int i;
544 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000545 for(i=0; z[i]; i++){
546 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000547 }
548 if( nSingle==0 ){
549 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000550 }else{
551 fprintf(out,"'");
552 while( *z ){
553 for(i=0; z[i] && z[i]!='\''; i++){}
554 if( i==0 ){
555 fprintf(out,"''");
556 z++;
557 }else if( z[i]=='\'' ){
558 fprintf(out,"%.*s''",i,z);
559 z += i+1;
560 }else{
drhcd7d2732002-02-26 23:24:26 +0000561 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000562 break;
563 }
564 }
drhcd7d2732002-02-26 23:24:26 +0000565 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000566 }
567}
568
569/*
drhfeac5f82004-08-01 00:10:45 +0000570** Output the given string as a quoted according to C or TCL quoting rules.
571*/
572static void output_c_string(FILE *out, const char *z){
573 unsigned int c;
574 fputc('"', out);
575 while( (c = *(z++))!=0 ){
576 if( c=='\\' ){
577 fputc(c, out);
578 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000579 }else if( c=='"' ){
580 fputc('\\', out);
581 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000582 }else if( c=='\t' ){
583 fputc('\\', out);
584 fputc('t', out);
585 }else if( c=='\n' ){
586 fputc('\\', out);
587 fputc('n', out);
588 }else if( c=='\r' ){
589 fputc('\\', out);
590 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000591 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000592 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000593 }else{
594 fputc(c, out);
595 }
596 }
597 fputc('"', out);
598}
599
600/*
drhc08a4f12000-06-15 16:49:48 +0000601** Output the given string with characters that are special to
602** HTML escaped.
603*/
604static void output_html_string(FILE *out, const char *z){
605 int i;
drhc3d6ba42014-01-13 20:38:35 +0000606 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000607 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000608 for(i=0; z[i]
609 && z[i]!='<'
610 && z[i]!='&'
611 && z[i]!='>'
612 && z[i]!='\"'
613 && z[i]!='\'';
614 i++){}
drhc08a4f12000-06-15 16:49:48 +0000615 if( i>0 ){
616 fprintf(out,"%.*s",i,z);
617 }
618 if( z[i]=='<' ){
619 fprintf(out,"&lt;");
620 }else if( z[i]=='&' ){
621 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000622 }else if( z[i]=='>' ){
623 fprintf(out,"&gt;");
624 }else if( z[i]=='\"' ){
625 fprintf(out,"&quot;");
626 }else if( z[i]=='\'' ){
627 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000628 }else{
629 break;
630 }
631 z += i + 1;
632 }
633}
634
635/*
drhc49f44e2006-10-26 18:15:42 +0000636** If a field contains any character identified by a 1 in the following
637** array, then the string must be quoted for CSV.
638*/
639static const char needCsvQuote[] = {
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
656};
657
658/*
drh8e64d1c2004-10-07 00:32:39 +0000659** Output a single term of CSV. Actually, p->separator is used for
660** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000661** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000662*/
663static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000664 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000665 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000666 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000667 }else{
drhc49f44e2006-10-26 18:15:42 +0000668 int i;
drh4f21c4a2008-12-10 22:15:00 +0000669 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000670 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000671 if( needCsvQuote[((unsigned char*)z)[i]]
672 || (z[i]==p->separator[0] &&
673 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000674 i = 0;
675 break;
676 }
677 }
678 if( i==0 ){
679 putc('"', out);
680 for(i=0; z[i]; i++){
681 if( z[i]=='"' ) putc('"', out);
682 putc(z[i], out);
683 }
684 putc('"', out);
685 }else{
686 fprintf(out, "%s", z);
687 }
drh8e64d1c2004-10-07 00:32:39 +0000688 }
689 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000690 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000691 }
692}
693
danielk19774af00c62005-01-23 23:43:21 +0000694#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000695/*
drh4c504392000-10-16 22:06:40 +0000696** This routine runs when the user presses Ctrl-C
697*/
698static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000699 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000700 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000701 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000702}
danielk19774af00c62005-01-23 23:43:21 +0000703#endif
drh4c504392000-10-16 22:06:40 +0000704
705/*
shane626a6e42009-10-22 17:30:15 +0000706** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000707** invokes for each row of a query result.
708*/
shane626a6e42009-10-22 17:30:15 +0000709static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000710 int i;
711 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000712
drh75897232000-05-29 14:26:00 +0000713 switch( p->mode ){
714 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000715 int w = 5;
drh6a535342001-10-19 16:44:56 +0000716 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000717 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000718 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000719 if( len>w ) w = len;
720 }
drh75897232000-05-29 14:26:00 +0000721 if( p->cnt++>0 ) fprintf(p->out,"\n");
722 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000723 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000724 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000725 }
726 break;
727 }
danielk19770d78bae2008-01-03 07:09:48 +0000728 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000729 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000730 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000731 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000732 int w, n;
733 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000734 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000735 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000736 w = 0;
drh75897232000-05-29 14:26:00 +0000737 }
drh078b1fd2012-09-21 13:40:02 +0000738 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000739 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000740 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000741 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000742 if( w<n ) w = n;
743 }
744 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000745 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000746 }
747 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000748 if( w<0 ){
749 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
750 }else{
751 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
752 }
drha0c66f52000-07-29 13:20:21 +0000753 }
754 }
755 if( p->showHeader ){
756 for(i=0; i<nArg; i++){
757 int w;
758 if( i<ArraySize(p->actualWidth) ){
759 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000760 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000761 }else{
762 w = 10;
763 }
764 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
765 "----------------------------------------------------------",
766 i==nArg-1 ? "\n": " ");
767 }
drh75897232000-05-29 14:26:00 +0000768 }
769 }
drh6a535342001-10-19 16:44:56 +0000770 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000771 for(i=0; i<nArg; i++){
772 int w;
drha0c66f52000-07-29 13:20:21 +0000773 if( i<ArraySize(p->actualWidth) ){
774 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000775 }else{
776 w = 10;
777 }
dana98bf362013-11-13 18:35:01 +0000778 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000779 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000780 }
dana98bf362013-11-13 18:35:01 +0000781 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000782 if( p->iIndent<p->nIndent ){
783 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000784 }
danc4650bb2013-11-18 08:41:06 +0000785 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000786 }
drh078b1fd2012-09-21 13:40:02 +0000787 if( w<0 ){
788 fprintf(p->out,"%*.*s%s",-w,-w,
789 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
790 }else{
791 fprintf(p->out,"%-*.*s%s",w,w,
792 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
793 }
drh75897232000-05-29 14:26:00 +0000794 }
795 break;
796 }
drhe3710332000-09-29 13:30:53 +0000797 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000798 case MODE_List: {
799 if( p->cnt++==0 && p->showHeader ){
800 for(i=0; i<nArg; i++){
801 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
802 }
803 }
drh6a535342001-10-19 16:44:56 +0000804 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000805 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000806 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000807 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000808 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000809 if( i<nArg-1 ){
810 fprintf(p->out, "%s", p->separator);
811 }else if( p->mode==MODE_Semi ){
812 fprintf(p->out, ";\n");
813 }else{
814 fprintf(p->out, "\n");
815 }
drh75897232000-05-29 14:26:00 +0000816 }
817 break;
818 }
drh1e5d0e92000-05-31 23:33:17 +0000819 case MODE_Html: {
820 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000821 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000822 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000823 fprintf(p->out,"<TH>");
824 output_html_string(p->out, azCol[i]);
825 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000826 }
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000828 }
drh6a535342001-10-19 16:44:56 +0000829 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000830 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000831 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000832 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000833 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000834 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000835 }
mihailim57c591a2008-06-23 21:26:05 +0000836 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000837 break;
838 }
drhfeac5f82004-08-01 00:10:45 +0000839 case MODE_Tcl: {
840 if( p->cnt++==0 && p->showHeader ){
841 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000842 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000843 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000844 }
845 fprintf(p->out,"\n");
846 }
847 if( azArg==0 ) break;
848 for(i=0; i<nArg; i++){
849 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000850 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000851 }
852 fprintf(p->out,"\n");
853 break;
854 }
drh8e64d1c2004-10-07 00:32:39 +0000855 case MODE_Csv: {
856 if( p->cnt++==0 && p->showHeader ){
857 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000858 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000859 }
860 fprintf(p->out,"\n");
861 }
862 if( azArg==0 ) break;
863 for(i=0; i<nArg; i++){
864 output_csv(p, azArg[i], i<nArg-1);
865 }
866 fprintf(p->out,"\n");
867 break;
868 }
drh28bd4bc2000-06-15 15:57:22 +0000869 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000870 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000871 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000872 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000873 for(i=0; i<nArg; i++){
874 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000875 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000876 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000877 }else if( aiType && aiType[i]==SQLITE_TEXT ){
878 if( zSep[0] ) fprintf(p->out,"%s",zSep);
879 output_quoted_string(p->out, azArg[i]);
880 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
881 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000882 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
883 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
884 int nBlob = sqlite3_column_bytes(p->pStmt, i);
885 if( zSep[0] ) fprintf(p->out,"%s",zSep);
886 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000887 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000888 fprintf(p->out,"%s%s",zSep, azArg[i]);
889 }else{
890 if( zSep[0] ) fprintf(p->out,"%s",zSep);
891 output_quoted_string(p->out, azArg[i]);
892 }
893 }
894 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000895 break;
drh28bd4bc2000-06-15 15:57:22 +0000896 }
persicom1d0b8722002-04-18 02:53:04 +0000897 }
drh75897232000-05-29 14:26:00 +0000898 return 0;
899}
900
901/*
shane626a6e42009-10-22 17:30:15 +0000902** This is the callback routine that the SQLite library
903** invokes for each row of a query result.
904*/
905static int callback(void *pArg, int nArg, char **azArg, char **azCol){
906 /* since we don't have type info, call the shell_callback with a NULL value */
907 return shell_callback(pArg, nArg, azArg, azCol, NULL);
908}
909
910/*
drh33048c02001-10-01 14:29:22 +0000911** Set the destination table field of the callback_data structure to
912** the name of the table given. Escape any quote characters in the
913** table name.
914*/
915static void set_table_name(struct callback_data *p, const char *zName){
916 int i, n;
917 int needQuote;
918 char *z;
919
920 if( p->zDestTable ){
921 free(p->zDestTable);
922 p->zDestTable = 0;
923 }
924 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000925 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000926 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000927 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000928 needQuote = 1;
929 if( zName[i]=='\'' ) n++;
930 }
931 }
932 if( needQuote ) n += 2;
933 z = p->zDestTable = malloc( n+1 );
934 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000935 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000936 exit(1);
937 }
938 n = 0;
939 if( needQuote ) z[n++] = '\'';
940 for(i=0; zName[i]; i++){
941 z[n++] = zName[i];
942 if( zName[i]=='\'' ) z[n++] = '\'';
943 }
944 if( needQuote ) z[n++] = '\'';
945 z[n] = 0;
946}
947
danielk19772a02e332004-06-05 08:04:36 +0000948/* zIn is either a pointer to a NULL-terminated string in memory obtained
949** from malloc(), or a NULL pointer. The string pointed to by zAppend is
950** added to zIn, and the result returned in memory obtained from malloc().
951** zIn, if it was not NULL, is freed.
952**
953** If the third argument, quote, is not '\0', then it is used as a
954** quote character for zAppend.
955*/
drhc28490c2006-10-26 14:25:58 +0000956static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000957 int len;
958 int i;
drh4f21c4a2008-12-10 22:15:00 +0000959 int nAppend = strlen30(zAppend);
960 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000961
962 len = nAppend+nIn+1;
963 if( quote ){
964 len += 2;
965 for(i=0; i<nAppend; i++){
966 if( zAppend[i]==quote ) len++;
967 }
968 }
969
970 zIn = (char *)realloc(zIn, len);
971 if( !zIn ){
972 return 0;
973 }
974
975 if( quote ){
976 char *zCsr = &zIn[nIn];
977 *zCsr++ = quote;
978 for(i=0; i<nAppend; i++){
979 *zCsr++ = zAppend[i];
980 if( zAppend[i]==quote ) *zCsr++ = quote;
981 }
982 *zCsr++ = quote;
983 *zCsr++ = '\0';
984 assert( (zCsr-zIn)==len );
985 }else{
986 memcpy(&zIn[nIn], zAppend, nAppend);
987 zIn[len-1] = '\0';
988 }
989
990 return zIn;
991}
992
drhdd3d4592004-08-30 01:54:05 +0000993
994/*
drhb21a8e42012-01-28 21:08:51 +0000995** Execute a query statement that will generate SQL output. Print
996** the result columns, comma-separated, on a line and then add a
997** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000998**
drhb21a8e42012-01-28 21:08:51 +0000999** If the number of columns is 1 and that column contains text "--"
1000** then write the semicolon on a separate line. That way, if a
1001** "--" comment occurs at the end of the statement, the comment
1002** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001003*/
drh157e29a2009-05-21 15:15:00 +00001004static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001005 struct callback_data *p, /* Query context */
1006 const char *zSelect, /* SELECT statement to extract content */
1007 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001008){
drhdd3d4592004-08-30 01:54:05 +00001009 sqlite3_stmt *pSelect;
1010 int rc;
drhb21a8e42012-01-28 21:08:51 +00001011 int nResult;
1012 int i;
1013 const char *z;
drhc7181902014-02-27 15:04:13 +00001014 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001015 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001016 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001017 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001018 return rc;
1019 }
1020 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001021 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001022 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001023 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001024 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001025 zFirstRow = 0;
1026 }
drhb21a8e42012-01-28 21:08:51 +00001027 z = (const char*)sqlite3_column_text(pSelect, 0);
1028 fprintf(p->out, "%s", z);
1029 for(i=1; i<nResult; i++){
1030 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1031 }
1032 if( z==0 ) z = "";
1033 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1034 if( z[0] ){
1035 fprintf(p->out, "\n;\n");
1036 }else{
1037 fprintf(p->out, ";\n");
1038 }
drhdd3d4592004-08-30 01:54:05 +00001039 rc = sqlite3_step(pSelect);
1040 }
drh2f464a02011-10-13 00:41:49 +00001041 rc = sqlite3_finalize(pSelect);
1042 if( rc!=SQLITE_OK ){
1043 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001044 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001045 }
1046 return rc;
drhdd3d4592004-08-30 01:54:05 +00001047}
1048
shane626a6e42009-10-22 17:30:15 +00001049/*
1050** Allocate space and save off current error string.
1051*/
1052static char *save_err_msg(
1053 sqlite3 *db /* Database to query */
1054){
1055 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1056 char *zErrMsg = sqlite3_malloc(nErrMsg);
1057 if( zErrMsg ){
1058 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1059 }
1060 return zErrMsg;
1061}
1062
1063/*
shaneh642d8b82010-07-28 16:05:34 +00001064** Display memory stats.
1065*/
1066static int display_stats(
1067 sqlite3 *db, /* Database to query */
1068 struct callback_data *pArg, /* Pointer to struct callback_data */
1069 int bReset /* True to reset the stats */
1070){
1071 int iCur;
1072 int iHiwtr;
1073
1074 if( pArg && pArg->out ){
1075
1076 iHiwtr = iCur = -1;
1077 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001078 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001079 iHiwtr = iCur = -1;
1080 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001081 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001082/*
1083** Not currently used by the CLI.
1084** iHiwtr = iCur = -1;
1085** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1086** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1087*/
1088 iHiwtr = iCur = -1;
1089 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1090 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1091/*
1092** Not currently used by the CLI.
1093** iHiwtr = iCur = -1;
1094** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1095** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1096*/
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1106 iHiwtr = iCur = -1;
1107 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1108 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1109#ifdef YYTRACKMAXSTACKDEPTH
1110 iHiwtr = iCur = -1;
1111 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1112 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1113#endif
1114 }
1115
1116 if( pArg && pArg->out && db ){
1117 iHiwtr = iCur = -1;
1118 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1119 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001120 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1121 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1122 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1123 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1125 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001126 iHiwtr = iCur = -1;
1127 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001128 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1131 iHiwtr = iCur = -1;
1132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001134 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1136 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1137 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001138 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1140 iHiwtr = iCur = -1;
1141 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1142 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1143 }
1144
1145 if( pArg && pArg->out && db && pArg->pStmt ){
1146 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1147 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1148 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1149 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1150 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1151 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001152 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1153 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001154 }
1155
1156 return 0;
1157}
1158
1159/*
dana98bf362013-11-13 18:35:01 +00001160** Parameter azArray points to a zero-terminated array of strings. zStr
1161** points to a single nul-terminated string. Return non-zero if zStr
1162** is equal, according to strcmp(), to any of the strings in the array.
1163** Otherwise, return zero.
1164*/
1165static int str_in_array(const char *zStr, const char **azArray){
1166 int i;
1167 for(i=0; azArray[i]; i++){
1168 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1169 }
1170 return 0;
1171}
1172
1173/*
1174** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1175** and populate the callback_data.aiIndent[] array with the number of
1176** spaces each opcode should be indented before it is output.
1177**
1178** The indenting rules are:
1179**
1180** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1181** all opcodes that occur between the p2 jump destination and the opcode
1182** itself by 2 spaces.
1183**
drh01752bc2013-11-14 23:59:33 +00001184** * For each "Goto", if the jump destination is earlier in the program
1185** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001186** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001187** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001188** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001189** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001190*/
1191static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1192 const char *zSql; /* The text of the SQL statement */
1193 const char *z; /* Used to check if this is an EXPLAIN */
1194 int *abYield = 0; /* True if op is an OP_Yield */
1195 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001196 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001197
drh602320e2013-11-15 03:16:34 +00001198 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001199 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001200 const char *azGoto[] = { "Goto", 0 };
1201
1202 /* Try to figure out if this is really an EXPLAIN statement. If this
1203 ** cannot be verified, return early. */
1204 zSql = sqlite3_sql(pSql);
1205 if( zSql==0 ) return;
1206 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1207 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1208
1209 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1210 int i;
danc4650bb2013-11-18 08:41:06 +00001211 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001212 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001213
1214 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1215 ** p2 is an instruction address, set variable p2op to the index of that
1216 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1217 ** the current instruction is part of a sub-program generated by an
1218 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001219 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001220 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001221
1222 /* Grow the p->aiIndent array as required */
1223 if( iOp>=nAlloc ){
1224 nAlloc += 100;
1225 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1226 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1227 }
1228 abYield[iOp] = str_in_array(zOp, azYield);
1229 p->aiIndent[iOp] = 0;
1230 p->nIndent = iOp+1;
1231
1232 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001233 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001234 }
drhfe705102014-03-06 13:38:37 +00001235 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1236 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1237 ){
drhe73f0592014-01-21 22:25:45 +00001238 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001239 }
1240 }
1241
danc4650bb2013-11-18 08:41:06 +00001242 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001243 sqlite3_free(abYield);
1244 sqlite3_reset(pSql);
1245}
1246
1247/*
1248** Free the array allocated by explain_data_prepare().
1249*/
1250static void explain_data_delete(struct callback_data *p){
1251 sqlite3_free(p->aiIndent);
1252 p->aiIndent = 0;
1253 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001254 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001255}
1256
1257/*
shane626a6e42009-10-22 17:30:15 +00001258** Execute a statement or set of statements. Print
1259** any result rows/columns depending on the current mode
1260** set via the supplied callback.
1261**
1262** This is very similar to SQLite's built-in sqlite3_exec()
1263** function except it takes a slightly different callback
1264** and callback data argument.
1265*/
1266static int shell_exec(
1267 sqlite3 *db, /* An open database */
1268 const char *zSql, /* SQL to be evaluated */
1269 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1270 /* (not the same as sqlite3_exec) */
1271 struct callback_data *pArg, /* Pointer to struct callback_data */
1272 char **pzErrMsg /* Error msg written here */
1273){
dan4564ced2010-01-05 04:59:56 +00001274 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1275 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001276 int rc2;
dan4564ced2010-01-05 04:59:56 +00001277 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001278
1279 if( pzErrMsg ){
1280 *pzErrMsg = NULL;
1281 }
1282
shaneb9fc17d2009-10-22 21:23:35 +00001283 while( zSql[0] && (SQLITE_OK == rc) ){
1284 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1285 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001286 if( pzErrMsg ){
1287 *pzErrMsg = save_err_msg(db);
1288 }
1289 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001290 if( !pStmt ){
1291 /* this happens for a comment or white-space */
1292 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001293 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001294 continue;
1295 }
shane626a6e42009-10-22 17:30:15 +00001296
shaneh642d8b82010-07-28 16:05:34 +00001297 /* save off the prepared statment handle and reset row count */
1298 if( pArg ){
1299 pArg->pStmt = pStmt;
1300 pArg->cnt = 0;
1301 }
1302
shanehb7977c52010-01-18 18:17:10 +00001303 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001304 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001305 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001306 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001307 }
shanehb7977c52010-01-18 18:17:10 +00001308
drhefbf3b12014-02-28 20:47:24 +00001309 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1310 if( pArg && pArg->autoEQP ){
1311 sqlite3_stmt *pExplain;
1312 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1313 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1314 if( rc==SQLITE_OK ){
1315 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1316 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1317 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1318 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1319 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1320 }
1321 }
1322 sqlite3_finalize(pExplain);
1323 sqlite3_free(zEQP);
1324 }
1325
drh7e02e5e2011-12-06 19:44:51 +00001326 /* Output TESTCTRL_EXPLAIN text of requested */
1327 if( pArg && pArg->mode==MODE_Explain ){
1328 const char *zExplain = 0;
1329 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1330 if( zExplain && zExplain[0] ){
1331 fprintf(pArg->out, "%s", zExplain);
1332 }
1333 }
1334
dana98bf362013-11-13 18:35:01 +00001335 /* If the shell is currently in ".explain" mode, gather the extra
1336 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001337 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001338 explain_data_prepare(pArg, pStmt);
1339 }
1340
shaneb9fc17d2009-10-22 21:23:35 +00001341 /* perform the first step. this will tell us if we
1342 ** have a result set or not and how wide it is.
1343 */
1344 rc = sqlite3_step(pStmt);
1345 /* if we have a result set... */
1346 if( SQLITE_ROW == rc ){
1347 /* if we have a callback... */
1348 if( xCallback ){
1349 /* allocate space for col name ptr, value ptr, and type */
1350 int nCol = sqlite3_column_count(pStmt);
1351 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1352 if( !pData ){
1353 rc = SQLITE_NOMEM;
1354 }else{
1355 char **azCols = (char **)pData; /* Names of result columns */
1356 char **azVals = &azCols[nCol]; /* Results */
1357 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001358 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001359 assert(sizeof(int) <= sizeof(char *));
1360 /* save off ptrs to column names */
1361 for(i=0; i<nCol; i++){
1362 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1363 }
shaneb9fc17d2009-10-22 21:23:35 +00001364 do{
1365 /* extract the data and data types */
1366 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001367 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001368 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001369 azVals[i] = "";
1370 }else{
1371 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1372 }
shaneb9fc17d2009-10-22 21:23:35 +00001373 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1374 rc = SQLITE_NOMEM;
1375 break; /* from for */
1376 }
1377 } /* end for */
1378
1379 /* if data and types extracted successfully... */
1380 if( SQLITE_ROW == rc ){
1381 /* call the supplied callback with the result row data */
1382 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1383 rc = SQLITE_ABORT;
1384 }else{
1385 rc = sqlite3_step(pStmt);
1386 }
1387 }
1388 } while( SQLITE_ROW == rc );
1389 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001390 }
1391 }else{
1392 do{
1393 rc = sqlite3_step(pStmt);
1394 } while( rc == SQLITE_ROW );
1395 }
1396 }
1397
dana98bf362013-11-13 18:35:01 +00001398 explain_data_delete(pArg);
1399
shaneh642d8b82010-07-28 16:05:34 +00001400 /* print usage stats if stats on */
1401 if( pArg && pArg->statsOn ){
1402 display_stats(db, pArg, 0);
1403 }
1404
dan4564ced2010-01-05 04:59:56 +00001405 /* Finalize the statement just executed. If this fails, save a
1406 ** copy of the error message. Otherwise, set zSql to point to the
1407 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001408 rc2 = sqlite3_finalize(pStmt);
1409 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001410 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001411 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001412 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001413 }else if( pzErrMsg ){
1414 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001415 }
shaneh642d8b82010-07-28 16:05:34 +00001416
1417 /* clear saved stmt handle */
1418 if( pArg ){
1419 pArg->pStmt = NULL;
1420 }
shane626a6e42009-10-22 17:30:15 +00001421 }
shaneb9fc17d2009-10-22 21:23:35 +00001422 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001423
1424 return rc;
1425}
1426
drhdd3d4592004-08-30 01:54:05 +00001427
drh33048c02001-10-01 14:29:22 +00001428/*
drh4c653a02000-06-07 01:27:47 +00001429** This is a different callback routine used for dumping the database.
1430** Each row received by this callback consists of a table name,
1431** the table type ("index" or "table") and SQL to create the table.
1432** This routine should print text sufficient to recreate the table.
1433*/
1434static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001435 int rc;
1436 const char *zTable;
1437 const char *zType;
1438 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001439 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001440 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001441
drh902b9ee2008-12-05 17:17:07 +00001442 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001443 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001444 zTable = azArg[0];
1445 zType = azArg[1];
1446 zSql = azArg[2];
1447
drh00b950d2005-09-11 02:03:03 +00001448 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001449 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001450 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001451 fprintf(p->out, "ANALYZE sqlite_master;\n");
1452 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1453 return 0;
drh45e29d82006-11-20 16:21:10 +00001454 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1455 char *zIns;
1456 if( !p->writableSchema ){
1457 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1458 p->writableSchema = 1;
1459 }
1460 zIns = sqlite3_mprintf(
1461 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1462 "VALUES('table','%q','%q',0,'%q');",
1463 zTable, zTable, zSql);
1464 fprintf(p->out, "%s\n", zIns);
1465 sqlite3_free(zIns);
1466 return 0;
drh00b950d2005-09-11 02:03:03 +00001467 }else{
1468 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001469 }
danielk19772a02e332004-06-05 08:04:36 +00001470
1471 if( strcmp(zType, "table")==0 ){
1472 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001473 char *zSelect = 0;
1474 char *zTableInfo = 0;
1475 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001476 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001477
1478 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1479 zTableInfo = appendText(zTableInfo, zTable, '"');
1480 zTableInfo = appendText(zTableInfo, ");", 0);
1481
drhc7181902014-02-27 15:04:13 +00001482 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001483 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001484 if( rc!=SQLITE_OK || !pTableInfo ){
1485 return 1;
1486 }
1487
1488 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001489 /* Always quote the table name, even if it appears to be pure ascii,
1490 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1491 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001492 if( zTmp ){
1493 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001494 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001495 }
1496 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1497 rc = sqlite3_step(pTableInfo);
1498 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001499 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001500 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001501 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001502 rc = sqlite3_step(pTableInfo);
1503 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001504 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001505 }else{
1506 zSelect = appendText(zSelect, ") ", 0);
1507 }
drh157e29a2009-05-21 15:15:00 +00001508 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001509 }
1510 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001511 if( rc!=SQLITE_OK || nRow==0 ){
1512 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001513 return 1;
1514 }
1515 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1516 zSelect = appendText(zSelect, zTable, '"');
1517
drh2f464a02011-10-13 00:41:49 +00001518 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001519 if( rc==SQLITE_CORRUPT ){
1520 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001521 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001522 }
drh85e72432012-04-11 11:38:53 +00001523 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001524 }
drh4c653a02000-06-07 01:27:47 +00001525 return 0;
1526}
1527
1528/*
drh45e29d82006-11-20 16:21:10 +00001529** Run zQuery. Use dump_callback() as the callback routine so that
1530** the contents of the query are output as SQL statements.
1531**
drhdd3d4592004-08-30 01:54:05 +00001532** If we get a SQLITE_CORRUPT error, rerun the query after appending
1533** "ORDER BY rowid DESC" to the end.
1534*/
1535static int run_schema_dump_query(
1536 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001537 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001538){
1539 int rc;
drh2f464a02011-10-13 00:41:49 +00001540 char *zErr = 0;
1541 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001542 if( rc==SQLITE_CORRUPT ){
1543 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001544 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001545 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1546 if( zErr ){
1547 fprintf(p->out, "/****** %s ******/\n", zErr);
1548 sqlite3_free(zErr);
1549 zErr = 0;
1550 }
drhdd3d4592004-08-30 01:54:05 +00001551 zQ2 = malloc( len+100 );
1552 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001553 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001554 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1555 if( rc ){
1556 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1557 }else{
1558 rc = SQLITE_CORRUPT;
1559 }
1560 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001561 free(zQ2);
1562 }
1563 return rc;
1564}
1565
1566/*
drh75897232000-05-29 14:26:00 +00001567** Text of a help message
1568*/
persicom1d0b8722002-04-18 02:53:04 +00001569static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001570 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001571 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001572 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001573 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001574 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001575 " If TABLE specified, only dump tables matching\n"
1576 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001577 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001578 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001579 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1580 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001581 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001582 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001583 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001584 ".indices ?TABLE? Show names of all indices\n"
1585 " If TABLE specified, only show indices for tables\n"
1586 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001587#ifdef SQLITE_ENABLE_IOTRACE
1588 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1589#endif
drh70df4fe2006-06-13 15:12:21 +00001590#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001591 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001592#endif
drh127f9d72010-02-23 01:47:00 +00001593 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001594 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001595 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001596 " column Left-aligned columns. (See .width)\n"
1597 " html HTML <table> code\n"
1598 " insert SQL insert statements for TABLE\n"
1599 " line One value per line\n"
1600 " list Values delimited by .separator string\n"
1601 " tabs Tab-separated values\n"
1602 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001603 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001604 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001605 ".output FILENAME Send output to FILENAME\n"
1606 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001607 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001608 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001609 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001610 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001611 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001612 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001613 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001614 " If TABLE specified, only show tables matching\n"
1615 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001616 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001617 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001618 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001619 ".tables ?TABLE? List names of tables\n"
1620 " If TABLE specified, only list tables matching\n"
1621 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001622 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001623 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001624 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001625 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001626;
1627
shaneb320ccd2009-10-21 03:42:58 +00001628static char zTimerHelp[] =
1629 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1630;
1631
drhdaffd0e2001-04-11 14:28:42 +00001632/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001633static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001634
drh75897232000-05-29 14:26:00 +00001635/*
drh44c2eb12003-04-30 11:38:26 +00001636** Make sure the database is open. If it is not, then open it. If
1637** the database fails to open, print an error message and exit.
1638*/
drh05782482013-10-24 15:20:20 +00001639static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001640 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001641 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001642 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001643 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001644 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1645 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1646 shellstaticFunc, 0, 0);
1647 }
1648 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001649 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001650 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001651 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001652 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001653 }
drhc2e87a32006-06-27 15:16:14 +00001654#ifndef SQLITE_OMIT_LOAD_EXTENSION
1655 sqlite3_enable_load_extension(p->db, 1);
1656#endif
drh44c2eb12003-04-30 11:38:26 +00001657 }
1658}
1659
1660/*
drhfeac5f82004-08-01 00:10:45 +00001661** Do C-language style dequoting.
1662**
1663** \t -> tab
1664** \n -> newline
1665** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001666** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001667** \NNN -> ascii character NNN in octal
1668** \\ -> backslash
1669*/
1670static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001671 int i, j;
1672 char c;
drhfeac5f82004-08-01 00:10:45 +00001673 for(i=j=0; (c = z[i])!=0; i++, j++){
1674 if( c=='\\' ){
1675 c = z[++i];
1676 if( c=='n' ){
1677 c = '\n';
1678 }else if( c=='t' ){
1679 c = '\t';
1680 }else if( c=='r' ){
1681 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001682 }else if( c=='\\' ){
1683 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001684 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001685 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001686 if( z[i+1]>='0' && z[i+1]<='7' ){
1687 i++;
1688 c = (c<<3) + z[i] - '0';
1689 if( z[i+1]>='0' && z[i+1]<='7' ){
1690 i++;
1691 c = (c<<3) + z[i] - '0';
1692 }
1693 }
1694 }
1695 }
1696 z[j] = c;
1697 }
1698 z[j] = 0;
1699}
1700
1701/*
drh348d19c2013-06-03 12:47:43 +00001702** Return the value of a hexadecimal digit. Return -1 if the input
1703** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001704*/
drh348d19c2013-06-03 12:47:43 +00001705static int hexDigitValue(char c){
1706 if( c>='0' && c<='9' ) return c - '0';
1707 if( c>='a' && c<='f' ) return c - 'a' + 10;
1708 if( c>='A' && c<='F' ) return c - 'A' + 10;
1709 return -1;
drhc28490c2006-10-26 14:25:58 +00001710}
1711
1712/*
drh7d9f3942013-04-03 01:26:54 +00001713** Interpret zArg as an integer value, possibly with suffixes.
1714*/
1715static sqlite3_int64 integerValue(const char *zArg){
1716 sqlite3_int64 v = 0;
1717 static const struct { char *zSuffix; int iMult; } aMult[] = {
1718 { "KiB", 1024 },
1719 { "MiB", 1024*1024 },
1720 { "GiB", 1024*1024*1024 },
1721 { "KB", 1000 },
1722 { "MB", 1000000 },
1723 { "GB", 1000000000 },
1724 { "K", 1000 },
1725 { "M", 1000000 },
1726 { "G", 1000000000 },
1727 };
1728 int i;
1729 int isNeg = 0;
1730 if( zArg[0]=='-' ){
1731 isNeg = 1;
1732 zArg++;
1733 }else if( zArg[0]=='+' ){
1734 zArg++;
1735 }
drh348d19c2013-06-03 12:47:43 +00001736 if( zArg[0]=='0' && zArg[1]=='x' ){
1737 int x;
1738 zArg += 2;
1739 while( (x = hexDigitValue(zArg[0]))>=0 ){
1740 v = (v<<4) + x;
1741 zArg++;
1742 }
1743 }else{
1744 while( IsDigit(zArg[0]) ){
1745 v = v*10 + zArg[0] - '0';
1746 zArg++;
1747 }
drh7d9f3942013-04-03 01:26:54 +00001748 }
drhc2bed0a2013-05-24 11:57:50 +00001749 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001750 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1751 v *= aMult[i].iMult;
1752 break;
1753 }
1754 }
1755 return isNeg? -v : v;
1756}
1757
1758/*
drh348d19c2013-06-03 12:47:43 +00001759** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1760** for TRUE and FALSE. Return the integer value if appropriate.
1761*/
1762static int booleanValue(char *zArg){
1763 int i;
1764 if( zArg[0]=='0' && zArg[1]=='x' ){
1765 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1766 }else{
1767 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1768 }
1769 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1770 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1771 return 1;
1772 }
1773 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1774 return 0;
1775 }
1776 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1777 zArg);
1778 return 0;
1779}
1780
1781/*
drh42f64e52012-04-04 16:56:23 +00001782** Close an output file, assuming it is not stderr or stdout
1783*/
1784static void output_file_close(FILE *f){
1785 if( f && f!=stdout && f!=stderr ) fclose(f);
1786}
1787
1788/*
1789** Try to open an output file. The names "stdout" and "stderr" are
1790** recognized and do the right thing. NULL is returned if the output
1791** filename is "off".
1792*/
1793static FILE *output_file_open(const char *zFile){
1794 FILE *f;
1795 if( strcmp(zFile,"stdout")==0 ){
1796 f = stdout;
1797 }else if( strcmp(zFile, "stderr")==0 ){
1798 f = stderr;
1799 }else if( strcmp(zFile, "off")==0 ){
1800 f = 0;
1801 }else{
1802 f = fopen(zFile, "wb");
1803 if( f==0 ){
1804 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1805 }
1806 }
1807 return f;
1808}
1809
1810/*
1811** A routine for handling output from sqlite3_trace().
1812*/
1813static void sql_trace_callback(void *pArg, const char *z){
1814 FILE *f = (FILE*)pArg;
1815 if( f ) fprintf(f, "%s\n", z);
1816}
1817
1818/*
drhd8621b92012-04-17 09:09:33 +00001819** A no-op routine that runs with the ".breakpoint" doc-command. This is
1820** a useful spot to set a debugger breakpoint.
1821*/
1822static void test_breakpoint(void){
1823 static int nCall = 0;
1824 nCall++;
1825}
1826
1827/*
drhdb95f682013-06-26 22:46:00 +00001828** An object used to read a CSV file
1829*/
1830typedef struct CSVReader CSVReader;
1831struct CSVReader {
1832 const char *zFile; /* Name of the input file */
1833 FILE *in; /* Read the CSV text from this input stream */
1834 char *z; /* Accumulated text for a field */
1835 int n; /* Number of bytes in z */
1836 int nAlloc; /* Space allocated for z[] */
1837 int nLine; /* Current line number */
1838 int cTerm; /* Character that terminated the most recent field */
1839 int cSeparator; /* The separator character. (Usually ",") */
1840};
1841
1842/* Append a single byte to z[] */
1843static void csv_append_char(CSVReader *p, int c){
1844 if( p->n+1>=p->nAlloc ){
1845 p->nAlloc += p->nAlloc + 100;
1846 p->z = sqlite3_realloc(p->z, p->nAlloc);
1847 if( p->z==0 ){
1848 fprintf(stderr, "out of memory\n");
1849 exit(1);
1850 }
1851 }
1852 p->z[p->n++] = (char)c;
1853}
1854
1855/* Read a single field of CSV text. Compatible with rfc4180 and extended
1856** with the option of having a separator other than ",".
1857**
1858** + Input comes from p->in.
1859** + Store results in p->z of length p->n. Space to hold p->z comes
1860** from sqlite3_malloc().
1861** + Use p->cSep as the separator. The default is ",".
1862** + Keep track of the line number in p->nLine.
1863** + Store the character that terminates the field in p->cTerm. Store
1864** EOF on end-of-file.
1865** + Report syntax errors on stderr
1866*/
1867static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001868 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001869 int cSep = p->cSeparator;
1870 p->n = 0;
1871 c = fgetc(p->in);
1872 if( c==EOF || seenInterrupt ){
1873 p->cTerm = EOF;
1874 return 0;
1875 }
1876 if( c=='"' ){
1877 int startLine = p->nLine;
1878 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001879 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001880 while( 1 ){
1881 c = fgetc(p->in);
1882 if( c=='\n' ) p->nLine++;
1883 if( c==cQuote ){
1884 if( pc==cQuote ){
1885 pc = 0;
1886 continue;
1887 }
1888 }
1889 if( (c==cSep && pc==cQuote)
1890 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001891 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001892 || (c==EOF && pc==cQuote)
1893 ){
1894 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001895 p->cTerm = c;
1896 break;
1897 }
1898 if( pc==cQuote && c!='\r' ){
1899 fprintf(stderr, "%s:%d: unescaped %c character\n",
1900 p->zFile, p->nLine, cQuote);
1901 }
1902 if( c==EOF ){
1903 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1904 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001905 p->cTerm = EOF;
1906 break;
1907 }
1908 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001909 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001910 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001911 }
drhdb95f682013-06-26 22:46:00 +00001912 }else{
drhd0a64dc2013-06-30 20:24:26 +00001913 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001914 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001915 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001916 }
1917 if( c=='\n' ){
1918 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001919 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001920 }
drhdb95f682013-06-26 22:46:00 +00001921 p->cTerm = c;
1922 }
drh8dd675e2013-07-12 21:09:24 +00001923 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001924 return p->z;
1925}
1926
1927/*
drh4bbcf102014-02-06 02:46:08 +00001928** Try to transfer data for table zTable. If an error is seen while
1929** moving forward, try to go backwards. The backwards movement won't
1930** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001931*/
mistachkine31ae902014-02-06 01:15:29 +00001932static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001933 struct callback_data *p,
1934 sqlite3 *newDb,
1935 const char *zTable
1936){
1937 sqlite3_stmt *pQuery = 0;
1938 sqlite3_stmt *pInsert = 0;
1939 char *zQuery = 0;
1940 char *zInsert = 0;
1941 int rc;
1942 int i, j, n;
1943 int nTable = (int)strlen(zTable);
1944 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001945 int cnt = 0;
1946 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001947
1948 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1949 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1950 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001951 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001952 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1953 zQuery);
1954 goto end_data_xfer;
1955 }
1956 n = sqlite3_column_count(pQuery);
1957 zInsert = sqlite3_malloc(200 + nTable + n*3);
1958 if( zInsert==0 ){
1959 fprintf(stderr, "out of memory\n");
1960 goto end_data_xfer;
1961 }
1962 sqlite3_snprintf(200+nTable,zInsert,
1963 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1964 i = (int)strlen(zInsert);
1965 for(j=1; j<n; j++){
1966 memcpy(zInsert+i, ",?", 2);
1967 i += 2;
1968 }
1969 memcpy(zInsert+i, ");", 3);
1970 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1971 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001972 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001973 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1974 zQuery);
1975 goto end_data_xfer;
1976 }
1977 for(k=0; k<2; k++){
1978 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1979 for(i=0; i<n; i++){
1980 switch( sqlite3_column_type(pQuery, i) ){
1981 case SQLITE_NULL: {
1982 sqlite3_bind_null(pInsert, i+1);
1983 break;
1984 }
1985 case SQLITE_INTEGER: {
1986 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1987 break;
1988 }
1989 case SQLITE_FLOAT: {
1990 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1991 break;
1992 }
1993 case SQLITE_TEXT: {
1994 sqlite3_bind_text(pInsert, i+1,
1995 (const char*)sqlite3_column_text(pQuery,i),
1996 -1, SQLITE_STATIC);
1997 break;
1998 }
1999 case SQLITE_BLOB: {
2000 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2001 sqlite3_column_bytes(pQuery,i),
2002 SQLITE_STATIC);
2003 break;
2004 }
2005 }
2006 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002007 rc = sqlite3_step(pInsert);
2008 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2009 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2010 sqlite3_errmsg(newDb));
2011 }
drh3350ce92014-02-06 00:49:12 +00002012 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002013 cnt++;
2014 if( (cnt%spinRate)==0 ){
2015 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2016 fflush(stdout);
2017 }
drh3350ce92014-02-06 00:49:12 +00002018 } /* End while */
2019 if( rc==SQLITE_DONE ) break;
2020 sqlite3_finalize(pQuery);
2021 sqlite3_free(zQuery);
2022 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2023 zTable);
2024 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2025 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002026 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2027 break;
drh3350ce92014-02-06 00:49:12 +00002028 }
2029 } /* End for(k=0...) */
2030
2031end_data_xfer:
2032 sqlite3_finalize(pQuery);
2033 sqlite3_finalize(pInsert);
2034 sqlite3_free(zQuery);
2035 sqlite3_free(zInsert);
2036}
2037
2038
2039/*
2040** Try to transfer all rows of the schema that match zWhere. For
2041** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002042** If an error is encountered while moving forward through the
2043** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002044*/
mistachkine31ae902014-02-06 01:15:29 +00002045static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002046 struct callback_data *p,
2047 sqlite3 *newDb,
2048 const char *zWhere,
2049 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2050){
2051 sqlite3_stmt *pQuery = 0;
2052 char *zQuery = 0;
2053 int rc;
2054 const unsigned char *zName;
2055 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002056 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002057
2058 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2059 " WHERE %s", zWhere);
2060 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2061 if( rc ){
2062 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2063 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2064 zQuery);
2065 goto end_schema_xfer;
2066 }
2067 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2068 zName = sqlite3_column_text(pQuery, 0);
2069 zSql = sqlite3_column_text(pQuery, 1);
2070 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002071 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2072 if( zErrMsg ){
2073 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2074 sqlite3_free(zErrMsg);
2075 zErrMsg = 0;
2076 }
drh3350ce92014-02-06 00:49:12 +00002077 if( xForEach ){
2078 xForEach(p, newDb, (const char*)zName);
2079 }
2080 printf("done\n");
2081 }
2082 if( rc!=SQLITE_DONE ){
2083 sqlite3_finalize(pQuery);
2084 sqlite3_free(zQuery);
2085 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2086 " WHERE %s ORDER BY rowid DESC", zWhere);
2087 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2088 if( rc ){
2089 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2090 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2091 zQuery);
2092 goto end_schema_xfer;
2093 }
2094 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2095 zName = sqlite3_column_text(pQuery, 0);
2096 zSql = sqlite3_column_text(pQuery, 1);
2097 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002098 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2099 if( zErrMsg ){
2100 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2101 sqlite3_free(zErrMsg);
2102 zErrMsg = 0;
2103 }
drh3350ce92014-02-06 00:49:12 +00002104 if( xForEach ){
2105 xForEach(p, newDb, (const char*)zName);
2106 }
2107 printf("done\n");
2108 }
2109 }
2110end_schema_xfer:
2111 sqlite3_finalize(pQuery);
2112 sqlite3_free(zQuery);
2113}
2114
2115/*
2116** Open a new database file named "zNewDb". Try to recover as much information
2117** as possible out of the main database (which might be corrupt) and write it
2118** into zNewDb.
2119*/
mistachkine31ae902014-02-06 01:15:29 +00002120static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002121 int rc;
2122 sqlite3 *newDb = 0;
2123 if( access(zNewDb,0)==0 ){
2124 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2125 return;
2126 }
2127 rc = sqlite3_open(zNewDb, &newDb);
2128 if( rc ){
2129 fprintf(stderr, "Cannot create output database: %s\n",
2130 sqlite3_errmsg(newDb));
2131 }else{
2132 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002133 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2134 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002135 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2136 }
2137 sqlite3_close(newDb);
2138}
2139
2140/*
drh75897232000-05-29 14:26:00 +00002141** If an input line begins with "." then invoke this routine to
2142** process that line.
drh67505e72002-04-19 12:34:06 +00002143**
drh47ad6842006-11-08 12:25:42 +00002144** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002145*/
drh44c2eb12003-04-30 11:38:26 +00002146static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002147 int i = 1;
2148 int nArg = 0;
2149 int n, c;
drh67505e72002-04-19 12:34:06 +00002150 int rc = 0;
drh75897232000-05-29 14:26:00 +00002151 char *azArg[50];
2152
2153 /* Parse the input line into tokens.
2154 */
2155 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002156 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002157 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002158 if( zLine[i]=='\'' || zLine[i]=='"' ){
2159 int delim = zLine[i++];
2160 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002161 while( zLine[i] && zLine[i]!=delim ){
2162 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2163 i++;
2164 }
drh75897232000-05-29 14:26:00 +00002165 if( zLine[i]==delim ){
2166 zLine[i++] = 0;
2167 }
drhfeac5f82004-08-01 00:10:45 +00002168 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002169 }else{
2170 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002171 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002172 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002173 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002174 }
2175 }
2176
2177 /* Process the input line.
2178 */
shane9bd1b442009-10-23 01:27:39 +00002179 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002180 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002181 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002182 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2183 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2184 ){
drhbc46f022013-01-23 18:53:23 +00002185 const char *zDestFile = 0;
2186 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002187 sqlite3 *pDest;
2188 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002189 int j;
2190 for(j=1; j<nArg; j++){
2191 const char *z = azArg[j];
2192 if( z[0]=='-' ){
2193 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002194 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002195 {
2196 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2197 return 1;
2198 }
2199 }else if( zDestFile==0 ){
2200 zDestFile = azArg[j];
2201 }else if( zDb==0 ){
2202 zDb = zDestFile;
2203 zDestFile = azArg[j];
2204 }else{
2205 fprintf(stderr, "too many arguments to .backup\n");
2206 return 1;
2207 }
drh9ff849f2009-02-04 20:55:57 +00002208 }
drhbc46f022013-01-23 18:53:23 +00002209 if( zDestFile==0 ){
2210 fprintf(stderr, "missing FILENAME argument on .backup\n");
2211 return 1;
2212 }
2213 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002214 rc = sqlite3_open(zDestFile, &pDest);
2215 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002216 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002217 sqlite3_close(pDest);
2218 return 1;
2219 }
drh05782482013-10-24 15:20:20 +00002220 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002221 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2222 if( pBackup==0 ){
2223 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2224 sqlite3_close(pDest);
2225 return 1;
2226 }
2227 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2228 sqlite3_backup_finish(pBackup);
2229 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002230 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002231 }else{
2232 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002233 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002234 }
2235 sqlite3_close(pDest);
2236 }else
2237
shanehe2aa9d72009-11-06 17:20:17 +00002238 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002239 bail_on_error = booleanValue(azArg[1]);
2240 }else
2241
drhd8621b92012-04-17 09:09:33 +00002242 /* The undocumented ".breakpoint" command causes a call to the no-op
2243 ** routine named test_breakpoint().
2244 */
2245 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2246 test_breakpoint();
2247 }else
2248
mistachkine31ae902014-02-06 01:15:29 +00002249 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2250 tryToClone(p, azArg[1]);
2251 }else
2252
shanehe2aa9d72009-11-06 17:20:17 +00002253 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002254 struct callback_data data;
2255 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002256 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002257 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002258 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002259 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002260 data.colWidth[0] = 3;
2261 data.colWidth[1] = 15;
2262 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002263 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002264 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002265 if( zErrMsg ){
2266 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002267 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002268 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002269 }
2270 }else
2271
shanehe2aa9d72009-11-06 17:20:17 +00002272 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002273 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002274 /* When playing back a "dump", the content might appear in an order
2275 ** which causes immediate foreign key constraints to be violated.
2276 ** So disable foreign-key constraint enforcement to prevent problems. */
2277 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002278 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002279 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002280 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002281 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002282 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002283 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002284 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002285 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002286 );
2287 run_schema_dump_query(p,
2288 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002289 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002290 );
drh2f464a02011-10-13 00:41:49 +00002291 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002292 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002293 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002294 );
drh4c653a02000-06-07 01:27:47 +00002295 }else{
2296 int i;
drhdd3d4592004-08-30 01:54:05 +00002297 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002298 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002299 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002300 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002301 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002302 " AND sql NOT NULL");
2303 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002304 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002305 "WHERE sql NOT NULL"
2306 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002307 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002308 );
danielk1977bc6ada42004-06-30 08:20:16 +00002309 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002310 }
2311 }
drh45e29d82006-11-20 16:21:10 +00002312 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002313 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002314 p->writableSchema = 0;
2315 }
drh56197952011-10-13 16:30:13 +00002316 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2317 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002318 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002319 }else
drh75897232000-05-29 14:26:00 +00002320
shanehe2aa9d72009-11-06 17:20:17 +00002321 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002322 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002323 }else
2324
drhefbf3b12014-02-28 20:47:24 +00002325 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 && nArg>1 && nArg<3 ){
2326 p->autoEQP = booleanValue(azArg[1]);
2327 }else
2328
drhd3ac7d92013-01-25 18:33:43 +00002329 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002330 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002331 rc = 2;
drh75897232000-05-29 14:26:00 +00002332 }else
2333
shanehe2aa9d72009-11-06 17:20:17 +00002334 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002335 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002336 if(val == 1) {
2337 if(!p->explainPrev.valid) {
2338 p->explainPrev.valid = 1;
2339 p->explainPrev.mode = p->mode;
2340 p->explainPrev.showHeader = p->showHeader;
2341 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2342 }
2343 /* We could put this code under the !p->explainValid
2344 ** condition so that it does not execute if we are already in
2345 ** explain mode. However, always executing it allows us an easy
2346 ** was to reset to explain mode in case the user previously
2347 ** did an .explain followed by a .width, .mode or .header
2348 ** command.
2349 */
danielk19770d78bae2008-01-03 07:09:48 +00002350 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002351 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002352 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002353 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002354 p->colWidth[1] = 13; /* opcode */
2355 p->colWidth[2] = 4; /* P1 */
2356 p->colWidth[3] = 4; /* P2 */
2357 p->colWidth[4] = 4; /* P3 */
2358 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002359 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002360 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002361 }else if (p->explainPrev.valid) {
2362 p->explainPrev.valid = 0;
2363 p->mode = p->explainPrev.mode;
2364 p->showHeader = p->explainPrev.showHeader;
2365 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2366 }
drh75897232000-05-29 14:26:00 +00002367 }else
2368
drhc28490c2006-10-26 14:25:58 +00002369 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002370 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002371 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002372 }else
2373
2374 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002375 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002376 if( HAS_TIMER ){
2377 fprintf(stderr,"%s",zTimerHelp);
2378 }
drh75897232000-05-29 14:26:00 +00002379 }else
2380
shanehe2aa9d72009-11-06 17:20:17 +00002381 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002382 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002383 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002384 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002385 int nCol; /* Number of columns in the table */
2386 int nByte; /* Number of bytes in an SQL string */
2387 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002388 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002389 int nSep; /* Number of bytes in p->separator[] */
2390 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002391 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002392 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002393
drhdb95f682013-06-26 22:46:00 +00002394 seenInterrupt = 0;
2395 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002396 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002397 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002398 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002399 fprintf(stderr, "Error: non-null separator required for import\n");
2400 return 1;
drhfeac5f82004-08-01 00:10:45 +00002401 }
drhdb95f682013-06-26 22:46:00 +00002402 if( nSep>1 ){
2403 fprintf(stderr, "Error: multi-character separators not allowed"
2404 " for import\n");
2405 return 1;
2406 }
drh5bde8162013-06-27 14:07:53 +00002407 sCsv.zFile = zFile;
2408 sCsv.nLine = 1;
2409 if( sCsv.zFile[0]=='|' ){
2410 sCsv.in = popen(sCsv.zFile+1, "r");
2411 sCsv.zFile = "<pipe>";
2412 xCloser = pclose;
2413 }else{
2414 sCsv.in = fopen(sCsv.zFile, "rb");
2415 xCloser = fclose;
2416 }
drhdb95f682013-06-26 22:46:00 +00002417 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002418 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002419 return 1;
2420 }
2421 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002422 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002423 if( zSql==0 ){
2424 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002425 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002426 return 1;
2427 }
drh4f21c4a2008-12-10 22:15:00 +00002428 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002429 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002430 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2431 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2432 char cSep = '(';
2433 while( csv_read_one_field(&sCsv) ){
2434 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2435 cSep = ',';
2436 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2437 }
drh5bde8162013-06-27 14:07:53 +00002438 if( cSep=='(' ){
2439 sqlite3_free(zCreate);
2440 sqlite3_free(sCsv.z);
2441 xCloser(sCsv.in);
2442 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2443 return 1;
2444 }
drhdb95f682013-06-26 22:46:00 +00002445 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2446 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2447 sqlite3_free(zCreate);
2448 if( rc ){
2449 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2450 sqlite3_errmsg(db));
2451 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002452 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002453 return 1;
2454 }
drhc7181902014-02-27 15:04:13 +00002455 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002456 }
drhfeac5f82004-08-01 00:10:45 +00002457 sqlite3_free(zSql);
2458 if( rc ){
shane916f9612009-10-23 00:37:15 +00002459 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002460 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002461 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002462 return 1;
drhfeac5f82004-08-01 00:10:45 +00002463 }
shane916f9612009-10-23 00:37:15 +00002464 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002465 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002466 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002467 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002468 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002469 if( zSql==0 ){
2470 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002471 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002472 return 1;
2473 }
drhdb95f682013-06-26 22:46:00 +00002474 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002475 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002476 for(i=1; i<nCol; i++){
2477 zSql[j++] = ',';
2478 zSql[j++] = '?';
2479 }
2480 zSql[j++] = ')';
2481 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002482 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002483 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002484 if( rc ){
2485 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002486 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002487 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002488 return 1;
drhfeac5f82004-08-01 00:10:45 +00002489 }
drh2d463112013-08-06 14:36:36 +00002490 needCommit = sqlite3_get_autocommit(db);
2491 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002492 do{
2493 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002494 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002495 char *z = csv_read_one_field(&sCsv);
2496 if( z==0 && i==0 ) break;
2497 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2498 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2499 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2500 "filling the rest with NULL\n",
2501 sCsv.zFile, startLine, nCol, i+1);
2502 i++;
2503 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002504 }
drhfeac5f82004-08-01 00:10:45 +00002505 }
drhdb95f682013-06-26 22:46:00 +00002506 if( sCsv.cTerm==sCsv.cSeparator ){
2507 do{
2508 csv_read_one_field(&sCsv);
2509 i++;
2510 }while( sCsv.cTerm==sCsv.cSeparator );
2511 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2512 "extras ignored\n",
2513 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002514 }
drhdb95f682013-06-26 22:46:00 +00002515 if( i>=nCol ){
2516 sqlite3_step(pStmt);
2517 rc = sqlite3_reset(pStmt);
2518 if( rc!=SQLITE_OK ){
2519 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2520 sqlite3_errmsg(db));
2521 }
2522 }
2523 }while( sCsv.cTerm!=EOF );
2524
drh5bde8162013-06-27 14:07:53 +00002525 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002526 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002527 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002528 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002529 }else
2530
shanehe2aa9d72009-11-06 17:20:17 +00002531 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002532 struct callback_data data;
2533 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002534 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002535 memcpy(&data, p, sizeof(data));
2536 data.showHeader = 0;
2537 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002538 if( nArg==1 ){
2539 rc = sqlite3_exec(p->db,
2540 "SELECT name FROM sqlite_master "
2541 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2542 "UNION ALL "
2543 "SELECT name FROM sqlite_temp_master "
2544 "WHERE type='index' "
2545 "ORDER BY 1",
2546 callback, &data, &zErrMsg
2547 );
2548 }else{
2549 zShellStatic = azArg[1];
2550 rc = sqlite3_exec(p->db,
2551 "SELECT name FROM sqlite_master "
2552 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2553 "UNION ALL "
2554 "SELECT name FROM sqlite_temp_master "
2555 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2556 "ORDER BY 1",
2557 callback, &data, &zErrMsg
2558 );
2559 zShellStatic = 0;
2560 }
drh75897232000-05-29 14:26:00 +00002561 if( zErrMsg ){
2562 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002563 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002564 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002565 }else if( rc != SQLITE_OK ){
2566 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2567 rc = 1;
drh75897232000-05-29 14:26:00 +00002568 }
2569 }else
2570
drhae5e4452007-05-03 17:18:36 +00002571#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002572 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002573 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002574 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2575 iotrace = 0;
2576 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002577 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002578 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002579 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002580 iotrace = stdout;
2581 }else{
2582 iotrace = fopen(azArg[1], "w");
2583 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002584 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002585 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002586 rc = 1;
drhb0603412007-02-28 04:47:26 +00002587 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002588 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002589 }
2590 }
2591 }else
drhae5e4452007-05-03 17:18:36 +00002592#endif
drhb0603412007-02-28 04:47:26 +00002593
drh70df4fe2006-06-13 15:12:21 +00002594#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002595 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2596 const char *zFile, *zProc;
2597 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002598 zFile = azArg[1];
2599 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002600 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002601 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2602 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002603 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002604 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002605 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002606 }
2607 }else
drh70df4fe2006-06-13 15:12:21 +00002608#endif
drh1e397f82006-06-08 15:28:43 +00002609
drhc8ba2122011-03-23 11:16:22 +00002610 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002611 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002612 output_file_close(p->pLog);
2613 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002614 }else
2615
shanehe2aa9d72009-11-06 17:20:17 +00002616 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002617 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002618 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002619 ||
shanehe2aa9d72009-11-06 17:20:17 +00002620 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002621 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002622 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002623 ||
shanehe2aa9d72009-11-06 17:20:17 +00002624 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002625 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002626 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002627 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002628 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002629 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002630 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002631 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002632 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002633 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002634 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002635 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002636 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002637 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002638 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002639 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002640 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002641 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002642 }else {
shane9bd1b442009-10-23 01:27:39 +00002643 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002644 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002645 rc = 1;
drh75897232000-05-29 14:26:00 +00002646 }
2647 }else
2648
shanehe2aa9d72009-11-06 17:20:17 +00002649 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2650 int n2 = strlen30(azArg[1]);
2651 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2652 p->mode = MODE_Insert;
2653 set_table_name(p, azArg[2]);
2654 }else {
2655 fprintf(stderr, "Error: invalid arguments: "
2656 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2657 rc = 1;
2658 }
2659 }else
2660
persicom7e2dfdd2002-04-18 02:46:52 +00002661 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002662 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2663 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002664 }else
2665
drh05782482013-10-24 15:20:20 +00002666 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2667 sqlite3 *savedDb = p->db;
2668 const char *zSavedFilename = p->zDbFilename;
2669 char *zNewFilename = 0;
2670 p->db = 0;
2671 if( nArg>=2 ){
2672 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2673 }
2674 open_db(p, 1);
2675 if( p->db!=0 ){
2676 sqlite3_close(savedDb);
2677 sqlite3_free(p->zFreeOnClose);
2678 p->zFreeOnClose = zNewFilename;
2679 }else{
2680 sqlite3_free(zNewFilename);
2681 p->db = savedDb;
2682 p->zDbFilename = zSavedFilename;
2683 }
2684 }else
2685
drh75897232000-05-29 14:26:00 +00002686 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002687 if( p->outfile[0]=='|' ){
2688 pclose(p->out);
2689 }else{
2690 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002691 }
drh42f64e52012-04-04 16:56:23 +00002692 p->outfile[0] = 0;
2693 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002694 p->out = popen(&azArg[1][1], "w");
2695 if( p->out==0 ){
2696 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2697 p->out = stdout;
2698 rc = 1;
2699 }else{
2700 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2701 }
drh75897232000-05-29 14:26:00 +00002702 }else{
drh42f64e52012-04-04 16:56:23 +00002703 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002704 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002705 if( strcmp(azArg[1],"off")!=0 ){
2706 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2707 }
drh75897232000-05-29 14:26:00 +00002708 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002709 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002710 } else {
drh42f64e52012-04-04 16:56:23 +00002711 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002712 }
2713 }
2714 }else
2715
drh078b1fd2012-09-21 13:40:02 +00002716 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2717 int i;
2718 for(i=1; i<nArg; i++){
2719 if( i>1 ) fprintf(p->out, " ");
2720 fprintf(p->out, "%s", azArg[i]);
2721 }
2722 fprintf(p->out, "\n");
2723 }else
2724
drhdd45df82002-04-18 12:39:03 +00002725 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002726 if( nArg >= 2) {
2727 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2728 }
2729 if( nArg >= 3) {
2730 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2731 }
2732 }else
2733
shanehe2aa9d72009-11-06 17:20:17 +00002734 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002735 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002736 }else
2737
drh9ff849f2009-02-04 20:55:57 +00002738 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002739 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002740 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002741 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2742 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002743 }else{
shane9bd1b442009-10-23 01:27:39 +00002744 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002745 fclose(alt);
2746 }
2747 }else
2748
shanehe2aa9d72009-11-06 17:20:17 +00002749 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002750 const char *zSrcFile;
2751 const char *zDb;
2752 sqlite3 *pSrc;
2753 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002754 int nTimeout = 0;
2755
drh9ff849f2009-02-04 20:55:57 +00002756 if( nArg==2 ){
2757 zSrcFile = azArg[1];
2758 zDb = "main";
2759 }else{
2760 zSrcFile = azArg[2];
2761 zDb = azArg[1];
2762 }
2763 rc = sqlite3_open(zSrcFile, &pSrc);
2764 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002765 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002766 sqlite3_close(pSrc);
2767 return 1;
2768 }
drh05782482013-10-24 15:20:20 +00002769 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002770 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2771 if( pBackup==0 ){
2772 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2773 sqlite3_close(pSrc);
2774 return 1;
2775 }
drhdc2c4912009-02-04 22:46:47 +00002776 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2777 || rc==SQLITE_BUSY ){
2778 if( rc==SQLITE_BUSY ){
2779 if( nTimeout++ >= 3 ) break;
2780 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002781 }
2782 }
2783 sqlite3_backup_finish(pBackup);
2784 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002785 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002786 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002787 fprintf(stderr, "Error: source database is busy\n");
2788 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002789 }else{
2790 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002791 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002792 }
2793 sqlite3_close(pSrc);
2794 }else
2795
shanehe2aa9d72009-11-06 17:20:17 +00002796 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002797 struct callback_data data;
2798 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002799 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002800 memcpy(&data, p, sizeof(data));
2801 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002802 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002803 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002804 int i;
drhf0693c82011-10-11 20:41:54 +00002805 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002806 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002807 char *new_argv[2], *new_colv[2];
2808 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2809 " type text,\n"
2810 " name text,\n"
2811 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002812 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002813 " sql text\n"
2814 ")";
2815 new_argv[1] = 0;
2816 new_colv[0] = "sql";
2817 new_colv[1] = 0;
2818 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002819 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002820 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002821 char *new_argv[2], *new_colv[2];
2822 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2823 " type text,\n"
2824 " name text,\n"
2825 " tbl_name text,\n"
2826 " rootpage integer,\n"
2827 " sql text\n"
2828 ")";
2829 new_argv[1] = 0;
2830 new_colv[0] = "sql";
2831 new_colv[1] = 0;
2832 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002833 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002834 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002835 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002836 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002837 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002838 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002839 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002840 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002841 "WHERE lower(tbl_name) LIKE shellstatic()"
2842 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002843 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002844 callback, &data, &zErrMsg);
2845 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002846 }
drh75897232000-05-29 14:26:00 +00002847 }else{
shane9bd1b442009-10-23 01:27:39 +00002848 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002849 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002850 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002851 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002852 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002853 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002854 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002855 callback, &data, &zErrMsg
2856 );
drh75897232000-05-29 14:26:00 +00002857 }
drh75897232000-05-29 14:26:00 +00002858 if( zErrMsg ){
2859 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002860 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002861 rc = 1;
2862 }else if( rc != SQLITE_OK ){
2863 fprintf(stderr,"Error: querying schema information\n");
2864 rc = 1;
2865 }else{
2866 rc = 0;
drh75897232000-05-29 14:26:00 +00002867 }
2868 }else
2869
drh340f5822013-06-27 13:01:21 +00002870#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002871 /* Undocumented commands for internal testing. Subject to change
2872 ** without notice. */
2873 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2874 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2875 int i, v;
2876 for(i=1; i<nArg; i++){
2877 v = booleanValue(azArg[i]);
2878 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2879 }
2880 }
2881 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2882 int i; sqlite3_int64 v;
2883 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002884 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002885 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002886 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2887 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002888 }
2889 }
2890 }else
drh340f5822013-06-27 13:01:21 +00002891#endif
drh348d19c2013-06-03 12:47:43 +00002892
drh75897232000-05-29 14:26:00 +00002893 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002894 sqlite3_snprintf(sizeof(p->separator), p->separator,
2895 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002896 }else
2897
shanehe2aa9d72009-11-06 17:20:17 +00002898 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002899 int i;
2900 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00002901 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002902 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002903 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002904 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002905 fprintf(p->out,"%9.9s: ", "nullvalue");
2906 output_c_string(p->out, p->nullvalue);
2907 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002908 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002909 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002910 fprintf(p->out,"%9.9s: ", "separator");
2911 output_c_string(p->out, p->separator);
2912 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002913 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002914 fprintf(p->out,"%9.9s: ","width");
2915 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002916 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002917 }
drhfeac5f82004-08-01 00:10:45 +00002918 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002919 }else
2920
shaneh642d8b82010-07-28 16:05:34 +00002921 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2922 p->statsOn = booleanValue(azArg[1]);
2923 }else
2924
shanehe2aa9d72009-11-06 17:20:17 +00002925 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002926 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002927 char **azResult;
drh98781232012-04-23 12:38:05 +00002928 int nRow, nAlloc;
2929 char *zSql = 0;
2930 int ii;
drh05782482013-10-24 15:20:20 +00002931 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002932 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2933 if( rc ) return rc;
2934 zSql = sqlite3_mprintf(
2935 "SELECT name FROM sqlite_master"
2936 " WHERE type IN ('table','view')"
2937 " AND name NOT LIKE 'sqlite_%%'"
2938 " AND name LIKE ?1");
2939 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2940 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2941 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2942 if( strcmp(zDbName,"temp")==0 ){
2943 zSql = sqlite3_mprintf(
2944 "%z UNION ALL "
2945 "SELECT 'temp.' || name FROM sqlite_temp_master"
2946 " WHERE type IN ('table','view')"
2947 " AND name NOT LIKE 'sqlite_%%'"
2948 " AND name LIKE ?1", zSql);
2949 }else{
2950 zSql = sqlite3_mprintf(
2951 "%z UNION ALL "
2952 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2953 " WHERE type IN ('table','view')"
2954 " AND name NOT LIKE 'sqlite_%%'"
2955 " AND name LIKE ?1", zSql, zDbName, zDbName);
2956 }
drha50da102000-08-08 20:19:09 +00002957 }
drh98781232012-04-23 12:38:05 +00002958 sqlite3_finalize(pStmt);
2959 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2960 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2961 sqlite3_free(zSql);
2962 if( rc ) return rc;
2963 nRow = nAlloc = 0;
2964 azResult = 0;
2965 if( nArg>1 ){
2966 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002967 }else{
drh98781232012-04-23 12:38:05 +00002968 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2969 }
2970 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2971 if( nRow>=nAlloc ){
2972 char **azNew;
2973 int n = nAlloc*2 + 10;
2974 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2975 if( azNew==0 ){
2976 fprintf(stderr, "Error: out of memory\n");
2977 break;
2978 }
2979 nAlloc = n;
2980 azResult = azNew;
2981 }
2982 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2983 if( azResult[nRow] ) nRow++;
2984 }
2985 sqlite3_finalize(pStmt);
2986 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002987 int len, maxlen = 0;
2988 int i, j;
2989 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002990 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002991 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002992 if( len>maxlen ) maxlen = len;
2993 }
2994 nPrintCol = 80/(maxlen+2);
2995 if( nPrintCol<1 ) nPrintCol = 1;
2996 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2997 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002998 for(j=i; j<nRow; j+=nPrintRow){
2999 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003000 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003001 }
drh151b7d52013-05-06 20:28:54 +00003002 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003003 }
3004 }
drh98781232012-04-23 12:38:05 +00003005 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3006 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003007 }else
3008
shaneh96887e12011-02-10 21:08:58 +00003009 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003010 static const struct {
3011 const char *zCtrlName; /* Name of a test-control option */
3012 int ctrlCode; /* Integer code for that option */
3013 } aCtrl[] = {
3014 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3015 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3016 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3017 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3018 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3019 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3020 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3021 { "assert", SQLITE_TESTCTRL_ASSERT },
3022 { "always", SQLITE_TESTCTRL_ALWAYS },
3023 { "reserve", SQLITE_TESTCTRL_RESERVE },
3024 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3025 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003026 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
3027 };
shaneh96887e12011-02-10 21:08:58 +00003028 int testctrl = -1;
3029 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003030 int i, n;
drh05782482013-10-24 15:20:20 +00003031 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003032
drhd416fe72011-03-17 16:45:50 +00003033 /* convert testctrl text option to value. allow any unique prefix
3034 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003035 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003036 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003037 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3038 if( testctrl<0 ){
3039 testctrl = aCtrl[i].ctrlCode;
3040 }else{
drhb07028f2011-10-14 21:49:18 +00003041 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003042 testctrl = -1;
3043 break;
3044 }
3045 }
3046 }
drh348d19c2013-06-03 12:47:43 +00003047 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003048 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3049 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3050 }else{
3051 switch(testctrl){
3052
3053 /* sqlite3_test_control(int, db, int) */
3054 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3055 case SQLITE_TESTCTRL_RESERVE:
3056 if( nArg==3 ){
3057 int opt = (int)strtol(azArg[2], 0, 0);
3058 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003059 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003060 } else {
drhd416fe72011-03-17 16:45:50 +00003061 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3062 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003063 }
3064 break;
3065
3066 /* sqlite3_test_control(int) */
3067 case SQLITE_TESTCTRL_PRNG_SAVE:
3068 case SQLITE_TESTCTRL_PRNG_RESTORE:
3069 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003070 if( nArg==2 ){
3071 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003072 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003073 } else {
3074 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3075 }
3076 break;
3077
3078 /* sqlite3_test_control(int, uint) */
3079 case SQLITE_TESTCTRL_PENDING_BYTE:
3080 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003081 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003082 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003083 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003084 } else {
drhd416fe72011-03-17 16:45:50 +00003085 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3086 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003087 }
3088 break;
3089
3090 /* sqlite3_test_control(int, int) */
3091 case SQLITE_TESTCTRL_ASSERT:
3092 case SQLITE_TESTCTRL_ALWAYS:
3093 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003094 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003095 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003096 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003097 } else {
drhd416fe72011-03-17 16:45:50 +00003098 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3099 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003100 }
3101 break;
3102
3103 /* sqlite3_test_control(int, char *) */
3104#ifdef SQLITE_N_KEYWORD
3105 case SQLITE_TESTCTRL_ISKEYWORD:
3106 if( nArg==3 ){
3107 const char *opt = azArg[2];
3108 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003109 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003110 } else {
drhd416fe72011-03-17 16:45:50 +00003111 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3112 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003113 }
3114 break;
3115#endif
3116
3117 case SQLITE_TESTCTRL_BITVEC_TEST:
3118 case SQLITE_TESTCTRL_FAULT_INSTALL:
3119 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3120 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3121 default:
drhd416fe72011-03-17 16:45:50 +00003122 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3123 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003124 break;
3125 }
3126 }
3127 }else
3128
shanehe2aa9d72009-11-06 17:20:17 +00003129 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003130 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003131 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003132 }else
3133
drhd416fe72011-03-17 16:45:50 +00003134 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3135 && nArg==2
3136 ){
drh3b1a9882007-11-02 12:53:03 +00003137 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003138 }else
3139
drh42f64e52012-04-04 16:56:23 +00003140 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003141 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003142 output_file_close(p->traceOut);
3143 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003144#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003145 if( p->traceOut==0 ){
3146 sqlite3_trace(p->db, 0, 0);
3147 }else{
3148 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3149 }
3150#endif
3151 }else
3152
drh9fd301b2011-06-03 13:28:22 +00003153 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003154 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003155 sqlite3_libversion(), sqlite3_sourceid());
3156 }else
3157
drhde60fc22011-12-14 17:53:36 +00003158 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3159 const char *zDbName = nArg==2 ? azArg[1] : "main";
3160 char *zVfsName = 0;
3161 if( p->db ){
3162 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3163 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003164 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003165 sqlite3_free(zVfsName);
3166 }
3167 }
3168 }else
3169
drhcef4fc82012-09-21 22:50:45 +00003170#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3171 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3172 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003173 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003174 }else
3175#endif
3176
shanehe2aa9d72009-11-06 17:20:17 +00003177 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003178 int j;
drh43617e92006-03-06 20:55:46 +00003179 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003180 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003181 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003182 }
3183 }else
3184
3185 {
shane9bd1b442009-10-23 01:27:39 +00003186 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003187 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003188 rc = 1;
drh75897232000-05-29 14:26:00 +00003189 }
drh67505e72002-04-19 12:34:06 +00003190
3191 return rc;
drh75897232000-05-29 14:26:00 +00003192}
3193
drh67505e72002-04-19 12:34:06 +00003194/*
drh91a66392007-09-07 01:12:32 +00003195** Return TRUE if a semicolon occurs anywhere in the first N characters
3196** of string z[].
drh324ccef2003-02-05 14:06:20 +00003197*/
drh9f099fd2013-08-06 14:01:46 +00003198static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003199 int i;
3200 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3201 return 0;
drh324ccef2003-02-05 14:06:20 +00003202}
3203
3204/*
drh70c7a4b2003-04-26 03:03:06 +00003205** Test to see if a line consists entirely of whitespace.
3206*/
3207static int _all_whitespace(const char *z){
3208 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003209 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003210 if( *z=='/' && z[1]=='*' ){
3211 z += 2;
3212 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3213 if( *z==0 ) return 0;
3214 z++;
3215 continue;
3216 }
3217 if( *z=='-' && z[1]=='-' ){
3218 z += 2;
3219 while( *z && *z!='\n' ){ z++; }
3220 if( *z==0 ) return 1;
3221 continue;
3222 }
3223 return 0;
3224 }
3225 return 1;
3226}
3227
3228/*
drha9b17162003-04-29 18:01:28 +00003229** Return TRUE if the line typed in is an SQL command terminator other
3230** than a semi-colon. The SQL Server style "go" command is understood
3231** as is the Oracle "/".
3232*/
drh9f099fd2013-08-06 14:01:46 +00003233static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003234 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003235 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3236 return 1; /* Oracle */
3237 }
drhf0693c82011-10-11 20:41:54 +00003238 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003239 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003240 return 1; /* SQL Server */
3241 }
3242 return 0;
3243}
3244
3245/*
drh233a5312008-12-18 22:25:13 +00003246** Return true if zSql is a complete SQL statement. Return false if it
3247** ends in the middle of a string literal or C-style comment.
3248*/
drh9f099fd2013-08-06 14:01:46 +00003249static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003250 int rc;
3251 if( zSql==0 ) return 1;
3252 zSql[nSql] = ';';
3253 zSql[nSql+1] = 0;
3254 rc = sqlite3_complete(zSql);
3255 zSql[nSql] = 0;
3256 return rc;
3257}
3258
3259/*
drh67505e72002-04-19 12:34:06 +00003260** Read input from *in and process it. If *in==0 then input
3261** is interactive - the user is typing it it. Otherwise, input
3262** is coming from a file or device. A prompt is issued and history
3263** is saved only if input is interactive. An interrupt signal will
3264** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003265**
3266** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003267*/
drhc28490c2006-10-26 14:25:58 +00003268static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003269 char *zLine = 0; /* A single input line */
3270 char *zSql = 0; /* Accumulated SQL text */
3271 int nLine; /* Length of current line */
3272 int nSql = 0; /* Bytes of zSql[] used */
3273 int nAlloc = 0; /* Allocated zSql[] space */
3274 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3275 char *zErrMsg; /* Error message returned */
3276 int rc; /* Error code */
3277 int errCnt = 0; /* Number of errors seen */
3278 int lineno = 0; /* Current line number */
3279 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003280
3281 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3282 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003283 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003284 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003285 /* End of input */
3286 if( stdin_is_interactive ) printf("\n");
3287 break;
drhc49f44e2006-10-26 18:15:42 +00003288 }
drh67505e72002-04-19 12:34:06 +00003289 if( seenInterrupt ){
3290 if( in!=0 ) break;
3291 seenInterrupt = 0;
3292 }
drhc28490c2006-10-26 14:25:58 +00003293 lineno++;
drh849a9d92013-12-21 15:46:06 +00003294 if( nSql==0 && _all_whitespace(zLine) ){
3295 if( p->echoOn ) printf("%s\n", zLine);
3296 continue;
3297 }
drh2af0b2d2002-02-21 02:25:02 +00003298 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003299 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003300 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003301 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003302 break;
3303 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003304 errCnt++;
3305 }
drhdaffd0e2001-04-11 14:28:42 +00003306 continue;
3307 }
drh9f099fd2013-08-06 14:01:46 +00003308 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003309 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003310 }
drh9f099fd2013-08-06 14:01:46 +00003311 nLine = strlen30(zLine);
3312 if( nSql+nLine+2>=nAlloc ){
3313 nAlloc = nSql+nLine+100;
3314 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003315 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003316 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003317 exit(1);
3318 }
drhdaffd0e2001-04-11 14:28:42 +00003319 }
drh9f099fd2013-08-06 14:01:46 +00003320 nSqlPrior = nSql;
3321 if( nSql==0 ){
3322 int i;
3323 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003324 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003325 memcpy(zSql, zLine+i, nLine+1-i);
3326 startline = lineno;
3327 nSql = nLine-i;
3328 }else{
3329 zSql[nSql++] = '\n';
3330 memcpy(zSql+nSql, zLine, nLine+1);
3331 nSql += nLine;
3332 }
3333 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003334 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003335 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003336 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003337 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003338 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003339 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003340 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003341 char zPrefix[100];
3342 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003343 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003344 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003345 }else{
shane9bd1b442009-10-23 01:27:39 +00003346 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003347 }
drh7f953e22002-07-13 17:33:45 +00003348 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003349 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003350 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003351 zErrMsg = 0;
3352 }else{
shaned2bed1c2009-10-21 03:56:54 +00003353 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003354 }
drhc49f44e2006-10-26 18:15:42 +00003355 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003356 }
drhdaffd0e2001-04-11 14:28:42 +00003357 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003358 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003359 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003360 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003361 }
3362 }
drh9f099fd2013-08-06 14:01:46 +00003363 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003364 if( !_all_whitespace(zSql) ){
3365 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3366 }
drhdaffd0e2001-04-11 14:28:42 +00003367 free(zSql);
3368 }
danielk19772ac27622007-07-03 05:31:16 +00003369 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003370 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003371}
3372
drh67505e72002-04-19 12:34:06 +00003373/*
3374** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003375** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003376*/
3377static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003378 static char *home_dir = NULL;
3379 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003380
drh83905c92012-06-21 13:00:37 +00003381#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003382 {
3383 struct passwd *pwent;
3384 uid_t uid = getuid();
3385 if( (pwent=getpwuid(uid)) != NULL) {
3386 home_dir = pwent->pw_dir;
3387 }
drh67505e72002-04-19 12:34:06 +00003388 }
3389#endif
3390
chw65d3c132007-11-12 21:09:10 +00003391#if defined(_WIN32_WCE)
3392 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3393 */
drh85e72432012-04-11 11:38:53 +00003394 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003395#else
3396
drh83905c92012-06-21 13:00:37 +00003397#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003398 if (!home_dir) {
3399 home_dir = getenv("USERPROFILE");
3400 }
3401#endif
3402
drh67505e72002-04-19 12:34:06 +00003403 if (!home_dir) {
3404 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003405 }
3406
drh83905c92012-06-21 13:00:37 +00003407#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003408 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003409 char *zDrive, *zPath;
3410 int n;
3411 zDrive = getenv("HOMEDRIVE");
3412 zPath = getenv("HOMEPATH");
3413 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003414 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003415 home_dir = malloc( n );
3416 if( home_dir==0 ) return 0;
3417 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3418 return home_dir;
3419 }
3420 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003421 }
3422#endif
3423
chw65d3c132007-11-12 21:09:10 +00003424#endif /* !_WIN32_WCE */
3425
drh67505e72002-04-19 12:34:06 +00003426 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003427 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003428 char *z = malloc( n );
3429 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003430 home_dir = z;
3431 }
drhe98d4fa2002-04-21 19:06:22 +00003432
drh67505e72002-04-19 12:34:06 +00003433 return home_dir;
3434}
3435
3436/*
3437** Read input from the file given by sqliterc_override. Or if that
3438** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003439**
3440** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003441*/
shane9bd1b442009-10-23 01:27:39 +00003442static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003443 struct callback_data *p, /* Configuration data */
3444 const char *sqliterc_override /* Name of config file. NULL to use default */
3445){
persicom7e2dfdd2002-04-18 02:46:52 +00003446 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003447 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003448 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003449 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003450 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003451
3452 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003453 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003454 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003455#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003456 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003457#endif
shane9bd1b442009-10-23 01:27:39 +00003458 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003459 }
drh2f3de322012-06-27 16:41:31 +00003460 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003461 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3462 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003463 }
drha1f9b5e2004-02-14 16:31:02 +00003464 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003465 if( in ){
drhc28490c2006-10-26 14:25:58 +00003466 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003467 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003468 }
shane9bd1b442009-10-23 01:27:39 +00003469 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003470 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003471 }
drh85e72432012-04-11 11:38:53 +00003472 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003473 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003474}
3475
drh67505e72002-04-19 12:34:06 +00003476/*
drhe1e38c42003-05-04 18:30:59 +00003477** Show available command line options
3478*/
3479static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003480 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003481 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003482 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003483 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003484 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003485 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003486 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003487 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003488#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3489 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3490#endif
drhcc3b4f82012-02-07 14:13:50 +00003491 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003492 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003493 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003494 " -line set output mode to 'line'\n"
3495 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003496 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003497#ifdef SQLITE_ENABLE_MULTIPLEX
3498 " -multiplex enable the multiplexor VFS\n"
3499#endif
drh98d312f2012-10-25 15:23:14 +00003500 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3501 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003502 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003503 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003504 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003505#ifdef SQLITE_ENABLE_VFSTRACE
3506 " -vfstrace enable tracing of all VFS calls\n"
3507#endif
drhe1e38c42003-05-04 18:30:59 +00003508;
3509static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003510 fprintf(stderr,
3511 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3512 "FILENAME is the name of an SQLite database. A new database is created\n"
3513 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003514 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003515 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003516 }else{
3517 fprintf(stderr, "Use the -help option for additional information\n");
3518 }
3519 exit(1);
3520}
3521
3522/*
drh67505e72002-04-19 12:34:06 +00003523** Initialize the state information in data
3524*/
drh0850b532006-01-31 19:31:43 +00003525static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003526 memset(data, 0, sizeof(*data));
3527 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003528 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003529 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003530 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003531 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003532 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3533 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003534 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003535}
3536
drh98d312f2012-10-25 15:23:14 +00003537/*
drh5c7976f2014-02-10 19:59:27 +00003538** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003539*/
3540#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003541static void printBold(const char *zText){
3542 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3543 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3544 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3545 SetConsoleTextAttribute(out,
3546 FOREGROUND_RED|FOREGROUND_INTENSITY
3547 );
3548 printf("%s", zText);
3549 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003550}
3551#else
drh5c7976f2014-02-10 19:59:27 +00003552static void printBold(const char *zText){
3553 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003554}
3555#endif
3556
3557/*
drh98d312f2012-10-25 15:23:14 +00003558** Get the argument to an --option. Throw an error and die if no argument
3559** is available.
3560*/
3561static char *cmdline_option_value(int argc, char **argv, int i){
3562 if( i==argc ){
3563 fprintf(stderr, "%s: Error: missing argument to %s\n",
3564 argv[0], argv[argc-1]);
3565 exit(1);
3566 }
3567 return argv[i];
3568}
3569
drh75897232000-05-29 14:26:00 +00003570int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003571 char *zErrMsg = 0;
3572 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003573 const char *zInitFile = 0;
3574 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003575 int i;
drhc28490c2006-10-26 14:25:58 +00003576 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003577 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003578
drh69b30ab2014-02-27 15:11:52 +00003579#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003580 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3581 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3582 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3583 exit(1);
3584 }
drhc7181902014-02-27 15:04:13 +00003585#endif
drhdaffd0e2001-04-11 14:28:42 +00003586 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003587 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003588 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003589
drh44c2eb12003-04-30 11:38:26 +00003590 /* Make sure we have a valid signal handler early, before anything
3591 ** else is done.
3592 */
drh4c504392000-10-16 22:06:40 +00003593#ifdef SIGINT
3594 signal(SIGINT, interrupt_handler);
3595#endif
drh44c2eb12003-04-30 11:38:26 +00003596
drh22fbcb82004-02-01 01:22:50 +00003597 /* Do an initial pass through the command-line argument to locate
3598 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003599 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003600 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003601 */
drh98d312f2012-10-25 15:23:14 +00003602 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003603 char *z;
drhc28490c2006-10-26 14:25:58 +00003604 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003605 if( z[0]!='-' ){
3606 if( data.zDbFilename==0 ){
3607 data.zDbFilename = z;
3608 continue;
3609 }
3610 if( zFirstCmd==0 ){
3611 zFirstCmd = z;
3612 continue;
3613 }
3614 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3615 fprintf(stderr,"Use -help for a list of options.\n");
3616 return 1;
3617 }
drhcc3b4f82012-02-07 14:13:50 +00003618 if( z[1]=='-' ) z++;
3619 if( strcmp(z,"-separator")==0
3620 || strcmp(z,"-nullvalue")==0
3621 || strcmp(z,"-cmd")==0
3622 ){
drh98d312f2012-10-25 15:23:14 +00003623 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003624 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003625 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003626 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003627 /* Need to check for batch mode here to so we can avoid printing
3628 ** informational messages (like from process_sqliterc) before
3629 ** we do the actual processing of arguments later in a second pass.
3630 */
shanef69573d2009-10-24 02:06:14 +00003631 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003632 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003633#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003634 const char *zSize;
3635 sqlite3_int64 szHeap;
3636
drh98d312f2012-10-25 15:23:14 +00003637 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003638 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003639 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003640 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3641#endif
drh97ae8ff2011-03-16 16:56:29 +00003642#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003643 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003644 extern int vfstrace_register(
3645 const char *zTraceName,
3646 const char *zOldVfsName,
3647 int (*xOut)(const char*,void*),
3648 void *pOutArg,
3649 int makeDefault
3650 );
drh2b625e22011-03-16 17:05:28 +00003651 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003652#endif
drh6f25e892011-07-08 17:02:57 +00003653#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003654 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003655 extern int sqlite3_multiple_initialize(const char*,int);
3656 sqlite3_multiplex_initialize(0, 1);
3657#endif
drh7d9f3942013-04-03 01:26:54 +00003658 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003659 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3660 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003661 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003662 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003663 if( pVfs ){
3664 sqlite3_vfs_register(pVfs, 1);
3665 }else{
3666 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3667 exit(1);
3668 }
drh44c2eb12003-04-30 11:38:26 +00003669 }
3670 }
drh98d312f2012-10-25 15:23:14 +00003671 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003672#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003673 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003674 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003675#else
shane86f5bdb2009-10-24 02:00:07 +00003676 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3677 return 1;
drh01b41712005-08-29 23:06:23 +00003678#endif
drhc7181902014-02-27 15:04:13 +00003679#ifdef SQLITE_SHELL_DBNAME_PROC
3680 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3681 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3682 warnInmemoryDb = 0; }
3683#endif
drh98d312f2012-10-25 15:23:14 +00003684 }
3685 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003686
drh44c2eb12003-04-30 11:38:26 +00003687 /* Go ahead and open the database file if it already exists. If the
3688 ** file does not exist, delay opening it. This prevents empty database
3689 ** files from being created if a user mistypes the database name argument
3690 ** to the sqlite command-line tool.
3691 */
drhc8d74412004-08-31 23:41:26 +00003692 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003693 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003694 }
3695
drh22fbcb82004-02-01 01:22:50 +00003696 /* Process the initialization file if there is one. If no -init option
3697 ** is given on the command line, look for a file named ~/.sqliterc and
3698 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003699 */
shane86f5bdb2009-10-24 02:00:07 +00003700 rc = process_sqliterc(&data,zInitFile);
3701 if( rc>0 ){
3702 return rc;
3703 }
drh44c2eb12003-04-30 11:38:26 +00003704
drh22fbcb82004-02-01 01:22:50 +00003705 /* Make a second pass through the command-line argument and set
3706 ** options. This second pass is delayed until after the initialization
3707 ** file is processed so that the command-line arguments will override
3708 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003709 */
drh98d312f2012-10-25 15:23:14 +00003710 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003711 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003712 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003713 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003714 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003715 i++;
3716 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003717 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003718 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003719 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003720 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003721 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003722 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003723 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003724 }else if( strcmp(z,"-csv")==0 ){
3725 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003726 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003727 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003728 sqlite3_snprintf(sizeof(data.separator), data.separator,
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,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003731 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003732 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003733 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003734 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003735 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003736 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003737 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003738 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00003739 }else if( strcmp(z,"-eqp")==0 ){
3740 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00003741 }else if( strcmp(z,"-stats")==0 ){
3742 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003743 }else if( strcmp(z,"-bail")==0 ){
3744 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003745 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003746 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003747 return 0;
drhc28490c2006-10-26 14:25:58 +00003748 }else if( strcmp(z,"-interactive")==0 ){
3749 stdin_is_interactive = 1;
3750 }else if( strcmp(z,"-batch")==0 ){
3751 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003752 }else if( strcmp(z,"-heap")==0 ){
3753 i++;
drh7d9f3942013-04-03 01:26:54 +00003754 }else if( strcmp(z,"-mmap")==0 ){
3755 i++;
drha7e61d82011-03-12 17:02:57 +00003756 }else if( strcmp(z,"-vfs")==0 ){
3757 i++;
drh6f25e892011-07-08 17:02:57 +00003758#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003759 }else if( strcmp(z,"-vfstrace")==0 ){
3760 i++;
drh6f25e892011-07-08 17:02:57 +00003761#endif
3762#ifdef SQLITE_ENABLE_MULTIPLEX
3763 }else if( strcmp(z,"-multiplex")==0 ){
3764 i++;
3765#endif
drhcc3b4f82012-02-07 14:13:50 +00003766 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003767 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003768 }else if( strcmp(z,"-cmd")==0 ){
3769 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003770 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003771 if( z[0]=='.' ){
3772 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003773 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003774 }else{
drh05782482013-10-24 15:20:20 +00003775 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003776 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3777 if( zErrMsg!=0 ){
3778 fprintf(stderr,"Error: %s\n", zErrMsg);
3779 if( bail_on_error ) return rc!=0 ? rc : 1;
3780 }else if( rc!=0 ){
3781 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3782 if( bail_on_error ) return rc;
3783 }
3784 }
drh1e5d0e92000-05-31 23:33:17 +00003785 }else{
shane86f5bdb2009-10-24 02:00:07 +00003786 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003787 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003788 return 1;
3789 }
3790 }
drh44c2eb12003-04-30 11:38:26 +00003791
drh22fbcb82004-02-01 01:22:50 +00003792 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003793 /* Run just the command that follows the database name
3794 */
drh22fbcb82004-02-01 01:22:50 +00003795 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003796 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003797 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003798 }else{
drh05782482013-10-24 15:20:20 +00003799 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003800 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003801 if( zErrMsg!=0 ){
3802 fprintf(stderr,"Error: %s\n", zErrMsg);
3803 return rc!=0 ? rc : 1;
3804 }else if( rc!=0 ){
3805 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3806 return rc;
drh6ff13852001-11-25 13:18:23 +00003807 }
drh75897232000-05-29 14:26:00 +00003808 }
3809 }else{
drh44c2eb12003-04-30 11:38:26 +00003810 /* Run commands received from standard input
3811 */
drhc28490c2006-10-26 14:25:58 +00003812 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003813 char *zHome;
3814 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003815 int nHistory;
drh75897232000-05-29 14:26:00 +00003816 printf(
drh743e0032011-12-12 16:51:50 +00003817 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00003818 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00003819 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003820 );
drhb3735912014-02-10 16:13:42 +00003821 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00003822 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00003823 printBold("transient in-memory database");
3824 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00003825 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00003826 }
drh67505e72002-04-19 12:34:06 +00003827 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003828 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003829 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003830 if( (zHistory = malloc(nHistory))!=0 ){
3831 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3832 }
drh67505e72002-04-19 12:34:06 +00003833 }
drhaaa21b42014-02-11 14:37:51 +00003834#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003835 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003836#endif
drhc28490c2006-10-26 14:25:58 +00003837 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003838 if( zHistory ){
3839 stifle_history(100);
3840 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003841 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003842 }
drhdaffd0e2001-04-11 14:28:42 +00003843 }else{
drhc28490c2006-10-26 14:25:58 +00003844 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003845 }
3846 }
drh33048c02001-10-01 14:29:22 +00003847 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003848 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003849 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003850 }
drh05782482013-10-24 15:20:20 +00003851 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003852 return rc;
drh75897232000-05-29 14:26:00 +00003853}