blob: b6733b7ce7964b7f514e0c8d45856fac6d3e167b [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
68#define access(f,m) _access((f),(m))
drh67ceaa62012-08-27 21:19:03 +000069#undef popen
drh53371f92013-07-25 17:07:03 +000070#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000071#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000072#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000073#else
drh4328c8b2003-04-26 02:50:11 +000074/* Make sure isatty() has a prototype.
75*/
drhb2acc3b2011-10-13 16:36:29 +000076extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000077
drh53371f92013-07-25 17:07:03 +000078/* popen and pclose are not C89 functions and so are sometimes omitted from
79** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000080extern FILE *popen(const char*,const char*);
81extern int pclose(FILE*);
82#endif
drh53371f92013-07-25 17:07:03 +000083
chw65d3c132007-11-12 21:09:10 +000084#if defined(_WIN32_WCE)
85/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
86 * thus we always assume that we have a console. That can be
87 * overridden with the -batch command line option.
88 */
89#define isatty(x) 1
90#endif
91
drhf0693c82011-10-11 20:41:54 +000092/* ctype macros that work with signed characters */
93#define IsSpace(X) isspace((unsigned char)X)
94#define IsDigit(X) isdigit((unsigned char)X)
95#define ToLower(X) (char)tolower((unsigned char)X)
96
drh43408312013-10-30 12:43:36 +000097
98/* True if the timer is enabled */
99static int enableTimer = 0;
100
101/* Return the current wall-clock time */
102static sqlite3_int64 timeOfDay(void){
103 static sqlite3_vfs *clockVfs = 0;
104 sqlite3_int64 t;
105 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
106 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
107 clockVfs->xCurrentTimeInt64(clockVfs, &t);
108 }else{
109 double r;
110 clockVfs->xCurrentTime(clockVfs, &r);
111 t = (sqlite3_int64)(r*86400000.0);
112 }
113 return t;
114}
115
drhd5d0f642013-02-20 00:54:21 +0000116#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
117 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000118#include <sys/time.h>
119#include <sys/resource.h>
120
drhda108222009-02-25 19:07:24 +0000121/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000122static struct rusage sBegin; /* CPU time at start */
123static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000124
drhda108222009-02-25 19:07:24 +0000125/*
126** Begin timing an operation
127*/
128static void beginTimer(void){
129 if( enableTimer ){
130 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000131 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000132 }
133}
134
135/* Return the difference of two time_structs in seconds */
136static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
137 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
138 (double)(pEnd->tv_sec - pStart->tv_sec);
139}
140
141/*
142** Print the timing results.
143*/
144static void endTimer(void){
145 if( enableTimer ){
146 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000147 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000148 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000149 printf("Run Time: real %.3f user %f sys %f\n",
150 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000151 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
152 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
153 }
154}
shaneb320ccd2009-10-21 03:42:58 +0000155
drhda108222009-02-25 19:07:24 +0000156#define BEGIN_TIMER beginTimer()
157#define END_TIMER endTimer()
158#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000159
160#elif (defined(_WIN32) || defined(WIN32))
161
162#include <windows.h>
163
164/* Saved resource information for the beginning of an operation */
165static HANDLE hProcess;
166static FILETIME ftKernelBegin;
167static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000168static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000169typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
170static GETPROCTIMES getProcessTimesAddr = NULL;
171
shaneb320ccd2009-10-21 03:42:58 +0000172/*
173** Check to see if we have timer support. Return 1 if necessary
174** support found (or found previously).
175*/
176static int hasTimer(void){
177 if( getProcessTimesAddr ){
178 return 1;
179 } else {
180 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
181 ** See if the version we are running on has it, and if it does, save off
182 ** a pointer to it and the current process handle.
183 */
184 hProcess = GetCurrentProcess();
185 if( hProcess ){
186 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
187 if( NULL != hinstLib ){
188 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
189 if( NULL != getProcessTimesAddr ){
190 return 1;
191 }
192 FreeLibrary(hinstLib);
193 }
194 }
195 }
196 return 0;
197}
198
199/*
200** Begin timing an operation
201*/
202static void beginTimer(void){
203 if( enableTimer && getProcessTimesAddr ){
204 FILETIME ftCreation, ftExit;
205 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000206 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000207 }
208}
209
210/* Return the difference of two FILETIME structs in seconds */
211static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
212 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
213 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
214 return (double) ((i64End - i64Start) / 10000000.0);
215}
216
217/*
218** Print the timing results.
219*/
220static void endTimer(void){
221 if( enableTimer && getProcessTimesAddr){
222 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000223 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000224 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000225 printf("Run Time: real %.3f user %f sys %f\n",
226 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000227 timeDiff(&ftUserBegin, &ftUserEnd),
228 timeDiff(&ftKernelBegin, &ftKernelEnd));
229 }
230}
231
232#define BEGIN_TIMER beginTimer()
233#define END_TIMER endTimer()
234#define HAS_TIMER hasTimer()
235
drhda108222009-02-25 19:07:24 +0000236#else
237#define BEGIN_TIMER
238#define END_TIMER
239#define HAS_TIMER 0
240#endif
241
shanec0688ea2009-03-05 03:48:06 +0000242/*
243** Used to prevent warnings about unused parameters
244*/
245#define UNUSED_PARAMETER(x) (void)(x)
246
drhe91d16b2008-12-08 18:27:31 +0000247/*
drhc49f44e2006-10-26 18:15:42 +0000248** If the following flag is set, then command execution stops
249** at an error if we are not interactive.
250*/
251static int bail_on_error = 0;
252
253/*
drhc28490c2006-10-26 14:25:58 +0000254** Threat stdin as an interactive input if the following variable
255** is true. Otherwise, assume stdin is connected to a file or pipe.
256*/
257static int stdin_is_interactive = 1;
258
259/*
drh4c504392000-10-16 22:06:40 +0000260** The following is the open SQLite database. We make a pointer
261** to this database a static variable so that it can be accessed
262** by the SIGINT handler to interrupt database processing.
263*/
danielk197792f9a1b2004-06-19 09:08:16 +0000264static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000265
266/*
drh67505e72002-04-19 12:34:06 +0000267** True if an interrupt (Control-C) has been received.
268*/
drh43617e92006-03-06 20:55:46 +0000269static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000270
271/*
persicom7e2dfdd2002-04-18 02:46:52 +0000272** This is the name of our program. It is set in main(), used
273** in a number of other places, mostly for error messages.
274*/
275static char *Argv0;
276
277/*
278** Prompt strings. Initialized in main. Settable with
279** .prompt main continue
280*/
281static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
282static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
283
drhb0603412007-02-28 04:47:26 +0000284/*
285** Write I/O traces to the following stream.
286*/
rsebe0a9092007-07-30 18:24:38 +0000287#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000288static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000289#endif
drhb0603412007-02-28 04:47:26 +0000290
291/*
292** This routine works like printf in that its first argument is a
293** format string and subsequent arguments are values to be substituted
294** in place of % fields. The result of formatting this string
295** is written to iotrace.
296*/
rsebe0a9092007-07-30 18:24:38 +0000297#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000298static void iotracePrintf(const char *zFormat, ...){
299 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000300 char *z;
drhb0603412007-02-28 04:47:26 +0000301 if( iotrace==0 ) return;
302 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000303 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000304 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000305 fprintf(iotrace, "%s", z);
306 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000307}
rsebe0a9092007-07-30 18:24:38 +0000308#endif
drhb0603412007-02-28 04:47:26 +0000309
drh44c2eb12003-04-30 11:38:26 +0000310
persicom7e2dfdd2002-04-18 02:46:52 +0000311/*
drh83965662003-04-17 02:54:13 +0000312** Determines if a string is a number of not.
313*/
danielk19772e588c72005-12-09 14:25:08 +0000314static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000315 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000316 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000317 return 0;
318 }
319 z++;
320 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000321 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000322 if( *z=='.' ){
323 z++;
drhf0693c82011-10-11 20:41:54 +0000324 if( !IsDigit(*z) ) return 0;
325 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000326 if( realnum ) *realnum = 1;
327 }
328 if( *z=='e' || *z=='E' ){
329 z++;
330 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000331 if( !IsDigit(*z) ) return 0;
332 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000333 if( realnum ) *realnum = 1;
334 }
335 return *z==0;
336}
drh83965662003-04-17 02:54:13 +0000337
338/*
danielk1977bc6ada42004-06-30 08:20:16 +0000339** A global char* and an SQL function to access its current value
340** from within an SQL statement. This program used to use the
341** sqlite_exec_printf() API to substitue a string into an SQL statement.
342** The correct way to do this with sqlite3 is to use the bind API, but
343** since the shell is built around the callback paradigm it would be a lot
344** of work. Instead just use this hack, which is quite harmless.
345*/
346static const char *zShellStatic = 0;
347static void shellstaticFunc(
348 sqlite3_context *context,
349 int argc,
350 sqlite3_value **argv
351){
352 assert( 0==argc );
353 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000354 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000355 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000356 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
357}
358
359
360/*
drhfeac5f82004-08-01 00:10:45 +0000361** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000362** the text in memory obtained from malloc() and returns a pointer
363** to the text. NULL is returned at end of file, or if malloc()
364** fails.
365**
drh9f099fd2013-08-06 14:01:46 +0000366** If zLine is not NULL then it is a malloced buffer returned from
367** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000368*/
drh9f099fd2013-08-06 14:01:46 +0000369static char *local_getline(char *zLine, FILE *in){
370 int nLine = zLine==0 ? 0 : 100;
371 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000372
drhb07028f2011-10-14 21:49:18 +0000373 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000374 if( n+100>nLine ){
375 nLine = nLine*2 + 100;
376 zLine = realloc(zLine, nLine);
377 if( zLine==0 ) return 0;
378 }
drhdaffd0e2001-04-11 14:28:42 +0000379 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000380 if( n==0 ){
381 free(zLine);
382 return 0;
383 }
384 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000385 break;
386 }
drh9f099fd2013-08-06 14:01:46 +0000387 while( zLine[n] ) n++;
388 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000389 n--;
shaneh13b36022009-12-17 21:07:15 +0000390 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000391 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000392 break;
drh8e7e7a22000-05-30 18:45:23 +0000393 }
394 }
drh8e7e7a22000-05-30 18:45:23 +0000395 return zLine;
396}
397
398/*
drhc28490c2006-10-26 14:25:58 +0000399** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000400**
drh9f099fd2013-08-06 14:01:46 +0000401** If in==0 then read from standard input and prompt before each line.
402** If isContinuation is true, then a continuation prompt is appropriate.
403** If isContinuation is zero, then the main prompt should be used.
404**
405** If zPrior is not NULL then it is a buffer from a prior call to this
406** routine that can be reused.
407**
408** The result is stored in space obtained from malloc() and must either
409** be freed by the caller or else passed back into this routine via the
410** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000411*/
drh9f099fd2013-08-06 14:01:46 +0000412static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000413 char *zPrompt;
414 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000415 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000416 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000417 }else{
drh9f099fd2013-08-06 14:01:46 +0000418 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000419#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000420 free(zPrior);
421 zResult = readline(zPrompt);
422 if( zResult && *zResult ) add_history(zResult);
423#else
424 printf("%s", zPrompt);
425 fflush(stdout);
426 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000427#endif
drh9f099fd2013-08-06 14:01:46 +0000428 }
drh8e7e7a22000-05-30 18:45:23 +0000429 return zResult;
430}
431
persicom7e2dfdd2002-04-18 02:46:52 +0000432struct previous_mode_data {
433 int valid; /* Is there legit data in here? */
434 int mode;
435 int showHeader;
436 int colWidth[100];
437};
drh45e29d82006-11-20 16:21:10 +0000438
drh8e7e7a22000-05-30 18:45:23 +0000439/*
drh75897232000-05-29 14:26:00 +0000440** An pointer to an instance of this structure is passed from
441** the main program to the callback. This is used to communicate
442** state and mode information.
443*/
444struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000445 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000446 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000447 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000448 int cnt; /* Number of records displayed so far */
449 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000450 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000451 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000452 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000453 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000454 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000455 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000456 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000457 int colWidth[100]; /* Requested width of each column when in column mode*/
458 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000459 char nullvalue[20]; /* The text to print when a NULL comes back from
460 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000461 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000462 /* Holds the mode information just before
463 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000464 char outfile[FILENAME_MAX]; /* Filename for *out */
465 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000466 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000467 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000468 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000469 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000470 int *aiIndent; /* Array of indents used in MODE_Explain */
471 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000472 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000473};
474
475/*
476** These are the allowed modes.
477*/
drh967e8b72000-06-21 13:59:10 +0000478#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000479#define MODE_Column 1 /* One record per line in neat columns */
480#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000481#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
482#define MODE_Html 4 /* Generate an XHTML table */
483#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000484#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000485#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000486#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000487
drh66ce4d02008-02-15 17:38:06 +0000488static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000489 "line",
490 "column",
491 "list",
492 "semi",
493 "html",
drhfeac5f82004-08-01 00:10:45 +0000494 "insert",
495 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000496 "csv",
drh66ce4d02008-02-15 17:38:06 +0000497 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000498};
drh75897232000-05-29 14:26:00 +0000499
500/*
501** Number of elements in an array
502*/
drh902b9ee2008-12-05 17:17:07 +0000503#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000504
505/*
drhea678832008-12-10 19:26:22 +0000506** Compute a string length that is limited to what can be stored in
507** lower 30 bits of a 32-bit signed integer.
508*/
drh4f21c4a2008-12-10 22:15:00 +0000509static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000510 const char *z2 = z;
511 while( *z2 ){ z2++; }
512 return 0x3fffffff & (int)(z2 - z);
513}
514
515/*
drh127f9d72010-02-23 01:47:00 +0000516** A callback for the sqlite3_log() interface.
517*/
518static void shellLog(void *pArg, int iErrCode, const char *zMsg){
519 struct callback_data *p = (struct callback_data*)pArg;
520 if( p->pLog==0 ) return;
521 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
522 fflush(p->pLog);
523}
524
525/*
shane626a6e42009-10-22 17:30:15 +0000526** Output the given string as a hex-encoded blob (eg. X'1234' )
527*/
528static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
529 int i;
530 char *zBlob = (char *)pBlob;
531 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000532 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000533 fprintf(out,"'");
534}
535
536/*
drh28bd4bc2000-06-15 15:57:22 +0000537** Output the given string as a quoted string using SQL quoting conventions.
538*/
539static void output_quoted_string(FILE *out, const char *z){
540 int i;
541 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000542 for(i=0; z[i]; i++){
543 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000544 }
545 if( nSingle==0 ){
546 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000547 }else{
548 fprintf(out,"'");
549 while( *z ){
550 for(i=0; z[i] && z[i]!='\''; i++){}
551 if( i==0 ){
552 fprintf(out,"''");
553 z++;
554 }else if( z[i]=='\'' ){
555 fprintf(out,"%.*s''",i,z);
556 z += i+1;
557 }else{
drhcd7d2732002-02-26 23:24:26 +0000558 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000559 break;
560 }
561 }
drhcd7d2732002-02-26 23:24:26 +0000562 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000563 }
564}
565
566/*
drhfeac5f82004-08-01 00:10:45 +0000567** Output the given string as a quoted according to C or TCL quoting rules.
568*/
569static void output_c_string(FILE *out, const char *z){
570 unsigned int c;
571 fputc('"', out);
572 while( (c = *(z++))!=0 ){
573 if( c=='\\' ){
574 fputc(c, out);
575 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000576 }else if( c=='"' ){
577 fputc('\\', out);
578 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000579 }else if( c=='\t' ){
580 fputc('\\', out);
581 fputc('t', out);
582 }else if( c=='\n' ){
583 fputc('\\', out);
584 fputc('n', out);
585 }else if( c=='\r' ){
586 fputc('\\', out);
587 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000588 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000589 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000590 }else{
591 fputc(c, out);
592 }
593 }
594 fputc('"', out);
595}
596
597/*
drhc08a4f12000-06-15 16:49:48 +0000598** Output the given string with characters that are special to
599** HTML escaped.
600*/
601static void output_html_string(FILE *out, const char *z){
602 int i;
drhc3d6ba42014-01-13 20:38:35 +0000603 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000604 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000605 for(i=0; z[i]
606 && z[i]!='<'
607 && z[i]!='&'
608 && z[i]!='>'
609 && z[i]!='\"'
610 && z[i]!='\'';
611 i++){}
drhc08a4f12000-06-15 16:49:48 +0000612 if( i>0 ){
613 fprintf(out,"%.*s",i,z);
614 }
615 if( z[i]=='<' ){
616 fprintf(out,"&lt;");
617 }else if( z[i]=='&' ){
618 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000619 }else if( z[i]=='>' ){
620 fprintf(out,"&gt;");
621 }else if( z[i]=='\"' ){
622 fprintf(out,"&quot;");
623 }else if( z[i]=='\'' ){
624 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000625 }else{
626 break;
627 }
628 z += i + 1;
629 }
630}
631
632/*
drhc49f44e2006-10-26 18:15:42 +0000633** If a field contains any character identified by a 1 in the following
634** array, then the string must be quoted for CSV.
635*/
636static const char needCsvQuote[] = {
637 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
638 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
639 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653};
654
655/*
drh8e64d1c2004-10-07 00:32:39 +0000656** Output a single term of CSV. Actually, p->separator is used for
657** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000658** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000659*/
660static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000661 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000662 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000663 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000664 }else{
drhc49f44e2006-10-26 18:15:42 +0000665 int i;
drh4f21c4a2008-12-10 22:15:00 +0000666 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000667 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000668 if( needCsvQuote[((unsigned char*)z)[i]]
669 || (z[i]==p->separator[0] &&
670 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000671 i = 0;
672 break;
673 }
674 }
675 if( i==0 ){
676 putc('"', out);
677 for(i=0; z[i]; i++){
678 if( z[i]=='"' ) putc('"', out);
679 putc(z[i], out);
680 }
681 putc('"', out);
682 }else{
683 fprintf(out, "%s", z);
684 }
drh8e64d1c2004-10-07 00:32:39 +0000685 }
686 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000687 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000688 }
689}
690
danielk19774af00c62005-01-23 23:43:21 +0000691#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000692/*
drh4c504392000-10-16 22:06:40 +0000693** This routine runs when the user presses Ctrl-C
694*/
695static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000696 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000697 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000698 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000699}
danielk19774af00c62005-01-23 23:43:21 +0000700#endif
drh4c504392000-10-16 22:06:40 +0000701
702/*
shane626a6e42009-10-22 17:30:15 +0000703** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000704** invokes for each row of a query result.
705*/
shane626a6e42009-10-22 17:30:15 +0000706static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000707 int i;
708 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000709
drh75897232000-05-29 14:26:00 +0000710 switch( p->mode ){
711 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000712 int w = 5;
drh6a535342001-10-19 16:44:56 +0000713 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000714 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000715 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000716 if( len>w ) w = len;
717 }
drh75897232000-05-29 14:26:00 +0000718 if( p->cnt++>0 ) fprintf(p->out,"\n");
719 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000720 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000721 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000722 }
723 break;
724 }
danielk19770d78bae2008-01-03 07:09:48 +0000725 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000726 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000727 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000728 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000729 int w, n;
730 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000731 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000732 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000733 w = 0;
drh75897232000-05-29 14:26:00 +0000734 }
drh078b1fd2012-09-21 13:40:02 +0000735 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000736 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000737 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000738 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000739 if( w<n ) w = n;
740 }
741 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000742 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000743 }
744 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000745 if( w<0 ){
746 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
747 }else{
748 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
749 }
drha0c66f52000-07-29 13:20:21 +0000750 }
751 }
752 if( p->showHeader ){
753 for(i=0; i<nArg; i++){
754 int w;
755 if( i<ArraySize(p->actualWidth) ){
756 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000757 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000758 }else{
759 w = 10;
760 }
761 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
762 "----------------------------------------------------------",
763 i==nArg-1 ? "\n": " ");
764 }
drh75897232000-05-29 14:26:00 +0000765 }
766 }
drh6a535342001-10-19 16:44:56 +0000767 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000768 for(i=0; i<nArg; i++){
769 int w;
drha0c66f52000-07-29 13:20:21 +0000770 if( i<ArraySize(p->actualWidth) ){
771 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000772 }else{
773 w = 10;
774 }
dana98bf362013-11-13 18:35:01 +0000775 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000776 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000777 }
dana98bf362013-11-13 18:35:01 +0000778 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000779 if( p->iIndent<p->nIndent ){
780 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000781 }
danc4650bb2013-11-18 08:41:06 +0000782 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000783 }
drh078b1fd2012-09-21 13:40:02 +0000784 if( w<0 ){
785 fprintf(p->out,"%*.*s%s",-w,-w,
786 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
787 }else{
788 fprintf(p->out,"%-*.*s%s",w,w,
789 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
790 }
drh75897232000-05-29 14:26:00 +0000791 }
792 break;
793 }
drhe3710332000-09-29 13:30:53 +0000794 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000795 case MODE_List: {
796 if( p->cnt++==0 && p->showHeader ){
797 for(i=0; i<nArg; i++){
798 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
799 }
800 }
drh6a535342001-10-19 16:44:56 +0000801 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000802 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000803 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000804 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000805 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000806 if( i<nArg-1 ){
807 fprintf(p->out, "%s", p->separator);
808 }else if( p->mode==MODE_Semi ){
809 fprintf(p->out, ";\n");
810 }else{
811 fprintf(p->out, "\n");
812 }
drh75897232000-05-29 14:26:00 +0000813 }
814 break;
815 }
drh1e5d0e92000-05-31 23:33:17 +0000816 case MODE_Html: {
817 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000818 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000819 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000820 fprintf(p->out,"<TH>");
821 output_html_string(p->out, azCol[i]);
822 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000823 }
mihailim57c591a2008-06-23 21:26:05 +0000824 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000825 }
drh6a535342001-10-19 16:44:56 +0000826 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000827 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000828 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000829 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000830 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000831 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000832 }
mihailim57c591a2008-06-23 21:26:05 +0000833 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000834 break;
835 }
drhfeac5f82004-08-01 00:10:45 +0000836 case MODE_Tcl: {
837 if( p->cnt++==0 && p->showHeader ){
838 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000839 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000840 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000841 }
842 fprintf(p->out,"\n");
843 }
844 if( azArg==0 ) break;
845 for(i=0; i<nArg; i++){
846 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000847 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000848 }
849 fprintf(p->out,"\n");
850 break;
851 }
drh8e64d1c2004-10-07 00:32:39 +0000852 case MODE_Csv: {
853 if( p->cnt++==0 && p->showHeader ){
854 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000855 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000856 }
857 fprintf(p->out,"\n");
858 }
859 if( azArg==0 ) break;
860 for(i=0; i<nArg; i++){
861 output_csv(p, azArg[i], i<nArg-1);
862 }
863 fprintf(p->out,"\n");
864 break;
865 }
drh28bd4bc2000-06-15 15:57:22 +0000866 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000867 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000868 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000869 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000870 for(i=0; i<nArg; i++){
871 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000872 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000873 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000874 }else if( aiType && aiType[i]==SQLITE_TEXT ){
875 if( zSep[0] ) fprintf(p->out,"%s",zSep);
876 output_quoted_string(p->out, azArg[i]);
877 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
878 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000879 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
880 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
881 int nBlob = sqlite3_column_bytes(p->pStmt, i);
882 if( zSep[0] ) fprintf(p->out,"%s",zSep);
883 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000884 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000885 fprintf(p->out,"%s%s",zSep, azArg[i]);
886 }else{
887 if( zSep[0] ) fprintf(p->out,"%s",zSep);
888 output_quoted_string(p->out, azArg[i]);
889 }
890 }
891 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000892 break;
drh28bd4bc2000-06-15 15:57:22 +0000893 }
persicom1d0b8722002-04-18 02:53:04 +0000894 }
drh75897232000-05-29 14:26:00 +0000895 return 0;
896}
897
898/*
shane626a6e42009-10-22 17:30:15 +0000899** This is the callback routine that the SQLite library
900** invokes for each row of a query result.
901*/
902static int callback(void *pArg, int nArg, char **azArg, char **azCol){
903 /* since we don't have type info, call the shell_callback with a NULL value */
904 return shell_callback(pArg, nArg, azArg, azCol, NULL);
905}
906
907/*
drh33048c02001-10-01 14:29:22 +0000908** Set the destination table field of the callback_data structure to
909** the name of the table given. Escape any quote characters in the
910** table name.
911*/
912static void set_table_name(struct callback_data *p, const char *zName){
913 int i, n;
914 int needQuote;
915 char *z;
916
917 if( p->zDestTable ){
918 free(p->zDestTable);
919 p->zDestTable = 0;
920 }
921 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000922 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000923 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000924 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000925 needQuote = 1;
926 if( zName[i]=='\'' ) n++;
927 }
928 }
929 if( needQuote ) n += 2;
930 z = p->zDestTable = malloc( n+1 );
931 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000932 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000933 exit(1);
934 }
935 n = 0;
936 if( needQuote ) z[n++] = '\'';
937 for(i=0; zName[i]; i++){
938 z[n++] = zName[i];
939 if( zName[i]=='\'' ) z[n++] = '\'';
940 }
941 if( needQuote ) z[n++] = '\'';
942 z[n] = 0;
943}
944
danielk19772a02e332004-06-05 08:04:36 +0000945/* zIn is either a pointer to a NULL-terminated string in memory obtained
946** from malloc(), or a NULL pointer. The string pointed to by zAppend is
947** added to zIn, and the result returned in memory obtained from malloc().
948** zIn, if it was not NULL, is freed.
949**
950** If the third argument, quote, is not '\0', then it is used as a
951** quote character for zAppend.
952*/
drhc28490c2006-10-26 14:25:58 +0000953static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000954 int len;
955 int i;
drh4f21c4a2008-12-10 22:15:00 +0000956 int nAppend = strlen30(zAppend);
957 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000958
959 len = nAppend+nIn+1;
960 if( quote ){
961 len += 2;
962 for(i=0; i<nAppend; i++){
963 if( zAppend[i]==quote ) len++;
964 }
965 }
966
967 zIn = (char *)realloc(zIn, len);
968 if( !zIn ){
969 return 0;
970 }
971
972 if( quote ){
973 char *zCsr = &zIn[nIn];
974 *zCsr++ = quote;
975 for(i=0; i<nAppend; i++){
976 *zCsr++ = zAppend[i];
977 if( zAppend[i]==quote ) *zCsr++ = quote;
978 }
979 *zCsr++ = quote;
980 *zCsr++ = '\0';
981 assert( (zCsr-zIn)==len );
982 }else{
983 memcpy(&zIn[nIn], zAppend, nAppend);
984 zIn[len-1] = '\0';
985 }
986
987 return zIn;
988}
989
drhdd3d4592004-08-30 01:54:05 +0000990
991/*
drhb21a8e42012-01-28 21:08:51 +0000992** Execute a query statement that will generate SQL output. Print
993** the result columns, comma-separated, on a line and then add a
994** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +0000995**
drhb21a8e42012-01-28 21:08:51 +0000996** If the number of columns is 1 and that column contains text "--"
997** then write the semicolon on a separate line. That way, if a
998** "--" comment occurs at the end of the statement, the comment
999** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001000*/
drh157e29a2009-05-21 15:15:00 +00001001static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001002 struct callback_data *p, /* Query context */
1003 const char *zSelect, /* SELECT statement to extract content */
1004 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001005){
drhdd3d4592004-08-30 01:54:05 +00001006 sqlite3_stmt *pSelect;
1007 int rc;
drhb21a8e42012-01-28 21:08:51 +00001008 int nResult;
1009 int i;
1010 const char *z;
drh2f464a02011-10-13 00:41:49 +00001011 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001012 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001013 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001014 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001015 return rc;
1016 }
1017 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001018 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001019 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001020 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001021 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001022 zFirstRow = 0;
1023 }
drhb21a8e42012-01-28 21:08:51 +00001024 z = (const char*)sqlite3_column_text(pSelect, 0);
1025 fprintf(p->out, "%s", z);
1026 for(i=1; i<nResult; i++){
1027 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1028 }
1029 if( z==0 ) z = "";
1030 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1031 if( z[0] ){
1032 fprintf(p->out, "\n;\n");
1033 }else{
1034 fprintf(p->out, ";\n");
1035 }
drhdd3d4592004-08-30 01:54:05 +00001036 rc = sqlite3_step(pSelect);
1037 }
drh2f464a02011-10-13 00:41:49 +00001038 rc = sqlite3_finalize(pSelect);
1039 if( rc!=SQLITE_OK ){
1040 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001041 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001042 }
1043 return rc;
drhdd3d4592004-08-30 01:54:05 +00001044}
1045
shane626a6e42009-10-22 17:30:15 +00001046/*
1047** Allocate space and save off current error string.
1048*/
1049static char *save_err_msg(
1050 sqlite3 *db /* Database to query */
1051){
1052 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1053 char *zErrMsg = sqlite3_malloc(nErrMsg);
1054 if( zErrMsg ){
1055 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1056 }
1057 return zErrMsg;
1058}
1059
1060/*
shaneh642d8b82010-07-28 16:05:34 +00001061** Display memory stats.
1062*/
1063static int display_stats(
1064 sqlite3 *db, /* Database to query */
1065 struct callback_data *pArg, /* Pointer to struct callback_data */
1066 int bReset /* True to reset the stats */
1067){
1068 int iCur;
1069 int iHiwtr;
1070
1071 if( pArg && pArg->out ){
1072
1073 iHiwtr = iCur = -1;
1074 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001075 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001076 iHiwtr = iCur = -1;
1077 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001078 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001079/*
1080** Not currently used by the CLI.
1081** iHiwtr = iCur = -1;
1082** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1083** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1084*/
1085 iHiwtr = iCur = -1;
1086 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1087 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1088/*
1089** Not currently used by the CLI.
1090** iHiwtr = iCur = -1;
1091** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1092** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1093*/
1094 iHiwtr = iCur = -1;
1095 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1096 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1097 iHiwtr = iCur = -1;
1098 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1099 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1100 iHiwtr = iCur = -1;
1101 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1102 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1106#ifdef YYTRACKMAXSTACKDEPTH
1107 iHiwtr = iCur = -1;
1108 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1109 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1110#endif
1111 }
1112
1113 if( pArg && pArg->out && db ){
1114 iHiwtr = iCur = -1;
1115 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1116 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001117 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1118 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1119 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1120 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1121 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1122 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001123 iHiwtr = iCur = -1;
1124 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001125 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1126 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1127 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1128 iHiwtr = iCur = -1;
1129 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1130 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001131 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001132 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1133 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1134 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1137 iHiwtr = iCur = -1;
1138 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1140 }
1141
1142 if( pArg && pArg->out && db && pArg->pStmt ){
1143 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1144 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1145 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1146 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1147 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1148 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001149 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1150 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001151 }
1152
1153 return 0;
1154}
1155
1156/*
dana98bf362013-11-13 18:35:01 +00001157** Parameter azArray points to a zero-terminated array of strings. zStr
1158** points to a single nul-terminated string. Return non-zero if zStr
1159** is equal, according to strcmp(), to any of the strings in the array.
1160** Otherwise, return zero.
1161*/
1162static int str_in_array(const char *zStr, const char **azArray){
1163 int i;
1164 for(i=0; azArray[i]; i++){
1165 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1166 }
1167 return 0;
1168}
1169
1170/*
1171** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1172** and populate the callback_data.aiIndent[] array with the number of
1173** spaces each opcode should be indented before it is output.
1174**
1175** The indenting rules are:
1176**
1177** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1178** all opcodes that occur between the p2 jump destination and the opcode
1179** itself by 2 spaces.
1180**
drh01752bc2013-11-14 23:59:33 +00001181** * For each "Goto", if the jump destination is earlier in the program
1182** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001183** Yield SeekGt SeekLt RowSetRead Rewind
drh01752bc2013-11-14 23:59:33 +00001184** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001185** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001186*/
1187static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1188 const char *zSql; /* The text of the SQL statement */
1189 const char *z; /* Used to check if this is an EXPLAIN */
1190 int *abYield = 0; /* True if op is an OP_Yield */
1191 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001192 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001193
drh602320e2013-11-15 03:16:34 +00001194 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
drhe73f0592014-01-21 22:25:45 +00001195 const char *azYield[] = { "Yield", "SeekLt", "SeekGt", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001196 const char *azGoto[] = { "Goto", 0 };
1197
1198 /* Try to figure out if this is really an EXPLAIN statement. If this
1199 ** cannot be verified, return early. */
1200 zSql = sqlite3_sql(pSql);
1201 if( zSql==0 ) return;
1202 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1203 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1204
1205 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1206 int i;
danc4650bb2013-11-18 08:41:06 +00001207 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001208 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001209
1210 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1211 ** p2 is an instruction address, set variable p2op to the index of that
1212 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1213 ** the current instruction is part of a sub-program generated by an
1214 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001215 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001216 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001217
1218 /* Grow the p->aiIndent array as required */
1219 if( iOp>=nAlloc ){
1220 nAlloc += 100;
1221 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1222 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1223 }
1224 abYield[iOp] = str_in_array(zOp, azYield);
1225 p->aiIndent[iOp] = 0;
1226 p->nIndent = iOp+1;
1227
1228 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001229 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001230 }
danc4650bb2013-11-18 08:41:06 +00001231 if( str_in_array(zOp, azGoto) && p2op<p->nIndent && abYield[p2op] ){
drhe73f0592014-01-21 22:25:45 +00001232 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001233 }
1234 }
1235
danc4650bb2013-11-18 08:41:06 +00001236 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001237 sqlite3_free(abYield);
1238 sqlite3_reset(pSql);
1239}
1240
1241/*
1242** Free the array allocated by explain_data_prepare().
1243*/
1244static void explain_data_delete(struct callback_data *p){
1245 sqlite3_free(p->aiIndent);
1246 p->aiIndent = 0;
1247 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001248 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001249}
1250
1251/*
shane626a6e42009-10-22 17:30:15 +00001252** Execute a statement or set of statements. Print
1253** any result rows/columns depending on the current mode
1254** set via the supplied callback.
1255**
1256** This is very similar to SQLite's built-in sqlite3_exec()
1257** function except it takes a slightly different callback
1258** and callback data argument.
1259*/
1260static int shell_exec(
1261 sqlite3 *db, /* An open database */
1262 const char *zSql, /* SQL to be evaluated */
1263 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1264 /* (not the same as sqlite3_exec) */
1265 struct callback_data *pArg, /* Pointer to struct callback_data */
1266 char **pzErrMsg /* Error msg written here */
1267){
dan4564ced2010-01-05 04:59:56 +00001268 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1269 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001270 int rc2;
dan4564ced2010-01-05 04:59:56 +00001271 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001272
1273 if( pzErrMsg ){
1274 *pzErrMsg = NULL;
1275 }
1276
shaneb9fc17d2009-10-22 21:23:35 +00001277 while( zSql[0] && (SQLITE_OK == rc) ){
1278 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1279 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001280 if( pzErrMsg ){
1281 *pzErrMsg = save_err_msg(db);
1282 }
1283 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001284 if( !pStmt ){
1285 /* this happens for a comment or white-space */
1286 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001287 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001288 continue;
1289 }
shane626a6e42009-10-22 17:30:15 +00001290
shaneh642d8b82010-07-28 16:05:34 +00001291 /* save off the prepared statment handle and reset row count */
1292 if( pArg ){
1293 pArg->pStmt = pStmt;
1294 pArg->cnt = 0;
1295 }
1296
shanehb7977c52010-01-18 18:17:10 +00001297 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001298 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001299 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001300 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001301 }
shanehb7977c52010-01-18 18:17:10 +00001302
drh7e02e5e2011-12-06 19:44:51 +00001303 /* Output TESTCTRL_EXPLAIN text of requested */
1304 if( pArg && pArg->mode==MODE_Explain ){
1305 const char *zExplain = 0;
1306 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1307 if( zExplain && zExplain[0] ){
1308 fprintf(pArg->out, "%s", zExplain);
1309 }
1310 }
1311
dana98bf362013-11-13 18:35:01 +00001312 /* If the shell is currently in ".explain" mode, gather the extra
1313 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001314 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001315 explain_data_prepare(pArg, pStmt);
1316 }
1317
shaneb9fc17d2009-10-22 21:23:35 +00001318 /* perform the first step. this will tell us if we
1319 ** have a result set or not and how wide it is.
1320 */
1321 rc = sqlite3_step(pStmt);
1322 /* if we have a result set... */
1323 if( SQLITE_ROW == rc ){
1324 /* if we have a callback... */
1325 if( xCallback ){
1326 /* allocate space for col name ptr, value ptr, and type */
1327 int nCol = sqlite3_column_count(pStmt);
1328 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1329 if( !pData ){
1330 rc = SQLITE_NOMEM;
1331 }else{
1332 char **azCols = (char **)pData; /* Names of result columns */
1333 char **azVals = &azCols[nCol]; /* Results */
1334 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001335 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001336 assert(sizeof(int) <= sizeof(char *));
1337 /* save off ptrs to column names */
1338 for(i=0; i<nCol; i++){
1339 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1340 }
shaneb9fc17d2009-10-22 21:23:35 +00001341 do{
1342 /* extract the data and data types */
1343 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001344 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001345 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001346 azVals[i] = "";
1347 }else{
1348 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1349 }
shaneb9fc17d2009-10-22 21:23:35 +00001350 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1351 rc = SQLITE_NOMEM;
1352 break; /* from for */
1353 }
1354 } /* end for */
1355
1356 /* if data and types extracted successfully... */
1357 if( SQLITE_ROW == rc ){
1358 /* call the supplied callback with the result row data */
1359 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1360 rc = SQLITE_ABORT;
1361 }else{
1362 rc = sqlite3_step(pStmt);
1363 }
1364 }
1365 } while( SQLITE_ROW == rc );
1366 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001367 }
1368 }else{
1369 do{
1370 rc = sqlite3_step(pStmt);
1371 } while( rc == SQLITE_ROW );
1372 }
1373 }
1374
dana98bf362013-11-13 18:35:01 +00001375 explain_data_delete(pArg);
1376
shaneh642d8b82010-07-28 16:05:34 +00001377 /* print usage stats if stats on */
1378 if( pArg && pArg->statsOn ){
1379 display_stats(db, pArg, 0);
1380 }
1381
dan4564ced2010-01-05 04:59:56 +00001382 /* Finalize the statement just executed. If this fails, save a
1383 ** copy of the error message. Otherwise, set zSql to point to the
1384 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001385 rc2 = sqlite3_finalize(pStmt);
1386 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001387 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001388 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001389 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001390 }else if( pzErrMsg ){
1391 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001392 }
shaneh642d8b82010-07-28 16:05:34 +00001393
1394 /* clear saved stmt handle */
1395 if( pArg ){
1396 pArg->pStmt = NULL;
1397 }
shane626a6e42009-10-22 17:30:15 +00001398 }
shaneb9fc17d2009-10-22 21:23:35 +00001399 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001400
1401 return rc;
1402}
1403
drhdd3d4592004-08-30 01:54:05 +00001404
drh33048c02001-10-01 14:29:22 +00001405/*
drh4c653a02000-06-07 01:27:47 +00001406** This is a different callback routine used for dumping the database.
1407** Each row received by this callback consists of a table name,
1408** the table type ("index" or "table") and SQL to create the table.
1409** This routine should print text sufficient to recreate the table.
1410*/
1411static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001412 int rc;
1413 const char *zTable;
1414 const char *zType;
1415 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001416 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001417 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001418
drh902b9ee2008-12-05 17:17:07 +00001419 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001420 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001421 zTable = azArg[0];
1422 zType = azArg[1];
1423 zSql = azArg[2];
1424
drh00b950d2005-09-11 02:03:03 +00001425 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001426 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001427 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001428 fprintf(p->out, "ANALYZE sqlite_master;\n");
1429 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1430 return 0;
drh45e29d82006-11-20 16:21:10 +00001431 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1432 char *zIns;
1433 if( !p->writableSchema ){
1434 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1435 p->writableSchema = 1;
1436 }
1437 zIns = sqlite3_mprintf(
1438 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1439 "VALUES('table','%q','%q',0,'%q');",
1440 zTable, zTable, zSql);
1441 fprintf(p->out, "%s\n", zIns);
1442 sqlite3_free(zIns);
1443 return 0;
drh00b950d2005-09-11 02:03:03 +00001444 }else{
1445 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001446 }
danielk19772a02e332004-06-05 08:04:36 +00001447
1448 if( strcmp(zType, "table")==0 ){
1449 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001450 char *zSelect = 0;
1451 char *zTableInfo = 0;
1452 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001453 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001454
1455 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1456 zTableInfo = appendText(zTableInfo, zTable, '"');
1457 zTableInfo = appendText(zTableInfo, ");", 0);
1458
1459 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001460 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001461 if( rc!=SQLITE_OK || !pTableInfo ){
1462 return 1;
1463 }
1464
1465 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001466 /* Always quote the table name, even if it appears to be pure ascii,
1467 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1468 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001469 if( zTmp ){
1470 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001471 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001472 }
1473 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1474 rc = sqlite3_step(pTableInfo);
1475 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001476 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001477 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001478 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001479 rc = sqlite3_step(pTableInfo);
1480 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001481 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001482 }else{
1483 zSelect = appendText(zSelect, ") ", 0);
1484 }
drh157e29a2009-05-21 15:15:00 +00001485 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001486 }
1487 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001488 if( rc!=SQLITE_OK || nRow==0 ){
1489 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001490 return 1;
1491 }
1492 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1493 zSelect = appendText(zSelect, zTable, '"');
1494
drh2f464a02011-10-13 00:41:49 +00001495 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001496 if( rc==SQLITE_CORRUPT ){
1497 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001498 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001499 }
drh85e72432012-04-11 11:38:53 +00001500 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001501 }
drh4c653a02000-06-07 01:27:47 +00001502 return 0;
1503}
1504
1505/*
drh45e29d82006-11-20 16:21:10 +00001506** Run zQuery. Use dump_callback() as the callback routine so that
1507** the contents of the query are output as SQL statements.
1508**
drhdd3d4592004-08-30 01:54:05 +00001509** If we get a SQLITE_CORRUPT error, rerun the query after appending
1510** "ORDER BY rowid DESC" to the end.
1511*/
1512static int run_schema_dump_query(
1513 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001514 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001515){
1516 int rc;
drh2f464a02011-10-13 00:41:49 +00001517 char *zErr = 0;
1518 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001519 if( rc==SQLITE_CORRUPT ){
1520 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001521 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001522 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1523 if( zErr ){
1524 fprintf(p->out, "/****** %s ******/\n", zErr);
1525 sqlite3_free(zErr);
1526 zErr = 0;
1527 }
drhdd3d4592004-08-30 01:54:05 +00001528 zQ2 = malloc( len+100 );
1529 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001530 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001531 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1532 if( rc ){
1533 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1534 }else{
1535 rc = SQLITE_CORRUPT;
1536 }
1537 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001538 free(zQ2);
1539 }
1540 return rc;
1541}
1542
1543/*
drh75897232000-05-29 14:26:00 +00001544** Text of a help message
1545*/
persicom1d0b8722002-04-18 02:53:04 +00001546static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001547 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001548 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001549 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001550 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001551 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001552 " If TABLE specified, only dump tables matching\n"
1553 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001554 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001555 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001556 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1557 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001558 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001559 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001560 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001561 ".indices ?TABLE? Show names of all indices\n"
1562 " If TABLE specified, only show indices for tables\n"
1563 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001564#ifdef SQLITE_ENABLE_IOTRACE
1565 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1566#endif
drh70df4fe2006-06-13 15:12:21 +00001567#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001568 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001569#endif
drh127f9d72010-02-23 01:47:00 +00001570 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001571 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001572 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001573 " column Left-aligned columns. (See .width)\n"
1574 " html HTML <table> code\n"
1575 " insert SQL insert statements for TABLE\n"
1576 " line One value per line\n"
1577 " list Values delimited by .separator string\n"
1578 " tabs Tab-separated values\n"
1579 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001580 ".nullvalue STRING Use STRING in place of NULL values\n"
drh05782482013-10-24 15:20:20 +00001581 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drh75897232000-05-29 14:26:00 +00001582 ".output FILENAME Send output to FILENAME\n"
1583 ".output stdout Send output to the screen\n"
drh078b1fd2012-09-21 13:40:02 +00001584 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001585 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001586 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001587 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001588 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001589 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001590 " If TABLE specified, only show tables matching\n"
1591 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001592 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001593 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001594 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001595 ".tables ?TABLE? List names of tables\n"
1596 " If TABLE specified, only list tables matching\n"
1597 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001598 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh42f64e52012-04-04 16:56:23 +00001599 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001600 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001601 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001602;
1603
shaneb320ccd2009-10-21 03:42:58 +00001604static char zTimerHelp[] =
1605 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1606;
1607
drhdaffd0e2001-04-11 14:28:42 +00001608/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001609static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001610
drh75897232000-05-29 14:26:00 +00001611/*
drh44c2eb12003-04-30 11:38:26 +00001612** Make sure the database is open. If it is not, then open it. If
1613** the database fails to open, print an error message and exit.
1614*/
drh05782482013-10-24 15:20:20 +00001615static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001616 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001617 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001618 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001619 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001620 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1621 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1622 shellstaticFunc, 0, 0);
1623 }
1624 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001625 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001626 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001627 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001628 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001629 }
drhc2e87a32006-06-27 15:16:14 +00001630#ifndef SQLITE_OMIT_LOAD_EXTENSION
1631 sqlite3_enable_load_extension(p->db, 1);
1632#endif
drh44c2eb12003-04-30 11:38:26 +00001633 }
1634}
1635
1636/*
drhfeac5f82004-08-01 00:10:45 +00001637** Do C-language style dequoting.
1638**
1639** \t -> tab
1640** \n -> newline
1641** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001642** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001643** \NNN -> ascii character NNN in octal
1644** \\ -> backslash
1645*/
1646static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001647 int i, j;
1648 char c;
drhfeac5f82004-08-01 00:10:45 +00001649 for(i=j=0; (c = z[i])!=0; i++, j++){
1650 if( c=='\\' ){
1651 c = z[++i];
1652 if( c=='n' ){
1653 c = '\n';
1654 }else if( c=='t' ){
1655 c = '\t';
1656 }else if( c=='r' ){
1657 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001658 }else if( c=='\\' ){
1659 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001660 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001661 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001662 if( z[i+1]>='0' && z[i+1]<='7' ){
1663 i++;
1664 c = (c<<3) + z[i] - '0';
1665 if( z[i+1]>='0' && z[i+1]<='7' ){
1666 i++;
1667 c = (c<<3) + z[i] - '0';
1668 }
1669 }
1670 }
1671 }
1672 z[j] = c;
1673 }
1674 z[j] = 0;
1675}
1676
1677/*
drh348d19c2013-06-03 12:47:43 +00001678** Return the value of a hexadecimal digit. Return -1 if the input
1679** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001680*/
drh348d19c2013-06-03 12:47:43 +00001681static int hexDigitValue(char c){
1682 if( c>='0' && c<='9' ) return c - '0';
1683 if( c>='a' && c<='f' ) return c - 'a' + 10;
1684 if( c>='A' && c<='F' ) return c - 'A' + 10;
1685 return -1;
drhc28490c2006-10-26 14:25:58 +00001686}
1687
1688/*
drh7d9f3942013-04-03 01:26:54 +00001689** Interpret zArg as an integer value, possibly with suffixes.
1690*/
1691static sqlite3_int64 integerValue(const char *zArg){
1692 sqlite3_int64 v = 0;
1693 static const struct { char *zSuffix; int iMult; } aMult[] = {
1694 { "KiB", 1024 },
1695 { "MiB", 1024*1024 },
1696 { "GiB", 1024*1024*1024 },
1697 { "KB", 1000 },
1698 { "MB", 1000000 },
1699 { "GB", 1000000000 },
1700 { "K", 1000 },
1701 { "M", 1000000 },
1702 { "G", 1000000000 },
1703 };
1704 int i;
1705 int isNeg = 0;
1706 if( zArg[0]=='-' ){
1707 isNeg = 1;
1708 zArg++;
1709 }else if( zArg[0]=='+' ){
1710 zArg++;
1711 }
drh348d19c2013-06-03 12:47:43 +00001712 if( zArg[0]=='0' && zArg[1]=='x' ){
1713 int x;
1714 zArg += 2;
1715 while( (x = hexDigitValue(zArg[0]))>=0 ){
1716 v = (v<<4) + x;
1717 zArg++;
1718 }
1719 }else{
1720 while( IsDigit(zArg[0]) ){
1721 v = v*10 + zArg[0] - '0';
1722 zArg++;
1723 }
drh7d9f3942013-04-03 01:26:54 +00001724 }
drhc2bed0a2013-05-24 11:57:50 +00001725 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001726 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1727 v *= aMult[i].iMult;
1728 break;
1729 }
1730 }
1731 return isNeg? -v : v;
1732}
1733
1734/*
drh348d19c2013-06-03 12:47:43 +00001735** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1736** for TRUE and FALSE. Return the integer value if appropriate.
1737*/
1738static int booleanValue(char *zArg){
1739 int i;
1740 if( zArg[0]=='0' && zArg[1]=='x' ){
1741 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1742 }else{
1743 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1744 }
1745 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1746 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1747 return 1;
1748 }
1749 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1750 return 0;
1751 }
1752 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1753 zArg);
1754 return 0;
1755}
1756
1757/*
drh42f64e52012-04-04 16:56:23 +00001758** Close an output file, assuming it is not stderr or stdout
1759*/
1760static void output_file_close(FILE *f){
1761 if( f && f!=stdout && f!=stderr ) fclose(f);
1762}
1763
1764/*
1765** Try to open an output file. The names "stdout" and "stderr" are
1766** recognized and do the right thing. NULL is returned if the output
1767** filename is "off".
1768*/
1769static FILE *output_file_open(const char *zFile){
1770 FILE *f;
1771 if( strcmp(zFile,"stdout")==0 ){
1772 f = stdout;
1773 }else if( strcmp(zFile, "stderr")==0 ){
1774 f = stderr;
1775 }else if( strcmp(zFile, "off")==0 ){
1776 f = 0;
1777 }else{
1778 f = fopen(zFile, "wb");
1779 if( f==0 ){
1780 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1781 }
1782 }
1783 return f;
1784}
1785
1786/*
1787** A routine for handling output from sqlite3_trace().
1788*/
1789static void sql_trace_callback(void *pArg, const char *z){
1790 FILE *f = (FILE*)pArg;
1791 if( f ) fprintf(f, "%s\n", z);
1792}
1793
1794/*
drhd8621b92012-04-17 09:09:33 +00001795** A no-op routine that runs with the ".breakpoint" doc-command. This is
1796** a useful spot to set a debugger breakpoint.
1797*/
1798static void test_breakpoint(void){
1799 static int nCall = 0;
1800 nCall++;
1801}
1802
1803/*
drhdb95f682013-06-26 22:46:00 +00001804** An object used to read a CSV file
1805*/
1806typedef struct CSVReader CSVReader;
1807struct CSVReader {
1808 const char *zFile; /* Name of the input file */
1809 FILE *in; /* Read the CSV text from this input stream */
1810 char *z; /* Accumulated text for a field */
1811 int n; /* Number of bytes in z */
1812 int nAlloc; /* Space allocated for z[] */
1813 int nLine; /* Current line number */
1814 int cTerm; /* Character that terminated the most recent field */
1815 int cSeparator; /* The separator character. (Usually ",") */
1816};
1817
1818/* Append a single byte to z[] */
1819static void csv_append_char(CSVReader *p, int c){
1820 if( p->n+1>=p->nAlloc ){
1821 p->nAlloc += p->nAlloc + 100;
1822 p->z = sqlite3_realloc(p->z, p->nAlloc);
1823 if( p->z==0 ){
1824 fprintf(stderr, "out of memory\n");
1825 exit(1);
1826 }
1827 }
1828 p->z[p->n++] = (char)c;
1829}
1830
1831/* Read a single field of CSV text. Compatible with rfc4180 and extended
1832** with the option of having a separator other than ",".
1833**
1834** + Input comes from p->in.
1835** + Store results in p->z of length p->n. Space to hold p->z comes
1836** from sqlite3_malloc().
1837** + Use p->cSep as the separator. The default is ",".
1838** + Keep track of the line number in p->nLine.
1839** + Store the character that terminates the field in p->cTerm. Store
1840** EOF on end-of-file.
1841** + Report syntax errors on stderr
1842*/
1843static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001844 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001845 int cSep = p->cSeparator;
1846 p->n = 0;
1847 c = fgetc(p->in);
1848 if( c==EOF || seenInterrupt ){
1849 p->cTerm = EOF;
1850 return 0;
1851 }
1852 if( c=='"' ){
1853 int startLine = p->nLine;
1854 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001855 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001856 while( 1 ){
1857 c = fgetc(p->in);
1858 if( c=='\n' ) p->nLine++;
1859 if( c==cQuote ){
1860 if( pc==cQuote ){
1861 pc = 0;
1862 continue;
1863 }
1864 }
1865 if( (c==cSep && pc==cQuote)
1866 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001867 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001868 || (c==EOF && pc==cQuote)
1869 ){
1870 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001871 p->cTerm = c;
1872 break;
1873 }
1874 if( pc==cQuote && c!='\r' ){
1875 fprintf(stderr, "%s:%d: unescaped %c character\n",
1876 p->zFile, p->nLine, cQuote);
1877 }
1878 if( c==EOF ){
1879 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1880 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001881 p->cTerm = EOF;
1882 break;
1883 }
1884 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001885 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001886 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001887 }
drhdb95f682013-06-26 22:46:00 +00001888 }else{
drhd0a64dc2013-06-30 20:24:26 +00001889 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00001890 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001891 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001892 }
1893 if( c=='\n' ){
1894 p->nLine++;
1895 if( p->n>1 && p->z[p->n-1]=='\r' ) p->n--;
1896 }
drhdb95f682013-06-26 22:46:00 +00001897 p->cTerm = c;
1898 }
drh8dd675e2013-07-12 21:09:24 +00001899 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001900 return p->z;
1901}
1902
1903/*
drh4bbcf102014-02-06 02:46:08 +00001904** Try to transfer data for table zTable. If an error is seen while
1905** moving forward, try to go backwards. The backwards movement won't
1906** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00001907*/
mistachkine31ae902014-02-06 01:15:29 +00001908static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00001909 struct callback_data *p,
1910 sqlite3 *newDb,
1911 const char *zTable
1912){
1913 sqlite3_stmt *pQuery = 0;
1914 sqlite3_stmt *pInsert = 0;
1915 char *zQuery = 0;
1916 char *zInsert = 0;
1917 int rc;
1918 int i, j, n;
1919 int nTable = (int)strlen(zTable);
1920 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00001921 int cnt = 0;
1922 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00001923
1924 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
1925 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
1926 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001927 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001928 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
1929 zQuery);
1930 goto end_data_xfer;
1931 }
1932 n = sqlite3_column_count(pQuery);
1933 zInsert = sqlite3_malloc(200 + nTable + n*3);
1934 if( zInsert==0 ){
1935 fprintf(stderr, "out of memory\n");
1936 goto end_data_xfer;
1937 }
1938 sqlite3_snprintf(200+nTable,zInsert,
1939 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
1940 i = (int)strlen(zInsert);
1941 for(j=1; j<n; j++){
1942 memcpy(zInsert+i, ",?", 2);
1943 i += 2;
1944 }
1945 memcpy(zInsert+i, ");", 3);
1946 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
1947 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00001948 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00001949 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
1950 zQuery);
1951 goto end_data_xfer;
1952 }
1953 for(k=0; k<2; k++){
1954 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
1955 for(i=0; i<n; i++){
1956 switch( sqlite3_column_type(pQuery, i) ){
1957 case SQLITE_NULL: {
1958 sqlite3_bind_null(pInsert, i+1);
1959 break;
1960 }
1961 case SQLITE_INTEGER: {
1962 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
1963 break;
1964 }
1965 case SQLITE_FLOAT: {
1966 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
1967 break;
1968 }
1969 case SQLITE_TEXT: {
1970 sqlite3_bind_text(pInsert, i+1,
1971 (const char*)sqlite3_column_text(pQuery,i),
1972 -1, SQLITE_STATIC);
1973 break;
1974 }
1975 case SQLITE_BLOB: {
1976 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
1977 sqlite3_column_bytes(pQuery,i),
1978 SQLITE_STATIC);
1979 break;
1980 }
1981 }
1982 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00001983 rc = sqlite3_step(pInsert);
1984 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
1985 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
1986 sqlite3_errmsg(newDb));
1987 }
drh3350ce92014-02-06 00:49:12 +00001988 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00001989 cnt++;
1990 if( (cnt%spinRate)==0 ){
1991 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
1992 fflush(stdout);
1993 }
drh3350ce92014-02-06 00:49:12 +00001994 } /* End while */
1995 if( rc==SQLITE_DONE ) break;
1996 sqlite3_finalize(pQuery);
1997 sqlite3_free(zQuery);
1998 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
1999 zTable);
2000 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2001 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002002 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2003 break;
drh3350ce92014-02-06 00:49:12 +00002004 }
2005 } /* End for(k=0...) */
2006
2007end_data_xfer:
2008 sqlite3_finalize(pQuery);
2009 sqlite3_finalize(pInsert);
2010 sqlite3_free(zQuery);
2011 sqlite3_free(zInsert);
2012}
2013
2014
2015/*
2016** Try to transfer all rows of the schema that match zWhere. For
2017** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002018** If an error is encountered while moving forward through the
2019** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002020*/
mistachkine31ae902014-02-06 01:15:29 +00002021static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002022 struct callback_data *p,
2023 sqlite3 *newDb,
2024 const char *zWhere,
2025 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2026){
2027 sqlite3_stmt *pQuery = 0;
2028 char *zQuery = 0;
2029 int rc;
2030 const unsigned char *zName;
2031 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002032 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002033
2034 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2035 " WHERE %s", zWhere);
2036 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2037 if( rc ){
2038 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2039 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2040 zQuery);
2041 goto end_schema_xfer;
2042 }
2043 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2044 zName = sqlite3_column_text(pQuery, 0);
2045 zSql = sqlite3_column_text(pQuery, 1);
2046 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002047 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2048 if( zErrMsg ){
2049 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2050 sqlite3_free(zErrMsg);
2051 zErrMsg = 0;
2052 }
drh3350ce92014-02-06 00:49:12 +00002053 if( xForEach ){
2054 xForEach(p, newDb, (const char*)zName);
2055 }
2056 printf("done\n");
2057 }
2058 if( rc!=SQLITE_DONE ){
2059 sqlite3_finalize(pQuery);
2060 sqlite3_free(zQuery);
2061 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2062 " WHERE %s ORDER BY rowid DESC", zWhere);
2063 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2064 if( rc ){
2065 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2066 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2067 zQuery);
2068 goto end_schema_xfer;
2069 }
2070 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2071 zName = sqlite3_column_text(pQuery, 0);
2072 zSql = sqlite3_column_text(pQuery, 1);
2073 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002074 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2075 if( zErrMsg ){
2076 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2077 sqlite3_free(zErrMsg);
2078 zErrMsg = 0;
2079 }
drh3350ce92014-02-06 00:49:12 +00002080 if( xForEach ){
2081 xForEach(p, newDb, (const char*)zName);
2082 }
2083 printf("done\n");
2084 }
2085 }
2086end_schema_xfer:
2087 sqlite3_finalize(pQuery);
2088 sqlite3_free(zQuery);
2089}
2090
2091/*
2092** Open a new database file named "zNewDb". Try to recover as much information
2093** as possible out of the main database (which might be corrupt) and write it
2094** into zNewDb.
2095*/
mistachkine31ae902014-02-06 01:15:29 +00002096static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002097 int rc;
2098 sqlite3 *newDb = 0;
2099 if( access(zNewDb,0)==0 ){
2100 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2101 return;
2102 }
2103 rc = sqlite3_open(zNewDb, &newDb);
2104 if( rc ){
2105 fprintf(stderr, "Cannot create output database: %s\n",
2106 sqlite3_errmsg(newDb));
2107 }else{
2108 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002109 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2110 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002111 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2112 }
2113 sqlite3_close(newDb);
2114}
2115
2116/*
drh75897232000-05-29 14:26:00 +00002117** If an input line begins with "." then invoke this routine to
2118** process that line.
drh67505e72002-04-19 12:34:06 +00002119**
drh47ad6842006-11-08 12:25:42 +00002120** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002121*/
drh44c2eb12003-04-30 11:38:26 +00002122static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002123 int i = 1;
2124 int nArg = 0;
2125 int n, c;
drh67505e72002-04-19 12:34:06 +00002126 int rc = 0;
drh75897232000-05-29 14:26:00 +00002127 char *azArg[50];
2128
2129 /* Parse the input line into tokens.
2130 */
2131 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002132 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002133 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002134 if( zLine[i]=='\'' || zLine[i]=='"' ){
2135 int delim = zLine[i++];
2136 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002137 while( zLine[i] && zLine[i]!=delim ){
2138 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2139 i++;
2140 }
drh75897232000-05-29 14:26:00 +00002141 if( zLine[i]==delim ){
2142 zLine[i++] = 0;
2143 }
drhfeac5f82004-08-01 00:10:45 +00002144 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002145 }else{
2146 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002147 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002148 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002149 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002150 }
2151 }
2152
2153 /* Process the input line.
2154 */
shane9bd1b442009-10-23 01:27:39 +00002155 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002156 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002157 c = azArg[0][0];
drhbc46f022013-01-23 18:53:23 +00002158 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 ){
2159 const char *zDestFile = 0;
2160 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002161 sqlite3 *pDest;
2162 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002163 int j;
2164 for(j=1; j<nArg; j++){
2165 const char *z = azArg[j];
2166 if( z[0]=='-' ){
2167 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002168 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002169 {
2170 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2171 return 1;
2172 }
2173 }else if( zDestFile==0 ){
2174 zDestFile = azArg[j];
2175 }else if( zDb==0 ){
2176 zDb = zDestFile;
2177 zDestFile = azArg[j];
2178 }else{
2179 fprintf(stderr, "too many arguments to .backup\n");
2180 return 1;
2181 }
drh9ff849f2009-02-04 20:55:57 +00002182 }
drhbc46f022013-01-23 18:53:23 +00002183 if( zDestFile==0 ){
2184 fprintf(stderr, "missing FILENAME argument on .backup\n");
2185 return 1;
2186 }
2187 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002188 rc = sqlite3_open(zDestFile, &pDest);
2189 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002190 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002191 sqlite3_close(pDest);
2192 return 1;
2193 }
drh05782482013-10-24 15:20:20 +00002194 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002195 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2196 if( pBackup==0 ){
2197 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2198 sqlite3_close(pDest);
2199 return 1;
2200 }
2201 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2202 sqlite3_backup_finish(pBackup);
2203 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002204 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002205 }else{
2206 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002207 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002208 }
2209 sqlite3_close(pDest);
2210 }else
2211
shanehe2aa9d72009-11-06 17:20:17 +00002212 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00002213 bail_on_error = booleanValue(azArg[1]);
2214 }else
2215
drhd8621b92012-04-17 09:09:33 +00002216 /* The undocumented ".breakpoint" command causes a call to the no-op
2217 ** routine named test_breakpoint().
2218 */
2219 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2220 test_breakpoint();
2221 }else
2222
mistachkine31ae902014-02-06 01:15:29 +00002223 if( c=='c' && strncmp(azArg[0], "clone", n)==0 && nArg>1 && nArg<3 ){
2224 tryToClone(p, azArg[1]);
2225 }else
2226
shanehe2aa9d72009-11-06 17:20:17 +00002227 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00002228 struct callback_data data;
2229 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002230 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002231 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002232 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002233 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002234 data.colWidth[0] = 3;
2235 data.colWidth[1] = 15;
2236 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002237 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002238 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002239 if( zErrMsg ){
2240 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002241 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002242 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002243 }
2244 }else
2245
shanehe2aa9d72009-11-06 17:20:17 +00002246 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh05782482013-10-24 15:20:20 +00002247 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002248 /* When playing back a "dump", the content might appear in an order
2249 ** which causes immediate foreign key constraints to be violated.
2250 ** So disable foreign-key constraint enforcement to prevent problems. */
2251 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002252 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002253 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002254 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002255 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002256 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002257 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002258 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002259 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002260 );
2261 run_schema_dump_query(p,
2262 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002263 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002264 );
drh2f464a02011-10-13 00:41:49 +00002265 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002266 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002267 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002268 );
drh4c653a02000-06-07 01:27:47 +00002269 }else{
2270 int i;
drhdd3d4592004-08-30 01:54:05 +00002271 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002272 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002273 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002274 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002275 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002276 " AND sql NOT NULL");
2277 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002278 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002279 "WHERE sql NOT NULL"
2280 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002281 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002282 );
danielk1977bc6ada42004-06-30 08:20:16 +00002283 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002284 }
2285 }
drh45e29d82006-11-20 16:21:10 +00002286 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002287 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002288 p->writableSchema = 0;
2289 }
drh56197952011-10-13 16:30:13 +00002290 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2291 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002292 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002293 }else
drh75897232000-05-29 14:26:00 +00002294
shanehe2aa9d72009-11-06 17:20:17 +00002295 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002296 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00002297 }else
2298
drhd3ac7d92013-01-25 18:33:43 +00002299 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002300 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002301 rc = 2;
drh75897232000-05-29 14:26:00 +00002302 }else
2303
shanehe2aa9d72009-11-06 17:20:17 +00002304 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002305 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002306 if(val == 1) {
2307 if(!p->explainPrev.valid) {
2308 p->explainPrev.valid = 1;
2309 p->explainPrev.mode = p->mode;
2310 p->explainPrev.showHeader = p->showHeader;
2311 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2312 }
2313 /* We could put this code under the !p->explainValid
2314 ** condition so that it does not execute if we are already in
2315 ** explain mode. However, always executing it allows us an easy
2316 ** was to reset to explain mode in case the user previously
2317 ** did an .explain followed by a .width, .mode or .header
2318 ** command.
2319 */
danielk19770d78bae2008-01-03 07:09:48 +00002320 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002321 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002322 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002323 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002324 p->colWidth[1] = 13; /* opcode */
2325 p->colWidth[2] = 4; /* P1 */
2326 p->colWidth[3] = 4; /* P2 */
2327 p->colWidth[4] = 4; /* P3 */
2328 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002329 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002330 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002331 }else if (p->explainPrev.valid) {
2332 p->explainPrev.valid = 0;
2333 p->mode = p->explainPrev.mode;
2334 p->showHeader = p->explainPrev.showHeader;
2335 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2336 }
drh75897232000-05-29 14:26:00 +00002337 }else
2338
drhc28490c2006-10-26 14:25:58 +00002339 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00002340 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00002341 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00002342 }else
2343
2344 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00002345 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00002346 if( HAS_TIMER ){
2347 fprintf(stderr,"%s",zTimerHelp);
2348 }
drh75897232000-05-29 14:26:00 +00002349 }else
2350
shanehe2aa9d72009-11-06 17:20:17 +00002351 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00002352 char *zTable = azArg[2]; /* Insert data into this table */
drh5bde8162013-06-27 14:07:53 +00002353 char *zFile = azArg[1]; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002354 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002355 int nCol; /* Number of columns in the table */
2356 int nByte; /* Number of bytes in an SQL string */
2357 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002358 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002359 int nSep; /* Number of bytes in p->separator[] */
2360 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002361 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002362 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002363
drhdb95f682013-06-26 22:46:00 +00002364 seenInterrupt = 0;
2365 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002366 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002367 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002368 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002369 fprintf(stderr, "Error: non-null separator required for import\n");
2370 return 1;
drhfeac5f82004-08-01 00:10:45 +00002371 }
drhdb95f682013-06-26 22:46:00 +00002372 if( nSep>1 ){
2373 fprintf(stderr, "Error: multi-character separators not allowed"
2374 " for import\n");
2375 return 1;
2376 }
drh5bde8162013-06-27 14:07:53 +00002377 sCsv.zFile = zFile;
2378 sCsv.nLine = 1;
2379 if( sCsv.zFile[0]=='|' ){
2380 sCsv.in = popen(sCsv.zFile+1, "r");
2381 sCsv.zFile = "<pipe>";
2382 xCloser = pclose;
2383 }else{
2384 sCsv.in = fopen(sCsv.zFile, "rb");
2385 xCloser = fclose;
2386 }
drhdb95f682013-06-26 22:46:00 +00002387 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002388 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002389 return 1;
2390 }
2391 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002392 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002393 if( zSql==0 ){
2394 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002395 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002396 return 1;
2397 }
drh4f21c4a2008-12-10 22:15:00 +00002398 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00002399 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002400 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2401 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2402 char cSep = '(';
2403 while( csv_read_one_field(&sCsv) ){
2404 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2405 cSep = ',';
2406 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2407 }
drh5bde8162013-06-27 14:07:53 +00002408 if( cSep=='(' ){
2409 sqlite3_free(zCreate);
2410 sqlite3_free(sCsv.z);
2411 xCloser(sCsv.in);
2412 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2413 return 1;
2414 }
drhdb95f682013-06-26 22:46:00 +00002415 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2416 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2417 sqlite3_free(zCreate);
2418 if( rc ){
2419 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2420 sqlite3_errmsg(db));
2421 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002422 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002423 return 1;
2424 }
2425 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
2426 }
drhfeac5f82004-08-01 00:10:45 +00002427 sqlite3_free(zSql);
2428 if( rc ){
shane916f9612009-10-23 00:37:15 +00002429 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002430 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002431 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002432 return 1;
drhfeac5f82004-08-01 00:10:45 +00002433 }
shane916f9612009-10-23 00:37:15 +00002434 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002435 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002436 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002437 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002438 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002439 if( zSql==0 ){
2440 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002441 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002442 return 1;
2443 }
drhdb95f682013-06-26 22:46:00 +00002444 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002445 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002446 for(i=1; i<nCol; i++){
2447 zSql[j++] = ',';
2448 zSql[j++] = '?';
2449 }
2450 zSql[j++] = ')';
2451 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00002452 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002453 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002454 if( rc ){
2455 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002456 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002457 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002458 return 1;
drhfeac5f82004-08-01 00:10:45 +00002459 }
drh2d463112013-08-06 14:36:36 +00002460 needCommit = sqlite3_get_autocommit(db);
2461 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002462 do{
2463 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002464 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002465 char *z = csv_read_one_field(&sCsv);
2466 if( z==0 && i==0 ) break;
2467 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2468 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2469 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2470 "filling the rest with NULL\n",
2471 sCsv.zFile, startLine, nCol, i+1);
2472 i++;
2473 while( i<nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002474 }
drhfeac5f82004-08-01 00:10:45 +00002475 }
drhdb95f682013-06-26 22:46:00 +00002476 if( sCsv.cTerm==sCsv.cSeparator ){
2477 do{
2478 csv_read_one_field(&sCsv);
2479 i++;
2480 }while( sCsv.cTerm==sCsv.cSeparator );
2481 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2482 "extras ignored\n",
2483 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002484 }
drhdb95f682013-06-26 22:46:00 +00002485 if( i>=nCol ){
2486 sqlite3_step(pStmt);
2487 rc = sqlite3_reset(pStmt);
2488 if( rc!=SQLITE_OK ){
2489 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2490 sqlite3_errmsg(db));
2491 }
2492 }
2493 }while( sCsv.cTerm!=EOF );
2494
drh5bde8162013-06-27 14:07:53 +00002495 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002496 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002497 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002498 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002499 }else
2500
shanehe2aa9d72009-11-06 17:20:17 +00002501 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002502 struct callback_data data;
2503 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002504 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002505 memcpy(&data, p, sizeof(data));
2506 data.showHeader = 0;
2507 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002508 if( nArg==1 ){
2509 rc = sqlite3_exec(p->db,
2510 "SELECT name FROM sqlite_master "
2511 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2512 "UNION ALL "
2513 "SELECT name FROM sqlite_temp_master "
2514 "WHERE type='index' "
2515 "ORDER BY 1",
2516 callback, &data, &zErrMsg
2517 );
2518 }else{
2519 zShellStatic = azArg[1];
2520 rc = sqlite3_exec(p->db,
2521 "SELECT name FROM sqlite_master "
2522 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2523 "UNION ALL "
2524 "SELECT name FROM sqlite_temp_master "
2525 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2526 "ORDER BY 1",
2527 callback, &data, &zErrMsg
2528 );
2529 zShellStatic = 0;
2530 }
drh75897232000-05-29 14:26:00 +00002531 if( zErrMsg ){
2532 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002533 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002534 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002535 }else if( rc != SQLITE_OK ){
2536 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2537 rc = 1;
drh75897232000-05-29 14:26:00 +00002538 }
2539 }else
2540
drhae5e4452007-05-03 17:18:36 +00002541#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002542 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002543 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002544 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2545 iotrace = 0;
2546 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002547 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002548 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002549 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002550 iotrace = stdout;
2551 }else{
2552 iotrace = fopen(azArg[1], "w");
2553 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002554 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002555 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002556 rc = 1;
drhb0603412007-02-28 04:47:26 +00002557 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002558 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002559 }
2560 }
2561 }else
drhae5e4452007-05-03 17:18:36 +00002562#endif
drhb0603412007-02-28 04:47:26 +00002563
drh70df4fe2006-06-13 15:12:21 +00002564#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00002565 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
2566 const char *zFile, *zProc;
2567 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00002568 zFile = azArg[1];
2569 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002570 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002571 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2572 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002573 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002574 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002575 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002576 }
2577 }else
drh70df4fe2006-06-13 15:12:21 +00002578#endif
drh1e397f82006-06-08 15:28:43 +00002579
drhc8ba2122011-03-23 11:16:22 +00002580 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00002581 const char *zFile = azArg[1];
drh42f64e52012-04-04 16:56:23 +00002582 output_file_close(p->pLog);
2583 p->pLog = output_file_open(zFile);
drh127f9d72010-02-23 01:47:00 +00002584 }else
2585
shanehe2aa9d72009-11-06 17:20:17 +00002586 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00002587 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002588 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002589 ||
shanehe2aa9d72009-11-06 17:20:17 +00002590 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002591 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00002592 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00002593 ||
shanehe2aa9d72009-11-06 17:20:17 +00002594 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00002595 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00002596 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002597 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00002598 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002599 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00002600 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002601 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002602 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
shanehe2aa9d72009-11-06 17:20:17 +00002603 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002604 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002605 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00002606 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002607 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002608 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00002609 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002610 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00002611 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00002612 }else {
shane9bd1b442009-10-23 01:27:39 +00002613 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002614 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002615 rc = 1;
drh75897232000-05-29 14:26:00 +00002616 }
2617 }else
2618
shanehe2aa9d72009-11-06 17:20:17 +00002619 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
2620 int n2 = strlen30(azArg[1]);
2621 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
2622 p->mode = MODE_Insert;
2623 set_table_name(p, azArg[2]);
2624 }else {
2625 fprintf(stderr, "Error: invalid arguments: "
2626 " \"%s\". Enter \".help\" for help\n", azArg[2]);
2627 rc = 1;
2628 }
2629 }else
2630
persicom7e2dfdd2002-04-18 02:46:52 +00002631 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00002632 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2633 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00002634 }else
2635
drh05782482013-10-24 15:20:20 +00002636 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2637 sqlite3 *savedDb = p->db;
2638 const char *zSavedFilename = p->zDbFilename;
2639 char *zNewFilename = 0;
2640 p->db = 0;
2641 if( nArg>=2 ){
2642 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2643 }
2644 open_db(p, 1);
2645 if( p->db!=0 ){
2646 sqlite3_close(savedDb);
2647 sqlite3_free(p->zFreeOnClose);
2648 p->zFreeOnClose = zNewFilename;
2649 }else{
2650 sqlite3_free(zNewFilename);
2651 p->db = savedDb;
2652 p->zDbFilename = zSavedFilename;
2653 }
2654 }else
2655
drh75897232000-05-29 14:26:00 +00002656 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
drh42f64e52012-04-04 16:56:23 +00002657 if( p->outfile[0]=='|' ){
2658 pclose(p->out);
2659 }else{
2660 output_file_close(p->out);
drh75897232000-05-29 14:26:00 +00002661 }
drh42f64e52012-04-04 16:56:23 +00002662 p->outfile[0] = 0;
2663 if( azArg[1][0]=='|' ){
drhe1da8fa2012-03-30 00:05:57 +00002664 p->out = popen(&azArg[1][1], "w");
2665 if( p->out==0 ){
2666 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]);
2667 p->out = stdout;
2668 rc = 1;
2669 }else{
2670 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
2671 }
drh75897232000-05-29 14:26:00 +00002672 }else{
drh42f64e52012-04-04 16:56:23 +00002673 p->out = output_file_open(azArg[1]);
drh75897232000-05-29 14:26:00 +00002674 if( p->out==0 ){
drh42f64e52012-04-04 16:56:23 +00002675 if( strcmp(azArg[1],"off")!=0 ){
2676 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
2677 }
drh75897232000-05-29 14:26:00 +00002678 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002679 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002680 } else {
drh42f64e52012-04-04 16:56:23 +00002681 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00002682 }
2683 }
2684 }else
2685
drh078b1fd2012-09-21 13:40:02 +00002686 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2687 int i;
2688 for(i=1; i<nArg; i++){
2689 if( i>1 ) fprintf(p->out, " ");
2690 fprintf(p->out, "%s", azArg[i]);
2691 }
2692 fprintf(p->out, "\n");
2693 }else
2694
drhdd45df82002-04-18 12:39:03 +00002695 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00002696 if( nArg >= 2) {
2697 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2698 }
2699 if( nArg >= 3) {
2700 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2701 }
2702 }else
2703
shanehe2aa9d72009-11-06 17:20:17 +00002704 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00002705 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002706 }else
2707
drh9ff849f2009-02-04 20:55:57 +00002708 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00002709 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002710 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002711 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2712 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002713 }else{
shane9bd1b442009-10-23 01:27:39 +00002714 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002715 fclose(alt);
2716 }
2717 }else
2718
shanehe2aa9d72009-11-06 17:20:17 +00002719 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00002720 const char *zSrcFile;
2721 const char *zDb;
2722 sqlite3 *pSrc;
2723 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002724 int nTimeout = 0;
2725
drh9ff849f2009-02-04 20:55:57 +00002726 if( nArg==2 ){
2727 zSrcFile = azArg[1];
2728 zDb = "main";
2729 }else{
2730 zSrcFile = azArg[2];
2731 zDb = azArg[1];
2732 }
2733 rc = sqlite3_open(zSrcFile, &pSrc);
2734 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002735 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002736 sqlite3_close(pSrc);
2737 return 1;
2738 }
drh05782482013-10-24 15:20:20 +00002739 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002740 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2741 if( pBackup==0 ){
2742 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2743 sqlite3_close(pSrc);
2744 return 1;
2745 }
drhdc2c4912009-02-04 22:46:47 +00002746 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2747 || rc==SQLITE_BUSY ){
2748 if( rc==SQLITE_BUSY ){
2749 if( nTimeout++ >= 3 ) break;
2750 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002751 }
2752 }
2753 sqlite3_backup_finish(pBackup);
2754 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002755 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002756 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002757 fprintf(stderr, "Error: source database is busy\n");
2758 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002759 }else{
2760 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002761 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002762 }
2763 sqlite3_close(pSrc);
2764 }else
2765
shanehe2aa9d72009-11-06 17:20:17 +00002766 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002767 struct callback_data data;
2768 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002769 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002770 memcpy(&data, p, sizeof(data));
2771 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002772 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002773 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002774 int i;
drhf0693c82011-10-11 20:41:54 +00002775 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002776 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002777 char *new_argv[2], *new_colv[2];
2778 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2779 " type text,\n"
2780 " name text,\n"
2781 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002782 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002783 " sql text\n"
2784 ")";
2785 new_argv[1] = 0;
2786 new_colv[0] = "sql";
2787 new_colv[1] = 0;
2788 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002789 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002790 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002791 char *new_argv[2], *new_colv[2];
2792 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2793 " type text,\n"
2794 " name text,\n"
2795 " tbl_name text,\n"
2796 " rootpage integer,\n"
2797 " sql text\n"
2798 ")";
2799 new_argv[1] = 0;
2800 new_colv[0] = "sql";
2801 new_colv[1] = 0;
2802 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002803 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002804 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002805 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002806 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002807 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002808 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002809 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002810 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002811 "WHERE lower(tbl_name) LIKE shellstatic()"
2812 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00002813 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00002814 callback, &data, &zErrMsg);
2815 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002816 }
drh75897232000-05-29 14:26:00 +00002817 }else{
shane9bd1b442009-10-23 01:27:39 +00002818 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002819 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00002820 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00002821 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00002822 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002823 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00002824 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00002825 callback, &data, &zErrMsg
2826 );
drh75897232000-05-29 14:26:00 +00002827 }
drh75897232000-05-29 14:26:00 +00002828 if( zErrMsg ){
2829 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002830 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002831 rc = 1;
2832 }else if( rc != SQLITE_OK ){
2833 fprintf(stderr,"Error: querying schema information\n");
2834 rc = 1;
2835 }else{
2836 rc = 0;
drh75897232000-05-29 14:26:00 +00002837 }
2838 }else
2839
drh340f5822013-06-27 13:01:21 +00002840#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00002841 /* Undocumented commands for internal testing. Subject to change
2842 ** without notice. */
2843 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
2844 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
2845 int i, v;
2846 for(i=1; i<nArg; i++){
2847 v = booleanValue(azArg[i]);
2848 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
2849 }
2850 }
2851 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
2852 int i; sqlite3_int64 v;
2853 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00002854 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00002855 v = integerValue(azArg[i]);
drh340f5822013-06-27 13:01:21 +00002856 sqlite3_snprintf(sizeof(zBuf), zBuf, "%s: %lld 0x%llx\n", azArg[i], v, v);
2857 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00002858 }
2859 }
2860 }else
drh340f5822013-06-27 13:01:21 +00002861#endif
drh348d19c2013-06-03 12:47:43 +00002862
drh75897232000-05-29 14:26:00 +00002863 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002864 sqlite3_snprintf(sizeof(p->separator), p->separator,
2865 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002866 }else
2867
shanehe2aa9d72009-11-06 17:20:17 +00002868 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002869 int i;
2870 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002871 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002872 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002873 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002874 fprintf(p->out,"%9.9s: ", "nullvalue");
2875 output_c_string(p->out, p->nullvalue);
2876 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002877 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002878 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002879 fprintf(p->out,"%9.9s: ", "separator");
2880 output_c_string(p->out, p->separator);
2881 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002882 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002883 fprintf(p->out,"%9.9s: ","width");
2884 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002885 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002886 }
drhfeac5f82004-08-01 00:10:45 +00002887 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002888 }else
2889
shaneh642d8b82010-07-28 16:05:34 +00002890 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2891 p->statsOn = booleanValue(azArg[1]);
2892 }else
2893
shanehe2aa9d72009-11-06 17:20:17 +00002894 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drh98781232012-04-23 12:38:05 +00002895 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00002896 char **azResult;
drh98781232012-04-23 12:38:05 +00002897 int nRow, nAlloc;
2898 char *zSql = 0;
2899 int ii;
drh05782482013-10-24 15:20:20 +00002900 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00002901 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2902 if( rc ) return rc;
2903 zSql = sqlite3_mprintf(
2904 "SELECT name FROM sqlite_master"
2905 " WHERE type IN ('table','view')"
2906 " AND name NOT LIKE 'sqlite_%%'"
2907 " AND name LIKE ?1");
2908 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2909 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
2910 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
2911 if( strcmp(zDbName,"temp")==0 ){
2912 zSql = sqlite3_mprintf(
2913 "%z UNION ALL "
2914 "SELECT 'temp.' || name FROM sqlite_temp_master"
2915 " WHERE type IN ('table','view')"
2916 " AND name NOT LIKE 'sqlite_%%'"
2917 " AND name LIKE ?1", zSql);
2918 }else{
2919 zSql = sqlite3_mprintf(
2920 "%z UNION ALL "
2921 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
2922 " WHERE type IN ('table','view')"
2923 " AND name NOT LIKE 'sqlite_%%'"
2924 " AND name LIKE ?1", zSql, zDbName, zDbName);
2925 }
drha50da102000-08-08 20:19:09 +00002926 }
drh98781232012-04-23 12:38:05 +00002927 sqlite3_finalize(pStmt);
2928 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
2929 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2930 sqlite3_free(zSql);
2931 if( rc ) return rc;
2932 nRow = nAlloc = 0;
2933 azResult = 0;
2934 if( nArg>1 ){
2935 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00002936 }else{
drh98781232012-04-23 12:38:05 +00002937 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2938 }
2939 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2940 if( nRow>=nAlloc ){
2941 char **azNew;
2942 int n = nAlloc*2 + 10;
2943 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2944 if( azNew==0 ){
2945 fprintf(stderr, "Error: out of memory\n");
2946 break;
2947 }
2948 nAlloc = n;
2949 azResult = azNew;
2950 }
2951 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
2952 if( azResult[nRow] ) nRow++;
2953 }
2954 sqlite3_finalize(pStmt);
2955 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00002956 int len, maxlen = 0;
2957 int i, j;
2958 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00002959 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00002960 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002961 if( len>maxlen ) maxlen = len;
2962 }
2963 nPrintCol = 80/(maxlen+2);
2964 if( nPrintCol<1 ) nPrintCol = 1;
2965 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2966 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00002967 for(j=i; j<nRow; j+=nPrintRow){
2968 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00002969 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00002970 }
drh151b7d52013-05-06 20:28:54 +00002971 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00002972 }
2973 }
drh98781232012-04-23 12:38:05 +00002974 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
2975 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00002976 }else
2977
shaneh96887e12011-02-10 21:08:58 +00002978 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002979 static const struct {
2980 const char *zCtrlName; /* Name of a test-control option */
2981 int ctrlCode; /* Integer code for that option */
2982 } aCtrl[] = {
2983 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2984 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2985 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2986 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2987 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2988 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2989 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2990 { "assert", SQLITE_TESTCTRL_ASSERT },
2991 { "always", SQLITE_TESTCTRL_ALWAYS },
2992 { "reserve", SQLITE_TESTCTRL_RESERVE },
2993 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2994 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002995 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2996 };
shaneh96887e12011-02-10 21:08:58 +00002997 int testctrl = -1;
2998 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002999 int i, n;
drh05782482013-10-24 15:20:20 +00003000 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003001
drhd416fe72011-03-17 16:45:50 +00003002 /* convert testctrl text option to value. allow any unique prefix
3003 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003004 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003005 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003006 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3007 if( testctrl<0 ){
3008 testctrl = aCtrl[i].ctrlCode;
3009 }else{
drhb07028f2011-10-14 21:49:18 +00003010 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003011 testctrl = -1;
3012 break;
3013 }
3014 }
3015 }
drh348d19c2013-06-03 12:47:43 +00003016 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003017 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3018 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3019 }else{
3020 switch(testctrl){
3021
3022 /* sqlite3_test_control(int, db, int) */
3023 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3024 case SQLITE_TESTCTRL_RESERVE:
3025 if( nArg==3 ){
3026 int opt = (int)strtol(azArg[2], 0, 0);
3027 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003028 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003029 } else {
drhd416fe72011-03-17 16:45:50 +00003030 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3031 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003032 }
3033 break;
3034
3035 /* sqlite3_test_control(int) */
3036 case SQLITE_TESTCTRL_PRNG_SAVE:
3037 case SQLITE_TESTCTRL_PRNG_RESTORE:
3038 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00003039 if( nArg==2 ){
3040 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003041 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003042 } else {
3043 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3044 }
3045 break;
3046
3047 /* sqlite3_test_control(int, uint) */
3048 case SQLITE_TESTCTRL_PENDING_BYTE:
3049 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003050 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003051 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003052 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003053 } else {
drhd416fe72011-03-17 16:45:50 +00003054 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3055 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003056 }
3057 break;
3058
3059 /* sqlite3_test_control(int, int) */
3060 case SQLITE_TESTCTRL_ASSERT:
3061 case SQLITE_TESTCTRL_ALWAYS:
3062 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003063 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003064 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003065 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003066 } else {
drhd416fe72011-03-17 16:45:50 +00003067 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3068 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003069 }
3070 break;
3071
3072 /* sqlite3_test_control(int, char *) */
3073#ifdef SQLITE_N_KEYWORD
3074 case SQLITE_TESTCTRL_ISKEYWORD:
3075 if( nArg==3 ){
3076 const char *opt = azArg[2];
3077 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003078 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003079 } else {
drhd416fe72011-03-17 16:45:50 +00003080 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3081 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003082 }
3083 break;
3084#endif
3085
3086 case SQLITE_TESTCTRL_BITVEC_TEST:
3087 case SQLITE_TESTCTRL_FAULT_INSTALL:
3088 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3089 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3090 default:
drhd416fe72011-03-17 16:45:50 +00003091 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3092 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003093 break;
3094 }
3095 }
3096 }else
3097
shanehe2aa9d72009-11-06 17:20:17 +00003098 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh05782482013-10-24 15:20:20 +00003099 open_db(p, 0);
drh348d19c2013-06-03 12:47:43 +00003100 sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00003101 }else
3102
drhd416fe72011-03-17 16:45:50 +00003103 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
3104 && nArg==2
3105 ){
drh3b1a9882007-11-02 12:53:03 +00003106 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00003107 }else
3108
drh42f64e52012-04-04 16:56:23 +00003109 if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
drh05782482013-10-24 15:20:20 +00003110 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003111 output_file_close(p->traceOut);
3112 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003113#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003114 if( p->traceOut==0 ){
3115 sqlite3_trace(p->db, 0, 0);
3116 }else{
3117 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3118 }
3119#endif
3120 }else
3121
drh9fd301b2011-06-03 13:28:22 +00003122 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003123 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003124 sqlite3_libversion(), sqlite3_sourceid());
3125 }else
3126
drhde60fc22011-12-14 17:53:36 +00003127 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3128 const char *zDbName = nArg==2 ? azArg[1] : "main";
3129 char *zVfsName = 0;
3130 if( p->db ){
3131 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3132 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003133 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003134 sqlite3_free(zVfsName);
3135 }
3136 }
3137 }else
3138
drhcef4fc82012-09-21 22:50:45 +00003139#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3140 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3141 extern int sqlite3WhereTrace;
drh7d9f3942013-04-03 01:26:54 +00003142 sqlite3WhereTrace = booleanValue(azArg[1]);
drhcef4fc82012-09-21 22:50:45 +00003143 }else
3144#endif
3145
shanehe2aa9d72009-11-06 17:20:17 +00003146 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00003147 int j;
drh43617e92006-03-06 20:55:46 +00003148 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003149 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003150 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003151 }
3152 }else
3153
3154 {
shane9bd1b442009-10-23 01:27:39 +00003155 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003156 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003157 rc = 1;
drh75897232000-05-29 14:26:00 +00003158 }
drh67505e72002-04-19 12:34:06 +00003159
3160 return rc;
drh75897232000-05-29 14:26:00 +00003161}
3162
drh67505e72002-04-19 12:34:06 +00003163/*
drh91a66392007-09-07 01:12:32 +00003164** Return TRUE if a semicolon occurs anywhere in the first N characters
3165** of string z[].
drh324ccef2003-02-05 14:06:20 +00003166*/
drh9f099fd2013-08-06 14:01:46 +00003167static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003168 int i;
3169 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3170 return 0;
drh324ccef2003-02-05 14:06:20 +00003171}
3172
3173/*
drh70c7a4b2003-04-26 03:03:06 +00003174** Test to see if a line consists entirely of whitespace.
3175*/
3176static int _all_whitespace(const char *z){
3177 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003178 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003179 if( *z=='/' && z[1]=='*' ){
3180 z += 2;
3181 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3182 if( *z==0 ) return 0;
3183 z++;
3184 continue;
3185 }
3186 if( *z=='-' && z[1]=='-' ){
3187 z += 2;
3188 while( *z && *z!='\n' ){ z++; }
3189 if( *z==0 ) return 1;
3190 continue;
3191 }
3192 return 0;
3193 }
3194 return 1;
3195}
3196
3197/*
drha9b17162003-04-29 18:01:28 +00003198** Return TRUE if the line typed in is an SQL command terminator other
3199** than a semi-colon. The SQL Server style "go" command is understood
3200** as is the Oracle "/".
3201*/
drh9f099fd2013-08-06 14:01:46 +00003202static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003203 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003204 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3205 return 1; /* Oracle */
3206 }
drhf0693c82011-10-11 20:41:54 +00003207 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003208 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003209 return 1; /* SQL Server */
3210 }
3211 return 0;
3212}
3213
3214/*
drh233a5312008-12-18 22:25:13 +00003215** Return true if zSql is a complete SQL statement. Return false if it
3216** ends in the middle of a string literal or C-style comment.
3217*/
drh9f099fd2013-08-06 14:01:46 +00003218static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003219 int rc;
3220 if( zSql==0 ) return 1;
3221 zSql[nSql] = ';';
3222 zSql[nSql+1] = 0;
3223 rc = sqlite3_complete(zSql);
3224 zSql[nSql] = 0;
3225 return rc;
3226}
3227
3228/*
drh67505e72002-04-19 12:34:06 +00003229** Read input from *in and process it. If *in==0 then input
3230** is interactive - the user is typing it it. Otherwise, input
3231** is coming from a file or device. A prompt is issued and history
3232** is saved only if input is interactive. An interrupt signal will
3233** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003234**
3235** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003236*/
drhc28490c2006-10-26 14:25:58 +00003237static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003238 char *zLine = 0; /* A single input line */
3239 char *zSql = 0; /* Accumulated SQL text */
3240 int nLine; /* Length of current line */
3241 int nSql = 0; /* Bytes of zSql[] used */
3242 int nAlloc = 0; /* Allocated zSql[] space */
3243 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3244 char *zErrMsg; /* Error message returned */
3245 int rc; /* Error code */
3246 int errCnt = 0; /* Number of errors seen */
3247 int lineno = 0; /* Current line number */
3248 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003249
3250 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3251 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003252 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003253 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003254 /* End of input */
3255 if( stdin_is_interactive ) printf("\n");
3256 break;
drhc49f44e2006-10-26 18:15:42 +00003257 }
drh67505e72002-04-19 12:34:06 +00003258 if( seenInterrupt ){
3259 if( in!=0 ) break;
3260 seenInterrupt = 0;
3261 }
drhc28490c2006-10-26 14:25:58 +00003262 lineno++;
drh849a9d92013-12-21 15:46:06 +00003263 if( nSql==0 && _all_whitespace(zLine) ){
3264 if( p->echoOn ) printf("%s\n", zLine);
3265 continue;
3266 }
drh2af0b2d2002-02-21 02:25:02 +00003267 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003268 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003269 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003270 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003271 break;
3272 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003273 errCnt++;
3274 }
drhdaffd0e2001-04-11 14:28:42 +00003275 continue;
3276 }
drh9f099fd2013-08-06 14:01:46 +00003277 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003278 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003279 }
drh9f099fd2013-08-06 14:01:46 +00003280 nLine = strlen30(zLine);
3281 if( nSql+nLine+2>=nAlloc ){
3282 nAlloc = nSql+nLine+100;
3283 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003284 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003285 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003286 exit(1);
3287 }
drhdaffd0e2001-04-11 14:28:42 +00003288 }
drh9f099fd2013-08-06 14:01:46 +00003289 nSqlPrior = nSql;
3290 if( nSql==0 ){
3291 int i;
3292 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003293 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003294 memcpy(zSql, zLine+i, nLine+1-i);
3295 startline = lineno;
3296 nSql = nLine-i;
3297 }else{
3298 zSql[nSql++] = '\n';
3299 memcpy(zSql+nSql, zLine, nLine+1);
3300 nSql += nLine;
3301 }
3302 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003303 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003304 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003305 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003306 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003307 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003308 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003309 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003310 char zPrefix[100];
3311 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003312 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003313 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003314 }else{
shane9bd1b442009-10-23 01:27:39 +00003315 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003316 }
drh7f953e22002-07-13 17:33:45 +00003317 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003318 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003319 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003320 zErrMsg = 0;
3321 }else{
shaned2bed1c2009-10-21 03:56:54 +00003322 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003323 }
drhc49f44e2006-10-26 18:15:42 +00003324 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003325 }
drhdaffd0e2001-04-11 14:28:42 +00003326 nSql = 0;
drh9f099fd2013-08-06 14:01:46 +00003327 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003328 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003329 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003330 }
3331 }
drh9f099fd2013-08-06 14:01:46 +00003332 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003333 if( !_all_whitespace(zSql) ){
3334 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3335 }
drhdaffd0e2001-04-11 14:28:42 +00003336 free(zSql);
3337 }
danielk19772ac27622007-07-03 05:31:16 +00003338 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003339 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003340}
3341
drh67505e72002-04-19 12:34:06 +00003342/*
3343** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003344** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003345*/
3346static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003347 static char *home_dir = NULL;
3348 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003349
drh83905c92012-06-21 13:00:37 +00003350#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003351 {
3352 struct passwd *pwent;
3353 uid_t uid = getuid();
3354 if( (pwent=getpwuid(uid)) != NULL) {
3355 home_dir = pwent->pw_dir;
3356 }
drh67505e72002-04-19 12:34:06 +00003357 }
3358#endif
3359
chw65d3c132007-11-12 21:09:10 +00003360#if defined(_WIN32_WCE)
3361 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3362 */
drh85e72432012-04-11 11:38:53 +00003363 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003364#else
3365
drh83905c92012-06-21 13:00:37 +00003366#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003367 if (!home_dir) {
3368 home_dir = getenv("USERPROFILE");
3369 }
3370#endif
3371
drh67505e72002-04-19 12:34:06 +00003372 if (!home_dir) {
3373 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003374 }
3375
drh83905c92012-06-21 13:00:37 +00003376#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003377 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003378 char *zDrive, *zPath;
3379 int n;
3380 zDrive = getenv("HOMEDRIVE");
3381 zPath = getenv("HOMEPATH");
3382 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003383 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003384 home_dir = malloc( n );
3385 if( home_dir==0 ) return 0;
3386 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3387 return home_dir;
3388 }
3389 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003390 }
3391#endif
3392
chw65d3c132007-11-12 21:09:10 +00003393#endif /* !_WIN32_WCE */
3394
drh67505e72002-04-19 12:34:06 +00003395 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003396 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003397 char *z = malloc( n );
3398 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003399 home_dir = z;
3400 }
drhe98d4fa2002-04-21 19:06:22 +00003401
drh67505e72002-04-19 12:34:06 +00003402 return home_dir;
3403}
3404
3405/*
3406** Read input from the file given by sqliterc_override. Or if that
3407** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003408**
3409** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003410*/
shane9bd1b442009-10-23 01:27:39 +00003411static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003412 struct callback_data *p, /* Configuration data */
3413 const char *sqliterc_override /* Name of config file. NULL to use default */
3414){
persicom7e2dfdd2002-04-18 02:46:52 +00003415 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003416 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003417 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003418 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003419 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003420
3421 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003422 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003423 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003424#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003425 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003426#endif
shane9bd1b442009-10-23 01:27:39 +00003427 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003428 }
drh2f3de322012-06-27 16:41:31 +00003429 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003430 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3431 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003432 }
drha1f9b5e2004-02-14 16:31:02 +00003433 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003434 if( in ){
drhc28490c2006-10-26 14:25:58 +00003435 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003436 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003437 }
shane9bd1b442009-10-23 01:27:39 +00003438 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003439 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003440 }
drh85e72432012-04-11 11:38:53 +00003441 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003442 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003443}
3444
drh67505e72002-04-19 12:34:06 +00003445/*
drhe1e38c42003-05-04 18:30:59 +00003446** Show available command line options
3447*/
3448static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003449 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003450 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003451 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003452 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003453 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003454 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003455 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003456 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003457#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3458 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3459#endif
drhcc3b4f82012-02-07 14:13:50 +00003460 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003461 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003462 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003463 " -line set output mode to 'line'\n"
3464 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003465 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003466#ifdef SQLITE_ENABLE_MULTIPLEX
3467 " -multiplex enable the multiplexor VFS\n"
3468#endif
drh98d312f2012-10-25 15:23:14 +00003469 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3470 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003471 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003472 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003473 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003474#ifdef SQLITE_ENABLE_VFSTRACE
3475 " -vfstrace enable tracing of all VFS calls\n"
3476#endif
drhe1e38c42003-05-04 18:30:59 +00003477;
3478static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003479 fprintf(stderr,
3480 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3481 "FILENAME is the name of an SQLite database. A new database is created\n"
3482 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003483 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003484 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003485 }else{
3486 fprintf(stderr, "Use the -help option for additional information\n");
3487 }
3488 exit(1);
3489}
3490
3491/*
drh67505e72002-04-19 12:34:06 +00003492** Initialize the state information in data
3493*/
drh0850b532006-01-31 19:31:43 +00003494static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003495 memset(data, 0, sizeof(*data));
3496 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003497 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003498 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003499 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003500 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003501 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3502 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003503 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003504}
3505
drh98d312f2012-10-25 15:23:14 +00003506/*
3507** Get the argument to an --option. Throw an error and die if no argument
3508** is available.
3509*/
3510static char *cmdline_option_value(int argc, char **argv, int i){
3511 if( i==argc ){
3512 fprintf(stderr, "%s: Error: missing argument to %s\n",
3513 argv[0], argv[argc-1]);
3514 exit(1);
3515 }
3516 return argv[i];
3517}
3518
drh75897232000-05-29 14:26:00 +00003519int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003520 char *zErrMsg = 0;
3521 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003522 const char *zInitFile = 0;
3523 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003524 int i;
drhc28490c2006-10-26 14:25:58 +00003525 int rc = 0;
drh75897232000-05-29 14:26:00 +00003526
drh52784bd2011-05-18 17:15:06 +00003527 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3528 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3529 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3530 exit(1);
3531 }
drhdaffd0e2001-04-11 14:28:42 +00003532 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003533 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003534 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003535
drh44c2eb12003-04-30 11:38:26 +00003536 /* Make sure we have a valid signal handler early, before anything
3537 ** else is done.
3538 */
drh4c504392000-10-16 22:06:40 +00003539#ifdef SIGINT
3540 signal(SIGINT, interrupt_handler);
3541#endif
drh44c2eb12003-04-30 11:38:26 +00003542
drh22fbcb82004-02-01 01:22:50 +00003543 /* Do an initial pass through the command-line argument to locate
3544 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003545 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003546 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003547 */
drh98d312f2012-10-25 15:23:14 +00003548 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003549 char *z;
drhc28490c2006-10-26 14:25:58 +00003550 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003551 if( z[0]!='-' ){
3552 if( data.zDbFilename==0 ){
3553 data.zDbFilename = z;
3554 continue;
3555 }
3556 if( zFirstCmd==0 ){
3557 zFirstCmd = z;
3558 continue;
3559 }
3560 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3561 fprintf(stderr,"Use -help for a list of options.\n");
3562 return 1;
3563 }
drhcc3b4f82012-02-07 14:13:50 +00003564 if( z[1]=='-' ) z++;
3565 if( strcmp(z,"-separator")==0
3566 || strcmp(z,"-nullvalue")==0
3567 || strcmp(z,"-cmd")==0
3568 ){
drh98d312f2012-10-25 15:23:14 +00003569 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003570 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003571 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003572 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003573 /* Need to check for batch mode here to so we can avoid printing
3574 ** informational messages (like from process_sqliterc) before
3575 ** we do the actual processing of arguments later in a second pass.
3576 */
shanef69573d2009-10-24 02:06:14 +00003577 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003578 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003579#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003580 const char *zSize;
3581 sqlite3_int64 szHeap;
3582
drh98d312f2012-10-25 15:23:14 +00003583 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003584 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003585 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003586 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3587#endif
drh97ae8ff2011-03-16 16:56:29 +00003588#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003589 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003590 extern int vfstrace_register(
3591 const char *zTraceName,
3592 const char *zOldVfsName,
3593 int (*xOut)(const char*,void*),
3594 void *pOutArg,
3595 int makeDefault
3596 );
drh2b625e22011-03-16 17:05:28 +00003597 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003598#endif
drh6f25e892011-07-08 17:02:57 +00003599#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003600 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003601 extern int sqlite3_multiple_initialize(const char*,int);
3602 sqlite3_multiplex_initialize(0, 1);
3603#endif
drh7d9f3942013-04-03 01:26:54 +00003604 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003605 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3606 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003607 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003608 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003609 if( pVfs ){
3610 sqlite3_vfs_register(pVfs, 1);
3611 }else{
3612 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3613 exit(1);
3614 }
drh44c2eb12003-04-30 11:38:26 +00003615 }
3616 }
drh98d312f2012-10-25 15:23:14 +00003617 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003618#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003619 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00003620#else
shane86f5bdb2009-10-24 02:00:07 +00003621 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3622 return 1;
drh01b41712005-08-29 23:06:23 +00003623#endif
drh98d312f2012-10-25 15:23:14 +00003624 }
3625 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003626
drh44c2eb12003-04-30 11:38:26 +00003627 /* Go ahead and open the database file if it already exists. If the
3628 ** file does not exist, delay opening it. This prevents empty database
3629 ** files from being created if a user mistypes the database name argument
3630 ** to the sqlite command-line tool.
3631 */
drhc8d74412004-08-31 23:41:26 +00003632 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003633 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003634 }
3635
drh22fbcb82004-02-01 01:22:50 +00003636 /* Process the initialization file if there is one. If no -init option
3637 ** is given on the command line, look for a file named ~/.sqliterc and
3638 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003639 */
shane86f5bdb2009-10-24 02:00:07 +00003640 rc = process_sqliterc(&data,zInitFile);
3641 if( rc>0 ){
3642 return rc;
3643 }
drh44c2eb12003-04-30 11:38:26 +00003644
drh22fbcb82004-02-01 01:22:50 +00003645 /* Make a second pass through the command-line argument and set
3646 ** options. This second pass is delayed until after the initialization
3647 ** file is processed so that the command-line arguments will override
3648 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003649 */
drh98d312f2012-10-25 15:23:14 +00003650 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003651 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003652 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003653 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003654 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003655 i++;
3656 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003657 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00003658 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003659 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00003660 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003661 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00003662 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00003663 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00003664 }else if( strcmp(z,"-csv")==0 ){
3665 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00003666 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00003667 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003668 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00003669 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003670 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00003671 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00003672 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00003673 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003674 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00003675 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003676 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00003677 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00003678 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00003679 }else if( strcmp(z,"-stats")==0 ){
3680 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00003681 }else if( strcmp(z,"-bail")==0 ){
3682 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00003683 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00003684 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00003685 return 0;
drhc28490c2006-10-26 14:25:58 +00003686 }else if( strcmp(z,"-interactive")==0 ){
3687 stdin_is_interactive = 1;
3688 }else if( strcmp(z,"-batch")==0 ){
3689 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00003690 }else if( strcmp(z,"-heap")==0 ){
3691 i++;
drh7d9f3942013-04-03 01:26:54 +00003692 }else if( strcmp(z,"-mmap")==0 ){
3693 i++;
drha7e61d82011-03-12 17:02:57 +00003694 }else if( strcmp(z,"-vfs")==0 ){
3695 i++;
drh6f25e892011-07-08 17:02:57 +00003696#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00003697 }else if( strcmp(z,"-vfstrace")==0 ){
3698 i++;
drh6f25e892011-07-08 17:02:57 +00003699#endif
3700#ifdef SQLITE_ENABLE_MULTIPLEX
3701 }else if( strcmp(z,"-multiplex")==0 ){
3702 i++;
3703#endif
drhcc3b4f82012-02-07 14:13:50 +00003704 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00003705 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00003706 }else if( strcmp(z,"-cmd")==0 ){
3707 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00003708 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00003709 if( z[0]=='.' ){
3710 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00003711 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00003712 }else{
drh05782482013-10-24 15:20:20 +00003713 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00003714 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
3715 if( zErrMsg!=0 ){
3716 fprintf(stderr,"Error: %s\n", zErrMsg);
3717 if( bail_on_error ) return rc!=0 ? rc : 1;
3718 }else if( rc!=0 ){
3719 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
3720 if( bail_on_error ) return rc;
3721 }
3722 }
drh1e5d0e92000-05-31 23:33:17 +00003723 }else{
shane86f5bdb2009-10-24 02:00:07 +00003724 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00003725 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00003726 return 1;
3727 }
3728 }
drh44c2eb12003-04-30 11:38:26 +00003729
drh22fbcb82004-02-01 01:22:50 +00003730 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00003731 /* Run just the command that follows the database name
3732 */
drh22fbcb82004-02-01 01:22:50 +00003733 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00003734 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00003735 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00003736 }else{
drh05782482013-10-24 15:20:20 +00003737 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00003738 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00003739 if( zErrMsg!=0 ){
3740 fprintf(stderr,"Error: %s\n", zErrMsg);
3741 return rc!=0 ? rc : 1;
3742 }else if( rc!=0 ){
3743 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
3744 return rc;
drh6ff13852001-11-25 13:18:23 +00003745 }
drh75897232000-05-29 14:26:00 +00003746 }
3747 }else{
drh44c2eb12003-04-30 11:38:26 +00003748 /* Run commands received from standard input
3749 */
drhc28490c2006-10-26 14:25:58 +00003750 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00003751 char *zHome;
3752 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00003753 int nHistory;
drh75897232000-05-29 14:26:00 +00003754 printf(
drh743e0032011-12-12 16:51:50 +00003755 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00003756 "Enter \".help\" for instructions\n"
3757 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00003758 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00003759 );
drh67505e72002-04-19 12:34:06 +00003760 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00003761 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00003762 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00003763 if( (zHistory = malloc(nHistory))!=0 ){
3764 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
3765 }
drh67505e72002-04-19 12:34:06 +00003766 }
drhaaa21b42014-02-11 14:37:51 +00003767#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00003768 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00003769#endif
drhc28490c2006-10-26 14:25:58 +00003770 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00003771 if( zHistory ){
3772 stifle_history(100);
3773 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00003774 free(zHistory);
drh67505e72002-04-19 12:34:06 +00003775 }
drhdaffd0e2001-04-11 14:28:42 +00003776 }else{
drhc28490c2006-10-26 14:25:58 +00003777 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00003778 }
3779 }
drh33048c02001-10-01 14:29:22 +00003780 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00003781 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00003782 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00003783 }
drh05782482013-10-24 15:20:20 +00003784 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00003785 return rc;
drh75897232000-05-29 14:26:00 +00003786}