blob: bae22d56a692ae5af3060f38d27ac83141da9769 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
shane18e526c2008-12-10 22:30:24 +000067#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000068#ifndef access
69# define access(f,m) _access((f),(m))
70#endif
drh67ceaa62012-08-27 21:19:03 +000071#undef popen
drh53371f92013-07-25 17:07:03 +000072#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000073#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000074#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000075#else
drh4328c8b2003-04-26 02:50:11 +000076/* Make sure isatty() has a prototype.
77*/
drhb2acc3b2011-10-13 16:36:29 +000078extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000079
drh53371f92013-07-25 17:07:03 +000080/* popen and pclose are not C89 functions and so are sometimes omitted from
81** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000082extern FILE *popen(const char*,const char*);
83extern int pclose(FILE*);
84#endif
drh53371f92013-07-25 17:07:03 +000085
chw65d3c132007-11-12 21:09:10 +000086#if defined(_WIN32_WCE)
87/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
88 * thus we always assume that we have a console. That can be
89 * overridden with the -batch command line option.
90 */
91#define isatty(x) 1
92#endif
93
drhf0693c82011-10-11 20:41:54 +000094/* ctype macros that work with signed characters */
95#define IsSpace(X) isspace((unsigned char)X)
96#define IsDigit(X) isdigit((unsigned char)X)
97#define ToLower(X) (char)tolower((unsigned char)X)
98
drh43408312013-10-30 12:43:36 +000099
100/* True if the timer is enabled */
101static int enableTimer = 0;
102
103/* Return the current wall-clock time */
104static sqlite3_int64 timeOfDay(void){
105 static sqlite3_vfs *clockVfs = 0;
106 sqlite3_int64 t;
107 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
108 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
109 clockVfs->xCurrentTimeInt64(clockVfs, &t);
110 }else{
111 double r;
112 clockVfs->xCurrentTime(clockVfs, &r);
113 t = (sqlite3_int64)(r*86400000.0);
114 }
115 return t;
116}
117
drhd5d0f642013-02-20 00:54:21 +0000118#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
119 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000120#include <sys/time.h>
121#include <sys/resource.h>
122
drhda108222009-02-25 19:07:24 +0000123/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000124static struct rusage sBegin; /* CPU time at start */
125static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000126
drhda108222009-02-25 19:07:24 +0000127/*
128** Begin timing an operation
129*/
130static void beginTimer(void){
131 if( enableTimer ){
132 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000133 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000134 }
135}
136
137/* Return the difference of two time_structs in seconds */
138static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
139 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
140 (double)(pEnd->tv_sec - pStart->tv_sec);
141}
142
143/*
144** Print the timing results.
145*/
146static void endTimer(void){
147 if( enableTimer ){
148 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000149 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000150 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000151 printf("Run Time: real %.3f user %f sys %f\n",
152 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000153 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
154 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
155 }
156}
shaneb320ccd2009-10-21 03:42:58 +0000157
drhda108222009-02-25 19:07:24 +0000158#define BEGIN_TIMER beginTimer()
159#define END_TIMER endTimer()
160#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000161
162#elif (defined(_WIN32) || defined(WIN32))
163
164#include <windows.h>
165
166/* Saved resource information for the beginning of an operation */
167static HANDLE hProcess;
168static FILETIME ftKernelBegin;
169static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000170static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000171typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
172static GETPROCTIMES getProcessTimesAddr = NULL;
173
shaneb320ccd2009-10-21 03:42:58 +0000174/*
175** Check to see if we have timer support. Return 1 if necessary
176** support found (or found previously).
177*/
178static int hasTimer(void){
179 if( getProcessTimesAddr ){
180 return 1;
181 } else {
182 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
183 ** See if the version we are running on has it, and if it does, save off
184 ** a pointer to it and the current process handle.
185 */
186 hProcess = GetCurrentProcess();
187 if( hProcess ){
188 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
189 if( NULL != hinstLib ){
190 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
191 if( NULL != getProcessTimesAddr ){
192 return 1;
193 }
194 FreeLibrary(hinstLib);
195 }
196 }
197 }
198 return 0;
199}
200
201/*
202** Begin timing an operation
203*/
204static void beginTimer(void){
205 if( enableTimer && getProcessTimesAddr ){
206 FILETIME ftCreation, ftExit;
207 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000208 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000209 }
210}
211
212/* Return the difference of two FILETIME structs in seconds */
213static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
214 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
215 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
216 return (double) ((i64End - i64Start) / 10000000.0);
217}
218
219/*
220** Print the timing results.
221*/
222static void endTimer(void){
223 if( enableTimer && getProcessTimesAddr){
224 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000225 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000226 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000227 printf("Run Time: real %.3f user %f sys %f\n",
228 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000229 timeDiff(&ftUserBegin, &ftUserEnd),
230 timeDiff(&ftKernelBegin, &ftKernelEnd));
231 }
232}
233
234#define BEGIN_TIMER beginTimer()
235#define END_TIMER endTimer()
236#define HAS_TIMER hasTimer()
237
drhda108222009-02-25 19:07:24 +0000238#else
239#define BEGIN_TIMER
240#define END_TIMER
241#define HAS_TIMER 0
242#endif
243
shanec0688ea2009-03-05 03:48:06 +0000244/*
245** Used to prevent warnings about unused parameters
246*/
247#define UNUSED_PARAMETER(x) (void)(x)
248
drhe91d16b2008-12-08 18:27:31 +0000249/*
drhc49f44e2006-10-26 18:15:42 +0000250** If the following flag is set, then command execution stops
251** at an error if we are not interactive.
252*/
253static int bail_on_error = 0;
254
255/*
drhc28490c2006-10-26 14:25:58 +0000256** Threat stdin as an interactive input if the following variable
257** is true. Otherwise, assume stdin is connected to a file or pipe.
258*/
259static int stdin_is_interactive = 1;
260
261/*
drh4c504392000-10-16 22:06:40 +0000262** The following is the open SQLite database. We make a pointer
263** to this database a static variable so that it can be accessed
264** by the SIGINT handler to interrupt database processing.
265*/
danielk197792f9a1b2004-06-19 09:08:16 +0000266static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000267
268/*
drh67505e72002-04-19 12:34:06 +0000269** True if an interrupt (Control-C) has been received.
270*/
drh43617e92006-03-06 20:55:46 +0000271static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000272
273/*
persicom7e2dfdd2002-04-18 02:46:52 +0000274** This is the name of our program. It is set in main(), used
275** in a number of other places, mostly for error messages.
276*/
277static char *Argv0;
278
279/*
280** Prompt strings. Initialized in main. Settable with
281** .prompt main continue
282*/
283static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
284static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
285
drhb0603412007-02-28 04:47:26 +0000286/*
287** Write I/O traces to the following stream.
288*/
rsebe0a9092007-07-30 18:24:38 +0000289#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000290static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000291#endif
drhb0603412007-02-28 04:47:26 +0000292
293/*
294** This routine works like printf in that its first argument is a
295** format string and subsequent arguments are values to be substituted
296** in place of % fields. The result of formatting this string
297** is written to iotrace.
298*/
rsebe0a9092007-07-30 18:24:38 +0000299#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000300static void iotracePrintf(const char *zFormat, ...){
301 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000302 char *z;
drhb0603412007-02-28 04:47:26 +0000303 if( iotrace==0 ) return;
304 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000305 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000306 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000307 fprintf(iotrace, "%s", z);
308 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000309}
rsebe0a9092007-07-30 18:24:38 +0000310#endif
drhb0603412007-02-28 04:47:26 +0000311
drh44c2eb12003-04-30 11:38:26 +0000312
persicom7e2dfdd2002-04-18 02:46:52 +0000313/*
drh83965662003-04-17 02:54:13 +0000314** Determines if a string is a number of not.
315*/
danielk19772e588c72005-12-09 14:25:08 +0000316static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000317 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000318 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000319 return 0;
320 }
321 z++;
322 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000323 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000324 if( *z=='.' ){
325 z++;
drhf0693c82011-10-11 20:41:54 +0000326 if( !IsDigit(*z) ) return 0;
327 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000328 if( realnum ) *realnum = 1;
329 }
330 if( *z=='e' || *z=='E' ){
331 z++;
332 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000333 if( !IsDigit(*z) ) return 0;
334 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000335 if( realnum ) *realnum = 1;
336 }
337 return *z==0;
338}
drh83965662003-04-17 02:54:13 +0000339
340/*
danielk1977bc6ada42004-06-30 08:20:16 +0000341** A global char* and an SQL function to access its current value
342** from within an SQL statement. This program used to use the
343** sqlite_exec_printf() API to substitue a string into an SQL statement.
344** The correct way to do this with sqlite3 is to use the bind API, but
345** since the shell is built around the callback paradigm it would be a lot
346** of work. Instead just use this hack, which is quite harmless.
347*/
348static const char *zShellStatic = 0;
349static void shellstaticFunc(
350 sqlite3_context *context,
351 int argc,
352 sqlite3_value **argv
353){
354 assert( 0==argc );
355 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000356 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000357 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000358 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
359}
360
361
362/*
drhfeac5f82004-08-01 00:10:45 +0000363** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000364** the text in memory obtained from malloc() and returns a pointer
365** to the text. NULL is returned at end of file, or if malloc()
366** fails.
367**
drh9f099fd2013-08-06 14:01:46 +0000368** If zLine is not NULL then it is a malloced buffer returned from
369** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000370*/
drh9f099fd2013-08-06 14:01:46 +0000371static char *local_getline(char *zLine, FILE *in){
372 int nLine = zLine==0 ? 0 : 100;
373 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000374
drhb07028f2011-10-14 21:49:18 +0000375 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000376 if( n+100>nLine ){
377 nLine = nLine*2 + 100;
378 zLine = realloc(zLine, nLine);
379 if( zLine==0 ) return 0;
380 }
drhdaffd0e2001-04-11 14:28:42 +0000381 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000382 if( n==0 ){
383 free(zLine);
384 return 0;
385 }
386 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000387 break;
388 }
drh9f099fd2013-08-06 14:01:46 +0000389 while( zLine[n] ) n++;
390 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000391 n--;
shaneh13b36022009-12-17 21:07:15 +0000392 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000393 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000394 break;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 }
drh8e7e7a22000-05-30 18:45:23 +0000397 return zLine;
398}
399
400/*
drhc28490c2006-10-26 14:25:58 +0000401** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000402**
drh9f099fd2013-08-06 14:01:46 +0000403** If in==0 then read from standard input and prompt before each line.
404** If isContinuation is true, then a continuation prompt is appropriate.
405** If isContinuation is zero, then the main prompt should be used.
406**
407** If zPrior is not NULL then it is a buffer from a prior call to this
408** routine that can be reused.
409**
410** The result is stored in space obtained from malloc() and must either
411** be freed by the caller or else passed back into this routine via the
412** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000413*/
drh9f099fd2013-08-06 14:01:46 +0000414static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000415 char *zPrompt;
416 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000417 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000418 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000419 }else{
drh9f099fd2013-08-06 14:01:46 +0000420 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000421#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000422 free(zPrior);
423 zResult = readline(zPrompt);
424 if( zResult && *zResult ) add_history(zResult);
425#else
426 printf("%s", zPrompt);
427 fflush(stdout);
428 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000429#endif
drh9f099fd2013-08-06 14:01:46 +0000430 }
drh8e7e7a22000-05-30 18:45:23 +0000431 return zResult;
432}
433
persicom7e2dfdd2002-04-18 02:46:52 +0000434struct previous_mode_data {
435 int valid; /* Is there legit data in here? */
436 int mode;
437 int showHeader;
438 int colWidth[100];
439};
drh45e29d82006-11-20 16:21:10 +0000440
drh8e7e7a22000-05-30 18:45:23 +0000441/*
drh75897232000-05-29 14:26:00 +0000442** An pointer to an instance of this structure is passed from
443** the main program to the callback. This is used to communicate
444** state and mode information.
445*/
446struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000447 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000448 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000449 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000450 int statsOn; /* True to display memory stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +0000451 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000452 int cnt; /* Number of records displayed so far */
453 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000454 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000455 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000456 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000457 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000458 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000459 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000460 char colSeparator[20]; /* Column separator character for several modes */
461 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000462 int colWidth[100]; /* Requested width of each column when in column mode*/
463 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000464 char nullvalue[20]; /* The text to print when a NULL comes back from
465 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000466 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000467 /* Holds the mode information just before
468 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000469 char outfile[FILENAME_MAX]; /* Filename for *out */
470 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000471 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000472 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000473 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000474 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000475 int *aiIndent; /* Array of indents used in MODE_Explain */
476 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000477 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000478};
479
480/*
481** These are the allowed modes.
482*/
drh967e8b72000-06-21 13:59:10 +0000483#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000484#define MODE_Column 1 /* One record per line in neat columns */
485#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000486#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
487#define MODE_Html 4 /* Generate an XHTML table */
488#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000489#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000490#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000491#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000492#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000493
drh66ce4d02008-02-15 17:38:06 +0000494static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000495 "line",
496 "column",
497 "list",
498 "semi",
499 "html",
drhfeac5f82004-08-01 00:10:45 +0000500 "insert",
501 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000502 "csv",
drh66ce4d02008-02-15 17:38:06 +0000503 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000504 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000505};
drh75897232000-05-29 14:26:00 +0000506
507/*
mistachkin636bf9f2014-07-19 20:15:16 +0000508** These are the column/row separators used by the ASCII mode.
509*/
510#define SEP_Line "\n"
511#define SEP_Column "\x1F"
512#define SEP_Row "\x1E"
513
514/*
drh75897232000-05-29 14:26:00 +0000515** Number of elements in an array
516*/
drh902b9ee2008-12-05 17:17:07 +0000517#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000518
519/*
drhea678832008-12-10 19:26:22 +0000520** Compute a string length that is limited to what can be stored in
521** lower 30 bits of a 32-bit signed integer.
522*/
drh4f21c4a2008-12-10 22:15:00 +0000523static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000524 const char *z2 = z;
525 while( *z2 ){ z2++; }
526 return 0x3fffffff & (int)(z2 - z);
527}
528
529/*
drh127f9d72010-02-23 01:47:00 +0000530** A callback for the sqlite3_log() interface.
531*/
532static void shellLog(void *pArg, int iErrCode, const char *zMsg){
533 struct callback_data *p = (struct callback_data*)pArg;
534 if( p->pLog==0 ) return;
535 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
536 fflush(p->pLog);
537}
538
539/*
shane626a6e42009-10-22 17:30:15 +0000540** Output the given string as a hex-encoded blob (eg. X'1234' )
541*/
542static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
543 int i;
544 char *zBlob = (char *)pBlob;
545 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000546 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000547 fprintf(out,"'");
548}
549
550/*
drh28bd4bc2000-06-15 15:57:22 +0000551** Output the given string as a quoted string using SQL quoting conventions.
552*/
553static void output_quoted_string(FILE *out, const char *z){
554 int i;
555 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000556 for(i=0; z[i]; i++){
557 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000558 }
559 if( nSingle==0 ){
560 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000561 }else{
562 fprintf(out,"'");
563 while( *z ){
564 for(i=0; z[i] && z[i]!='\''; i++){}
565 if( i==0 ){
566 fprintf(out,"''");
567 z++;
568 }else if( z[i]=='\'' ){
569 fprintf(out,"%.*s''",i,z);
570 z += i+1;
571 }else{
drhcd7d2732002-02-26 23:24:26 +0000572 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000573 break;
574 }
575 }
drhcd7d2732002-02-26 23:24:26 +0000576 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000577 }
578}
579
580/*
drhfeac5f82004-08-01 00:10:45 +0000581** Output the given string as a quoted according to C or TCL quoting rules.
582*/
583static void output_c_string(FILE *out, const char *z){
584 unsigned int c;
585 fputc('"', out);
586 while( (c = *(z++))!=0 ){
587 if( c=='\\' ){
588 fputc(c, out);
589 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000590 }else if( c=='"' ){
591 fputc('\\', out);
592 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000593 }else if( c=='\t' ){
594 fputc('\\', out);
595 fputc('t', out);
596 }else if( c=='\n' ){
597 fputc('\\', out);
598 fputc('n', out);
599 }else if( c=='\r' ){
600 fputc('\\', out);
601 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000602 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000603 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000604 }else{
605 fputc(c, out);
606 }
607 }
608 fputc('"', out);
609}
610
611/*
drhc08a4f12000-06-15 16:49:48 +0000612** Output the given string with characters that are special to
613** HTML escaped.
614*/
615static void output_html_string(FILE *out, const char *z){
616 int i;
drhc3d6ba42014-01-13 20:38:35 +0000617 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000618 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000619 for(i=0; z[i]
620 && z[i]!='<'
621 && z[i]!='&'
622 && z[i]!='>'
623 && z[i]!='\"'
624 && z[i]!='\'';
625 i++){}
drhc08a4f12000-06-15 16:49:48 +0000626 if( i>0 ){
627 fprintf(out,"%.*s",i,z);
628 }
629 if( z[i]=='<' ){
630 fprintf(out,"&lt;");
631 }else if( z[i]=='&' ){
632 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000633 }else if( z[i]=='>' ){
634 fprintf(out,"&gt;");
635 }else if( z[i]=='\"' ){
636 fprintf(out,"&quot;");
637 }else if( z[i]=='\'' ){
638 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000639 }else{
640 break;
641 }
642 z += i + 1;
643 }
644}
645
646/*
drhc49f44e2006-10-26 18:15:42 +0000647** If a field contains any character identified by a 1 in the following
648** array, then the string must be quoted for CSV.
649*/
650static const char needCsvQuote[] = {
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
654 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
655 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
656 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
657 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
658 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
659 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
660 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
661 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
662 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
663 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
664 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
665 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
666 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
667};
668
669/*
drh8e64d1c2004-10-07 00:32:39 +0000670** Output a single term of CSV. Actually, p->separator is used for
671** the separator, which may or may not be a comma. p->nullvalue is
drh18f52e02012-01-16 16:56:31 +0000672** the null value. Strings are quoted if necessary.
drh8e64d1c2004-10-07 00:32:39 +0000673*/
674static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000675 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000676 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000677 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000678 }else{
drhc49f44e2006-10-26 18:15:42 +0000679 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000680 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000681 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000682 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000683 || (z[i]==p->colSeparator[0] &&
684 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000685 i = 0;
686 break;
687 }
688 }
689 if( i==0 ){
690 putc('"', out);
691 for(i=0; z[i]; i++){
692 if( z[i]=='"' ) putc('"', out);
693 putc(z[i], out);
694 }
695 putc('"', out);
696 }else{
697 fprintf(out, "%s", z);
698 }
drh8e64d1c2004-10-07 00:32:39 +0000699 }
700 if( bSep ){
mistachkin636bf9f2014-07-19 20:15:16 +0000701 fprintf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000702 }
703}
704
danielk19774af00c62005-01-23 23:43:21 +0000705#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000706/*
drh4c504392000-10-16 22:06:40 +0000707** This routine runs when the user presses Ctrl-C
708*/
709static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000710 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000711 seenInterrupt++;
712 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000713 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000714}
danielk19774af00c62005-01-23 23:43:21 +0000715#endif
drh4c504392000-10-16 22:06:40 +0000716
717/*
shane626a6e42009-10-22 17:30:15 +0000718** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000719** invokes for each row of a query result.
720*/
shane626a6e42009-10-22 17:30:15 +0000721static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000722 int i;
723 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000724
drh75897232000-05-29 14:26:00 +0000725 switch( p->mode ){
726 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000727 int w = 5;
drh6a535342001-10-19 16:44:56 +0000728 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000729 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000730 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000731 if( len>w ) w = len;
732 }
mistachkin636bf9f2014-07-19 20:15:16 +0000733 if( p->cnt++>0 ) fprintf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000734 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000735 fprintf(p->out,"%*s = %s%s", w, azCol[i],
736 azArg[i] ? azArg[i] : p->nullvalue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000737 }
738 break;
739 }
danielk19770d78bae2008-01-03 07:09:48 +0000740 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000741 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000742 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000743 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000744 int w, n;
745 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000746 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000747 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000748 w = 0;
drh75897232000-05-29 14:26:00 +0000749 }
drh078b1fd2012-09-21 13:40:02 +0000750 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000751 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000752 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000753 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000754 if( w<n ) w = n;
755 }
756 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000757 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000758 }
759 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000760 if( w<0 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000761 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i],
762 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000763 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000764 fprintf(p->out,"%-*.*s%s",w,w,azCol[i],
765 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000766 }
drha0c66f52000-07-29 13:20:21 +0000767 }
768 }
769 if( p->showHeader ){
770 for(i=0; i<nArg; i++){
771 int w;
772 if( i<ArraySize(p->actualWidth) ){
773 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000774 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000775 }else{
776 w = 10;
777 }
778 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
779 "----------------------------------------------------------",
mistachkin636bf9f2014-07-19 20:15:16 +0000780 i==nArg-1 ? p->rowSeparator : " ");
drha0c66f52000-07-29 13:20:21 +0000781 }
drh75897232000-05-29 14:26:00 +0000782 }
783 }
drh6a535342001-10-19 16:44:56 +0000784 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000785 for(i=0; i<nArg; i++){
786 int w;
drha0c66f52000-07-29 13:20:21 +0000787 if( i<ArraySize(p->actualWidth) ){
788 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000789 }else{
790 w = 10;
791 }
dana98bf362013-11-13 18:35:01 +0000792 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000793 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000794 }
dana98bf362013-11-13 18:35:01 +0000795 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000796 if( p->iIndent<p->nIndent ){
797 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000798 }
danc4650bb2013-11-18 08:41:06 +0000799 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000800 }
drh078b1fd2012-09-21 13:40:02 +0000801 if( w<0 ){
802 fprintf(p->out,"%*.*s%s",-w,-w,
mistachkin636bf9f2014-07-19 20:15:16 +0000803 azArg[i] ? azArg[i] : p->nullvalue,
804 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000805 }else{
806 fprintf(p->out,"%-*.*s%s",w,w,
mistachkin636bf9f2014-07-19 20:15:16 +0000807 azArg[i] ? azArg[i] : p->nullvalue,
808 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000809 }
drh75897232000-05-29 14:26:00 +0000810 }
811 break;
812 }
drhe3710332000-09-29 13:30:53 +0000813 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000814 case MODE_List: {
815 if( p->cnt++==0 && p->showHeader ){
816 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000817 fprintf(p->out,"%s%s",azCol[i],
818 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +0000819 }
820 }
drh6a535342001-10-19 16:44:56 +0000821 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000822 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000823 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000824 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000825 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000826 if( i<nArg-1 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000827 fprintf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +0000828 }else if( p->mode==MODE_Semi ){
mistachkin636bf9f2014-07-19 20:15:16 +0000829 fprintf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000830 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000831 fprintf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000832 }
drh75897232000-05-29 14:26:00 +0000833 }
834 break;
835 }
drh1e5d0e92000-05-31 23:33:17 +0000836 case MODE_Html: {
837 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000838 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000839 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000840 fprintf(p->out,"<TH>");
841 output_html_string(p->out, azCol[i]);
842 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000843 }
mihailim57c591a2008-06-23 21:26:05 +0000844 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000845 }
drh6a535342001-10-19 16:44:56 +0000846 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000847 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000848 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000849 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000850 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000851 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000852 }
mihailim57c591a2008-06-23 21:26:05 +0000853 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000854 break;
855 }
drhfeac5f82004-08-01 00:10:45 +0000856 case MODE_Tcl: {
857 if( p->cnt++==0 && p->showHeader ){
858 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000859 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +0000860 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000861 }
mistachkin636bf9f2014-07-19 20:15:16 +0000862 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000863 }
864 if( azArg==0 ) break;
865 for(i=0; i<nArg; i++){
866 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin636bf9f2014-07-19 20:15:16 +0000867 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000868 }
mistachkin636bf9f2014-07-19 20:15:16 +0000869 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000870 break;
871 }
drh8e64d1c2004-10-07 00:32:39 +0000872 case MODE_Csv: {
873 if( p->cnt++==0 && p->showHeader ){
874 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000875 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000876 }
mistachkin636bf9f2014-07-19 20:15:16 +0000877 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000878 }
879 if( azArg==0 ) break;
880 for(i=0; i<nArg; i++){
881 output_csv(p, azArg[i], i<nArg-1);
882 }
mistachkin636bf9f2014-07-19 20:15:16 +0000883 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000884 break;
885 }
drh28bd4bc2000-06-15 15:57:22 +0000886 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000887 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000888 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000889 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000890 for(i=0; i<nArg; i++){
891 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000892 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000893 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000894 }else if( aiType && aiType[i]==SQLITE_TEXT ){
895 if( zSep[0] ) fprintf(p->out,"%s",zSep);
896 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +0000897 }else if( aiType && (aiType[i]==SQLITE_INTEGER
898 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +0000899 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000900 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
901 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
902 int nBlob = sqlite3_column_bytes(p->pStmt, i);
903 if( zSep[0] ) fprintf(p->out,"%s",zSep);
904 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000905 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000906 fprintf(p->out,"%s%s",zSep, azArg[i]);
907 }else{
908 if( zSep[0] ) fprintf(p->out,"%s",zSep);
909 output_quoted_string(p->out, azArg[i]);
910 }
911 }
912 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000913 break;
drh28bd4bc2000-06-15 15:57:22 +0000914 }
mistachkin636bf9f2014-07-19 20:15:16 +0000915 case MODE_Ascii: {
916 if( p->cnt++==0 && p->showHeader ){
917 for(i=0; i<nArg; i++){
918 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
919 fprintf(p->out,"%s",azCol[i] ? azCol[i] : "");
920 }
921 fprintf(p->out, "%s", p->rowSeparator);
922 }
923 if( azArg==0 ) break;
924 for(i=0; i<nArg; i++){
925 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
926 fprintf(p->out,"%s",azArg[i] ? azArg[i] : p->nullvalue);
927 }
928 fprintf(p->out, "%s", p->rowSeparator);
929 break;
930 }
persicom1d0b8722002-04-18 02:53:04 +0000931 }
drh75897232000-05-29 14:26:00 +0000932 return 0;
933}
934
935/*
shane626a6e42009-10-22 17:30:15 +0000936** This is the callback routine that the SQLite library
937** invokes for each row of a query result.
938*/
939static int callback(void *pArg, int nArg, char **azArg, char **azCol){
940 /* since we don't have type info, call the shell_callback with a NULL value */
941 return shell_callback(pArg, nArg, azArg, azCol, NULL);
942}
943
944/*
drh33048c02001-10-01 14:29:22 +0000945** Set the destination table field of the callback_data structure to
946** the name of the table given. Escape any quote characters in the
947** table name.
948*/
949static void set_table_name(struct callback_data *p, const char *zName){
950 int i, n;
951 int needQuote;
952 char *z;
953
954 if( p->zDestTable ){
955 free(p->zDestTable);
956 p->zDestTable = 0;
957 }
958 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000959 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000960 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000961 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000962 needQuote = 1;
963 if( zName[i]=='\'' ) n++;
964 }
965 }
966 if( needQuote ) n += 2;
967 z = p->zDestTable = malloc( n+1 );
968 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000969 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000970 exit(1);
971 }
972 n = 0;
973 if( needQuote ) z[n++] = '\'';
974 for(i=0; zName[i]; i++){
975 z[n++] = zName[i];
976 if( zName[i]=='\'' ) z[n++] = '\'';
977 }
978 if( needQuote ) z[n++] = '\'';
979 z[n] = 0;
980}
981
danielk19772a02e332004-06-05 08:04:36 +0000982/* zIn is either a pointer to a NULL-terminated string in memory obtained
983** from malloc(), or a NULL pointer. The string pointed to by zAppend is
984** added to zIn, and the result returned in memory obtained from malloc().
985** zIn, if it was not NULL, is freed.
986**
987** If the third argument, quote, is not '\0', then it is used as a
988** quote character for zAppend.
989*/
drhc28490c2006-10-26 14:25:58 +0000990static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000991 int len;
992 int i;
drh4f21c4a2008-12-10 22:15:00 +0000993 int nAppend = strlen30(zAppend);
994 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000995
996 len = nAppend+nIn+1;
997 if( quote ){
998 len += 2;
999 for(i=0; i<nAppend; i++){
1000 if( zAppend[i]==quote ) len++;
1001 }
1002 }
1003
1004 zIn = (char *)realloc(zIn, len);
1005 if( !zIn ){
1006 return 0;
1007 }
1008
1009 if( quote ){
1010 char *zCsr = &zIn[nIn];
1011 *zCsr++ = quote;
1012 for(i=0; i<nAppend; i++){
1013 *zCsr++ = zAppend[i];
1014 if( zAppend[i]==quote ) *zCsr++ = quote;
1015 }
1016 *zCsr++ = quote;
1017 *zCsr++ = '\0';
1018 assert( (zCsr-zIn)==len );
1019 }else{
1020 memcpy(&zIn[nIn], zAppend, nAppend);
1021 zIn[len-1] = '\0';
1022 }
1023
1024 return zIn;
1025}
1026
drhdd3d4592004-08-30 01:54:05 +00001027
1028/*
drhb21a8e42012-01-28 21:08:51 +00001029** Execute a query statement that will generate SQL output. Print
1030** the result columns, comma-separated, on a line and then add a
1031** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001032**
drhb21a8e42012-01-28 21:08:51 +00001033** If the number of columns is 1 and that column contains text "--"
1034** then write the semicolon on a separate line. That way, if a
1035** "--" comment occurs at the end of the statement, the comment
1036** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001037*/
drh157e29a2009-05-21 15:15:00 +00001038static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001039 struct callback_data *p, /* Query context */
1040 const char *zSelect, /* SELECT statement to extract content */
1041 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001042){
drhdd3d4592004-08-30 01:54:05 +00001043 sqlite3_stmt *pSelect;
1044 int rc;
drhb21a8e42012-01-28 21:08:51 +00001045 int nResult;
1046 int i;
1047 const char *z;
drhc7181902014-02-27 15:04:13 +00001048 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001049 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001050 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001051 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001052 return rc;
1053 }
1054 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001055 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001056 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001057 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001058 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001059 zFirstRow = 0;
1060 }
drhb21a8e42012-01-28 21:08:51 +00001061 z = (const char*)sqlite3_column_text(pSelect, 0);
1062 fprintf(p->out, "%s", z);
1063 for(i=1; i<nResult; i++){
1064 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1065 }
1066 if( z==0 ) z = "";
1067 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1068 if( z[0] ){
1069 fprintf(p->out, "\n;\n");
1070 }else{
1071 fprintf(p->out, ";\n");
1072 }
drhdd3d4592004-08-30 01:54:05 +00001073 rc = sqlite3_step(pSelect);
1074 }
drh2f464a02011-10-13 00:41:49 +00001075 rc = sqlite3_finalize(pSelect);
1076 if( rc!=SQLITE_OK ){
1077 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001078 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001079 }
1080 return rc;
drhdd3d4592004-08-30 01:54:05 +00001081}
1082
shane626a6e42009-10-22 17:30:15 +00001083/*
1084** Allocate space and save off current error string.
1085*/
1086static char *save_err_msg(
1087 sqlite3 *db /* Database to query */
1088){
1089 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1090 char *zErrMsg = sqlite3_malloc(nErrMsg);
1091 if( zErrMsg ){
1092 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1093 }
1094 return zErrMsg;
1095}
1096
1097/*
shaneh642d8b82010-07-28 16:05:34 +00001098** Display memory stats.
1099*/
1100static int display_stats(
1101 sqlite3 *db, /* Database to query */
1102 struct callback_data *pArg, /* Pointer to struct callback_data */
1103 int bReset /* True to reset the stats */
1104){
1105 int iCur;
1106 int iHiwtr;
1107
1108 if( pArg && pArg->out ){
1109
1110 iHiwtr = iCur = -1;
1111 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001112 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001113 iHiwtr = iCur = -1;
1114 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001115 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001116/*
1117** Not currently used by the CLI.
1118** iHiwtr = iCur = -1;
1119** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1120** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1121*/
1122 iHiwtr = iCur = -1;
1123 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1124 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1125/*
1126** Not currently used by the CLI.
1127** iHiwtr = iCur = -1;
1128** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1129** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1130*/
1131 iHiwtr = iCur = -1;
1132 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1133 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1134 iHiwtr = iCur = -1;
1135 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1137 iHiwtr = iCur = -1;
1138 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1139 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1140 iHiwtr = iCur = -1;
1141 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1142 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1143#ifdef YYTRACKMAXSTACKDEPTH
1144 iHiwtr = iCur = -1;
1145 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1146 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1147#endif
1148 }
1149
1150 if( pArg && pArg->out && db ){
1151 iHiwtr = iCur = -1;
1152 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1153 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001154 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1155 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1156 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1157 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1158 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1159 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001160 iHiwtr = iCur = -1;
1161 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001162 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1163 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1164 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1165 iHiwtr = iCur = -1;
1166 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1167 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001168 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001169 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1170 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1171 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001172 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1173 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1174 iHiwtr = iCur = -1;
1175 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1176 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1177 }
1178
1179 if( pArg && pArg->out && db && pArg->pStmt ){
1180 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1181 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1182 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1183 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1184 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1185 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001186 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1187 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001188 }
1189
1190 return 0;
1191}
1192
1193/*
dana98bf362013-11-13 18:35:01 +00001194** Parameter azArray points to a zero-terminated array of strings. zStr
1195** points to a single nul-terminated string. Return non-zero if zStr
1196** is equal, according to strcmp(), to any of the strings in the array.
1197** Otherwise, return zero.
1198*/
1199static int str_in_array(const char *zStr, const char **azArray){
1200 int i;
1201 for(i=0; azArray[i]; i++){
1202 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1203 }
1204 return 0;
1205}
1206
1207/*
1208** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1209** and populate the callback_data.aiIndent[] array with the number of
1210** spaces each opcode should be indented before it is output.
1211**
1212** The indenting rules are:
1213**
1214** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1215** all opcodes that occur between the p2 jump destination and the opcode
1216** itself by 2 spaces.
1217**
drh01752bc2013-11-14 23:59:33 +00001218** * For each "Goto", if the jump destination is earlier in the program
1219** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001220** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001221** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001222** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001223** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001224*/
1225static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1226 const char *zSql; /* The text of the SQL statement */
1227 const char *z; /* Used to check if this is an EXPLAIN */
1228 int *abYield = 0; /* True if op is an OP_Yield */
1229 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001230 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001231
drh8ad0de32014-03-20 18:45:27 +00001232 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1233 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001234 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001235 const char *azGoto[] = { "Goto", 0 };
1236
1237 /* Try to figure out if this is really an EXPLAIN statement. If this
1238 ** cannot be verified, return early. */
1239 zSql = sqlite3_sql(pSql);
1240 if( zSql==0 ) return;
1241 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1242 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1243
1244 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1245 int i;
danc4650bb2013-11-18 08:41:06 +00001246 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001247 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001248
1249 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1250 ** p2 is an instruction address, set variable p2op to the index of that
1251 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1252 ** the current instruction is part of a sub-program generated by an
1253 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001254 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001255 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001256
1257 /* Grow the p->aiIndent array as required */
1258 if( iOp>=nAlloc ){
1259 nAlloc += 100;
1260 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1261 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1262 }
1263 abYield[iOp] = str_in_array(zOp, azYield);
1264 p->aiIndent[iOp] = 0;
1265 p->nIndent = iOp+1;
1266
1267 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001268 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001269 }
drhfe705102014-03-06 13:38:37 +00001270 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1271 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1272 ){
drhe73f0592014-01-21 22:25:45 +00001273 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001274 }
1275 }
1276
danc4650bb2013-11-18 08:41:06 +00001277 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001278 sqlite3_free(abYield);
1279 sqlite3_reset(pSql);
1280}
1281
1282/*
1283** Free the array allocated by explain_data_prepare().
1284*/
1285static void explain_data_delete(struct callback_data *p){
1286 sqlite3_free(p->aiIndent);
1287 p->aiIndent = 0;
1288 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001289 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001290}
1291
1292/*
shane626a6e42009-10-22 17:30:15 +00001293** Execute a statement or set of statements. Print
1294** any result rows/columns depending on the current mode
1295** set via the supplied callback.
1296**
1297** This is very similar to SQLite's built-in sqlite3_exec()
1298** function except it takes a slightly different callback
1299** and callback data argument.
1300*/
1301static int shell_exec(
1302 sqlite3 *db, /* An open database */
1303 const char *zSql, /* SQL to be evaluated */
1304 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1305 /* (not the same as sqlite3_exec) */
1306 struct callback_data *pArg, /* Pointer to struct callback_data */
1307 char **pzErrMsg /* Error msg written here */
1308){
dan4564ced2010-01-05 04:59:56 +00001309 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1310 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001311 int rc2;
dan4564ced2010-01-05 04:59:56 +00001312 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001313
1314 if( pzErrMsg ){
1315 *pzErrMsg = NULL;
1316 }
1317
shaneb9fc17d2009-10-22 21:23:35 +00001318 while( zSql[0] && (SQLITE_OK == rc) ){
1319 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1320 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001321 if( pzErrMsg ){
1322 *pzErrMsg = save_err_msg(db);
1323 }
1324 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001325 if( !pStmt ){
1326 /* this happens for a comment or white-space */
1327 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001328 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001329 continue;
1330 }
shane626a6e42009-10-22 17:30:15 +00001331
shaneh642d8b82010-07-28 16:05:34 +00001332 /* save off the prepared statment handle and reset row count */
1333 if( pArg ){
1334 pArg->pStmt = pStmt;
1335 pArg->cnt = 0;
1336 }
1337
shanehb7977c52010-01-18 18:17:10 +00001338 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001339 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001340 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001341 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001342 }
shanehb7977c52010-01-18 18:17:10 +00001343
drhefbf3b12014-02-28 20:47:24 +00001344 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1345 if( pArg && pArg->autoEQP ){
1346 sqlite3_stmt *pExplain;
1347 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1348 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1349 if( rc==SQLITE_OK ){
1350 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1351 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1352 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1353 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1354 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1355 }
1356 }
1357 sqlite3_finalize(pExplain);
1358 sqlite3_free(zEQP);
1359 }
1360
drh7e02e5e2011-12-06 19:44:51 +00001361 /* Output TESTCTRL_EXPLAIN text of requested */
1362 if( pArg && pArg->mode==MODE_Explain ){
1363 const char *zExplain = 0;
1364 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1365 if( zExplain && zExplain[0] ){
1366 fprintf(pArg->out, "%s", zExplain);
1367 }
1368 }
1369
dana98bf362013-11-13 18:35:01 +00001370 /* If the shell is currently in ".explain" mode, gather the extra
1371 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001372 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001373 explain_data_prepare(pArg, pStmt);
1374 }
1375
shaneb9fc17d2009-10-22 21:23:35 +00001376 /* perform the first step. this will tell us if we
1377 ** have a result set or not and how wide it is.
1378 */
1379 rc = sqlite3_step(pStmt);
1380 /* if we have a result set... */
1381 if( SQLITE_ROW == rc ){
1382 /* if we have a callback... */
1383 if( xCallback ){
1384 /* allocate space for col name ptr, value ptr, and type */
1385 int nCol = sqlite3_column_count(pStmt);
1386 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1387 if( !pData ){
1388 rc = SQLITE_NOMEM;
1389 }else{
1390 char **azCols = (char **)pData; /* Names of result columns */
1391 char **azVals = &azCols[nCol]; /* Results */
1392 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001393 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001394 assert(sizeof(int) <= sizeof(char *));
1395 /* save off ptrs to column names */
1396 for(i=0; i<nCol; i++){
1397 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1398 }
shaneb9fc17d2009-10-22 21:23:35 +00001399 do{
1400 /* extract the data and data types */
1401 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001402 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001403 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001404 azVals[i] = "";
1405 }else{
1406 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1407 }
shaneb9fc17d2009-10-22 21:23:35 +00001408 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1409 rc = SQLITE_NOMEM;
1410 break; /* from for */
1411 }
1412 } /* end for */
1413
1414 /* if data and types extracted successfully... */
1415 if( SQLITE_ROW == rc ){
1416 /* call the supplied callback with the result row data */
1417 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1418 rc = SQLITE_ABORT;
1419 }else{
1420 rc = sqlite3_step(pStmt);
1421 }
1422 }
1423 } while( SQLITE_ROW == rc );
1424 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001425 }
1426 }else{
1427 do{
1428 rc = sqlite3_step(pStmt);
1429 } while( rc == SQLITE_ROW );
1430 }
1431 }
1432
dana98bf362013-11-13 18:35:01 +00001433 explain_data_delete(pArg);
1434
shaneh642d8b82010-07-28 16:05:34 +00001435 /* print usage stats if stats on */
1436 if( pArg && pArg->statsOn ){
1437 display_stats(db, pArg, 0);
1438 }
1439
dan4564ced2010-01-05 04:59:56 +00001440 /* Finalize the statement just executed. If this fails, save a
1441 ** copy of the error message. Otherwise, set zSql to point to the
1442 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001443 rc2 = sqlite3_finalize(pStmt);
1444 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001445 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001446 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001447 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001448 }else if( pzErrMsg ){
1449 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001450 }
shaneh642d8b82010-07-28 16:05:34 +00001451
1452 /* clear saved stmt handle */
1453 if( pArg ){
1454 pArg->pStmt = NULL;
1455 }
shane626a6e42009-10-22 17:30:15 +00001456 }
shaneb9fc17d2009-10-22 21:23:35 +00001457 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001458
1459 return rc;
1460}
1461
drhdd3d4592004-08-30 01:54:05 +00001462
drh33048c02001-10-01 14:29:22 +00001463/*
drh4c653a02000-06-07 01:27:47 +00001464** This is a different callback routine used for dumping the database.
1465** Each row received by this callback consists of a table name,
1466** the table type ("index" or "table") and SQL to create the table.
1467** This routine should print text sufficient to recreate the table.
1468*/
1469static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001470 int rc;
1471 const char *zTable;
1472 const char *zType;
1473 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001474 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001475 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001476
drh902b9ee2008-12-05 17:17:07 +00001477 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001478 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001479 zTable = azArg[0];
1480 zType = azArg[1];
1481 zSql = azArg[2];
1482
drh00b950d2005-09-11 02:03:03 +00001483 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001484 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001485 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001486 fprintf(p->out, "ANALYZE sqlite_master;\n");
1487 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1488 return 0;
drh45e29d82006-11-20 16:21:10 +00001489 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1490 char *zIns;
1491 if( !p->writableSchema ){
1492 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1493 p->writableSchema = 1;
1494 }
1495 zIns = sqlite3_mprintf(
1496 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1497 "VALUES('table','%q','%q',0,'%q');",
1498 zTable, zTable, zSql);
1499 fprintf(p->out, "%s\n", zIns);
1500 sqlite3_free(zIns);
1501 return 0;
drh00b950d2005-09-11 02:03:03 +00001502 }else{
1503 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001504 }
danielk19772a02e332004-06-05 08:04:36 +00001505
1506 if( strcmp(zType, "table")==0 ){
1507 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001508 char *zSelect = 0;
1509 char *zTableInfo = 0;
1510 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001511 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001512
1513 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1514 zTableInfo = appendText(zTableInfo, zTable, '"');
1515 zTableInfo = appendText(zTableInfo, ");", 0);
1516
drhc7181902014-02-27 15:04:13 +00001517 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001518 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001519 if( rc!=SQLITE_OK || !pTableInfo ){
1520 return 1;
1521 }
1522
1523 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001524 /* Always quote the table name, even if it appears to be pure ascii,
1525 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1526 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001527 if( zTmp ){
1528 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001529 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001530 }
1531 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1532 rc = sqlite3_step(pTableInfo);
1533 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001534 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001535 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001536 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001537 rc = sqlite3_step(pTableInfo);
1538 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001539 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001540 }else{
1541 zSelect = appendText(zSelect, ") ", 0);
1542 }
drh157e29a2009-05-21 15:15:00 +00001543 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001544 }
1545 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001546 if( rc!=SQLITE_OK || nRow==0 ){
1547 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001548 return 1;
1549 }
1550 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1551 zSelect = appendText(zSelect, zTable, '"');
1552
drh2f464a02011-10-13 00:41:49 +00001553 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001554 if( rc==SQLITE_CORRUPT ){
1555 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001556 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001557 }
drh85e72432012-04-11 11:38:53 +00001558 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001559 }
drh4c653a02000-06-07 01:27:47 +00001560 return 0;
1561}
1562
1563/*
drh45e29d82006-11-20 16:21:10 +00001564** Run zQuery. Use dump_callback() as the callback routine so that
1565** the contents of the query are output as SQL statements.
1566**
drhdd3d4592004-08-30 01:54:05 +00001567** If we get a SQLITE_CORRUPT error, rerun the query after appending
1568** "ORDER BY rowid DESC" to the end.
1569*/
1570static int run_schema_dump_query(
1571 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001572 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001573){
1574 int rc;
drh2f464a02011-10-13 00:41:49 +00001575 char *zErr = 0;
1576 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001577 if( rc==SQLITE_CORRUPT ){
1578 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001579 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001580 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1581 if( zErr ){
1582 fprintf(p->out, "/****** %s ******/\n", zErr);
1583 sqlite3_free(zErr);
1584 zErr = 0;
1585 }
drhdd3d4592004-08-30 01:54:05 +00001586 zQ2 = malloc( len+100 );
1587 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001588 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001589 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1590 if( rc ){
1591 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1592 }else{
1593 rc = SQLITE_CORRUPT;
1594 }
1595 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001596 free(zQ2);
1597 }
1598 return rc;
1599}
1600
1601/*
drh75897232000-05-29 14:26:00 +00001602** Text of a help message
1603*/
persicom1d0b8722002-04-18 02:53:04 +00001604static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001605 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001606 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001607 ".clone NEWDB Clone data into NEWDB from the existing database\n"
mistachkin636bf9f2014-07-19 20:15:16 +00001608 ".colseparator STRING This is an alias for .separator\n"
jplyon6a65bb32003-05-04 07:25:57 +00001609 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001610 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001611 " If TABLE specified, only dump tables matching\n"
1612 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001613 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001614 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001615 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001616 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001617 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001618 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001619 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001620 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001621 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001622 ".indices ?TABLE? Show names of all indices\n"
1623 " If TABLE specified, only show indices for tables\n"
1624 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001625#ifdef SQLITE_ENABLE_IOTRACE
1626 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1627#endif
drh70df4fe2006-06-13 15:12:21 +00001628#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001629 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001630#endif
drh127f9d72010-02-23 01:47:00 +00001631 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001632 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkin636bf9f2014-07-19 20:15:16 +00001633 " ascii Columns/rows delimited with 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001634 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001635 " column Left-aligned columns. (See .width)\n"
1636 " html HTML <table> code\n"
1637 " insert SQL insert statements for TABLE\n"
1638 " line One value per line\n"
1639 " list Values delimited by .separator string\n"
1640 " tabs Tab-separated values\n"
1641 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001642 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001643 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001644 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001645 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001646 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001647 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001648 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001649 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001650 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
mistachkin636bf9f2014-07-19 20:15:16 +00001651 ".rowseparator STRING Change row separator for output mode and .import\n"
drh5c7976f2014-02-10 19:59:27 +00001652 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001653 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001654 " If TABLE specified, only show tables matching\n"
1655 " LIKE pattern TABLE.\n"
mistachkin636bf9f2014-07-19 20:15:16 +00001656 ".separator STRING Change column separator for output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001657 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001658 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001659 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001660 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001661 ".tables ?TABLE? List names of tables\n"
1662 " If TABLE specified, only list tables matching\n"
1663 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001664 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001665 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001666 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001667 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001668 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001669 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001670;
1671
drhdaffd0e2001-04-11 14:28:42 +00001672/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001673static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001674
drh75897232000-05-29 14:26:00 +00001675/*
drh44c2eb12003-04-30 11:38:26 +00001676** Make sure the database is open. If it is not, then open it. If
1677** the database fails to open, print an error message and exit.
1678*/
drh05782482013-10-24 15:20:20 +00001679static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001680 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001681 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001682 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001683 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001684 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1685 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1686 shellstaticFunc, 0, 0);
1687 }
1688 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001689 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001690 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001691 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001692 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001693 }
drhc2e87a32006-06-27 15:16:14 +00001694#ifndef SQLITE_OMIT_LOAD_EXTENSION
1695 sqlite3_enable_load_extension(p->db, 1);
1696#endif
drh44c2eb12003-04-30 11:38:26 +00001697 }
1698}
1699
1700/*
drhfeac5f82004-08-01 00:10:45 +00001701** Do C-language style dequoting.
1702**
1703** \t -> tab
1704** \n -> newline
1705** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001706** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001707** \NNN -> ascii character NNN in octal
1708** \\ -> backslash
1709*/
1710static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001711 int i, j;
1712 char c;
drhc2ce0be2014-05-29 12:36:14 +00001713 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001714 for(i=j=0; (c = z[i])!=0; i++, j++){
1715 if( c=='\\' ){
1716 c = z[++i];
1717 if( c=='n' ){
1718 c = '\n';
1719 }else if( c=='t' ){
1720 c = '\t';
1721 }else if( c=='r' ){
1722 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001723 }else if( c=='\\' ){
1724 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001725 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001726 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001727 if( z[i+1]>='0' && z[i+1]<='7' ){
1728 i++;
1729 c = (c<<3) + z[i] - '0';
1730 if( z[i+1]>='0' && z[i+1]<='7' ){
1731 i++;
1732 c = (c<<3) + z[i] - '0';
1733 }
1734 }
1735 }
1736 }
1737 z[j] = c;
1738 }
drhc2ce0be2014-05-29 12:36:14 +00001739 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001740}
1741
1742/*
drh348d19c2013-06-03 12:47:43 +00001743** Return the value of a hexadecimal digit. Return -1 if the input
1744** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001745*/
drh348d19c2013-06-03 12:47:43 +00001746static int hexDigitValue(char c){
1747 if( c>='0' && c<='9' ) return c - '0';
1748 if( c>='a' && c<='f' ) return c - 'a' + 10;
1749 if( c>='A' && c<='F' ) return c - 'A' + 10;
1750 return -1;
drhc28490c2006-10-26 14:25:58 +00001751}
1752
1753/*
drh7d9f3942013-04-03 01:26:54 +00001754** Interpret zArg as an integer value, possibly with suffixes.
1755*/
1756static sqlite3_int64 integerValue(const char *zArg){
1757 sqlite3_int64 v = 0;
1758 static const struct { char *zSuffix; int iMult; } aMult[] = {
1759 { "KiB", 1024 },
1760 { "MiB", 1024*1024 },
1761 { "GiB", 1024*1024*1024 },
1762 { "KB", 1000 },
1763 { "MB", 1000000 },
1764 { "GB", 1000000000 },
1765 { "K", 1000 },
1766 { "M", 1000000 },
1767 { "G", 1000000000 },
1768 };
1769 int i;
1770 int isNeg = 0;
1771 if( zArg[0]=='-' ){
1772 isNeg = 1;
1773 zArg++;
1774 }else if( zArg[0]=='+' ){
1775 zArg++;
1776 }
drh348d19c2013-06-03 12:47:43 +00001777 if( zArg[0]=='0' && zArg[1]=='x' ){
1778 int x;
1779 zArg += 2;
1780 while( (x = hexDigitValue(zArg[0]))>=0 ){
1781 v = (v<<4) + x;
1782 zArg++;
1783 }
1784 }else{
1785 while( IsDigit(zArg[0]) ){
1786 v = v*10 + zArg[0] - '0';
1787 zArg++;
1788 }
drh7d9f3942013-04-03 01:26:54 +00001789 }
drhc2bed0a2013-05-24 11:57:50 +00001790 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001791 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1792 v *= aMult[i].iMult;
1793 break;
1794 }
1795 }
1796 return isNeg? -v : v;
1797}
1798
1799/*
drh348d19c2013-06-03 12:47:43 +00001800** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1801** for TRUE and FALSE. Return the integer value if appropriate.
1802*/
1803static int booleanValue(char *zArg){
1804 int i;
1805 if( zArg[0]=='0' && zArg[1]=='x' ){
1806 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1807 }else{
1808 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1809 }
1810 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1811 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1812 return 1;
1813 }
1814 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1815 return 0;
1816 }
1817 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1818 zArg);
1819 return 0;
1820}
1821
1822/*
drh42f64e52012-04-04 16:56:23 +00001823** Close an output file, assuming it is not stderr or stdout
1824*/
1825static void output_file_close(FILE *f){
1826 if( f && f!=stdout && f!=stderr ) fclose(f);
1827}
1828
1829/*
1830** Try to open an output file. The names "stdout" and "stderr" are
1831** recognized and do the right thing. NULL is returned if the output
1832** filename is "off".
1833*/
1834static FILE *output_file_open(const char *zFile){
1835 FILE *f;
1836 if( strcmp(zFile,"stdout")==0 ){
1837 f = stdout;
1838 }else if( strcmp(zFile, "stderr")==0 ){
1839 f = stderr;
1840 }else if( strcmp(zFile, "off")==0 ){
1841 f = 0;
1842 }else{
1843 f = fopen(zFile, "wb");
1844 if( f==0 ){
1845 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1846 }
1847 }
1848 return f;
1849}
1850
1851/*
1852** A routine for handling output from sqlite3_trace().
1853*/
1854static void sql_trace_callback(void *pArg, const char *z){
1855 FILE *f = (FILE*)pArg;
1856 if( f ) fprintf(f, "%s\n", z);
1857}
1858
1859/*
drhd8621b92012-04-17 09:09:33 +00001860** A no-op routine that runs with the ".breakpoint" doc-command. This is
1861** a useful spot to set a debugger breakpoint.
1862*/
1863static void test_breakpoint(void){
1864 static int nCall = 0;
1865 nCall++;
1866}
1867
1868/*
mistachkin636bf9f2014-07-19 20:15:16 +00001869** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00001870*/
mistachkin636bf9f2014-07-19 20:15:16 +00001871typedef struct ImportCtx ImportCtx;
1872struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00001873 const char *zFile; /* Name of the input file */
1874 FILE *in; /* Read the CSV text from this input stream */
1875 char *z; /* Accumulated text for a field */
1876 int n; /* Number of bytes in z */
1877 int nAlloc; /* Space allocated for z[] */
1878 int nLine; /* Current line number */
1879 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00001880 int cColSep; /* The column separator character. (Usually ",") */
1881 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00001882};
1883
1884/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00001885static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00001886 if( p->n+1>=p->nAlloc ){
1887 p->nAlloc += p->nAlloc + 100;
1888 p->z = sqlite3_realloc(p->z, p->nAlloc);
1889 if( p->z==0 ){
1890 fprintf(stderr, "out of memory\n");
1891 exit(1);
1892 }
1893 }
1894 p->z[p->n++] = (char)c;
1895}
1896
1897/* Read a single field of CSV text. Compatible with rfc4180 and extended
1898** with the option of having a separator other than ",".
1899**
1900** + Input comes from p->in.
1901** + Store results in p->z of length p->n. Space to hold p->z comes
1902** from sqlite3_malloc().
mistachkin636bf9f2014-07-19 20:15:16 +00001903** + Use p->cSep as the column separator. The default is ",".
1904** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00001905** + Keep track of the line number in p->nLine.
1906** + Store the character that terminates the field in p->cTerm. Store
1907** EOF on end-of-file.
1908** + Report syntax errors on stderr
1909*/
mistachkin636bf9f2014-07-19 20:15:16 +00001910static char *csv_read_one_field(ImportCtx *p){
1911 int c;
1912 int cSep = p->cColSep;
1913 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00001914 p->n = 0;
1915 c = fgetc(p->in);
1916 if( c==EOF || seenInterrupt ){
1917 p->cTerm = EOF;
1918 return 0;
1919 }
1920 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00001921 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001922 int startLine = p->nLine;
1923 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001924 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001925 while( 1 ){
1926 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00001927 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00001928 if( c==cQuote ){
1929 if( pc==cQuote ){
1930 pc = 0;
1931 continue;
1932 }
1933 }
1934 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00001935 || (c==rSep && pc==cQuote)
1936 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001937 || (c==EOF && pc==cQuote)
1938 ){
1939 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001940 p->cTerm = c;
1941 break;
1942 }
1943 if( pc==cQuote && c!='\r' ){
1944 fprintf(stderr, "%s:%d: unescaped %c character\n",
1945 p->zFile, p->nLine, cQuote);
1946 }
1947 if( c==EOF ){
1948 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1949 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00001950 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00001951 break;
1952 }
mistachkin636bf9f2014-07-19 20:15:16 +00001953 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001954 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001955 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001956 }
drhdb95f682013-06-26 22:46:00 +00001957 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00001958 while( c!=EOF && c!=cSep && c!=rSep ){
1959 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00001960 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00001961 }
mistachkin636bf9f2014-07-19 20:15:16 +00001962 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00001963 p->nLine++;
drh3852b682014-02-26 13:53:34 +00001964 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00001965 }
drhdb95f682013-06-26 22:46:00 +00001966 p->cTerm = c;
1967 }
drh8dd675e2013-07-12 21:09:24 +00001968 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00001969 return p->z;
1970}
1971
mistachkin636bf9f2014-07-19 20:15:16 +00001972/* Read a single field of ASCII delimited text.
1973**
1974** + Input comes from p->in.
1975** + Store results in p->z of length p->n. Space to hold p->z comes
1976** from sqlite3_malloc().
1977** + Use p->cSep as the column separator. The default is "\x1F".
1978** + Use p->rSep as the row separator. The default is "\x1E".
1979** + Keep track of the row number in p->nLine.
1980** + Store the character that terminates the field in p->cTerm. Store
1981** EOF on end-of-file.
1982** + Report syntax errors on stderr
1983*/
1984static char *ascii_read_one_field(ImportCtx *p){
1985 int c;
1986 int cSep = p->cColSep;
1987 int rSep = p->cRowSep;
1988 p->n = 0;
1989 c = fgetc(p->in);
1990 if( c==EOF || seenInterrupt ){
1991 p->cTerm = EOF;
1992 return 0;
1993 }
1994 while( c!=EOF && c!=cSep && c!=rSep ){
1995 import_append_char(p, c);
1996 c = fgetc(p->in);
1997 }
1998 if( c==rSep ){
1999 p->nLine++;
2000 }
2001 p->cTerm = c;
2002 if( p->z ) p->z[p->n] = 0;
2003 return p->z;
2004}
2005
drhdb95f682013-06-26 22:46:00 +00002006/*
drh4bbcf102014-02-06 02:46:08 +00002007** Try to transfer data for table zTable. If an error is seen while
2008** moving forward, try to go backwards. The backwards movement won't
2009** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002010*/
mistachkine31ae902014-02-06 01:15:29 +00002011static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00002012 struct callback_data *p,
2013 sqlite3 *newDb,
2014 const char *zTable
2015){
2016 sqlite3_stmt *pQuery = 0;
2017 sqlite3_stmt *pInsert = 0;
2018 char *zQuery = 0;
2019 char *zInsert = 0;
2020 int rc;
2021 int i, j, n;
2022 int nTable = (int)strlen(zTable);
2023 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002024 int cnt = 0;
2025 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002026
2027 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2028 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2029 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002030 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002031 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2032 zQuery);
2033 goto end_data_xfer;
2034 }
2035 n = sqlite3_column_count(pQuery);
2036 zInsert = sqlite3_malloc(200 + nTable + n*3);
2037 if( zInsert==0 ){
2038 fprintf(stderr, "out of memory\n");
2039 goto end_data_xfer;
2040 }
2041 sqlite3_snprintf(200+nTable,zInsert,
2042 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2043 i = (int)strlen(zInsert);
2044 for(j=1; j<n; j++){
2045 memcpy(zInsert+i, ",?", 2);
2046 i += 2;
2047 }
2048 memcpy(zInsert+i, ");", 3);
2049 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2050 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002051 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002052 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2053 zQuery);
2054 goto end_data_xfer;
2055 }
2056 for(k=0; k<2; k++){
2057 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2058 for(i=0; i<n; i++){
2059 switch( sqlite3_column_type(pQuery, i) ){
2060 case SQLITE_NULL: {
2061 sqlite3_bind_null(pInsert, i+1);
2062 break;
2063 }
2064 case SQLITE_INTEGER: {
2065 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2066 break;
2067 }
2068 case SQLITE_FLOAT: {
2069 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2070 break;
2071 }
2072 case SQLITE_TEXT: {
2073 sqlite3_bind_text(pInsert, i+1,
2074 (const char*)sqlite3_column_text(pQuery,i),
2075 -1, SQLITE_STATIC);
2076 break;
2077 }
2078 case SQLITE_BLOB: {
2079 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2080 sqlite3_column_bytes(pQuery,i),
2081 SQLITE_STATIC);
2082 break;
2083 }
2084 }
2085 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002086 rc = sqlite3_step(pInsert);
2087 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2088 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2089 sqlite3_errmsg(newDb));
2090 }
drh3350ce92014-02-06 00:49:12 +00002091 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002092 cnt++;
2093 if( (cnt%spinRate)==0 ){
2094 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2095 fflush(stdout);
2096 }
drh3350ce92014-02-06 00:49:12 +00002097 } /* End while */
2098 if( rc==SQLITE_DONE ) break;
2099 sqlite3_finalize(pQuery);
2100 sqlite3_free(zQuery);
2101 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2102 zTable);
2103 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2104 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002105 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2106 break;
drh3350ce92014-02-06 00:49:12 +00002107 }
2108 } /* End for(k=0...) */
2109
2110end_data_xfer:
2111 sqlite3_finalize(pQuery);
2112 sqlite3_finalize(pInsert);
2113 sqlite3_free(zQuery);
2114 sqlite3_free(zInsert);
2115}
2116
2117
2118/*
2119** Try to transfer all rows of the schema that match zWhere. For
2120** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002121** If an error is encountered while moving forward through the
2122** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002123*/
mistachkine31ae902014-02-06 01:15:29 +00002124static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002125 struct callback_data *p,
2126 sqlite3 *newDb,
2127 const char *zWhere,
2128 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2129){
2130 sqlite3_stmt *pQuery = 0;
2131 char *zQuery = 0;
2132 int rc;
2133 const unsigned char *zName;
2134 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002135 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002136
2137 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2138 " WHERE %s", zWhere);
2139 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2140 if( rc ){
2141 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2142 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2143 zQuery);
2144 goto end_schema_xfer;
2145 }
2146 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2147 zName = sqlite3_column_text(pQuery, 0);
2148 zSql = sqlite3_column_text(pQuery, 1);
2149 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002150 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2151 if( zErrMsg ){
2152 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2153 sqlite3_free(zErrMsg);
2154 zErrMsg = 0;
2155 }
drh3350ce92014-02-06 00:49:12 +00002156 if( xForEach ){
2157 xForEach(p, newDb, (const char*)zName);
2158 }
2159 printf("done\n");
2160 }
2161 if( rc!=SQLITE_DONE ){
2162 sqlite3_finalize(pQuery);
2163 sqlite3_free(zQuery);
2164 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2165 " WHERE %s ORDER BY rowid DESC", zWhere);
2166 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2167 if( rc ){
2168 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2169 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2170 zQuery);
2171 goto end_schema_xfer;
2172 }
2173 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2174 zName = sqlite3_column_text(pQuery, 0);
2175 zSql = sqlite3_column_text(pQuery, 1);
2176 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002177 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2178 if( zErrMsg ){
2179 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2180 sqlite3_free(zErrMsg);
2181 zErrMsg = 0;
2182 }
drh3350ce92014-02-06 00:49:12 +00002183 if( xForEach ){
2184 xForEach(p, newDb, (const char*)zName);
2185 }
2186 printf("done\n");
2187 }
2188 }
2189end_schema_xfer:
2190 sqlite3_finalize(pQuery);
2191 sqlite3_free(zQuery);
2192}
2193
2194/*
2195** Open a new database file named "zNewDb". Try to recover as much information
2196** as possible out of the main database (which might be corrupt) and write it
2197** into zNewDb.
2198*/
mistachkine31ae902014-02-06 01:15:29 +00002199static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002200 int rc;
2201 sqlite3 *newDb = 0;
2202 if( access(zNewDb,0)==0 ){
2203 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2204 return;
2205 }
2206 rc = sqlite3_open(zNewDb, &newDb);
2207 if( rc ){
2208 fprintf(stderr, "Cannot create output database: %s\n",
2209 sqlite3_errmsg(newDb));
2210 }else{
drh54d0d2d2014-04-03 00:32:13 +00002211 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002212 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002213 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2214 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002215 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002216 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002217 }
2218 sqlite3_close(newDb);
2219}
2220
2221/*
drhc2ce0be2014-05-29 12:36:14 +00002222** Change the output file back to stdout
2223*/
2224static void output_reset(struct callback_data *p){
2225 if( p->outfile[0]=='|' ){
2226 pclose(p->out);
2227 }else{
2228 output_file_close(p->out);
2229 }
2230 p->outfile[0] = 0;
2231 p->out = stdout;
2232}
2233
2234/*
drh75897232000-05-29 14:26:00 +00002235** If an input line begins with "." then invoke this routine to
2236** process that line.
drh67505e72002-04-19 12:34:06 +00002237**
drh47ad6842006-11-08 12:25:42 +00002238** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002239*/
drh44c2eb12003-04-30 11:38:26 +00002240static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002241 int i = 1;
2242 int nArg = 0;
2243 int n, c;
drh67505e72002-04-19 12:34:06 +00002244 int rc = 0;
drh75897232000-05-29 14:26:00 +00002245 char *azArg[50];
2246
2247 /* Parse the input line into tokens.
2248 */
2249 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002250 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002251 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002252 if( zLine[i]=='\'' || zLine[i]=='"' ){
2253 int delim = zLine[i++];
2254 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002255 while( zLine[i] && zLine[i]!=delim ){
2256 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2257 i++;
2258 }
drh75897232000-05-29 14:26:00 +00002259 if( zLine[i]==delim ){
2260 zLine[i++] = 0;
2261 }
drhfeac5f82004-08-01 00:10:45 +00002262 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002263 }else{
2264 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002265 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002266 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002267 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002268 }
2269 }
2270
2271 /* Process the input line.
2272 */
shane9bd1b442009-10-23 01:27:39 +00002273 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002274 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002275 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002276 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2277 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2278 ){
drhbc46f022013-01-23 18:53:23 +00002279 const char *zDestFile = 0;
2280 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002281 sqlite3 *pDest;
2282 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002283 int j;
2284 for(j=1; j<nArg; j++){
2285 const char *z = azArg[j];
2286 if( z[0]=='-' ){
2287 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002288 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002289 {
2290 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2291 return 1;
2292 }
2293 }else if( zDestFile==0 ){
2294 zDestFile = azArg[j];
2295 }else if( zDb==0 ){
2296 zDb = zDestFile;
2297 zDestFile = azArg[j];
2298 }else{
2299 fprintf(stderr, "too many arguments to .backup\n");
2300 return 1;
2301 }
drh9ff849f2009-02-04 20:55:57 +00002302 }
drhbc46f022013-01-23 18:53:23 +00002303 if( zDestFile==0 ){
2304 fprintf(stderr, "missing FILENAME argument on .backup\n");
2305 return 1;
2306 }
2307 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002308 rc = sqlite3_open(zDestFile, &pDest);
2309 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002310 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002311 sqlite3_close(pDest);
2312 return 1;
2313 }
drh05782482013-10-24 15:20:20 +00002314 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002315 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2316 if( pBackup==0 ){
2317 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2318 sqlite3_close(pDest);
2319 return 1;
2320 }
2321 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2322 sqlite3_backup_finish(pBackup);
2323 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002324 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002325 }else{
2326 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002327 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002328 }
2329 sqlite3_close(pDest);
2330 }else
2331
drhc2ce0be2014-05-29 12:36:14 +00002332 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2333 if( nArg==2 ){
2334 bail_on_error = booleanValue(azArg[1]);
2335 }else{
2336 fprintf(stderr, "Usage: .bail on|off\n");
2337 rc = 1;
2338 }
drhc49f44e2006-10-26 18:15:42 +00002339 }else
2340
drhd8621b92012-04-17 09:09:33 +00002341 /* The undocumented ".breakpoint" command causes a call to the no-op
2342 ** routine named test_breakpoint().
2343 */
2344 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2345 test_breakpoint();
2346 }else
2347
drhc2ce0be2014-05-29 12:36:14 +00002348 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2349 if( nArg==2 ){
2350 tryToClone(p, azArg[1]);
2351 }else{
2352 fprintf(stderr, "Usage: .clone FILENAME\n");
2353 rc = 1;
2354 }
mistachkine31ae902014-02-06 01:15:29 +00002355 }else
2356
drhc2ce0be2014-05-29 12:36:14 +00002357 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
jplyon672a1ed2003-05-11 20:07:05 +00002358 struct callback_data data;
2359 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002360 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002361 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002362 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002363 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002364 data.colWidth[0] = 3;
2365 data.colWidth[1] = 15;
2366 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002367 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002368 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002369 if( zErrMsg ){
2370 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002371 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002372 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002373 }
2374 }else
2375
drhc2ce0be2014-05-29 12:36:14 +00002376 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002377 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002378 /* When playing back a "dump", the content might appear in an order
2379 ** which causes immediate foreign key constraints to be violated.
2380 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002381 if( nArg!=1 && nArg!=2 ){
2382 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2383 rc = 1;
2384 goto meta_command_exit;
2385 }
drhf1dfc4f2009-09-23 15:51:35 +00002386 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002387 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002388 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002389 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002390 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002391 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002392 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002393 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002394 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002395 );
2396 run_schema_dump_query(p,
2397 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002398 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002399 );
drh2f464a02011-10-13 00:41:49 +00002400 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002401 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002402 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002403 );
drh4c653a02000-06-07 01:27:47 +00002404 }else{
2405 int i;
drhdd3d4592004-08-30 01:54:05 +00002406 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002407 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002408 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002409 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002410 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002411 " AND sql NOT NULL");
2412 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002413 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002414 "WHERE sql NOT NULL"
2415 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002416 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002417 );
danielk1977bc6ada42004-06-30 08:20:16 +00002418 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002419 }
2420 }
drh45e29d82006-11-20 16:21:10 +00002421 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002422 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002423 p->writableSchema = 0;
2424 }
drh56197952011-10-13 16:30:13 +00002425 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2426 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002427 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002428 }else
drh75897232000-05-29 14:26:00 +00002429
drhc2ce0be2014-05-29 12:36:14 +00002430 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2431 if( nArg==2 ){
2432 p->echoOn = booleanValue(azArg[1]);
2433 }else{
2434 fprintf(stderr, "Usage: .echo on|off\n");
2435 rc = 1;
2436 }
drhdaffd0e2001-04-11 14:28:42 +00002437 }else
2438
drhc2ce0be2014-05-29 12:36:14 +00002439 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2440 if( nArg==2 ){
2441 p->autoEQP = booleanValue(azArg[1]);
2442 }else{
2443 fprintf(stderr, "Usage: .eqp on|off\n");
2444 rc = 1;
2445 }
drhefbf3b12014-02-28 20:47:24 +00002446 }else
2447
drhd3ac7d92013-01-25 18:33:43 +00002448 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002449 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002450 rc = 2;
drh75897232000-05-29 14:26:00 +00002451 }else
2452
drhc2ce0be2014-05-29 12:36:14 +00002453 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002454 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002455 if(val == 1) {
2456 if(!p->explainPrev.valid) {
2457 p->explainPrev.valid = 1;
2458 p->explainPrev.mode = p->mode;
2459 p->explainPrev.showHeader = p->showHeader;
2460 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2461 }
2462 /* We could put this code under the !p->explainValid
2463 ** condition so that it does not execute if we are already in
2464 ** explain mode. However, always executing it allows us an easy
2465 ** was to reset to explain mode in case the user previously
2466 ** did an .explain followed by a .width, .mode or .header
2467 ** command.
2468 */
danielk19770d78bae2008-01-03 07:09:48 +00002469 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002470 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002471 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002472 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002473 p->colWidth[1] = 13; /* opcode */
2474 p->colWidth[2] = 4; /* P1 */
2475 p->colWidth[3] = 4; /* P2 */
2476 p->colWidth[4] = 4; /* P3 */
2477 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002478 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002479 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002480 }else if (p->explainPrev.valid) {
2481 p->explainPrev.valid = 0;
2482 p->mode = p->explainPrev.mode;
2483 p->showHeader = p->explainPrev.showHeader;
2484 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2485 }
drh75897232000-05-29 14:26:00 +00002486 }else
2487
drhc1971542014-06-23 23:28:13 +00002488 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
2489 struct callback_data data;
2490 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002491 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002492 if( nArg!=1 ){
2493 fprintf(stderr, "Usage: .fullschema\n");
2494 rc = 1;
2495 goto meta_command_exit;
2496 }
2497 open_db(p, 0);
2498 memcpy(&data, p, sizeof(data));
2499 data.showHeader = 0;
2500 data.mode = MODE_Semi;
2501 rc = sqlite3_exec(p->db,
2502 "SELECT sql FROM"
2503 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2504 " FROM sqlite_master UNION ALL"
2505 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2506 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
2507 "ORDER BY rowid",
2508 callback, &data, &zErrMsg
2509 );
drh56f674c2014-07-18 14:43:29 +00002510 if( rc==SQLITE_OK ){
2511 sqlite3_stmt *pStmt;
2512 rc = sqlite3_prepare_v2(p->db,
2513 "SELECT rowid FROM sqlite_master"
2514 " WHERE name GLOB 'sqlite_stat[134]'",
2515 -1, &pStmt, 0);
2516 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2517 sqlite3_finalize(pStmt);
2518 }
2519 if( doStats==0 ){
2520 fprintf(p->out, "/* No STAT tables available */\n");
2521 }else{
2522 fprintf(p->out, "ANALYZE sqlite_master;\n");
2523 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2524 callback, &data, &zErrMsg);
2525 data.mode = MODE_Insert;
2526 data.zDestTable = "sqlite_stat1";
2527 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2528 shell_callback, &data,&zErrMsg);
2529 data.zDestTable = "sqlite_stat3";
2530 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2531 shell_callback, &data,&zErrMsg);
2532 data.zDestTable = "sqlite_stat4";
2533 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2534 shell_callback, &data, &zErrMsg);
2535 fprintf(p->out, "ANALYZE sqlite_master;\n");
2536 }
drhc1971542014-06-23 23:28:13 +00002537 }else
2538
drhc2ce0be2014-05-29 12:36:14 +00002539 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2540 if( nArg==2 ){
2541 p->showHeader = booleanValue(azArg[1]);
2542 }else{
2543 fprintf(stderr, "Usage: .headers on|off\n");
2544 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002545 }
drh75897232000-05-29 14:26:00 +00002546 }else
2547
drhc2ce0be2014-05-29 12:36:14 +00002548 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2549 fprintf(p->out, "%s", zHelp);
2550 }else
2551
2552 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002553 char *zTable; /* Insert data into this table */
2554 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002555 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002556 int nCol; /* Number of columns in the table */
2557 int nByte; /* Number of bytes in an SQL string */
2558 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002559 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00002560 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00002561 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00002562 ImportCtx sCtx; /* Reader context */
2563 char *(*xRead)(ImportCtx*); /* Procecure to read one value */
drh5bde8162013-06-27 14:07:53 +00002564 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002565
drhc2ce0be2014-05-29 12:36:14 +00002566 if( nArg!=3 ){
2567 fprintf(stderr, "Usage: .import FILE TABLE\n");
2568 goto meta_command_exit;
2569 }
drh01f37542014-05-31 15:43:33 +00002570 zFile = azArg[1];
2571 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002572 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00002573 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00002574 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002575 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002576 if( nSep==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002577 fprintf(stderr, "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00002578 return 1;
drhfeac5f82004-08-01 00:10:45 +00002579 }
drhdb95f682013-06-26 22:46:00 +00002580 if( nSep>1 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002581 fprintf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00002582 " for import\n");
2583 return 1;
2584 }
mistachkin636bf9f2014-07-19 20:15:16 +00002585 nSep = strlen30(p->rowSeparator);
2586 if( nSep==0 ){
2587 fprintf(stderr, "Error: non-null row separator required for import\n");
2588 return 1;
2589 }
2590 if( nSep>1 ){
2591 fprintf(stderr, "Error: multi-character row separators not allowed"
2592 " for import\n");
2593 return 1;
2594 }
2595 sCtx.zFile = zFile;
2596 sCtx.nLine = 1;
2597 if( sCtx.zFile[0]=='|' ){
2598 sCtx.in = popen(sCtx.zFile+1, "r");
2599 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00002600 xCloser = pclose;
2601 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002602 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00002603 xCloser = fclose;
2604 }
mistachkin636bf9f2014-07-19 20:15:16 +00002605 if( p->mode==MODE_Ascii ){
2606 xRead = ascii_read_one_field;
2607 }else{
2608 xRead = csv_read_one_field;
2609 }
2610 if( sCtx.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002611 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002612 return 1;
2613 }
mistachkin636bf9f2014-07-19 20:15:16 +00002614 sCtx.cColSep = p->colSeparator[0];
2615 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00002616 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002617 if( zSql==0 ){
2618 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00002619 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00002620 return 1;
2621 }
drh4f21c4a2008-12-10 22:15:00 +00002622 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002623 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002624 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002625 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2626 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2627 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00002628 while( xRead(&sCtx) ){
2629 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00002630 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00002631 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00002632 }
drh5bde8162013-06-27 14:07:53 +00002633 if( cSep=='(' ){
2634 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00002635 sqlite3_free(sCtx.z);
2636 xCloser(sCtx.in);
2637 fprintf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00002638 return 1;
2639 }
drhdb95f682013-06-26 22:46:00 +00002640 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2641 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2642 sqlite3_free(zCreate);
2643 if( rc ){
2644 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2645 sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00002646 sqlite3_free(sCtx.z);
2647 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00002648 return 1;
2649 }
drhc7181902014-02-27 15:04:13 +00002650 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002651 }
drhfeac5f82004-08-01 00:10:45 +00002652 sqlite3_free(zSql);
2653 if( rc ){
shane916f9612009-10-23 00:37:15 +00002654 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002655 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
mistachkin636bf9f2014-07-19 20:15:16 +00002656 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00002657 return 1;
drhfeac5f82004-08-01 00:10:45 +00002658 }
shane916f9612009-10-23 00:37:15 +00002659 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002660 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002661 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002662 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002663 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002664 if( zSql==0 ){
2665 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00002666 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00002667 return 1;
2668 }
drhdb95f682013-06-26 22:46:00 +00002669 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002670 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002671 for(i=1; i<nCol; i++){
2672 zSql[j++] = ',';
2673 zSql[j++] = '?';
2674 }
2675 zSql[j++] = ')';
2676 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002677 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002678 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002679 if( rc ){
2680 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002681 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00002682 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00002683 return 1;
drhfeac5f82004-08-01 00:10:45 +00002684 }
drh2d463112013-08-06 14:36:36 +00002685 needCommit = sqlite3_get_autocommit(db);
2686 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002687 do{
mistachkin636bf9f2014-07-19 20:15:16 +00002688 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00002689 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00002690 char *z = xRead(&sCtx);
2691 /*
2692 ** Did we reach end-of-file before finding any columns?
2693 ** If so, stop instead of NULL filling the remaining columns.
2694 */
drhdb95f682013-06-26 22:46:00 +00002695 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00002696 /*
2697 ** Did we reach end-of-file OR end-of-line before finding any
2698 ** columns in ASCII mode? If so, stop instead of NULL filling
2699 ** the remaining columns.
2700 */
2701 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00002702 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00002703 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00002704 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2705 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00002706 sCtx.zFile, startLine, nCol, i+1);
drhdb95f682013-06-26 22:46:00 +00002707 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002708 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002709 }
drhfeac5f82004-08-01 00:10:45 +00002710 }
mistachkin636bf9f2014-07-19 20:15:16 +00002711 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00002712 do{
mistachkin636bf9f2014-07-19 20:15:16 +00002713 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00002714 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00002715 }while( sCtx.cTerm==sCtx.cColSep );
drhdb95f682013-06-26 22:46:00 +00002716 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2717 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00002718 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002719 }
drhdb95f682013-06-26 22:46:00 +00002720 if( i>=nCol ){
2721 sqlite3_step(pStmt);
2722 rc = sqlite3_reset(pStmt);
2723 if( rc!=SQLITE_OK ){
mistachkin636bf9f2014-07-19 20:15:16 +00002724 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
drhdb95f682013-06-26 22:46:00 +00002725 sqlite3_errmsg(db));
2726 }
2727 }
mistachkin636bf9f2014-07-19 20:15:16 +00002728 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00002729
mistachkin636bf9f2014-07-19 20:15:16 +00002730 xCloser(sCtx.in);
2731 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00002732 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002733 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002734 }else
2735
drhc2ce0be2014-05-29 12:36:14 +00002736 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drh75897232000-05-29 14:26:00 +00002737 struct callback_data data;
2738 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002739 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002740 memcpy(&data, p, sizeof(data));
2741 data.showHeader = 0;
2742 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002743 if( nArg==1 ){
2744 rc = sqlite3_exec(p->db,
2745 "SELECT name FROM sqlite_master "
2746 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2747 "UNION ALL "
2748 "SELECT name FROM sqlite_temp_master "
2749 "WHERE type='index' "
2750 "ORDER BY 1",
2751 callback, &data, &zErrMsg
2752 );
drhc2ce0be2014-05-29 12:36:14 +00002753 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002754 zShellStatic = azArg[1];
2755 rc = sqlite3_exec(p->db,
2756 "SELECT name FROM sqlite_master "
2757 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2758 "UNION ALL "
2759 "SELECT name FROM sqlite_temp_master "
2760 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2761 "ORDER BY 1",
2762 callback, &data, &zErrMsg
2763 );
2764 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002765 }else{
2766 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2767 rc = 1;
2768 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002769 }
drh75897232000-05-29 14:26:00 +00002770 if( zErrMsg ){
2771 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002772 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002773 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002774 }else if( rc != SQLITE_OK ){
2775 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2776 rc = 1;
drh75897232000-05-29 14:26:00 +00002777 }
2778 }else
2779
drhae5e4452007-05-03 17:18:36 +00002780#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002781 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002782 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002783 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2784 iotrace = 0;
2785 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002786 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002787 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002788 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002789 iotrace = stdout;
2790 }else{
2791 iotrace = fopen(azArg[1], "w");
2792 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002793 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002794 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002795 rc = 1;
drhb0603412007-02-28 04:47:26 +00002796 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002797 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002798 }
2799 }
2800 }else
drhae5e4452007-05-03 17:18:36 +00002801#endif
drhb0603412007-02-28 04:47:26 +00002802
drh70df4fe2006-06-13 15:12:21 +00002803#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002804 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002805 const char *zFile, *zProc;
2806 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002807 if( nArg<2 ){
2808 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2809 rc = 1;
2810 goto meta_command_exit;
2811 }
drh1e397f82006-06-08 15:28:43 +00002812 zFile = azArg[1];
2813 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002814 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002815 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2816 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002817 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002818 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002819 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002820 }
2821 }else
drh70df4fe2006-06-13 15:12:21 +00002822#endif
drh1e397f82006-06-08 15:28:43 +00002823
drhc2ce0be2014-05-29 12:36:14 +00002824 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2825 if( nArg!=2 ){
2826 fprintf(stderr, "Usage: .log FILENAME\n");
2827 rc = 1;
2828 }else{
2829 const char *zFile = azArg[1];
2830 output_file_close(p->pLog);
2831 p->pLog = output_file_open(zFile);
2832 }
drh127f9d72010-02-23 01:47:00 +00002833 }else
2834
drhc2ce0be2014-05-29 12:36:14 +00002835 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2836 const char *zMode = nArg>=2 ? azArg[1] : "";
2837 int n2 = (int)strlen(zMode);
2838 int c2 = zMode[0];
2839 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002840 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002841 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002842 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002843 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002844 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002845 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002846 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002847 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002848 p->mode = MODE_Tcl;
mistachkin636bf9f2014-07-19 20:15:16 +00002849 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, " ");
2850 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line);
drhc2ce0be2014-05-29 12:36:14 +00002851 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002852 p->mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00002853 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, ",");
2854 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line);
drhc2ce0be2014-05-29 12:36:14 +00002855 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002856 p->mode = MODE_List;
mistachkin636bf9f2014-07-19 20:15:16 +00002857 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, "\t");
2858 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line);
drhc2ce0be2014-05-29 12:36:14 +00002859 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002860 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002861 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00002862 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
2863 p->mode = MODE_Ascii;
2864 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
2865 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhdaffd0e2001-04-11 14:28:42 +00002866 }else {
shane9bd1b442009-10-23 01:27:39 +00002867 fprintf(stderr,"Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00002868 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002869 rc = 1;
drh75897232000-05-29 14:26:00 +00002870 }
2871 }else
2872
drhc2ce0be2014-05-29 12:36:14 +00002873 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2874 if( nArg==2 ){
2875 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2876 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2877 }else{
2878 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002879 rc = 1;
2880 }
2881 }else
2882
drh05782482013-10-24 15:20:20 +00002883 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2884 sqlite3 *savedDb = p->db;
2885 const char *zSavedFilename = p->zDbFilename;
2886 char *zNewFilename = 0;
2887 p->db = 0;
2888 if( nArg>=2 ){
2889 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2890 }
2891 open_db(p, 1);
2892 if( p->db!=0 ){
2893 sqlite3_close(savedDb);
2894 sqlite3_free(p->zFreeOnClose);
2895 p->zFreeOnClose = zNewFilename;
2896 }else{
2897 sqlite3_free(zNewFilename);
2898 p->db = savedDb;
2899 p->zDbFilename = zSavedFilename;
2900 }
2901 }else
2902
drhc2ce0be2014-05-29 12:36:14 +00002903 if( c=='o'
2904 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2905 ){
2906 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2907 if( nArg>2 ){
2908 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2909 rc = 1;
2910 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002911 }
drhc2ce0be2014-05-29 12:36:14 +00002912 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2913 if( nArg<2 ){
2914 fprintf(stderr, "Usage: .once FILE\n");
2915 rc = 1;
2916 goto meta_command_exit;
2917 }
2918 p->outCount = 2;
2919 }else{
2920 p->outCount = 0;
2921 }
2922 output_reset(p);
2923 if( zFile[0]=='|' ){
2924 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002925 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002926 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002927 p->out = stdout;
2928 rc = 1;
2929 }else{
drhc2ce0be2014-05-29 12:36:14 +00002930 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002931 }
drh75897232000-05-29 14:26:00 +00002932 }else{
drhc2ce0be2014-05-29 12:36:14 +00002933 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002934 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002935 if( strcmp(zFile,"off")!=0 ){
2936 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002937 }
drh75897232000-05-29 14:26:00 +00002938 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002939 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002940 } else {
drhc2ce0be2014-05-29 12:36:14 +00002941 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002942 }
2943 }
2944 }else
2945
drh078b1fd2012-09-21 13:40:02 +00002946 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2947 int i;
2948 for(i=1; i<nArg; i++){
2949 if( i>1 ) fprintf(p->out, " ");
2950 fprintf(p->out, "%s", azArg[i]);
2951 }
2952 fprintf(p->out, "\n");
2953 }else
2954
drhc2ce0be2014-05-29 12:36:14 +00002955 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002956 if( nArg >= 2) {
2957 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2958 }
2959 if( nArg >= 3) {
2960 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2961 }
2962 }else
2963
drhc2ce0be2014-05-29 12:36:14 +00002964 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002965 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002966 }else
2967
drhc2ce0be2014-05-29 12:36:14 +00002968 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
2969 FILE *alt;
2970 if( nArg!=2 ){
2971 fprintf(stderr, "Usage: .read FILE\n");
2972 rc = 1;
2973 goto meta_command_exit;
2974 }
2975 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002976 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002977 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2978 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002979 }else{
shane9bd1b442009-10-23 01:27:39 +00002980 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002981 fclose(alt);
2982 }
2983 }else
2984
drhc2ce0be2014-05-29 12:36:14 +00002985 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00002986 const char *zSrcFile;
2987 const char *zDb;
2988 sqlite3 *pSrc;
2989 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002990 int nTimeout = 0;
2991
drh9ff849f2009-02-04 20:55:57 +00002992 if( nArg==2 ){
2993 zSrcFile = azArg[1];
2994 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00002995 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00002996 zSrcFile = azArg[2];
2997 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00002998 }else{
2999 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3000 rc = 1;
3001 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003002 }
3003 rc = sqlite3_open(zSrcFile, &pSrc);
3004 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003005 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003006 sqlite3_close(pSrc);
3007 return 1;
3008 }
drh05782482013-10-24 15:20:20 +00003009 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003010 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3011 if( pBackup==0 ){
3012 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3013 sqlite3_close(pSrc);
3014 return 1;
3015 }
drhdc2c4912009-02-04 22:46:47 +00003016 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3017 || rc==SQLITE_BUSY ){
3018 if( rc==SQLITE_BUSY ){
3019 if( nTimeout++ >= 3 ) break;
3020 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003021 }
3022 }
3023 sqlite3_backup_finish(pBackup);
3024 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003025 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003026 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003027 fprintf(stderr, "Error: source database is busy\n");
3028 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003029 }else{
3030 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003031 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003032 }
3033 sqlite3_close(pSrc);
3034 }else
3035
drhc2ce0be2014-05-29 12:36:14 +00003036 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drh75897232000-05-29 14:26:00 +00003037 struct callback_data data;
3038 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003039 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003040 memcpy(&data, p, sizeof(data));
3041 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003042 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003043 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003044 int i;
drhf0693c82011-10-11 20:41:54 +00003045 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003046 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003047 char *new_argv[2], *new_colv[2];
3048 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3049 " type text,\n"
3050 " name text,\n"
3051 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003052 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003053 " sql text\n"
3054 ")";
3055 new_argv[1] = 0;
3056 new_colv[0] = "sql";
3057 new_colv[1] = 0;
3058 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003059 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003060 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003061 char *new_argv[2], *new_colv[2];
3062 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3063 " type text,\n"
3064 " name text,\n"
3065 " tbl_name text,\n"
3066 " rootpage integer,\n"
3067 " sql text\n"
3068 ")";
3069 new_argv[1] = 0;
3070 new_colv[0] = "sql";
3071 new_colv[1] = 0;
3072 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003073 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003074 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003075 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003076 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003077 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003078 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003079 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003080 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003081 "WHERE lower(tbl_name) LIKE shellstatic()"
3082 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003083 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003084 callback, &data, &zErrMsg);
3085 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003086 }
drhc2ce0be2014-05-29 12:36:14 +00003087 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003088 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003089 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003090 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003091 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003092 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00003093 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00003094 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003095 callback, &data, &zErrMsg
3096 );
drhc2ce0be2014-05-29 12:36:14 +00003097 }else{
3098 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3099 rc = 1;
3100 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003101 }
drh75897232000-05-29 14:26:00 +00003102 if( zErrMsg ){
3103 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003104 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003105 rc = 1;
3106 }else if( rc != SQLITE_OK ){
3107 fprintf(stderr,"Error: querying schema information\n");
3108 rc = 1;
3109 }else{
3110 rc = 0;
drh75897232000-05-29 14:26:00 +00003111 }
3112 }else
3113
drh340f5822013-06-27 13:01:21 +00003114#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003115 /* Undocumented commands for internal testing. Subject to change
3116 ** without notice. */
3117 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3118 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3119 int i, v;
3120 for(i=1; i<nArg; i++){
3121 v = booleanValue(azArg[i]);
3122 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3123 }
3124 }
3125 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3126 int i; sqlite3_int64 v;
3127 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003128 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003129 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003130 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003131 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003132 }
3133 }
3134 }else
drh340f5822013-06-27 13:01:21 +00003135#endif
drh348d19c2013-06-03 12:47:43 +00003136
mistachkin636bf9f2014-07-19 20:15:16 +00003137 if( c=='r' && strncmp(azArg[0], "rowseparator", n)==0 ){
3138 if( nArg==2 ){
3139 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3140 "%.*s", (int)sizeof(p->rowSeparator)-1, azArg[1]);
3141 }else{
3142 fprintf(stderr, "Usage: .rowseparator STRING\n");
3143 rc = 1;
3144 }
3145 }else
3146
3147 if( c=='c' && strncmp(azArg[0], "colseparator", n)==0 ){
3148 if( nArg==2 ){
3149 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
3150 "%.*s", (int)sizeof(p->colSeparator)-1, azArg[1]);
3151 }else{
3152 fprintf(stderr, "Usage: .colseparator STRING\n");
3153 rc = 1;
3154 }
3155 }else
3156
drhc2ce0be2014-05-29 12:36:14 +00003157 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
3158 if( nArg==2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003159 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
3160 "%.*s", (int)sizeof(p->colSeparator)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003161 }else{
3162 fprintf(stderr, "Usage: .separator STRING\n");
3163 rc = 1;
3164 }
drh75897232000-05-29 14:26:00 +00003165 }else
3166
drh62cdde52014-05-28 20:22:28 +00003167 if( c=='s'
3168 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003169 ){
3170 char *zCmd;
3171 int i;
drhc2ce0be2014-05-29 12:36:14 +00003172 if( nArg<2 ){
3173 fprintf(stderr, "Usage: .system COMMAND\n");
3174 rc = 1;
3175 goto meta_command_exit;
3176 }
drhdcb3e3d2014-05-29 03:17:29 +00003177 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003178 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003179 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3180 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003181 }
drh3c4461f2014-05-29 20:39:59 +00003182 (void)system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003183 sqlite3_free(zCmd);
3184 }else
3185
drhc2ce0be2014-05-29 12:36:14 +00003186 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003187 int i;
drhc2ce0be2014-05-29 12:36:14 +00003188 if( nArg!=1 ){
3189 fprintf(stderr, "Usage: .show\n");
3190 rc = 1;
3191 goto meta_command_exit;
3192 }
mistachkin636bf9f2014-07-19 20:15:16 +00003193 fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3194 fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
3195 fprintf(p->out,"%12.12s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
3196 fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3197 fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3198 fprintf(p->out,"%12.12s: ", "nullvalue");
drhfeac5f82004-08-01 00:10:45 +00003199 output_c_string(p->out, p->nullvalue);
3200 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003201 fprintf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003202 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkin636bf9f2014-07-19 20:15:16 +00003203 fprintf(p->out,"%12.12s: ", "colseparator");
3204 output_c_string(p->out, p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003205 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003206 fprintf(p->out,"%12.12s: ", "rowseparator");
3207 output_c_string(p->out, p->rowSeparator);
3208 fprintf(p->out, "\n");
3209 fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3210 fprintf(p->out,"%12.12s: ","width");
persicom7e2dfdd2002-04-18 02:46:52 +00003211 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003212 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003213 }
drhfeac5f82004-08-01 00:10:45 +00003214 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003215 }else
3216
drhc2ce0be2014-05-29 12:36:14 +00003217 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3218 if( nArg==2 ){
3219 p->statsOn = booleanValue(azArg[1]);
3220 }else{
3221 fprintf(stderr, "Usage: .stats on|off\n");
3222 rc = 1;
3223 }
shaneh642d8b82010-07-28 16:05:34 +00003224 }else
3225
drhc2ce0be2014-05-29 12:36:14 +00003226 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003227 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003228 char **azResult;
drh98781232012-04-23 12:38:05 +00003229 int nRow, nAlloc;
3230 char *zSql = 0;
3231 int ii;
drh05782482013-10-24 15:20:20 +00003232 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003233 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3234 if( rc ) return rc;
3235 zSql = sqlite3_mprintf(
3236 "SELECT name FROM sqlite_master"
3237 " WHERE type IN ('table','view')"
3238 " AND name NOT LIKE 'sqlite_%%'"
3239 " AND name LIKE ?1");
3240 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3241 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3242 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3243 if( strcmp(zDbName,"temp")==0 ){
3244 zSql = sqlite3_mprintf(
3245 "%z UNION ALL "
3246 "SELECT 'temp.' || name FROM sqlite_temp_master"
3247 " WHERE type IN ('table','view')"
3248 " AND name NOT LIKE 'sqlite_%%'"
3249 " AND name LIKE ?1", zSql);
3250 }else{
3251 zSql = sqlite3_mprintf(
3252 "%z UNION ALL "
3253 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3254 " WHERE type IN ('table','view')"
3255 " AND name NOT LIKE 'sqlite_%%'"
3256 " AND name LIKE ?1", zSql, zDbName, zDbName);
3257 }
drha50da102000-08-08 20:19:09 +00003258 }
drh98781232012-04-23 12:38:05 +00003259 sqlite3_finalize(pStmt);
3260 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3261 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3262 sqlite3_free(zSql);
3263 if( rc ) return rc;
3264 nRow = nAlloc = 0;
3265 azResult = 0;
3266 if( nArg>1 ){
3267 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003268 }else{
drh98781232012-04-23 12:38:05 +00003269 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3270 }
3271 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3272 if( nRow>=nAlloc ){
3273 char **azNew;
3274 int n = nAlloc*2 + 10;
3275 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3276 if( azNew==0 ){
3277 fprintf(stderr, "Error: out of memory\n");
3278 break;
3279 }
3280 nAlloc = n;
3281 azResult = azNew;
3282 }
3283 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3284 if( azResult[nRow] ) nRow++;
3285 }
3286 sqlite3_finalize(pStmt);
3287 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003288 int len, maxlen = 0;
3289 int i, j;
3290 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003291 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003292 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003293 if( len>maxlen ) maxlen = len;
3294 }
3295 nPrintCol = 80/(maxlen+2);
3296 if( nPrintCol<1 ) nPrintCol = 1;
3297 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3298 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003299 for(j=i; j<nRow; j+=nPrintRow){
3300 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003301 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003302 }
drh151b7d52013-05-06 20:28:54 +00003303 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003304 }
3305 }
drh98781232012-04-23 12:38:05 +00003306 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3307 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003308 }else
3309
shaneh96887e12011-02-10 21:08:58 +00003310 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003311 static const struct {
3312 const char *zCtrlName; /* Name of a test-control option */
3313 int ctrlCode; /* Integer code for that option */
3314 } aCtrl[] = {
3315 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3316 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3317 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3318 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3319 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3320 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3321 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3322 { "assert", SQLITE_TESTCTRL_ASSERT },
3323 { "always", SQLITE_TESTCTRL_ALWAYS },
3324 { "reserve", SQLITE_TESTCTRL_RESERVE },
3325 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3326 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003327 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003328 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003329 };
shaneh96887e12011-02-10 21:08:58 +00003330 int testctrl = -1;
3331 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003332 int i, n;
drh05782482013-10-24 15:20:20 +00003333 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003334
drhd416fe72011-03-17 16:45:50 +00003335 /* convert testctrl text option to value. allow any unique prefix
3336 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003337 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003338 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003339 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3340 if( testctrl<0 ){
3341 testctrl = aCtrl[i].ctrlCode;
3342 }else{
drhb07028f2011-10-14 21:49:18 +00003343 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003344 testctrl = -1;
3345 break;
3346 }
3347 }
3348 }
drh348d19c2013-06-03 12:47:43 +00003349 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003350 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3351 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3352 }else{
3353 switch(testctrl){
3354
3355 /* sqlite3_test_control(int, db, int) */
3356 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3357 case SQLITE_TESTCTRL_RESERVE:
3358 if( nArg==3 ){
3359 int opt = (int)strtol(azArg[2], 0, 0);
3360 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003361 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003362 } else {
drhd416fe72011-03-17 16:45:50 +00003363 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3364 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003365 }
3366 break;
3367
3368 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003369 case SQLITE_TESTCTRL_PRNG_SAVE:
3370 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003371 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003372 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003373 if( nArg==2 ){
3374 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003375 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003376 } else {
3377 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3378 }
3379 break;
3380
3381 /* sqlite3_test_control(int, uint) */
3382 case SQLITE_TESTCTRL_PENDING_BYTE:
3383 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003384 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003385 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003386 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003387 } else {
drhd416fe72011-03-17 16:45:50 +00003388 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3389 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003390 }
3391 break;
3392
3393 /* sqlite3_test_control(int, int) */
3394 case SQLITE_TESTCTRL_ASSERT:
3395 case SQLITE_TESTCTRL_ALWAYS:
3396 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003397 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003398 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003399 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003400 } else {
drhd416fe72011-03-17 16:45:50 +00003401 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3402 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003403 }
3404 break;
3405
3406 /* sqlite3_test_control(int, char *) */
3407#ifdef SQLITE_N_KEYWORD
3408 case SQLITE_TESTCTRL_ISKEYWORD:
3409 if( nArg==3 ){
3410 const char *opt = azArg[2];
3411 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003412 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003413 } else {
drhd416fe72011-03-17 16:45:50 +00003414 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3415 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003416 }
3417 break;
3418#endif
3419
3420 case SQLITE_TESTCTRL_BITVEC_TEST:
3421 case SQLITE_TESTCTRL_FAULT_INSTALL:
3422 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3423 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3424 default:
drhd416fe72011-03-17 16:45:50 +00003425 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3426 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003427 break;
3428 }
3429 }
3430 }else
3431
drhc2ce0be2014-05-29 12:36:14 +00003432 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003433 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003434 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003435 }else
3436
drhc2ce0be2014-05-29 12:36:14 +00003437 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3438 if( nArg==2 ){
3439 enableTimer = booleanValue(azArg[1]);
3440 if( enableTimer && !HAS_TIMER ){
3441 fprintf(stderr, "Error: timer not available on this system.\n");
3442 enableTimer = 0;
3443 }
3444 }else{
3445 fprintf(stderr, "Usage: .timer on|off\n");
3446 rc = 1;
3447 }
shanehe2aa9d72009-11-06 17:20:17 +00003448 }else
3449
drhc2ce0be2014-05-29 12:36:14 +00003450 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003451 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003452 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003453 if( nArg!=2 ){
3454 fprintf(stderr, "Usage: .trace FILE|off\n");
3455 rc = 1;
3456 goto meta_command_exit;
3457 }
drh42f64e52012-04-04 16:56:23 +00003458 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003459#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003460 if( p->traceOut==0 ){
3461 sqlite3_trace(p->db, 0, 0);
3462 }else{
3463 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3464 }
3465#endif
3466 }else
3467
drh9fd301b2011-06-03 13:28:22 +00003468 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003469 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003470 sqlite3_libversion(), sqlite3_sourceid());
3471 }else
3472
drhde60fc22011-12-14 17:53:36 +00003473 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3474 const char *zDbName = nArg==2 ? azArg[1] : "main";
3475 char *zVfsName = 0;
3476 if( p->db ){
3477 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3478 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003479 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003480 sqlite3_free(zVfsName);
3481 }
3482 }
3483 }else
3484
drhcef4fc82012-09-21 22:50:45 +00003485#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3486 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3487 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003488 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003489 }else
3490#endif
3491
drhc2ce0be2014-05-29 12:36:14 +00003492 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003493 int j;
drh43617e92006-03-06 20:55:46 +00003494 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003495 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003496 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003497 }
3498 }else
3499
3500 {
shane9bd1b442009-10-23 01:27:39 +00003501 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003502 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003503 rc = 1;
drh75897232000-05-29 14:26:00 +00003504 }
drh67505e72002-04-19 12:34:06 +00003505
drhc2ce0be2014-05-29 12:36:14 +00003506meta_command_exit:
3507 if( p->outCount ){
3508 p->outCount--;
3509 if( p->outCount==0 ) output_reset(p);
3510 }
drh67505e72002-04-19 12:34:06 +00003511 return rc;
drh75897232000-05-29 14:26:00 +00003512}
3513
drh67505e72002-04-19 12:34:06 +00003514/*
drh91a66392007-09-07 01:12:32 +00003515** Return TRUE if a semicolon occurs anywhere in the first N characters
3516** of string z[].
drh324ccef2003-02-05 14:06:20 +00003517*/
drh9f099fd2013-08-06 14:01:46 +00003518static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003519 int i;
3520 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3521 return 0;
drh324ccef2003-02-05 14:06:20 +00003522}
3523
3524/*
drh70c7a4b2003-04-26 03:03:06 +00003525** Test to see if a line consists entirely of whitespace.
3526*/
3527static int _all_whitespace(const char *z){
3528 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003529 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003530 if( *z=='/' && z[1]=='*' ){
3531 z += 2;
3532 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3533 if( *z==0 ) return 0;
3534 z++;
3535 continue;
3536 }
3537 if( *z=='-' && z[1]=='-' ){
3538 z += 2;
3539 while( *z && *z!='\n' ){ z++; }
3540 if( *z==0 ) return 1;
3541 continue;
3542 }
3543 return 0;
3544 }
3545 return 1;
3546}
3547
3548/*
drha9b17162003-04-29 18:01:28 +00003549** Return TRUE if the line typed in is an SQL command terminator other
3550** than a semi-colon. The SQL Server style "go" command is understood
3551** as is the Oracle "/".
3552*/
drh9f099fd2013-08-06 14:01:46 +00003553static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003554 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003555 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3556 return 1; /* Oracle */
3557 }
drhf0693c82011-10-11 20:41:54 +00003558 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003559 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003560 return 1; /* SQL Server */
3561 }
3562 return 0;
3563}
3564
3565/*
drh233a5312008-12-18 22:25:13 +00003566** Return true if zSql is a complete SQL statement. Return false if it
3567** ends in the middle of a string literal or C-style comment.
3568*/
drh9f099fd2013-08-06 14:01:46 +00003569static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003570 int rc;
3571 if( zSql==0 ) return 1;
3572 zSql[nSql] = ';';
3573 zSql[nSql+1] = 0;
3574 rc = sqlite3_complete(zSql);
3575 zSql[nSql] = 0;
3576 return rc;
3577}
3578
3579/*
drh67505e72002-04-19 12:34:06 +00003580** Read input from *in and process it. If *in==0 then input
3581** is interactive - the user is typing it it. Otherwise, input
3582** is coming from a file or device. A prompt is issued and history
3583** is saved only if input is interactive. An interrupt signal will
3584** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003585**
3586** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003587*/
drhc28490c2006-10-26 14:25:58 +00003588static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003589 char *zLine = 0; /* A single input line */
3590 char *zSql = 0; /* Accumulated SQL text */
3591 int nLine; /* Length of current line */
3592 int nSql = 0; /* Bytes of zSql[] used */
3593 int nAlloc = 0; /* Allocated zSql[] space */
3594 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3595 char *zErrMsg; /* Error message returned */
3596 int rc; /* Error code */
3597 int errCnt = 0; /* Number of errors seen */
3598 int lineno = 0; /* Current line number */
3599 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003600
3601 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3602 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003603 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003604 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003605 /* End of input */
3606 if( stdin_is_interactive ) printf("\n");
3607 break;
drhc49f44e2006-10-26 18:15:42 +00003608 }
drh67505e72002-04-19 12:34:06 +00003609 if( seenInterrupt ){
3610 if( in!=0 ) break;
3611 seenInterrupt = 0;
3612 }
drhc28490c2006-10-26 14:25:58 +00003613 lineno++;
drh849a9d92013-12-21 15:46:06 +00003614 if( nSql==0 && _all_whitespace(zLine) ){
3615 if( p->echoOn ) printf("%s\n", zLine);
3616 continue;
3617 }
drh2af0b2d2002-02-21 02:25:02 +00003618 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003619 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003620 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003621 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003622 break;
3623 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003624 errCnt++;
3625 }
drhdaffd0e2001-04-11 14:28:42 +00003626 continue;
3627 }
drh9f099fd2013-08-06 14:01:46 +00003628 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003629 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003630 }
drh9f099fd2013-08-06 14:01:46 +00003631 nLine = strlen30(zLine);
3632 if( nSql+nLine+2>=nAlloc ){
3633 nAlloc = nSql+nLine+100;
3634 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003635 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003636 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003637 exit(1);
3638 }
drhdaffd0e2001-04-11 14:28:42 +00003639 }
drh9f099fd2013-08-06 14:01:46 +00003640 nSqlPrior = nSql;
3641 if( nSql==0 ){
3642 int i;
3643 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003644 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003645 memcpy(zSql, zLine+i, nLine+1-i);
3646 startline = lineno;
3647 nSql = nLine-i;
3648 }else{
3649 zSql[nSql++] = '\n';
3650 memcpy(zSql+nSql, zLine, nLine+1);
3651 nSql += nLine;
3652 }
3653 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003654 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003655 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003656 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003657 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003658 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003659 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003660 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003661 char zPrefix[100];
3662 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003663 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003664 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003665 }else{
shane9bd1b442009-10-23 01:27:39 +00003666 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003667 }
drh7f953e22002-07-13 17:33:45 +00003668 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003669 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003670 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003671 zErrMsg = 0;
3672 }else{
shaned2bed1c2009-10-21 03:56:54 +00003673 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003674 }
drhc49f44e2006-10-26 18:15:42 +00003675 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003676 }
drhdaffd0e2001-04-11 14:28:42 +00003677 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003678 if( p->outCount ){
3679 output_reset(p);
3680 p->outCount = 0;
3681 }
drh9f099fd2013-08-06 14:01:46 +00003682 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003683 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003684 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003685 }
3686 }
drh9f099fd2013-08-06 14:01:46 +00003687 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003688 if( !_all_whitespace(zSql) ){
3689 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3690 }
drhdaffd0e2001-04-11 14:28:42 +00003691 free(zSql);
3692 }
danielk19772ac27622007-07-03 05:31:16 +00003693 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003694 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003695}
3696
drh67505e72002-04-19 12:34:06 +00003697/*
3698** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003699** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003700*/
3701static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003702 static char *home_dir = NULL;
3703 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003704
drh83905c92012-06-21 13:00:37 +00003705#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003706 {
3707 struct passwd *pwent;
3708 uid_t uid = getuid();
3709 if( (pwent=getpwuid(uid)) != NULL) {
3710 home_dir = pwent->pw_dir;
3711 }
drh67505e72002-04-19 12:34:06 +00003712 }
3713#endif
3714
chw65d3c132007-11-12 21:09:10 +00003715#if defined(_WIN32_WCE)
3716 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3717 */
drh85e72432012-04-11 11:38:53 +00003718 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003719#else
3720
drh83905c92012-06-21 13:00:37 +00003721#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003722 if (!home_dir) {
3723 home_dir = getenv("USERPROFILE");
3724 }
3725#endif
3726
drh67505e72002-04-19 12:34:06 +00003727 if (!home_dir) {
3728 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003729 }
3730
drh83905c92012-06-21 13:00:37 +00003731#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003732 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003733 char *zDrive, *zPath;
3734 int n;
3735 zDrive = getenv("HOMEDRIVE");
3736 zPath = getenv("HOMEPATH");
3737 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003738 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003739 home_dir = malloc( n );
3740 if( home_dir==0 ) return 0;
3741 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3742 return home_dir;
3743 }
3744 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003745 }
3746#endif
3747
chw65d3c132007-11-12 21:09:10 +00003748#endif /* !_WIN32_WCE */
3749
drh67505e72002-04-19 12:34:06 +00003750 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003751 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003752 char *z = malloc( n );
3753 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003754 home_dir = z;
3755 }
drhe98d4fa2002-04-21 19:06:22 +00003756
drh67505e72002-04-19 12:34:06 +00003757 return home_dir;
3758}
3759
3760/*
3761** Read input from the file given by sqliterc_override. Or if that
3762** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003763**
3764** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003765*/
shane9bd1b442009-10-23 01:27:39 +00003766static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003767 struct callback_data *p, /* Configuration data */
3768 const char *sqliterc_override /* Name of config file. NULL to use default */
3769){
persicom7e2dfdd2002-04-18 02:46:52 +00003770 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003771 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003772 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003773 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003774 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003775
3776 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003777 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003778 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003779#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003780 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003781#endif
shane9bd1b442009-10-23 01:27:39 +00003782 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003783 }
drh2f3de322012-06-27 16:41:31 +00003784 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003785 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3786 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003787 }
drha1f9b5e2004-02-14 16:31:02 +00003788 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003789 if( in ){
drhc28490c2006-10-26 14:25:58 +00003790 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003791 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003792 }
shane9bd1b442009-10-23 01:27:39 +00003793 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003794 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003795 }
drh85e72432012-04-11 11:38:53 +00003796 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003797 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003798}
3799
drh67505e72002-04-19 12:34:06 +00003800/*
drhe1e38c42003-05-04 18:30:59 +00003801** Show available command line options
3802*/
3803static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00003804 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00003805 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003806 " -batch force batch I/O\n"
mistachkin636bf9f2014-07-19 20:15:16 +00003807 " -colseparator SEP same as -separator\n"
drhe1e38c42003-05-04 18:30:59 +00003808 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003809 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003810 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003811 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003812 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003813 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003814#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3815 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3816#endif
drhcc3b4f82012-02-07 14:13:50 +00003817 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003818 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003819 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003820 " -line set output mode to 'line'\n"
3821 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003822 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003823#ifdef SQLITE_ENABLE_MULTIPLEX
3824 " -multiplex enable the multiplexor VFS\n"
3825#endif
drh98d312f2012-10-25 15:23:14 +00003826 " -nullvalue TEXT set text string for NULL values. Default ''\n"
mistachkin636bf9f2014-07-19 20:15:16 +00003827 " -rowseparator SEP set output line separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00003828 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003829 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003830 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003831 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003832#ifdef SQLITE_ENABLE_VFSTRACE
3833 " -vfstrace enable tracing of all VFS calls\n"
3834#endif
drhe1e38c42003-05-04 18:30:59 +00003835;
3836static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003837 fprintf(stderr,
3838 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3839 "FILENAME is the name of an SQLite database. A new database is created\n"
3840 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003841 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003842 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003843 }else{
3844 fprintf(stderr, "Use the -help option for additional information\n");
3845 }
3846 exit(1);
3847}
3848
3849/*
drh67505e72002-04-19 12:34:06 +00003850** Initialize the state information in data
3851*/
drh0850b532006-01-31 19:31:43 +00003852static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003853 memset(data, 0, sizeof(*data));
3854 data->mode = MODE_List;
mistachkin636bf9f2014-07-19 20:15:16 +00003855 memcpy(data->colSeparator,"|", 2);
3856 memcpy(data->rowSeparator,"\n", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00003857 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003858 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003859 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003860 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3861 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003862 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003863}
3864
drh98d312f2012-10-25 15:23:14 +00003865/*
drh5c7976f2014-02-10 19:59:27 +00003866** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003867*/
3868#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003869static void printBold(const char *zText){
3870 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3871 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3872 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3873 SetConsoleTextAttribute(out,
3874 FOREGROUND_RED|FOREGROUND_INTENSITY
3875 );
3876 printf("%s", zText);
3877 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003878}
3879#else
drh5c7976f2014-02-10 19:59:27 +00003880static void printBold(const char *zText){
3881 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003882}
3883#endif
3884
3885/*
drh98d312f2012-10-25 15:23:14 +00003886** Get the argument to an --option. Throw an error and die if no argument
3887** is available.
3888*/
3889static char *cmdline_option_value(int argc, char **argv, int i){
3890 if( i==argc ){
3891 fprintf(stderr, "%s: Error: missing argument to %s\n",
3892 argv[0], argv[argc-1]);
3893 exit(1);
3894 }
3895 return argv[i];
3896}
3897
drh75897232000-05-29 14:26:00 +00003898int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003899 char *zErrMsg = 0;
3900 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003901 const char *zInitFile = 0;
3902 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003903 int i;
drhc28490c2006-10-26 14:25:58 +00003904 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003905 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003906
drh69b30ab2014-02-27 15:11:52 +00003907#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003908 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3909 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3910 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3911 exit(1);
3912 }
drhc7181902014-02-27 15:04:13 +00003913#endif
drhdaffd0e2001-04-11 14:28:42 +00003914 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003915 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003916 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003917
drh44c2eb12003-04-30 11:38:26 +00003918 /* Make sure we have a valid signal handler early, before anything
3919 ** else is done.
3920 */
drh4c504392000-10-16 22:06:40 +00003921#ifdef SIGINT
3922 signal(SIGINT, interrupt_handler);
3923#endif
drh44c2eb12003-04-30 11:38:26 +00003924
drh22fbcb82004-02-01 01:22:50 +00003925 /* Do an initial pass through the command-line argument to locate
3926 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003927 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003928 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003929 */
drh98d312f2012-10-25 15:23:14 +00003930 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003931 char *z;
drhc28490c2006-10-26 14:25:58 +00003932 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003933 if( z[0]!='-' ){
3934 if( data.zDbFilename==0 ){
3935 data.zDbFilename = z;
3936 continue;
3937 }
3938 if( zFirstCmd==0 ){
3939 zFirstCmd = z;
3940 continue;
3941 }
3942 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3943 fprintf(stderr,"Use -help for a list of options.\n");
3944 return 1;
3945 }
drhcc3b4f82012-02-07 14:13:50 +00003946 if( z[1]=='-' ) z++;
3947 if( strcmp(z,"-separator")==0
3948 || strcmp(z,"-nullvalue")==0
3949 || strcmp(z,"-cmd")==0
3950 ){
drh98d312f2012-10-25 15:23:14 +00003951 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003952 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003953 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003954 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003955 /* Need to check for batch mode here to so we can avoid printing
3956 ** informational messages (like from process_sqliterc) before
3957 ** we do the actual processing of arguments later in a second pass.
3958 */
shanef69573d2009-10-24 02:06:14 +00003959 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003960 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003961#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003962 const char *zSize;
3963 sqlite3_int64 szHeap;
3964
drh98d312f2012-10-25 15:23:14 +00003965 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003966 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003967 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003968 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3969#endif
drh97ae8ff2011-03-16 16:56:29 +00003970#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003971 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003972 extern int vfstrace_register(
3973 const char *zTraceName,
3974 const char *zOldVfsName,
3975 int (*xOut)(const char*,void*),
3976 void *pOutArg,
3977 int makeDefault
3978 );
drh2b625e22011-03-16 17:05:28 +00003979 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003980#endif
drh6f25e892011-07-08 17:02:57 +00003981#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003982 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003983 extern int sqlite3_multiple_initialize(const char*,int);
3984 sqlite3_multiplex_initialize(0, 1);
3985#endif
drh7d9f3942013-04-03 01:26:54 +00003986 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003987 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3988 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003989 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003990 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003991 if( pVfs ){
3992 sqlite3_vfs_register(pVfs, 1);
3993 }else{
3994 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3995 exit(1);
3996 }
drh44c2eb12003-04-30 11:38:26 +00003997 }
3998 }
drh98d312f2012-10-25 15:23:14 +00003999 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004000#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004001 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004002 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004003#else
shane86f5bdb2009-10-24 02:00:07 +00004004 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4005 return 1;
drh01b41712005-08-29 23:06:23 +00004006#endif
drhc7181902014-02-27 15:04:13 +00004007#ifdef SQLITE_SHELL_DBNAME_PROC
4008 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4009 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4010 warnInmemoryDb = 0; }
4011#endif
drh98d312f2012-10-25 15:23:14 +00004012 }
4013 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004014
drh44c2eb12003-04-30 11:38:26 +00004015 /* Go ahead and open the database file if it already exists. If the
4016 ** file does not exist, delay opening it. This prevents empty database
4017 ** files from being created if a user mistypes the database name argument
4018 ** to the sqlite command-line tool.
4019 */
drhc8d74412004-08-31 23:41:26 +00004020 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004021 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004022 }
4023
drh22fbcb82004-02-01 01:22:50 +00004024 /* Process the initialization file if there is one. If no -init option
4025 ** is given on the command line, look for a file named ~/.sqliterc and
4026 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004027 */
shane86f5bdb2009-10-24 02:00:07 +00004028 rc = process_sqliterc(&data,zInitFile);
4029 if( rc>0 ){
4030 return rc;
4031 }
drh44c2eb12003-04-30 11:38:26 +00004032
drh22fbcb82004-02-01 01:22:50 +00004033 /* Make a second pass through the command-line argument and set
4034 ** options. This second pass is delayed until after the initialization
4035 ** file is processed so that the command-line arguments will override
4036 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004037 */
drh98d312f2012-10-25 15:23:14 +00004038 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004039 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004040 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004041 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004042 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004043 i++;
4044 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004045 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004046 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004047 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004048 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004049 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004050 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004051 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004052 }else if( strcmp(z,"-csv")==0 ){
4053 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004054 memcpy(data.colSeparator,",",2);
4055 }else if( strcmp(z,"-ascii")==0 ){
4056 data.mode = MODE_Ascii;
4057 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4058 SEP_Column);
4059 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
4060 SEP_Row);
4061 }else if( strcmp(z,"-separator")==0 || strcmp(z,"-colseparator")==0 ){
4062 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4063 "%s",cmdline_option_value(argc,argv,++i));
4064 }else if( strcmp(z,"-rowseparator")==0 ){
4065 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh98d312f2012-10-25 15:23:14 +00004066 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004067 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004068 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004069 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004070 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004071 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004072 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004073 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004074 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004075 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004076 }else if( strcmp(z,"-eqp")==0 ){
4077 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004078 }else if( strcmp(z,"-stats")==0 ){
4079 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004080 }else if( strcmp(z,"-bail")==0 ){
4081 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004082 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004083 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004084 return 0;
drhc28490c2006-10-26 14:25:58 +00004085 }else if( strcmp(z,"-interactive")==0 ){
4086 stdin_is_interactive = 1;
4087 }else if( strcmp(z,"-batch")==0 ){
4088 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004089 }else if( strcmp(z,"-heap")==0 ){
4090 i++;
drh7d9f3942013-04-03 01:26:54 +00004091 }else if( strcmp(z,"-mmap")==0 ){
4092 i++;
drha7e61d82011-03-12 17:02:57 +00004093 }else if( strcmp(z,"-vfs")==0 ){
4094 i++;
drh6f25e892011-07-08 17:02:57 +00004095#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004096 }else if( strcmp(z,"-vfstrace")==0 ){
4097 i++;
drh6f25e892011-07-08 17:02:57 +00004098#endif
4099#ifdef SQLITE_ENABLE_MULTIPLEX
4100 }else if( strcmp(z,"-multiplex")==0 ){
4101 i++;
4102#endif
drhcc3b4f82012-02-07 14:13:50 +00004103 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004104 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004105 }else if( strcmp(z,"-cmd")==0 ){
4106 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004107 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004108 if( z[0]=='.' ){
4109 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004110 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004111 }else{
drh05782482013-10-24 15:20:20 +00004112 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004113 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4114 if( zErrMsg!=0 ){
4115 fprintf(stderr,"Error: %s\n", zErrMsg);
4116 if( bail_on_error ) return rc!=0 ? rc : 1;
4117 }else if( rc!=0 ){
4118 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4119 if( bail_on_error ) return rc;
4120 }
4121 }
drh1e5d0e92000-05-31 23:33:17 +00004122 }else{
shane86f5bdb2009-10-24 02:00:07 +00004123 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004124 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004125 return 1;
4126 }
4127 }
drh44c2eb12003-04-30 11:38:26 +00004128
drh22fbcb82004-02-01 01:22:50 +00004129 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00004130 /* Run just the command that follows the database name
4131 */
drh22fbcb82004-02-01 01:22:50 +00004132 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00004133 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00004134 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00004135 }else{
drh05782482013-10-24 15:20:20 +00004136 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00004137 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00004138 if( zErrMsg!=0 ){
4139 fprintf(stderr,"Error: %s\n", zErrMsg);
4140 return rc!=0 ? rc : 1;
4141 }else if( rc!=0 ){
4142 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4143 return rc;
drh6ff13852001-11-25 13:18:23 +00004144 }
drh75897232000-05-29 14:26:00 +00004145 }
4146 }else{
drh44c2eb12003-04-30 11:38:26 +00004147 /* Run commands received from standard input
4148 */
drhc28490c2006-10-26 14:25:58 +00004149 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004150 char *zHome;
4151 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004152 int nHistory;
drh75897232000-05-29 14:26:00 +00004153 printf(
drh743e0032011-12-12 16:51:50 +00004154 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004155 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004156 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004157 );
drhb3735912014-02-10 16:13:42 +00004158 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004159 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004160 printBold("transient in-memory database");
4161 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004162 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004163 }
drh67505e72002-04-19 12:34:06 +00004164 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004165 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004166 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004167 if( (zHistory = malloc(nHistory))!=0 ){
4168 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4169 }
drh67505e72002-04-19 12:34:06 +00004170 }
drhaaa21b42014-02-11 14:37:51 +00004171#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004172 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004173#endif
drhc28490c2006-10-26 14:25:58 +00004174 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004175 if( zHistory ){
4176 stifle_history(100);
4177 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004178 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004179 }
drhdaffd0e2001-04-11 14:28:42 +00004180 }else{
drhc28490c2006-10-26 14:25:58 +00004181 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004182 }
4183 }
drh33048c02001-10-01 14:29:22 +00004184 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004185 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004186 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004187 }
drh05782482013-10-24 15:20:20 +00004188 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004189 return rc;
drh75897232000-05-29 14:26:00 +00004190}