blob: 3f8b22f4fa26465193b8e59d5ae694bb90a6fb0a [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/*
mistachkin2318d332015-01-12 18:02:52 +000021** If requested, include the SQLite compiler options file for MSVC.
22*/
23#if defined(INCLUDE_MSVC_H)
24#include "msvc.h"
25#endif
26
27/*
drh8cd5b252015-03-02 22:06:43 +000028** No support for loadable extensions in VxWorks.
29*/
drhada3f2b2015-03-23 21:32:50 +000030#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
drh8cd5b252015-03-02 22:06:43 +000031# define SQLITE_OMIT_LOAD_EXTENSION 1
32#endif
33
34/*
drh36f7dd32011-10-13 16:02:17 +000035** Enable large-file support for fopen() and friends on unix.
36*/
37#ifndef SQLITE_DISABLE_LFS
38# define _LARGE_FILE 1
39# ifndef _FILE_OFFSET_BITS
40# define _FILE_OFFSET_BITS 64
41# endif
42# define _LARGEFILE_SOURCE 1
43#endif
44
drh75897232000-05-29 14:26:00 +000045#include <stdlib.h>
46#include <string.h>
47#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000048#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000049#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000050#if SQLITE_USER_AUTHENTICATION
51# include "sqlite3userauth.h"
52#endif
drh75897232000-05-29 14:26:00 +000053#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000054#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000055
drh83905c92012-06-21 13:00:37 +000056#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000057# include <signal.h>
chw97185482008-11-17 08:05:31 +000058# if !defined(__RTP__) && !defined(_WRS_KERNEL)
59# include <pwd.h>
60# endif
drhdd45df82002-04-18 12:39:03 +000061# include <unistd.h>
62# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000063#endif
drh75897232000-05-29 14:26:00 +000064
drh0ede9eb2015-01-10 16:49:23 +000065#if HAVE_READLINE
drh8e7e7a22000-05-30 18:45:23 +000066# include <readline/readline.h>
67# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000068#endif
danfd34d6d2015-02-25 10:54:53 +000069
drh0ede9eb2015-01-10 16:49:23 +000070#if HAVE_EDITLINE
drhaaa21b42014-02-11 14:37:51 +000071# include <editline/readline.h>
72#endif
danfd34d6d2015-02-25 10:54:53 +000073
74#if HAVE_EDITLINE || HAVE_READLINE
75
76# define shell_add_history(X) add_history(X)
77# define shell_read_history(X) read_history(X)
78# define shell_write_history(X) write_history(X)
79# define shell_stifle_history(X) stifle_history(X)
80# define shell_readline(X) readline(X)
81
82#elif HAVE_LINENOISE
83
84# include "linenoise.h"
85# define shell_add_history(X) linenoiseHistoryAdd(X)
86# define shell_read_history(X) linenoiseHistoryLoad(X)
87# define shell_write_history(X) linenoiseHistorySave(X)
88# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89# define shell_readline(X) linenoise(X)
90
91#else
92
93# define shell_read_history(X)
94# define shell_write_history(X)
95# define shell_stifle_history(X)
96
97# define SHELL_USE_LOCAL_GETLINE 1
drh75897232000-05-29 14:26:00 +000098#endif
99
danfd34d6d2015-02-25 10:54:53 +0000100
adamd2e8464a2006-09-06 21:39:40 +0000101#if defined(_WIN32) || defined(WIN32)
102# include <io.h>
drh6976c212014-07-24 12:09:47 +0000103# include <fcntl.h>
mistachkin073664d2015-06-17 18:57:37 +0000104# define isatty(h) _isatty(h)
105# ifndef access
106# define access(f,m) _access((f),(m))
107# endif
108# undef popen
109# define popen _popen
110# undef pclose
111# define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000112#else
mistachkin073664d2015-06-17 18:57:37 +0000113 /* Make sure isatty() has a prototype. */
114 extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000115
mistachkin073664d2015-06-17 18:57:37 +0000116# if !defined(__RTP__) && !defined(_WRS_KERNEL)
117 /* popen and pclose are not C89 functions and so are
118 ** sometimes omitted from the <stdio.h> header */
119 extern FILE *popen(const char*,const char*);
120 extern int pclose(FILE*);
121# else
122# define SQLITE_OMIT_POPEN 1
123# endif
mistachkinf6418892013-08-28 01:54:12 +0000124#endif
drh53371f92013-07-25 17:07:03 +0000125
chw65d3c132007-11-12 21:09:10 +0000126#if defined(_WIN32_WCE)
127/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128 * thus we always assume that we have a console. That can be
129 * overridden with the -batch command line option.
130 */
131#define isatty(x) 1
132#endif
133
drhf0693c82011-10-11 20:41:54 +0000134/* ctype macros that work with signed characters */
135#define IsSpace(X) isspace((unsigned char)X)
136#define IsDigit(X) isdigit((unsigned char)X)
137#define ToLower(X) (char)tolower((unsigned char)X)
138
drh047d4532015-01-18 20:30:23 +0000139/* On Windows, we normally run with output mode of TEXT so that \n characters
140** are automatically translated into \r\n. However, this behavior needs
141** to be disabled in some cases (ex: when generating CSV output and when
142** rendering quoted strings that contain \n characters). The following
143** routines take care of that.
144*/
145#if defined(_WIN32) || defined(WIN32)
mistachkine4a0d792015-01-27 21:24:33 +0000146static void setBinaryMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000147 fflush(out);
148 _setmode(_fileno(out), _O_BINARY);
149}
mistachkine4a0d792015-01-27 21:24:33 +0000150static void setTextMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000151 fflush(out);
152 _setmode(_fileno(out), _O_TEXT);
153}
154#else
155# define setBinaryMode(X)
156# define setTextMode(X)
157#endif
158
drh43408312013-10-30 12:43:36 +0000159
160/* True if the timer is enabled */
161static int enableTimer = 0;
162
163/* Return the current wall-clock time */
164static sqlite3_int64 timeOfDay(void){
165 static sqlite3_vfs *clockVfs = 0;
166 sqlite3_int64 t;
167 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000168 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000169 clockVfs->xCurrentTimeInt64(clockVfs, &t);
170 }else{
171 double r;
172 clockVfs->xCurrentTime(clockVfs, &r);
173 t = (sqlite3_int64)(r*86400000.0);
174 }
175 return t;
176}
177
drh91eb93c2015-03-03 19:56:20 +0000178#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000179#include <sys/time.h>
180#include <sys/resource.h>
181
drh91eb93c2015-03-03 19:56:20 +0000182/* VxWorks does not support getrusage() as far as we can determine */
183#if defined(_WRS_KERNEL) || defined(__RTP__)
184struct rusage {
185 struct timeval ru_utime; /* user CPU time used */
186 struct timeval ru_stime; /* system CPU time used */
187};
188#define getrusage(A,B) memset(B,0,sizeof(*B))
189#endif
190
drhda108222009-02-25 19:07:24 +0000191/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000192static struct rusage sBegin; /* CPU time at start */
193static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000194
drhda108222009-02-25 19:07:24 +0000195/*
196** Begin timing an operation
197*/
198static void beginTimer(void){
199 if( enableTimer ){
200 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000201 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000202 }
203}
204
205/* Return the difference of two time_structs in seconds */
206static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
207 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
208 (double)(pEnd->tv_sec - pStart->tv_sec);
209}
210
211/*
212** Print the timing results.
213*/
214static void endTimer(void){
215 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000216 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000217 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000218 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000219 printf("Run Time: real %.3f user %f sys %f\n",
220 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000221 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
222 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
223 }
224}
shaneb320ccd2009-10-21 03:42:58 +0000225
drhda108222009-02-25 19:07:24 +0000226#define BEGIN_TIMER beginTimer()
227#define END_TIMER endTimer()
228#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000229
230#elif (defined(_WIN32) || defined(WIN32))
231
232#include <windows.h>
233
234/* Saved resource information for the beginning of an operation */
235static HANDLE hProcess;
236static FILETIME ftKernelBegin;
237static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000238static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000239typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
240 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000241static GETPROCTIMES getProcessTimesAddr = NULL;
242
shaneb320ccd2009-10-21 03:42:58 +0000243/*
244** Check to see if we have timer support. Return 1 if necessary
245** support found (or found previously).
246*/
247static int hasTimer(void){
248 if( getProcessTimesAddr ){
249 return 1;
250 } else {
drh4ace5362014-11-10 14:42:28 +0000251 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
252 ** versions. See if the version we are running on has it, and if it
253 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000254 */
255 hProcess = GetCurrentProcess();
256 if( hProcess ){
257 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
258 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000259 getProcessTimesAddr =
260 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000261 if( NULL != getProcessTimesAddr ){
262 return 1;
263 }
264 FreeLibrary(hinstLib);
265 }
266 }
267 }
268 return 0;
269}
270
271/*
272** Begin timing an operation
273*/
274static void beginTimer(void){
275 if( enableTimer && getProcessTimesAddr ){
276 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000277 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
278 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000279 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000280 }
281}
282
283/* Return the difference of two FILETIME structs in seconds */
284static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
285 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
286 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
287 return (double) ((i64End - i64Start) / 10000000.0);
288}
289
290/*
291** Print the timing results.
292*/
293static void endTimer(void){
294 if( enableTimer && getProcessTimesAddr){
295 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000296 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000297 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000298 printf("Run Time: real %.3f user %f sys %f\n",
299 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000300 timeDiff(&ftUserBegin, &ftUserEnd),
301 timeDiff(&ftKernelBegin, &ftKernelEnd));
302 }
303}
304
305#define BEGIN_TIMER beginTimer()
306#define END_TIMER endTimer()
307#define HAS_TIMER hasTimer()
308
drhda108222009-02-25 19:07:24 +0000309#else
310#define BEGIN_TIMER
311#define END_TIMER
312#define HAS_TIMER 0
313#endif
314
shanec0688ea2009-03-05 03:48:06 +0000315/*
316** Used to prevent warnings about unused parameters
317*/
318#define UNUSED_PARAMETER(x) (void)(x)
319
drhe91d16b2008-12-08 18:27:31 +0000320/*
drhc49f44e2006-10-26 18:15:42 +0000321** If the following flag is set, then command execution stops
322** at an error if we are not interactive.
323*/
324static int bail_on_error = 0;
325
326/*
drhc28490c2006-10-26 14:25:58 +0000327** Threat stdin as an interactive input if the following variable
328** is true. Otherwise, assume stdin is connected to a file or pipe.
329*/
330static int stdin_is_interactive = 1;
331
332/*
drhe05461c2015-12-30 13:36:57 +0000333** On Windows systems we have to know if standard output is a console
334** in order to translate UTF-8 into MBCS. The following variable is
335** true if translation is required.
336*/
337static int stdout_is_console = 1;
338
339/*
drh4c504392000-10-16 22:06:40 +0000340** The following is the open SQLite database. We make a pointer
341** to this database a static variable so that it can be accessed
342** by the SIGINT handler to interrupt database processing.
343*/
mistachkin8e189222015-04-19 21:43:16 +0000344static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000345
346/*
drh67505e72002-04-19 12:34:06 +0000347** True if an interrupt (Control-C) has been received.
348*/
drh43617e92006-03-06 20:55:46 +0000349static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000350
351/*
persicom7e2dfdd2002-04-18 02:46:52 +0000352** This is the name of our program. It is set in main(), used
353** in a number of other places, mostly for error messages.
354*/
355static char *Argv0;
356
357/*
358** Prompt strings. Initialized in main. Settable with
359** .prompt main continue
360*/
361static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
362static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
363
drhb0603412007-02-28 04:47:26 +0000364/*
365** Write I/O traces to the following stream.
366*/
rsebe0a9092007-07-30 18:24:38 +0000367#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000368static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000369#endif
drhb0603412007-02-28 04:47:26 +0000370
371/*
372** This routine works like printf in that its first argument is a
373** format string and subsequent arguments are values to be substituted
374** in place of % fields. The result of formatting this string
375** is written to iotrace.
376*/
rsebe0a9092007-07-30 18:24:38 +0000377#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000378static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000379 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000380 char *z;
drhb0603412007-02-28 04:47:26 +0000381 if( iotrace==0 ) return;
382 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000383 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000384 va_end(ap);
drh41d0ba72016-01-03 11:27:47 +0000385 fprintf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000386 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000387}
rsebe0a9092007-07-30 18:24:38 +0000388#endif
drhb0603412007-02-28 04:47:26 +0000389
drh44c2eb12003-04-30 11:38:26 +0000390
persicom7e2dfdd2002-04-18 02:46:52 +0000391/*
drh83965662003-04-17 02:54:13 +0000392** Determines if a string is a number of not.
393*/
danielk19772e588c72005-12-09 14:25:08 +0000394static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000395 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000396 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000397 return 0;
398 }
399 z++;
400 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000401 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000402 if( *z=='.' ){
403 z++;
drhf0693c82011-10-11 20:41:54 +0000404 if( !IsDigit(*z) ) return 0;
405 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000406 if( realnum ) *realnum = 1;
407 }
408 if( *z=='e' || *z=='E' ){
409 z++;
410 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000411 if( !IsDigit(*z) ) return 0;
412 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000413 if( realnum ) *realnum = 1;
414 }
415 return *z==0;
416}
drh83965662003-04-17 02:54:13 +0000417
418/*
danielk1977bc6ada42004-06-30 08:20:16 +0000419** A global char* and an SQL function to access its current value
420** from within an SQL statement. This program used to use the
421** sqlite_exec_printf() API to substitue a string into an SQL statement.
422** The correct way to do this with sqlite3 is to use the bind API, but
423** since the shell is built around the callback paradigm it would be a lot
424** of work. Instead just use this hack, which is quite harmless.
425*/
426static const char *zShellStatic = 0;
427static void shellstaticFunc(
428 sqlite3_context *context,
429 int argc,
430 sqlite3_value **argv
431){
432 assert( 0==argc );
433 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000434 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000435 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000436 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
437}
438
439
440/*
drhe05461c2015-12-30 13:36:57 +0000441** Compute a string length that is limited to what can be stored in
442** lower 30 bits of a 32-bit signed integer.
443*/
444static int strlen30(const char *z){
445 const char *z2 = z;
446 while( *z2 ){ z2++; }
447 return 0x3fffffff & (int)(z2 - z);
448}
449
450/*
drhfeac5f82004-08-01 00:10:45 +0000451** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000452** the text in memory obtained from malloc() and returns a pointer
453** to the text. NULL is returned at end of file, or if malloc()
454** fails.
455**
drh9f099fd2013-08-06 14:01:46 +0000456** If zLine is not NULL then it is a malloced buffer returned from
457** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000458*/
drh9f099fd2013-08-06 14:01:46 +0000459static char *local_getline(char *zLine, FILE *in){
460 int nLine = zLine==0 ? 0 : 100;
461 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000462
drhb07028f2011-10-14 21:49:18 +0000463 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000464 if( n+100>nLine ){
465 nLine = nLine*2 + 100;
466 zLine = realloc(zLine, nLine);
467 if( zLine==0 ) return 0;
468 }
drhdaffd0e2001-04-11 14:28:42 +0000469 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000470 if( n==0 ){
471 free(zLine);
472 return 0;
473 }
474 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000475 break;
476 }
drh9f099fd2013-08-06 14:01:46 +0000477 while( zLine[n] ) n++;
478 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000479 n--;
shaneh13b36022009-12-17 21:07:15 +0000480 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000481 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000482 break;
drh8e7e7a22000-05-30 18:45:23 +0000483 }
484 }
drhe05461c2015-12-30 13:36:57 +0000485#if defined(_WIN32) || defined(WIN32)
486 /* For interactive input on Windows systems, translate the
487 ** multi-byte characterset characters into UTF-8. */
488 if( stdin_is_interactive ){
489 extern char *sqlite3_win32_mbcs_to_utf8(const char*);
490 char *zTrans = sqlite3_win32_mbcs_to_utf8(zLine);
491 if( zTrans ){
492 int nTrans = strlen30(zTrans)+1;
493 if( nTrans>nLine ){
494 zLine = realloc(zLine, nTrans);
495 if( zLine==0 ){
496 sqlite3_free(zTrans);
497 return 0;
498 }
499 }
500 memcpy(zLine, zTrans, nTrans);
501 sqlite3_free(zTrans);
502 }
503 }
504#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000505 return zLine;
506}
507
508/*
drhc28490c2006-10-26 14:25:58 +0000509** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000510**
drh9f099fd2013-08-06 14:01:46 +0000511** If in==0 then read from standard input and prompt before each line.
512** If isContinuation is true, then a continuation prompt is appropriate.
513** If isContinuation is zero, then the main prompt should be used.
514**
515** If zPrior is not NULL then it is a buffer from a prior call to this
516** routine that can be reused.
517**
518** The result is stored in space obtained from malloc() and must either
519** be freed by the caller or else passed back into this routine via the
520** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000521*/
drh9f099fd2013-08-06 14:01:46 +0000522static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000523 char *zPrompt;
524 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000525 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000526 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000527 }else{
drh9f099fd2013-08-06 14:01:46 +0000528 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000529#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000530 printf("%s", zPrompt);
531 fflush(stdout);
532 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000533#else
534 free(zPrior);
535 zResult = shell_readline(zPrompt);
536 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000537#endif
drh9f099fd2013-08-06 14:01:46 +0000538 }
drh8e7e7a22000-05-30 18:45:23 +0000539 return zResult;
540}
541
drhdcd87a92014-08-18 13:45:42 +0000542/*
drhe05461c2015-12-30 13:36:57 +0000543** Render output like fprintf(). Except, if the output is going to the
544** console and if this is running on a Windows machine, translate the
545** output from UTF-8 into MBCS.
546*/
547#if defined(_WIN32) || defined(WIN32)
548void utf8_printf(FILE *out, const char *zFormat, ...){
549 va_list ap;
550 va_start(ap, zFormat);
mistachkinaae280e2015-12-31 19:06:24 +0000551 if( stdout_is_console && (out==stdout || out==stderr) ){
drhe05461c2015-12-30 13:36:57 +0000552 extern char *sqlite3_win32_utf8_to_mbcs(const char*);
553 char *z1 = sqlite3_vmprintf(zFormat, ap);
554 char *z2 = sqlite3_win32_utf8_to_mbcs(z1);
555 sqlite3_free(z1);
556 fputs(z2, out);
557 sqlite3_free(z2);
558 }else{
559 vfprintf(out, zFormat, ap);
560 }
561 va_end(ap);
562}
mistachkinaae280e2015-12-31 19:06:24 +0000563#elif !defined(utf8_printf)
drhe05461c2015-12-30 13:36:57 +0000564# define utf8_printf fprintf
565#endif
566
567/*
mistachkinaae280e2015-12-31 19:06:24 +0000568** Render output like fprintf(). This should not be used on anything that
569** includes string formatting (e.g. "%s").
570*/
571#if !defined(raw_printf)
572# define raw_printf fprintf
573#endif
574
575/*
drhdcd87a92014-08-18 13:45:42 +0000576** Shell output mode information from before ".explain on",
577** saved so that it can be restored by ".explain off"
578*/
579typedef struct SavedModeInfo SavedModeInfo;
580struct SavedModeInfo {
581 int valid; /* Is there legit data in here? */
582 int mode; /* Mode prior to ".explain on" */
583 int showHeader; /* The ".header" setting prior to ".explain on" */
584 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000585};
drh45e29d82006-11-20 16:21:10 +0000586
drh8e7e7a22000-05-30 18:45:23 +0000587/*
drhdcd87a92014-08-18 13:45:42 +0000588** State information about the database connection is contained in an
589** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000590*/
drhdcd87a92014-08-18 13:45:42 +0000591typedef struct ShellState ShellState;
592struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000593 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000594 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000595 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000596 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000597 int scanstatsOn; /* True to display scan stats before each finalize */
drhdf12f1c2015-12-07 21:46:19 +0000598 int countChanges; /* True to display change counts */
drh9569f602015-04-16 15:05:04 +0000599 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +0000600 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000601 int cnt; /* Number of records displayed so far */
602 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000603 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000604 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000605 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000606 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000607 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000608 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000609 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000610 char colSeparator[20]; /* Column separator character for several modes */
611 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000612 int colWidth[100]; /* Requested width of each column when in column mode*/
613 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +0000614 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +0000615 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000616 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000617 char outfile[FILENAME_MAX]; /* Filename for *out */
618 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000619 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000620 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000621 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000622 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000623 int *aiIndent; /* Array of indents used in MODE_Explain */
624 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000625 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000626};
627
628/*
drh44dec872014-08-30 15:49:25 +0000629** These are the allowed shellFlgs values
630*/
631#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
632#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
633#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
634
635/*
drh75897232000-05-29 14:26:00 +0000636** These are the allowed modes.
637*/
drh967e8b72000-06-21 13:59:10 +0000638#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000639#define MODE_Column 1 /* One record per line in neat columns */
640#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000641#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
642#define MODE_Html 4 /* Generate an XHTML table */
643#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000644#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000645#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000646#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000647#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000648
drh66ce4d02008-02-15 17:38:06 +0000649static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000650 "line",
651 "column",
652 "list",
653 "semi",
654 "html",
drhfeac5f82004-08-01 00:10:45 +0000655 "insert",
656 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000657 "csv",
drh66ce4d02008-02-15 17:38:06 +0000658 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000659 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000660};
drh75897232000-05-29 14:26:00 +0000661
662/*
mistachkinfad42082014-07-24 22:13:12 +0000663** These are the column/row/line separators used by the various
664** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +0000665*/
mistachkinfad42082014-07-24 22:13:12 +0000666#define SEP_Column "|"
667#define SEP_Row "\n"
668#define SEP_Tab "\t"
669#define SEP_Space " "
670#define SEP_Comma ","
671#define SEP_CrLf "\r\n"
672#define SEP_Unit "\x1F"
673#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +0000674
675/*
drh75897232000-05-29 14:26:00 +0000676** Number of elements in an array
677*/
drh902b9ee2008-12-05 17:17:07 +0000678#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000679
680/*
drh127f9d72010-02-23 01:47:00 +0000681** A callback for the sqlite3_log() interface.
682*/
683static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000684 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000685 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +0000686 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +0000687 fflush(p->pLog);
688}
689
690/*
shane626a6e42009-10-22 17:30:15 +0000691** Output the given string as a hex-encoded blob (eg. X'1234' )
692*/
693static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
694 int i;
695 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +0000696 raw_printf(out,"X'");
697 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
698 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +0000699}
700
701/*
drh28bd4bc2000-06-15 15:57:22 +0000702** Output the given string as a quoted string using SQL quoting conventions.
703*/
704static void output_quoted_string(FILE *out, const char *z){
705 int i;
706 int nSingle = 0;
drh047d4532015-01-18 20:30:23 +0000707 setBinaryMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000708 for(i=0; z[i]; i++){
709 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000710 }
711 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +0000712 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000713 }else{
mistachkinaae280e2015-12-31 19:06:24 +0000714 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000715 while( *z ){
716 for(i=0; z[i] && z[i]!='\''; i++){}
717 if( i==0 ){
mistachkinaae280e2015-12-31 19:06:24 +0000718 raw_printf(out,"''");
drh28bd4bc2000-06-15 15:57:22 +0000719 z++;
720 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +0000721 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +0000722 z += i+1;
723 }else{
drhe05461c2015-12-30 13:36:57 +0000724 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000725 break;
726 }
727 }
mistachkinaae280e2015-12-31 19:06:24 +0000728 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000729 }
drh047d4532015-01-18 20:30:23 +0000730 setTextMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000731}
732
733/*
drhfeac5f82004-08-01 00:10:45 +0000734** Output the given string as a quoted according to C or TCL quoting rules.
735*/
736static void output_c_string(FILE *out, const char *z){
737 unsigned int c;
738 fputc('"', out);
739 while( (c = *(z++))!=0 ){
740 if( c=='\\' ){
741 fputc(c, out);
742 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000743 }else if( c=='"' ){
744 fputc('\\', out);
745 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000746 }else if( c=='\t' ){
747 fputc('\\', out);
748 fputc('t', out);
749 }else if( c=='\n' ){
750 fputc('\\', out);
751 fputc('n', out);
752 }else if( c=='\r' ){
753 fputc('\\', out);
754 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000755 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +0000756 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000757 }else{
758 fputc(c, out);
759 }
760 }
761 fputc('"', out);
762}
763
764/*
drhc08a4f12000-06-15 16:49:48 +0000765** Output the given string with characters that are special to
766** HTML escaped.
767*/
768static void output_html_string(FILE *out, const char *z){
769 int i;
drhc3d6ba42014-01-13 20:38:35 +0000770 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000771 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000772 for(i=0; z[i]
773 && z[i]!='<'
774 && z[i]!='&'
775 && z[i]!='>'
776 && z[i]!='\"'
777 && z[i]!='\'';
778 i++){}
drhc08a4f12000-06-15 16:49:48 +0000779 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +0000780 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +0000781 }
782 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +0000783 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +0000784 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +0000785 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000786 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +0000787 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +0000788 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +0000789 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +0000790 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +0000791 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000792 }else{
793 break;
794 }
795 z += i + 1;
796 }
797}
798
799/*
drhc49f44e2006-10-26 18:15:42 +0000800** If a field contains any character identified by a 1 in the following
801** array, then the string must be quoted for CSV.
802*/
803static const char needCsvQuote[] = {
804 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
805 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
806 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
807 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
808 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
809 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
810 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
811 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
812 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
813 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
814 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
815 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
816 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
817 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
818 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
819 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
820};
821
822/*
mistachkindd11f2d2014-12-11 04:49:46 +0000823** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +0000824** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +0000825** the null value. Strings are quoted if necessary. The separator
826** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000827*/
drhdcd87a92014-08-18 13:45:42 +0000828static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000829 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000830 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +0000831 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +0000832 }else{
drhc49f44e2006-10-26 18:15:42 +0000833 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000834 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000835 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000836 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000837 || (z[i]==p->colSeparator[0] &&
838 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000839 i = 0;
840 break;
841 }
842 }
843 if( i==0 ){
844 putc('"', out);
845 for(i=0; z[i]; i++){
846 if( z[i]=='"' ) putc('"', out);
847 putc(z[i], out);
848 }
849 putc('"', out);
850 }else{
drhe05461c2015-12-30 13:36:57 +0000851 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +0000852 }
drh8e64d1c2004-10-07 00:32:39 +0000853 }
854 if( bSep ){
drhe05461c2015-12-30 13:36:57 +0000855 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000856 }
857}
858
danielk19774af00c62005-01-23 23:43:21 +0000859#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000860/*
drh4c504392000-10-16 22:06:40 +0000861** This routine runs when the user presses Ctrl-C
862*/
863static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000864 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000865 seenInterrupt++;
866 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +0000867 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +0000868}
danielk19774af00c62005-01-23 23:43:21 +0000869#endif
drh4c504392000-10-16 22:06:40 +0000870
871/*
shane626a6e42009-10-22 17:30:15 +0000872** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000873** invokes for each row of a query result.
874*/
drh4ace5362014-11-10 14:42:28 +0000875static int shell_callback(
876 void *pArg,
877 int nArg, /* Number of result columns */
878 char **azArg, /* Text of each result column */
879 char **azCol, /* Column names */
880 int *aiType /* Column types */
881){
drh75897232000-05-29 14:26:00 +0000882 int i;
drhdcd87a92014-08-18 13:45:42 +0000883 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000884
drh75897232000-05-29 14:26:00 +0000885 switch( p->mode ){
886 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000887 int w = 5;
drh6a535342001-10-19 16:44:56 +0000888 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000889 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000890 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000891 if( len>w ) w = len;
892 }
drhe05461c2015-12-30 13:36:57 +0000893 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000894 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +0000895 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +0000896 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000897 }
898 break;
899 }
danielk19770d78bae2008-01-03 07:09:48 +0000900 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000901 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000902 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000903 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000904 int w, n;
905 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000906 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000907 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000908 w = 0;
drh75897232000-05-29 14:26:00 +0000909 }
drh078b1fd2012-09-21 13:40:02 +0000910 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000911 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000912 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +0000913 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +0000914 if( w<n ) w = n;
915 }
916 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000917 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000918 }
919 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000920 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000921 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000922 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000923 }else{
drhe05461c2015-12-30 13:36:57 +0000924 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000925 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000926 }
drha0c66f52000-07-29 13:20:21 +0000927 }
928 }
929 if( p->showHeader ){
930 for(i=0; i<nArg; i++){
931 int w;
932 if( i<ArraySize(p->actualWidth) ){
933 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000934 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000935 }else{
936 w = 10;
937 }
mistachkinaae280e2015-12-31 19:06:24 +0000938 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +0000939 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +0000940 "----------------------------------------------------------",
mistachkin636bf9f2014-07-19 20:15:16 +0000941 i==nArg-1 ? p->rowSeparator : " ");
drha0c66f52000-07-29 13:20:21 +0000942 }
drh75897232000-05-29 14:26:00 +0000943 }
944 }
drh6a535342001-10-19 16:44:56 +0000945 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000946 for(i=0; i<nArg; i++){
947 int w;
drha0c66f52000-07-29 13:20:21 +0000948 if( i<ArraySize(p->actualWidth) ){
949 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000950 }else{
951 w = 10;
952 }
dana98bf362013-11-13 18:35:01 +0000953 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000954 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000955 }
dana98bf362013-11-13 18:35:01 +0000956 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000957 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +0000958 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000959 }
danc4650bb2013-11-18 08:41:06 +0000960 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000961 }
drh078b1fd2012-09-21 13:40:02 +0000962 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000963 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +0000964 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000965 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000966 }else{
drhe05461c2015-12-30 13:36:57 +0000967 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +0000968 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000969 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000970 }
drh75897232000-05-29 14:26:00 +0000971 }
972 break;
973 }
drhe3710332000-09-29 13:30:53 +0000974 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000975 case MODE_List: {
976 if( p->cnt++==0 && p->showHeader ){
977 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +0000978 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000979 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +0000980 }
981 }
drh6a535342001-10-19 16:44:56 +0000982 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000983 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000984 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +0000985 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +0000986 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000987 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +0000988 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +0000989 }else if( p->mode==MODE_Semi ){
drhe05461c2015-12-30 13:36:57 +0000990 utf8_printf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000991 }else{
drhe05461c2015-12-30 13:36:57 +0000992 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000993 }
drh75897232000-05-29 14:26:00 +0000994 }
995 break;
996 }
drh1e5d0e92000-05-31 23:33:17 +0000997 case MODE_Html: {
998 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +0000999 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001000 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001001 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001002 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001003 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001004 }
mistachkinaae280e2015-12-31 19:06:24 +00001005 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001006 }
drh6a535342001-10-19 16:44:56 +00001007 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001008 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001009 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001010 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001011 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001012 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001013 }
mistachkinaae280e2015-12-31 19:06:24 +00001014 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001015 break;
1016 }
drhfeac5f82004-08-01 00:10:45 +00001017 case MODE_Tcl: {
1018 if( p->cnt++==0 && p->showHeader ){
1019 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001020 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001021 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001022 }
drhe05461c2015-12-30 13:36:57 +00001023 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001024 }
1025 if( azArg==0 ) break;
1026 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001027 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001028 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001029 }
drhe05461c2015-12-30 13:36:57 +00001030 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001031 break;
1032 }
drh8e64d1c2004-10-07 00:32:39 +00001033 case MODE_Csv: {
drh047d4532015-01-18 20:30:23 +00001034 setBinaryMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001035 if( p->cnt++==0 && p->showHeader ){
1036 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001037 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001038 }
drhe05461c2015-12-30 13:36:57 +00001039 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001040 }
drh40253262014-10-17 21:35:05 +00001041 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001042 for(i=0; i<nArg; i++){
1043 output_csv(p, azArg[i], i<nArg-1);
1044 }
drhe05461c2015-12-30 13:36:57 +00001045 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001046 }
drh047d4532015-01-18 20:30:23 +00001047 setTextMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001048 break;
1049 }
drh28bd4bc2000-06-15 15:57:22 +00001050 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +00001051 p->cnt++;
drh6a535342001-10-19 16:44:56 +00001052 if( azArg==0 ) break;
drhe05461c2015-12-30 13:36:57 +00001053 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
mistachkin151c75a2015-04-07 21:16:40 +00001054 if( p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001055 raw_printf(p->out,"(");
mistachkin151c75a2015-04-07 21:16:40 +00001056 for(i=0; i<nArg; i++){
1057 char *zSep = i>0 ? ",": "";
drhe05461c2015-12-30 13:36:57 +00001058 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
mistachkin151c75a2015-04-07 21:16:40 +00001059 }
mistachkinaae280e2015-12-31 19:06:24 +00001060 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00001061 }
mistachkinaae280e2015-12-31 19:06:24 +00001062 raw_printf(p->out," VALUES(");
drh28bd4bc2000-06-15 15:57:22 +00001063 for(i=0; i<nArg; i++){
1064 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00001065 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00001066 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00001067 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00001068 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00001069 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001070 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1071 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00001072 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00001073 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1074 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1075 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00001076 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00001077 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00001078 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00001079 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00001080 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001081 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00001082 output_quoted_string(p->out, azArg[i]);
1083 }
1084 }
mistachkinaae280e2015-12-31 19:06:24 +00001085 raw_printf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001086 break;
drh28bd4bc2000-06-15 15:57:22 +00001087 }
mistachkin636bf9f2014-07-19 20:15:16 +00001088 case MODE_Ascii: {
1089 if( p->cnt++==0 && p->showHeader ){
1090 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001091 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1092 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00001093 }
drhe05461c2015-12-30 13:36:57 +00001094 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001095 }
1096 if( azArg==0 ) break;
1097 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001098 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1099 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00001100 }
drhe05461c2015-12-30 13:36:57 +00001101 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001102 break;
1103 }
persicom1d0b8722002-04-18 02:53:04 +00001104 }
drh75897232000-05-29 14:26:00 +00001105 return 0;
1106}
1107
1108/*
shane626a6e42009-10-22 17:30:15 +00001109** This is the callback routine that the SQLite library
1110** invokes for each row of a query result.
1111*/
1112static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1113 /* since we don't have type info, call the shell_callback with a NULL value */
1114 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1115}
1116
1117/*
drhdcd87a92014-08-18 13:45:42 +00001118** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00001119** the name of the table given. Escape any quote characters in the
1120** table name.
1121*/
drhdcd87a92014-08-18 13:45:42 +00001122static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00001123 int i, n;
1124 int needQuote;
1125 char *z;
1126
1127 if( p->zDestTable ){
1128 free(p->zDestTable);
1129 p->zDestTable = 0;
1130 }
1131 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001132 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001133 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001134 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001135 needQuote = 1;
1136 if( zName[i]=='\'' ) n++;
1137 }
1138 }
1139 if( needQuote ) n += 2;
1140 z = p->zDestTable = malloc( n+1 );
1141 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001142 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00001143 exit(1);
1144 }
1145 n = 0;
1146 if( needQuote ) z[n++] = '\'';
1147 for(i=0; zName[i]; i++){
1148 z[n++] = zName[i];
1149 if( zName[i]=='\'' ) z[n++] = '\'';
1150 }
1151 if( needQuote ) z[n++] = '\'';
1152 z[n] = 0;
1153}
1154
danielk19772a02e332004-06-05 08:04:36 +00001155/* zIn is either a pointer to a NULL-terminated string in memory obtained
1156** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1157** added to zIn, and the result returned in memory obtained from malloc().
1158** zIn, if it was not NULL, is freed.
1159**
1160** If the third argument, quote, is not '\0', then it is used as a
1161** quote character for zAppend.
1162*/
drhc28490c2006-10-26 14:25:58 +00001163static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001164 int len;
1165 int i;
drh4f21c4a2008-12-10 22:15:00 +00001166 int nAppend = strlen30(zAppend);
1167 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001168
1169 len = nAppend+nIn+1;
1170 if( quote ){
1171 len += 2;
1172 for(i=0; i<nAppend; i++){
1173 if( zAppend[i]==quote ) len++;
1174 }
1175 }
1176
1177 zIn = (char *)realloc(zIn, len);
1178 if( !zIn ){
1179 return 0;
1180 }
1181
1182 if( quote ){
1183 char *zCsr = &zIn[nIn];
1184 *zCsr++ = quote;
1185 for(i=0; i<nAppend; i++){
1186 *zCsr++ = zAppend[i];
1187 if( zAppend[i]==quote ) *zCsr++ = quote;
1188 }
1189 *zCsr++ = quote;
1190 *zCsr++ = '\0';
1191 assert( (zCsr-zIn)==len );
1192 }else{
1193 memcpy(&zIn[nIn], zAppend, nAppend);
1194 zIn[len-1] = '\0';
1195 }
1196
1197 return zIn;
1198}
1199
drhdd3d4592004-08-30 01:54:05 +00001200
1201/*
drhb21a8e42012-01-28 21:08:51 +00001202** Execute a query statement that will generate SQL output. Print
1203** the result columns, comma-separated, on a line and then add a
1204** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001205**
drhb21a8e42012-01-28 21:08:51 +00001206** If the number of columns is 1 and that column contains text "--"
1207** then write the semicolon on a separate line. That way, if a
1208** "--" comment occurs at the end of the statement, the comment
1209** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001210*/
drh157e29a2009-05-21 15:15:00 +00001211static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001212 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001213 const char *zSelect, /* SELECT statement to extract content */
1214 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001215){
drhdd3d4592004-08-30 01:54:05 +00001216 sqlite3_stmt *pSelect;
1217 int rc;
drhb21a8e42012-01-28 21:08:51 +00001218 int nResult;
1219 int i;
1220 const char *z;
drhc7181902014-02-27 15:04:13 +00001221 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001222 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00001223 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1224 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001225 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001226 return rc;
1227 }
1228 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001229 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001230 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001231 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00001232 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001233 zFirstRow = 0;
1234 }
drhb21a8e42012-01-28 21:08:51 +00001235 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00001236 utf8_printf(p->out, "%s", z);
drhb21a8e42012-01-28 21:08:51 +00001237 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00001238 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00001239 }
1240 if( z==0 ) z = "";
1241 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1242 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00001243 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00001244 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001245 raw_printf(p->out, ";\n");
drhb21a8e42012-01-28 21:08:51 +00001246 }
drhdd3d4592004-08-30 01:54:05 +00001247 rc = sqlite3_step(pSelect);
1248 }
drh2f464a02011-10-13 00:41:49 +00001249 rc = sqlite3_finalize(pSelect);
1250 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00001251 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1252 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001253 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001254 }
1255 return rc;
drhdd3d4592004-08-30 01:54:05 +00001256}
1257
shane626a6e42009-10-22 17:30:15 +00001258/*
1259** Allocate space and save off current error string.
1260*/
1261static char *save_err_msg(
1262 sqlite3 *db /* Database to query */
1263){
1264 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00001265 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00001266 if( zErrMsg ){
1267 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1268 }
1269 return zErrMsg;
1270}
1271
1272/*
shaneh642d8b82010-07-28 16:05:34 +00001273** Display memory stats.
1274*/
1275static int display_stats(
1276 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001277 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001278 int bReset /* True to reset the stats */
1279){
1280 int iCur;
1281 int iHiwtr;
1282
1283 if( pArg && pArg->out ){
1284
1285 iHiwtr = iCur = -1;
1286 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001287 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001288 "Memory Used: %d (max %d) bytes\n",
1289 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001290 iHiwtr = iCur = -1;
1291 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001292 raw_printf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001293 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001294 if( pArg->shellFlgs & SHFLG_Pagecache ){
1295 iHiwtr = iCur = -1;
1296 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001297 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001298 "Number of Pcache Pages Used: %d (max %d) pages\n",
1299 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001300 }
shaneh642d8b82010-07-28 16:05:34 +00001301 iHiwtr = iCur = -1;
1302 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001303 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001304 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1305 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001306 if( pArg->shellFlgs & SHFLG_Scratch ){
1307 iHiwtr = iCur = -1;
1308 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001309 raw_printf(pArg->out,
1310 "Number of Scratch Allocations Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001311 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001312 }
shaneh642d8b82010-07-28 16:05:34 +00001313 iHiwtr = iCur = -1;
1314 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001315 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001316 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1317 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001318 iHiwtr = iCur = -1;
1319 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001320 raw_printf(pArg->out, "Largest Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001321 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001322 iHiwtr = iCur = -1;
1323 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001324 raw_printf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001325 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001326 iHiwtr = iCur = -1;
1327 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001328 raw_printf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001329 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001330#ifdef YYTRACKMAXSTACKDEPTH
1331 iHiwtr = iCur = -1;
1332 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001333 raw_printf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001334 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001335#endif
1336 }
1337
1338 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001339 if( pArg->shellFlgs & SHFLG_Lookaside ){
1340 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001341 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1342 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001343 raw_printf(pArg->out,
1344 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001345 iCur, iHiwtr);
1346 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1347 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001348 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
1349 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001350 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1351 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001352 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
1353 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001354 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1355 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001356 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
1357 iHiwtr);
drh44dec872014-08-30 15:49:25 +00001358 }
shaneh642d8b82010-07-28 16:05:34 +00001359 iHiwtr = iCur = -1;
1360 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001361 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
1362 iCur);
drh4ace5362014-11-10 14:42:28 +00001363 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001364 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001365 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00001366 iHiwtr = iCur = -1;
1367 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001368 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001369 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001370 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001371 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00001372 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001373 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001374 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
1375 iCur);
shaneh642d8b82010-07-28 16:05:34 +00001376 iHiwtr = iCur = -1;
1377 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001378 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
1379 iCur);
shaneh642d8b82010-07-28 16:05:34 +00001380 }
1381
1382 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001383 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1384 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001385 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001386 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001387 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001388 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001389 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001390 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001391 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001392 }
1393
dan5a790282015-08-07 20:06:14 +00001394 /* Do not remove this machine readable comment: extra-stats-output-here */
1395
shaneh642d8b82010-07-28 16:05:34 +00001396 return 0;
1397}
1398
1399/*
dan8d1edb92014-11-05 09:07:28 +00001400** Display scan stats.
1401*/
1402static void display_scanstats(
1403 sqlite3 *db, /* Database to query */
1404 ShellState *pArg /* Pointer to ShellState */
1405){
drhf5ed7ad2015-06-15 14:43:25 +00001406#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1407 UNUSED_PARAMETER(db);
1408 UNUSED_PARAMETER(pArg);
1409#else
drh15f23c22014-11-06 12:46:16 +00001410 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00001411 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001412 mx = 0;
1413 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001414 double rEstLoop = 1.0;
1415 for(i=n=0; 1; i++){
1416 sqlite3_stmt *p = pArg->pStmt;
1417 sqlite3_int64 nLoop, nVisit;
1418 double rEst;
1419 int iSid;
1420 const char *zExplain;
1421 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1422 break;
1423 }
1424 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001425 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001426 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001427 if( n==0 ){
1428 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00001429 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001430 }
drh42f30bc2014-11-06 12:08:21 +00001431 n++;
1432 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1433 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1434 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00001435 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00001436 rEstLoop *= rEst;
mistachkinaae280e2015-12-31 19:06:24 +00001437 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001438 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001439 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001440 );
dan8d1edb92014-11-05 09:07:28 +00001441 }
dan8d1edb92014-11-05 09:07:28 +00001442 }
mistachkinaae280e2015-12-31 19:06:24 +00001443 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001444#endif
dan8d1edb92014-11-05 09:07:28 +00001445}
1446
1447/*
dana98bf362013-11-13 18:35:01 +00001448** Parameter azArray points to a zero-terminated array of strings. zStr
1449** points to a single nul-terminated string. Return non-zero if zStr
1450** is equal, according to strcmp(), to any of the strings in the array.
1451** Otherwise, return zero.
1452*/
1453static int str_in_array(const char *zStr, const char **azArray){
1454 int i;
1455 for(i=0; azArray[i]; i++){
1456 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1457 }
1458 return 0;
1459}
1460
1461/*
1462** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001463** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001464** spaces each opcode should be indented before it is output.
1465**
1466** The indenting rules are:
1467**
1468** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1469** all opcodes that occur between the p2 jump destination and the opcode
1470** itself by 2 spaces.
1471**
drh01752bc2013-11-14 23:59:33 +00001472** * For each "Goto", if the jump destination is earlier in the program
1473** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001474** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001475** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001476** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001477** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001478*/
drhdcd87a92014-08-18 13:45:42 +00001479static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001480 const char *zSql; /* The text of the SQL statement */
1481 const char *z; /* Used to check if this is an EXPLAIN */
1482 int *abYield = 0; /* True if op is an OP_Yield */
1483 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001484 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001485
drh8ad0de32014-03-20 18:45:27 +00001486 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1487 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001488 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1489 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001490 const char *azGoto[] = { "Goto", 0 };
1491
1492 /* Try to figure out if this is really an EXPLAIN statement. If this
1493 ** cannot be verified, return early. */
1494 zSql = sqlite3_sql(pSql);
1495 if( zSql==0 ) return;
1496 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1497 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1498
1499 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1500 int i;
danc4650bb2013-11-18 08:41:06 +00001501 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001502 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001503
1504 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1505 ** p2 is an instruction address, set variable p2op to the index of that
1506 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1507 ** the current instruction is part of a sub-program generated by an
1508 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001509 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001510 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001511
1512 /* Grow the p->aiIndent array as required */
1513 if( iOp>=nAlloc ){
1514 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00001515 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1516 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00001517 }
1518 abYield[iOp] = str_in_array(zOp, azYield);
1519 p->aiIndent[iOp] = 0;
1520 p->nIndent = iOp+1;
1521
1522 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001523 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001524 }
drhfe705102014-03-06 13:38:37 +00001525 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1526 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1527 ){
drhe73f0592014-01-21 22:25:45 +00001528 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001529 }
1530 }
1531
danc4650bb2013-11-18 08:41:06 +00001532 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001533 sqlite3_free(abYield);
1534 sqlite3_reset(pSql);
1535}
1536
1537/*
1538** Free the array allocated by explain_data_prepare().
1539*/
drhdcd87a92014-08-18 13:45:42 +00001540static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001541 sqlite3_free(p->aiIndent);
1542 p->aiIndent = 0;
1543 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001544 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001545}
1546
1547/*
shane626a6e42009-10-22 17:30:15 +00001548** Execute a statement or set of statements. Print
1549** any result rows/columns depending on the current mode
1550** set via the supplied callback.
1551**
1552** This is very similar to SQLite's built-in sqlite3_exec()
1553** function except it takes a slightly different callback
1554** and callback data argument.
1555*/
1556static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001557 sqlite3 *db, /* An open database */
1558 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001559 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001560 /* (not the same as sqlite3_exec) */
1561 ShellState *pArg, /* Pointer to ShellState */
1562 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001563){
dan4564ced2010-01-05 04:59:56 +00001564 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1565 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001566 int rc2;
dan4564ced2010-01-05 04:59:56 +00001567 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001568
1569 if( pzErrMsg ){
1570 *pzErrMsg = NULL;
1571 }
1572
shaneb9fc17d2009-10-22 21:23:35 +00001573 while( zSql[0] && (SQLITE_OK == rc) ){
1574 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1575 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001576 if( pzErrMsg ){
1577 *pzErrMsg = save_err_msg(db);
1578 }
1579 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001580 if( !pStmt ){
1581 /* this happens for a comment or white-space */
1582 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001583 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001584 continue;
1585 }
shane626a6e42009-10-22 17:30:15 +00001586
shaneh642d8b82010-07-28 16:05:34 +00001587 /* save off the prepared statment handle and reset row count */
1588 if( pArg ){
1589 pArg->pStmt = pStmt;
1590 pArg->cnt = 0;
1591 }
1592
shanehb7977c52010-01-18 18:17:10 +00001593 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001594 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001595 const char *zStmtSql = sqlite3_sql(pStmt);
drhe05461c2015-12-30 13:36:57 +00001596 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001597 }
shanehb7977c52010-01-18 18:17:10 +00001598
drhefbf3b12014-02-28 20:47:24 +00001599 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1600 if( pArg && pArg->autoEQP ){
1601 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001602 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1603 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001604 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1605 if( rc==SQLITE_OK ){
1606 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00001607 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
1608 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1609 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00001610 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00001611 }
1612 }
1613 sqlite3_finalize(pExplain);
1614 sqlite3_free(zEQP);
1615 }
1616
dana98bf362013-11-13 18:35:01 +00001617 /* If the shell is currently in ".explain" mode, gather the extra
1618 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001619 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001620 explain_data_prepare(pArg, pStmt);
1621 }
1622
shaneb9fc17d2009-10-22 21:23:35 +00001623 /* perform the first step. this will tell us if we
1624 ** have a result set or not and how wide it is.
1625 */
1626 rc = sqlite3_step(pStmt);
1627 /* if we have a result set... */
1628 if( SQLITE_ROW == rc ){
1629 /* if we have a callback... */
1630 if( xCallback ){
1631 /* allocate space for col name ptr, value ptr, and type */
1632 int nCol = sqlite3_column_count(pStmt);
drhf3cdcdc2015-04-29 16:50:28 +00001633 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
shaneb9fc17d2009-10-22 21:23:35 +00001634 if( !pData ){
1635 rc = SQLITE_NOMEM;
1636 }else{
1637 char **azCols = (char **)pData; /* Names of result columns */
1638 char **azVals = &azCols[nCol]; /* Results */
1639 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001640 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001641 assert(sizeof(int) <= sizeof(char *));
1642 /* save off ptrs to column names */
1643 for(i=0; i<nCol; i++){
1644 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1645 }
shaneb9fc17d2009-10-22 21:23:35 +00001646 do{
1647 /* extract the data and data types */
1648 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001649 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001650 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001651 azVals[i] = "";
1652 }else{
1653 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1654 }
shaneb9fc17d2009-10-22 21:23:35 +00001655 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1656 rc = SQLITE_NOMEM;
1657 break; /* from for */
1658 }
1659 } /* end for */
1660
1661 /* if data and types extracted successfully... */
1662 if( SQLITE_ROW == rc ){
1663 /* call the supplied callback with the result row data */
1664 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1665 rc = SQLITE_ABORT;
1666 }else{
1667 rc = sqlite3_step(pStmt);
1668 }
1669 }
1670 } while( SQLITE_ROW == rc );
1671 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001672 }
1673 }else{
1674 do{
1675 rc = sqlite3_step(pStmt);
1676 } while( rc == SQLITE_ROW );
1677 }
1678 }
1679
dana98bf362013-11-13 18:35:01 +00001680 explain_data_delete(pArg);
1681
shaneh642d8b82010-07-28 16:05:34 +00001682 /* print usage stats if stats on */
1683 if( pArg && pArg->statsOn ){
1684 display_stats(db, pArg, 0);
1685 }
1686
dan8d1edb92014-11-05 09:07:28 +00001687 /* print loop-counters if required */
1688 if( pArg && pArg->scanstatsOn ){
1689 display_scanstats(db, pArg);
1690 }
1691
dan4564ced2010-01-05 04:59:56 +00001692 /* Finalize the statement just executed. If this fails, save a
1693 ** copy of the error message. Otherwise, set zSql to point to the
1694 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001695 rc2 = sqlite3_finalize(pStmt);
1696 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001697 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001698 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001699 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001700 }else if( pzErrMsg ){
1701 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001702 }
shaneh642d8b82010-07-28 16:05:34 +00001703
1704 /* clear saved stmt handle */
1705 if( pArg ){
1706 pArg->pStmt = NULL;
1707 }
shane626a6e42009-10-22 17:30:15 +00001708 }
shaneb9fc17d2009-10-22 21:23:35 +00001709 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001710
1711 return rc;
1712}
1713
drhdd3d4592004-08-30 01:54:05 +00001714
drh33048c02001-10-01 14:29:22 +00001715/*
drh4c653a02000-06-07 01:27:47 +00001716** This is a different callback routine used for dumping the database.
1717** Each row received by this callback consists of a table name,
1718** the table type ("index" or "table") and SQL to create the table.
1719** This routine should print text sufficient to recreate the table.
1720*/
1721static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001722 int rc;
1723 const char *zTable;
1724 const char *zType;
1725 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001726 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001727 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001728
drh902b9ee2008-12-05 17:17:07 +00001729 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001730 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001731 zTable = azArg[0];
1732 zType = azArg[1];
1733 zSql = azArg[2];
1734
drh00b950d2005-09-11 02:03:03 +00001735 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001736 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001737 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001738 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00001739 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1740 return 0;
drh45e29d82006-11-20 16:21:10 +00001741 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1742 char *zIns;
1743 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00001744 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00001745 p->writableSchema = 1;
1746 }
1747 zIns = sqlite3_mprintf(
1748 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1749 "VALUES('table','%q','%q',0,'%q');",
1750 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00001751 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00001752 sqlite3_free(zIns);
1753 return 0;
drh00b950d2005-09-11 02:03:03 +00001754 }else{
drhe05461c2015-12-30 13:36:57 +00001755 utf8_printf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001756 }
danielk19772a02e332004-06-05 08:04:36 +00001757
1758 if( strcmp(zType, "table")==0 ){
1759 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001760 char *zSelect = 0;
1761 char *zTableInfo = 0;
1762 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001763 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001764
1765 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1766 zTableInfo = appendText(zTableInfo, zTable, '"');
1767 zTableInfo = appendText(zTableInfo, ");", 0);
1768
drhc7181902014-02-27 15:04:13 +00001769 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001770 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001771 if( rc!=SQLITE_OK || !pTableInfo ){
1772 return 1;
1773 }
1774
1775 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001776 /* Always quote the table name, even if it appears to be pure ascii,
1777 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1778 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001779 if( zTmp ){
1780 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001781 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001782 }
1783 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1784 rc = sqlite3_step(pTableInfo);
1785 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001786 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001787 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001788 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001789 rc = sqlite3_step(pTableInfo);
1790 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001791 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001792 }else{
1793 zSelect = appendText(zSelect, ") ", 0);
1794 }
drh157e29a2009-05-21 15:15:00 +00001795 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001796 }
1797 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001798 if( rc!=SQLITE_OK || nRow==0 ){
1799 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001800 return 1;
1801 }
1802 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1803 zSelect = appendText(zSelect, zTable, '"');
1804
drh2f464a02011-10-13 00:41:49 +00001805 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001806 if( rc==SQLITE_CORRUPT ){
1807 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001808 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001809 }
drh85e72432012-04-11 11:38:53 +00001810 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001811 }
drh4c653a02000-06-07 01:27:47 +00001812 return 0;
1813}
1814
1815/*
drh45e29d82006-11-20 16:21:10 +00001816** Run zQuery. Use dump_callback() as the callback routine so that
1817** the contents of the query are output as SQL statements.
1818**
drhdd3d4592004-08-30 01:54:05 +00001819** If we get a SQLITE_CORRUPT error, rerun the query after appending
1820** "ORDER BY rowid DESC" to the end.
1821*/
1822static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001823 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001824 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001825){
1826 int rc;
drh2f464a02011-10-13 00:41:49 +00001827 char *zErr = 0;
1828 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001829 if( rc==SQLITE_CORRUPT ){
1830 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001831 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00001832 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00001833 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00001834 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00001835 sqlite3_free(zErr);
1836 zErr = 0;
1837 }
drhdd3d4592004-08-30 01:54:05 +00001838 zQ2 = malloc( len+100 );
1839 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001840 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001841 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1842 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00001843 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00001844 }else{
1845 rc = SQLITE_CORRUPT;
1846 }
1847 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001848 free(zQ2);
1849 }
1850 return rc;
1851}
1852
1853/*
drh75897232000-05-29 14:26:00 +00001854** Text of a help message
1855*/
persicom1d0b8722002-04-18 02:53:04 +00001856static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001857 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001858 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00001859 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00001860 ".changes on|off Show number of rows changed by SQL\n"
drh4bbcf102014-02-06 02:46:08 +00001861 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001862 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00001863 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00001864 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001865 " If TABLE specified, only dump tables matching\n"
1866 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001867 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001868 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001869 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001870 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001871 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001872 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001873 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001874 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001875 ".import FILE TABLE Import data from FILE into TABLE\n"
drh0e55db12015-02-06 14:51:13 +00001876 ".indexes ?TABLE? Show names of all indexes\n"
1877 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00001878 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001879#ifdef SQLITE_ENABLE_IOTRACE
1880 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1881#endif
drh1a513372015-05-02 17:40:23 +00001882 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh70df4fe2006-06-13 15:12:21 +00001883#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001884 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001885#endif
drh127f9d72010-02-23 01:47:00 +00001886 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001887 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00001888 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001889 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001890 " column Left-aligned columns. (See .width)\n"
1891 " html HTML <table> code\n"
1892 " insert SQL insert statements for TABLE\n"
1893 " line One value per line\n"
mistachkine0d68852014-12-11 03:12:33 +00001894 " list Values delimited by .separator strings\n"
drhb860bc92004-08-04 15:16:55 +00001895 " tabs Tab-separated values\n"
1896 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001897 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001898 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001899 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001900 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001901 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001902 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001903 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001904 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001905 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001906 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001907 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001908 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001909 " If TABLE specified, only show tables matching\n"
1910 " LIKE pattern TABLE.\n"
mistachkine0d68852014-12-11 03:12:33 +00001911 ".separator COL ?ROW? Change the column separator and optionally the row\n"
1912 " separator for both the output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001913 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001914 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001915 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001916 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001917 ".tables ?TABLE? List names of tables\n"
1918 " If TABLE specified, only list tables matching\n"
1919 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001920 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001921 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001922 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00001923 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00001924 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00001925 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001926 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001927 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001928;
1929
drhdaffd0e2001-04-11 14:28:42 +00001930/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001931static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001932/*
1933** Implementation of the "readfile(X)" SQL function. The entire content
1934** of the file named X is read and returned as a BLOB. NULL is returned
1935** if the file does not exist or is unreadable.
1936*/
1937static void readfileFunc(
1938 sqlite3_context *context,
1939 int argc,
1940 sqlite3_value **argv
1941){
1942 const char *zName;
1943 FILE *in;
1944 long nIn;
1945 void *pBuf;
1946
drhf5ed7ad2015-06-15 14:43:25 +00001947 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00001948 zName = (const char*)sqlite3_value_text(argv[0]);
1949 if( zName==0 ) return;
1950 in = fopen(zName, "rb");
1951 if( in==0 ) return;
1952 fseek(in, 0, SEEK_END);
1953 nIn = ftell(in);
1954 rewind(in);
drhf3cdcdc2015-04-29 16:50:28 +00001955 pBuf = sqlite3_malloc64( nIn );
drhba5b0932014-07-24 12:39:59 +00001956 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1957 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1958 }else{
1959 sqlite3_free(pBuf);
1960 }
1961 fclose(in);
1962}
1963
1964/*
1965** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1966** is written into file X. The number of bytes written is returned. Or
1967** NULL is returned if something goes wrong, such as being unable to open
1968** file X for writing.
1969*/
1970static void writefileFunc(
1971 sqlite3_context *context,
1972 int argc,
1973 sqlite3_value **argv
1974){
1975 FILE *out;
1976 const char *z;
drhba5b0932014-07-24 12:39:59 +00001977 sqlite3_int64 rc;
1978 const char *zFile;
1979
drhf5ed7ad2015-06-15 14:43:25 +00001980 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00001981 zFile = (const char*)sqlite3_value_text(argv[0]);
1982 if( zFile==0 ) return;
1983 out = fopen(zFile, "wb");
1984 if( out==0 ) return;
1985 z = (const char*)sqlite3_value_blob(argv[1]);
1986 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001987 rc = 0;
1988 }else{
drh490fe862014-08-11 14:21:32 +00001989 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001990 }
1991 fclose(out);
1992 sqlite3_result_int64(context, rc);
1993}
drhdaffd0e2001-04-11 14:28:42 +00001994
drh75897232000-05-29 14:26:00 +00001995/*
drh44c2eb12003-04-30 11:38:26 +00001996** Make sure the database is open. If it is not, then open it. If
1997** the database fails to open, print an error message and exit.
1998*/
drhdcd87a92014-08-18 13:45:42 +00001999static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00002000 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00002001 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00002002 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00002003 globalDb = p->db;
2004 if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
2005 sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
drh4cea5ba2008-05-05 16:27:24 +00002006 shellstaticFunc, 0, 0);
2007 }
mistachkin8e189222015-04-19 21:43:16 +00002008 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkinaae280e2015-12-31 19:06:24 +00002009 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00002010 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00002011 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00002012 exit(1);
drh44c2eb12003-04-30 11:38:26 +00002013 }
drhc2e87a32006-06-27 15:16:14 +00002014#ifndef SQLITE_OMIT_LOAD_EXTENSION
2015 sqlite3_enable_load_extension(p->db, 1);
2016#endif
mistachkin8e189222015-04-19 21:43:16 +00002017 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00002018 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00002019 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00002020 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00002021 }
2022}
2023
2024/*
drhfeac5f82004-08-01 00:10:45 +00002025** Do C-language style dequoting.
2026**
mistachkinf21979d2015-01-18 05:35:01 +00002027** \a -> alarm
2028** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00002029** \t -> tab
2030** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00002031** \v -> vertical tab
2032** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00002033** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00002034** \s -> space
drh4c56b992013-06-27 13:26:55 +00002035** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00002036** \' -> '
drhfeac5f82004-08-01 00:10:45 +00002037** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00002038** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00002039*/
2040static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00002041 int i, j;
2042 char c;
drhc2ce0be2014-05-29 12:36:14 +00002043 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00002044 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00002045 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00002046 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00002047 if( c=='a' ){
2048 c = '\a';
2049 }else if( c=='b' ){
2050 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00002051 }else if( c=='t' ){
2052 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00002053 }else if( c=='n' ){
2054 c = '\n';
2055 }else if( c=='v' ){
2056 c = '\v';
2057 }else if( c=='f' ){
2058 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00002059 }else if( c=='r' ){
2060 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00002061 }else if( c=='"' ){
2062 c = '"';
2063 }else if( c=='\'' ){
2064 c = '\'';
drh4c56b992013-06-27 13:26:55 +00002065 }else if( c=='\\' ){
2066 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00002067 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00002068 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00002069 if( z[i+1]>='0' && z[i+1]<='7' ){
2070 i++;
2071 c = (c<<3) + z[i] - '0';
2072 if( z[i+1]>='0' && z[i+1]<='7' ){
2073 i++;
2074 c = (c<<3) + z[i] - '0';
2075 }
2076 }
2077 }
2078 }
2079 z[j] = c;
2080 }
drhc2ce0be2014-05-29 12:36:14 +00002081 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00002082}
2083
2084/*
drh348d19c2013-06-03 12:47:43 +00002085** Return the value of a hexadecimal digit. Return -1 if the input
2086** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00002087*/
drh348d19c2013-06-03 12:47:43 +00002088static int hexDigitValue(char c){
2089 if( c>='0' && c<='9' ) return c - '0';
2090 if( c>='a' && c<='f' ) return c - 'a' + 10;
2091 if( c>='A' && c<='F' ) return c - 'A' + 10;
2092 return -1;
drhc28490c2006-10-26 14:25:58 +00002093}
2094
2095/*
drh7d9f3942013-04-03 01:26:54 +00002096** Interpret zArg as an integer value, possibly with suffixes.
2097*/
2098static sqlite3_int64 integerValue(const char *zArg){
2099 sqlite3_int64 v = 0;
2100 static const struct { char *zSuffix; int iMult; } aMult[] = {
2101 { "KiB", 1024 },
2102 { "MiB", 1024*1024 },
2103 { "GiB", 1024*1024*1024 },
2104 { "KB", 1000 },
2105 { "MB", 1000000 },
2106 { "GB", 1000000000 },
2107 { "K", 1000 },
2108 { "M", 1000000 },
2109 { "G", 1000000000 },
2110 };
2111 int i;
2112 int isNeg = 0;
2113 if( zArg[0]=='-' ){
2114 isNeg = 1;
2115 zArg++;
2116 }else if( zArg[0]=='+' ){
2117 zArg++;
2118 }
drh348d19c2013-06-03 12:47:43 +00002119 if( zArg[0]=='0' && zArg[1]=='x' ){
2120 int x;
2121 zArg += 2;
2122 while( (x = hexDigitValue(zArg[0]))>=0 ){
2123 v = (v<<4) + x;
2124 zArg++;
2125 }
2126 }else{
2127 while( IsDigit(zArg[0]) ){
2128 v = v*10 + zArg[0] - '0';
2129 zArg++;
2130 }
drh7d9f3942013-04-03 01:26:54 +00002131 }
drhc2bed0a2013-05-24 11:57:50 +00002132 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002133 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2134 v *= aMult[i].iMult;
2135 break;
2136 }
2137 }
2138 return isNeg? -v : v;
2139}
2140
2141/*
drh348d19c2013-06-03 12:47:43 +00002142** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2143** for TRUE and FALSE. Return the integer value if appropriate.
2144*/
2145static int booleanValue(char *zArg){
2146 int i;
2147 if( zArg[0]=='0' && zArg[1]=='x' ){
2148 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2149 }else{
2150 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2151 }
2152 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2153 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2154 return 1;
2155 }
2156 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2157 return 0;
2158 }
mistachkinaae280e2015-12-31 19:06:24 +00002159 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00002160 zArg);
2161 return 0;
2162}
2163
2164/*
drh42f64e52012-04-04 16:56:23 +00002165** Close an output file, assuming it is not stderr or stdout
2166*/
2167static void output_file_close(FILE *f){
2168 if( f && f!=stdout && f!=stderr ) fclose(f);
2169}
2170
2171/*
2172** Try to open an output file. The names "stdout" and "stderr" are
2173** recognized and do the right thing. NULL is returned if the output
2174** filename is "off".
2175*/
2176static FILE *output_file_open(const char *zFile){
2177 FILE *f;
2178 if( strcmp(zFile,"stdout")==0 ){
2179 f = stdout;
2180 }else if( strcmp(zFile, "stderr")==0 ){
2181 f = stderr;
2182 }else if( strcmp(zFile, "off")==0 ){
2183 f = 0;
2184 }else{
2185 f = fopen(zFile, "wb");
2186 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002187 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002188 }
2189 }
2190 return f;
2191}
2192
2193/*
2194** A routine for handling output from sqlite3_trace().
2195*/
2196static void sql_trace_callback(void *pArg, const char *z){
2197 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002198 if( f ){
2199 int i = (int)strlen(z);
2200 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00002201 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00002202 }
drh42f64e52012-04-04 16:56:23 +00002203}
2204
2205/*
drhd8621b92012-04-17 09:09:33 +00002206** A no-op routine that runs with the ".breakpoint" doc-command. This is
2207** a useful spot to set a debugger breakpoint.
2208*/
2209static void test_breakpoint(void){
2210 static int nCall = 0;
2211 nCall++;
2212}
2213
2214/*
mistachkin636bf9f2014-07-19 20:15:16 +00002215** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002216*/
mistachkin636bf9f2014-07-19 20:15:16 +00002217typedef struct ImportCtx ImportCtx;
2218struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002219 const char *zFile; /* Name of the input file */
2220 FILE *in; /* Read the CSV text from this input stream */
2221 char *z; /* Accumulated text for a field */
2222 int n; /* Number of bytes in z */
2223 int nAlloc; /* Space allocated for z[] */
2224 int nLine; /* Current line number */
2225 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002226 int cColSep; /* The column separator character. (Usually ",") */
2227 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002228};
2229
2230/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002231static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002232 if( p->n+1>=p->nAlloc ){
2233 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00002234 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00002235 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002236 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00002237 exit(1);
2238 }
2239 }
2240 p->z[p->n++] = (char)c;
2241}
2242
2243/* Read a single field of CSV text. Compatible with rfc4180 and extended
2244** with the option of having a separator other than ",".
2245**
2246** + Input comes from p->in.
2247** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002248** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002249** + Use p->cSep as the column separator. The default is ",".
2250** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002251** + Keep track of the line number in p->nLine.
2252** + Store the character that terminates the field in p->cTerm. Store
2253** EOF on end-of-file.
2254** + Report syntax errors on stderr
2255*/
mistachkin44723ce2015-03-21 02:22:37 +00002256static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002257 int c;
2258 int cSep = p->cColSep;
2259 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002260 p->n = 0;
2261 c = fgetc(p->in);
2262 if( c==EOF || seenInterrupt ){
2263 p->cTerm = EOF;
2264 return 0;
2265 }
2266 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002267 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002268 int startLine = p->nLine;
2269 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002270 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002271 while( 1 ){
2272 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002273 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002274 if( c==cQuote ){
2275 if( pc==cQuote ){
2276 pc = 0;
2277 continue;
2278 }
2279 }
2280 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002281 || (c==rSep && pc==cQuote)
2282 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002283 || (c==EOF && pc==cQuote)
2284 ){
2285 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002286 p->cTerm = c;
2287 break;
2288 }
2289 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00002290 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00002291 p->zFile, p->nLine, cQuote);
2292 }
2293 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00002294 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00002295 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002296 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002297 break;
2298 }
mistachkin636bf9f2014-07-19 20:15:16 +00002299 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002300 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002301 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002302 }
drhdb95f682013-06-26 22:46:00 +00002303 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002304 while( c!=EOF && c!=cSep && c!=rSep ){
2305 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002306 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002307 }
mistachkin636bf9f2014-07-19 20:15:16 +00002308 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002309 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002310 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002311 }
drhdb95f682013-06-26 22:46:00 +00002312 p->cTerm = c;
2313 }
drh8dd675e2013-07-12 21:09:24 +00002314 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002315 return p->z;
2316}
2317
mistachkin636bf9f2014-07-19 20:15:16 +00002318/* Read a single field of ASCII delimited text.
2319**
2320** + Input comes from p->in.
2321** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002322** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002323** + Use p->cSep as the column separator. The default is "\x1F".
2324** + Use p->rSep as the row separator. The default is "\x1E".
2325** + Keep track of the row number in p->nLine.
2326** + Store the character that terminates the field in p->cTerm. Store
2327** EOF on end-of-file.
2328** + Report syntax errors on stderr
2329*/
mistachkin44723ce2015-03-21 02:22:37 +00002330static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002331 int c;
2332 int cSep = p->cColSep;
2333 int rSep = p->cRowSep;
2334 p->n = 0;
2335 c = fgetc(p->in);
2336 if( c==EOF || seenInterrupt ){
2337 p->cTerm = EOF;
2338 return 0;
2339 }
2340 while( c!=EOF && c!=cSep && c!=rSep ){
2341 import_append_char(p, c);
2342 c = fgetc(p->in);
2343 }
2344 if( c==rSep ){
2345 p->nLine++;
2346 }
2347 p->cTerm = c;
2348 if( p->z ) p->z[p->n] = 0;
2349 return p->z;
2350}
2351
drhdb95f682013-06-26 22:46:00 +00002352/*
drh4bbcf102014-02-06 02:46:08 +00002353** Try to transfer data for table zTable. If an error is seen while
2354** moving forward, try to go backwards. The backwards movement won't
2355** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002356*/
mistachkine31ae902014-02-06 01:15:29 +00002357static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002358 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002359 sqlite3 *newDb,
2360 const char *zTable
2361){
2362 sqlite3_stmt *pQuery = 0;
2363 sqlite3_stmt *pInsert = 0;
2364 char *zQuery = 0;
2365 char *zInsert = 0;
2366 int rc;
2367 int i, j, n;
2368 int nTable = (int)strlen(zTable);
2369 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002370 int cnt = 0;
2371 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002372
2373 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2374 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2375 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002376 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002377 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2378 zQuery);
2379 goto end_data_xfer;
2380 }
2381 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00002382 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00002383 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002384 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00002385 goto end_data_xfer;
2386 }
2387 sqlite3_snprintf(200+nTable,zInsert,
2388 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2389 i = (int)strlen(zInsert);
2390 for(j=1; j<n; j++){
2391 memcpy(zInsert+i, ",?", 2);
2392 i += 2;
2393 }
2394 memcpy(zInsert+i, ");", 3);
2395 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2396 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002397 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002398 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2399 zQuery);
2400 goto end_data_xfer;
2401 }
2402 for(k=0; k<2; k++){
2403 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2404 for(i=0; i<n; i++){
2405 switch( sqlite3_column_type(pQuery, i) ){
2406 case SQLITE_NULL: {
2407 sqlite3_bind_null(pInsert, i+1);
2408 break;
2409 }
2410 case SQLITE_INTEGER: {
2411 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2412 break;
2413 }
2414 case SQLITE_FLOAT: {
2415 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2416 break;
2417 }
2418 case SQLITE_TEXT: {
2419 sqlite3_bind_text(pInsert, i+1,
2420 (const char*)sqlite3_column_text(pQuery,i),
2421 -1, SQLITE_STATIC);
2422 break;
2423 }
2424 case SQLITE_BLOB: {
2425 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2426 sqlite3_column_bytes(pQuery,i),
2427 SQLITE_STATIC);
2428 break;
2429 }
2430 }
2431 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002432 rc = sqlite3_step(pInsert);
2433 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00002434 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00002435 sqlite3_errmsg(newDb));
2436 }
drh3350ce92014-02-06 00:49:12 +00002437 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002438 cnt++;
2439 if( (cnt%spinRate)==0 ){
2440 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2441 fflush(stdout);
2442 }
drh3350ce92014-02-06 00:49:12 +00002443 } /* End while */
2444 if( rc==SQLITE_DONE ) break;
2445 sqlite3_finalize(pQuery);
2446 sqlite3_free(zQuery);
2447 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2448 zTable);
2449 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2450 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002451 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00002452 break;
drh3350ce92014-02-06 00:49:12 +00002453 }
2454 } /* End for(k=0...) */
2455
2456end_data_xfer:
2457 sqlite3_finalize(pQuery);
2458 sqlite3_finalize(pInsert);
2459 sqlite3_free(zQuery);
2460 sqlite3_free(zInsert);
2461}
2462
2463
2464/*
2465** Try to transfer all rows of the schema that match zWhere. For
2466** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002467** If an error is encountered while moving forward through the
2468** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002469*/
mistachkine31ae902014-02-06 01:15:29 +00002470static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002471 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002472 sqlite3 *newDb,
2473 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002474 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002475){
2476 sqlite3_stmt *pQuery = 0;
2477 char *zQuery = 0;
2478 int rc;
2479 const unsigned char *zName;
2480 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002481 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002482
2483 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2484 " WHERE %s", zWhere);
2485 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2486 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002487 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002488 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2489 zQuery);
2490 goto end_schema_xfer;
2491 }
2492 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2493 zName = sqlite3_column_text(pQuery, 0);
2494 zSql = sqlite3_column_text(pQuery, 1);
2495 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002496 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2497 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00002498 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00002499 sqlite3_free(zErrMsg);
2500 zErrMsg = 0;
2501 }
drh3350ce92014-02-06 00:49:12 +00002502 if( xForEach ){
2503 xForEach(p, newDb, (const char*)zName);
2504 }
2505 printf("done\n");
2506 }
2507 if( rc!=SQLITE_DONE ){
2508 sqlite3_finalize(pQuery);
2509 sqlite3_free(zQuery);
2510 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2511 " WHERE %s ORDER BY rowid DESC", zWhere);
2512 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2513 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002514 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002515 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2516 zQuery);
2517 goto end_schema_xfer;
2518 }
2519 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2520 zName = sqlite3_column_text(pQuery, 0);
2521 zSql = sqlite3_column_text(pQuery, 1);
2522 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002523 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2524 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00002525 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00002526 sqlite3_free(zErrMsg);
2527 zErrMsg = 0;
2528 }
drh3350ce92014-02-06 00:49:12 +00002529 if( xForEach ){
2530 xForEach(p, newDb, (const char*)zName);
2531 }
2532 printf("done\n");
2533 }
2534 }
2535end_schema_xfer:
2536 sqlite3_finalize(pQuery);
2537 sqlite3_free(zQuery);
2538}
2539
2540/*
2541** Open a new database file named "zNewDb". Try to recover as much information
2542** as possible out of the main database (which might be corrupt) and write it
2543** into zNewDb.
2544*/
drhdcd87a92014-08-18 13:45:42 +00002545static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002546 int rc;
2547 sqlite3 *newDb = 0;
2548 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002549 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00002550 return;
2551 }
2552 rc = sqlite3_open(zNewDb, &newDb);
2553 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002554 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00002555 sqlite3_errmsg(newDb));
2556 }else{
drh54d0d2d2014-04-03 00:32:13 +00002557 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002558 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002559 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2560 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002561 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002562 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002563 }
2564 sqlite3_close(newDb);
2565}
2566
2567/*
drhc2ce0be2014-05-29 12:36:14 +00002568** Change the output file back to stdout
2569*/
drhdcd87a92014-08-18 13:45:42 +00002570static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002571 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002572#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002573 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002574#endif
drhc2ce0be2014-05-29 12:36:14 +00002575 }else{
2576 output_file_close(p->out);
2577 }
2578 p->outfile[0] = 0;
2579 p->out = stdout;
2580}
2581
2582/*
drhf7502f02015-02-06 14:19:44 +00002583** Run an SQL command and return the single integer result.
2584*/
2585static int db_int(ShellState *p, const char *zSql){
2586 sqlite3_stmt *pStmt;
2587 int res = 0;
2588 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2589 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2590 res = sqlite3_column_int(pStmt,0);
2591 }
2592 sqlite3_finalize(pStmt);
2593 return res;
2594}
2595
2596/*
2597** Convert a 2-byte or 4-byte big-endian integer into a native integer
2598*/
2599unsigned int get2byteInt(unsigned char *a){
2600 return (a[0]<<8) + a[1];
2601}
2602unsigned int get4byteInt(unsigned char *a){
2603 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2604}
2605
2606/*
2607** Implementation of the ".info" command.
2608**
2609** Return 1 on error, 2 to exit, and 0 otherwise.
2610*/
drh0e55db12015-02-06 14:51:13 +00002611static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002612 static const struct { const char *zName; int ofst; } aField[] = {
2613 { "file change counter:", 24 },
2614 { "database page count:", 28 },
2615 { "freelist page count:", 36 },
2616 { "schema cookie:", 40 },
2617 { "schema format:", 44 },
2618 { "default cache size:", 48 },
2619 { "autovacuum top root:", 52 },
2620 { "incremental vacuum:", 64 },
2621 { "text encoding:", 56 },
2622 { "user version:", 60 },
2623 { "application id:", 68 },
2624 { "software version:", 96 },
2625 };
drh0e55db12015-02-06 14:51:13 +00002626 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2627 { "number of tables:",
2628 "SELECT count(*) FROM %s WHERE type='table'" },
2629 { "number of indexes:",
2630 "SELECT count(*) FROM %s WHERE type='index'" },
2631 { "number of triggers:",
2632 "SELECT count(*) FROM %s WHERE type='trigger'" },
2633 { "number of views:",
2634 "SELECT count(*) FROM %s WHERE type='view'" },
2635 { "schema size:",
2636 "SELECT total(length(sql)) FROM %s" },
2637 };
mistachkinbfe8bd52015-11-17 19:17:14 +00002638 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00002639 int i;
2640 char *zSchemaTab;
2641 char *zDb = nArg>=2 ? azArg[1] : "main";
2642 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002643 open_db(p, 0);
2644 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002645 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002646 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2647 return 1;
2648 }
2649 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2650 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002651 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00002652 return 1;
2653 }
2654 i = get2byteInt(aHdr+16);
2655 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00002656 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
2657 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2658 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2659 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00002660 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00002661 int ofst = aField[i].ofst;
2662 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00002663 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00002664 switch( ofst ){
2665 case 56: {
mistachkinaae280e2015-12-31 19:06:24 +00002666 if( val==1 ) raw_printf(p->out, " (utf8)");
2667 if( val==2 ) raw_printf(p->out, " (utf16le)");
2668 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00002669 }
2670 }
mistachkinaae280e2015-12-31 19:06:24 +00002671 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00002672 }
drh0e55db12015-02-06 14:51:13 +00002673 if( zDb==0 ){
2674 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2675 }else if( strcmp(zDb,"temp")==0 ){
2676 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2677 }else{
2678 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2679 }
drhf5ed7ad2015-06-15 14:43:25 +00002680 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00002681 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2682 int val = db_int(p, zSql);
2683 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00002684 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00002685 }
2686 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002687 return 0;
2688}
2689
dand95bb392015-09-30 11:19:05 +00002690/*
2691** Print the current sqlite3_errmsg() value to stderr and return 1.
2692*/
2693static int shellDatabaseError(sqlite3 *db){
2694 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00002695 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00002696 return 1;
2697}
2698
2699/*
2700** Print an out-of-memory message to stderr and return 1.
2701*/
2702static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00002703 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00002704 return 1;
2705}
drhf7502f02015-02-06 14:19:44 +00002706
2707/*
drh75897232000-05-29 14:26:00 +00002708** If an input line begins with "." then invoke this routine to
2709** process that line.
drh67505e72002-04-19 12:34:06 +00002710**
drh47ad6842006-11-08 12:25:42 +00002711** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002712*/
drhdcd87a92014-08-18 13:45:42 +00002713static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00002714 int h = 1;
drh75897232000-05-29 14:26:00 +00002715 int nArg = 0;
2716 int n, c;
drh67505e72002-04-19 12:34:06 +00002717 int rc = 0;
drh75897232000-05-29 14:26:00 +00002718 char *azArg[50];
2719
2720 /* Parse the input line into tokens.
2721 */
mistachkin8e189222015-04-19 21:43:16 +00002722 while( zLine[h] && nArg<ArraySize(azArg) ){
2723 while( IsSpace(zLine[h]) ){ h++; }
2724 if( zLine[h]==0 ) break;
2725 if( zLine[h]=='\'' || zLine[h]=='"' ){
2726 int delim = zLine[h++];
2727 azArg[nArg++] = &zLine[h];
2728 while( zLine[h] && zLine[h]!=delim ){
2729 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2730 h++;
drh4c56b992013-06-27 13:26:55 +00002731 }
mistachkin8e189222015-04-19 21:43:16 +00002732 if( zLine[h]==delim ){
2733 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00002734 }
drhfeac5f82004-08-01 00:10:45 +00002735 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002736 }else{
mistachkin8e189222015-04-19 21:43:16 +00002737 azArg[nArg++] = &zLine[h];
2738 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2739 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002740 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002741 }
2742 }
2743
2744 /* Process the input line.
2745 */
shane9bd1b442009-10-23 01:27:39 +00002746 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002747 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002748 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002749 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2750 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2751 ){
drhbc46f022013-01-23 18:53:23 +00002752 const char *zDestFile = 0;
2753 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002754 sqlite3 *pDest;
2755 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002756 int j;
2757 for(j=1; j<nArg; j++){
2758 const char *z = azArg[j];
2759 if( z[0]=='-' ){
2760 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002761 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002762 {
mistachkinaae280e2015-12-31 19:06:24 +00002763 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00002764 return 1;
2765 }
2766 }else if( zDestFile==0 ){
2767 zDestFile = azArg[j];
2768 }else if( zDb==0 ){
2769 zDb = zDestFile;
2770 zDestFile = azArg[j];
2771 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002772 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00002773 return 1;
2774 }
drh9ff849f2009-02-04 20:55:57 +00002775 }
drhbc46f022013-01-23 18:53:23 +00002776 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002777 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00002778 return 1;
2779 }
2780 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002781 rc = sqlite3_open(zDestFile, &pDest);
2782 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002783 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002784 sqlite3_close(pDest);
2785 return 1;
2786 }
drh05782482013-10-24 15:20:20 +00002787 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002788 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2789 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002790 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00002791 sqlite3_close(pDest);
2792 return 1;
2793 }
2794 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2795 sqlite3_backup_finish(pBackup);
2796 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002797 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002798 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002799 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002800 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002801 }
2802 sqlite3_close(pDest);
2803 }else
2804
drhc2ce0be2014-05-29 12:36:14 +00002805 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2806 if( nArg==2 ){
2807 bail_on_error = booleanValue(azArg[1]);
2808 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002809 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00002810 rc = 1;
2811 }
drhc49f44e2006-10-26 18:15:42 +00002812 }else
2813
mistachkinf21979d2015-01-18 05:35:01 +00002814 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2815 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00002816 if( booleanValue(azArg[1]) ){
2817 setBinaryMode(p->out);
2818 }else{
2819 setTextMode(p->out);
2820 }
mistachkinf21979d2015-01-18 05:35:01 +00002821 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002822 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00002823 rc = 1;
2824 }
2825 }else
2826
drhd8621b92012-04-17 09:09:33 +00002827 /* The undocumented ".breakpoint" command causes a call to the no-op
2828 ** routine named test_breakpoint().
2829 */
2830 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2831 test_breakpoint();
2832 }else
2833
drhdf12f1c2015-12-07 21:46:19 +00002834 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
2835 if( nArg==2 ){
2836 p->countChanges = booleanValue(azArg[1]);
2837 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002838 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00002839 rc = 1;
2840 }
2841 }else
2842
drhc2ce0be2014-05-29 12:36:14 +00002843 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2844 if( nArg==2 ){
2845 tryToClone(p, azArg[1]);
2846 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002847 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00002848 rc = 1;
2849 }
mistachkine31ae902014-02-06 01:15:29 +00002850 }else
2851
drhc2ce0be2014-05-29 12:36:14 +00002852 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002853 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002854 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002855 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002856 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002857 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002858 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002859 data.colWidth[0] = 3;
2860 data.colWidth[1] = 15;
2861 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002862 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002863 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002864 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00002865 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002866 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002867 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002868 }
2869 }else
2870
drh0e55db12015-02-06 14:51:13 +00002871 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2872 rc = shell_dbinfo_command(p, nArg, azArg);
2873 }else
2874
drhc2ce0be2014-05-29 12:36:14 +00002875 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002876 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002877 /* When playing back a "dump", the content might appear in an order
2878 ** which causes immediate foreign key constraints to be violated.
2879 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002880 if( nArg!=1 && nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00002881 raw_printf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00002882 rc = 1;
2883 goto meta_command_exit;
2884 }
mistachkinaae280e2015-12-31 19:06:24 +00002885 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
2886 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002887 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002888 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002889 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002890 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002891 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002892 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002893 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002894 );
2895 run_schema_dump_query(p,
2896 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002897 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002898 );
drh2f464a02011-10-13 00:41:49 +00002899 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002900 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002901 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002902 );
drh4c653a02000-06-07 01:27:47 +00002903 }else{
2904 int i;
drhdd3d4592004-08-30 01:54:05 +00002905 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002906 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002907 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002908 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002909 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002910 " AND sql NOT NULL");
2911 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002912 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002913 "WHERE sql NOT NULL"
2914 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002915 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002916 );
danielk1977bc6ada42004-06-30 08:20:16 +00002917 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002918 }
2919 }
drh45e29d82006-11-20 16:21:10 +00002920 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00002921 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002922 p->writableSchema = 0;
2923 }
drh56197952011-10-13 16:30:13 +00002924 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2925 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00002926 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002927 }else
drh75897232000-05-29 14:26:00 +00002928
drhc2ce0be2014-05-29 12:36:14 +00002929 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2930 if( nArg==2 ){
2931 p->echoOn = booleanValue(azArg[1]);
2932 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002933 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00002934 rc = 1;
2935 }
drhdaffd0e2001-04-11 14:28:42 +00002936 }else
2937
drhc2ce0be2014-05-29 12:36:14 +00002938 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2939 if( nArg==2 ){
2940 p->autoEQP = booleanValue(azArg[1]);
2941 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002942 raw_printf(stderr, "Usage: .eqp on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00002943 rc = 1;
2944 }
drhefbf3b12014-02-28 20:47:24 +00002945 }else
2946
drhd3ac7d92013-01-25 18:33:43 +00002947 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002948 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002949 rc = 2;
drh75897232000-05-29 14:26:00 +00002950 }else
2951
drhc2ce0be2014-05-29 12:36:14 +00002952 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002953 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002954 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002955 if(!p->normalMode.valid) {
2956 p->normalMode.valid = 1;
2957 p->normalMode.mode = p->mode;
2958 p->normalMode.showHeader = p->showHeader;
2959 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002960 }
2961 /* We could put this code under the !p->explainValid
2962 ** condition so that it does not execute if we are already in
2963 ** explain mode. However, always executing it allows us an easy
2964 ** was to reset to explain mode in case the user previously
2965 ** did an .explain followed by a .width, .mode or .header
2966 ** command.
2967 */
danielk19770d78bae2008-01-03 07:09:48 +00002968 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002969 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002970 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002971 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002972 p->colWidth[1] = 13; /* opcode */
2973 p->colWidth[2] = 4; /* P1 */
2974 p->colWidth[3] = 4; /* P2 */
2975 p->colWidth[4] = 4; /* P3 */
2976 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002977 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002978 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002979 }else if (p->normalMode.valid) {
2980 p->normalMode.valid = 0;
2981 p->mode = p->normalMode.mode;
2982 p->showHeader = p->normalMode.showHeader;
2983 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002984 }
drh75897232000-05-29 14:26:00 +00002985 }else
2986
drhc1971542014-06-23 23:28:13 +00002987 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002988 ShellState data;
drhc1971542014-06-23 23:28:13 +00002989 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002990 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002991 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00002992 raw_printf(stderr, "Usage: .fullschema\n");
drhc1971542014-06-23 23:28:13 +00002993 rc = 1;
2994 goto meta_command_exit;
2995 }
2996 open_db(p, 0);
2997 memcpy(&data, p, sizeof(data));
2998 data.showHeader = 0;
2999 data.mode = MODE_Semi;
3000 rc = sqlite3_exec(p->db,
3001 "SELECT sql FROM"
3002 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3003 " FROM sqlite_master UNION ALL"
3004 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003005 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00003006 "ORDER BY rowid",
3007 callback, &data, &zErrMsg
3008 );
drh56f674c2014-07-18 14:43:29 +00003009 if( rc==SQLITE_OK ){
3010 sqlite3_stmt *pStmt;
3011 rc = sqlite3_prepare_v2(p->db,
3012 "SELECT rowid FROM sqlite_master"
3013 " WHERE name GLOB 'sqlite_stat[134]'",
3014 -1, &pStmt, 0);
3015 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
3016 sqlite3_finalize(pStmt);
3017 }
3018 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003019 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00003020 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003021 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00003022 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
3023 callback, &data, &zErrMsg);
3024 data.mode = MODE_Insert;
3025 data.zDestTable = "sqlite_stat1";
3026 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
3027 shell_callback, &data,&zErrMsg);
3028 data.zDestTable = "sqlite_stat3";
3029 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
3030 shell_callback, &data,&zErrMsg);
3031 data.zDestTable = "sqlite_stat4";
3032 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
3033 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00003034 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00003035 }
drhc1971542014-06-23 23:28:13 +00003036 }else
3037
drhc2ce0be2014-05-29 12:36:14 +00003038 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
3039 if( nArg==2 ){
3040 p->showHeader = booleanValue(azArg[1]);
3041 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003042 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00003043 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00003044 }
drh75897232000-05-29 14:26:00 +00003045 }else
3046
drhc2ce0be2014-05-29 12:36:14 +00003047 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003048 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00003049 }else
3050
3051 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00003052 char *zTable; /* Insert data into this table */
3053 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00003054 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00003055 int nCol; /* Number of columns in the table */
3056 int nByte; /* Number of bytes in an SQL string */
3057 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00003058 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00003059 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00003060 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00003061 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00003062 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
3063 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00003064
drhc2ce0be2014-05-29 12:36:14 +00003065 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00003066 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00003067 goto meta_command_exit;
3068 }
drh01f37542014-05-31 15:43:33 +00003069 zFile = azArg[1];
3070 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00003071 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00003072 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00003073 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003074 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003075 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003076 raw_printf(stderr,
3077 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00003078 return 1;
drhfeac5f82004-08-01 00:10:45 +00003079 }
drhdb95f682013-06-26 22:46:00 +00003080 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003081 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00003082 " for import\n");
3083 return 1;
3084 }
mistachkin636bf9f2014-07-19 20:15:16 +00003085 nSep = strlen30(p->rowSeparator);
3086 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003087 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003088 return 1;
3089 }
mistachkine0d68852014-12-11 03:12:33 +00003090 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
3091 /* When importing CSV (only), if the row separator is set to the
3092 ** default output row separator, change it to the default input
3093 ** row separator. This avoids having to maintain different input
3094 ** and output row separators. */
3095 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
3096 nSep = strlen30(p->rowSeparator);
3097 }
mistachkin636bf9f2014-07-19 20:15:16 +00003098 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003099 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00003100 " for import\n");
3101 return 1;
3102 }
3103 sCtx.zFile = zFile;
3104 sCtx.nLine = 1;
3105 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003106#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00003107 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00003108 return 1;
3109#else
mistachkin636bf9f2014-07-19 20:15:16 +00003110 sCtx.in = popen(sCtx.zFile+1, "r");
3111 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00003112 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00003113#endif
drh5bde8162013-06-27 14:07:53 +00003114 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003115 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00003116 xCloser = fclose;
3117 }
mistachkin636bf9f2014-07-19 20:15:16 +00003118 if( p->mode==MODE_Ascii ){
3119 xRead = ascii_read_one_field;
3120 }else{
3121 xRead = csv_read_one_field;
3122 }
3123 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003124 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00003125 return 1;
3126 }
mistachkin636bf9f2014-07-19 20:15:16 +00003127 sCtx.cColSep = p->colSeparator[0];
3128 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00003129 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00003130 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003131 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003132 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003133 return 1;
3134 }
drh4f21c4a2008-12-10 22:15:00 +00003135 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00003136 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003137 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00003138 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00003139 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3140 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00003141 while( xRead(&sCtx) ){
3142 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00003143 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00003144 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00003145 }
drh5bde8162013-06-27 14:07:53 +00003146 if( cSep=='(' ){
3147 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00003148 sqlite3_free(sCtx.z);
3149 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00003150 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003151 return 1;
3152 }
drhdb95f682013-06-26 22:46:00 +00003153 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3154 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3155 sqlite3_free(zCreate);
3156 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003157 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00003158 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003159 sqlite3_free(sCtx.z);
3160 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003161 return 1;
3162 }
drhc7181902014-02-27 15:04:13 +00003163 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003164 }
drhfeac5f82004-08-01 00:10:45 +00003165 sqlite3_free(zSql);
3166 if( rc ){
shane916f9612009-10-23 00:37:15 +00003167 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00003168 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003169 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003170 return 1;
drhfeac5f82004-08-01 00:10:45 +00003171 }
shane916f9612009-10-23 00:37:15 +00003172 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003173 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003174 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003175 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00003176 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003177 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003178 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003179 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003180 return 1;
3181 }
drhdb95f682013-06-26 22:46:00 +00003182 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003183 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003184 for(i=1; i<nCol; i++){
3185 zSql[j++] = ',';
3186 zSql[j++] = '?';
3187 }
3188 zSql[j++] = ')';
3189 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003190 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003191 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003192 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003193 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00003194 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003195 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003196 return 1;
drhfeac5f82004-08-01 00:10:45 +00003197 }
mistachkin8e189222015-04-19 21:43:16 +00003198 needCommit = sqlite3_get_autocommit(p->db);
3199 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003200 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003201 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003202 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003203 char *z = xRead(&sCtx);
3204 /*
3205 ** Did we reach end-of-file before finding any columns?
3206 ** If so, stop instead of NULL filling the remaining columns.
3207 */
drhdb95f682013-06-26 22:46:00 +00003208 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003209 /*
3210 ** Did we reach end-of-file OR end-of-line before finding any
3211 ** columns in ASCII mode? If so, stop instead of NULL filling
3212 ** the remaining columns.
3213 */
3214 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003215 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003216 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00003217 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00003218 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003219 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003220 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003221 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003222 }
drhfeac5f82004-08-01 00:10:45 +00003223 }
mistachkin636bf9f2014-07-19 20:15:16 +00003224 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003225 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003226 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003227 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003228 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00003229 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00003230 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003231 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003232 }
drhdb95f682013-06-26 22:46:00 +00003233 if( i>=nCol ){
3234 sqlite3_step(pStmt);
3235 rc = sqlite3_reset(pStmt);
3236 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003237 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
3238 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00003239 }
3240 }
mistachkin636bf9f2014-07-19 20:15:16 +00003241 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003242
mistachkin636bf9f2014-07-19 20:15:16 +00003243 xCloser(sCtx.in);
3244 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003245 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003246 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003247 }else
3248
drh0e55db12015-02-06 14:51:13 +00003249 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3250 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003251 ShellState data;
drh75897232000-05-29 14:26:00 +00003252 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003253 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003254 memcpy(&data, p, sizeof(data));
3255 data.showHeader = 0;
3256 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003257 if( nArg==1 ){
3258 rc = sqlite3_exec(p->db,
3259 "SELECT name FROM sqlite_master "
3260 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3261 "UNION ALL "
3262 "SELECT name FROM sqlite_temp_master "
3263 "WHERE type='index' "
3264 "ORDER BY 1",
3265 callback, &data, &zErrMsg
3266 );
drhc2ce0be2014-05-29 12:36:14 +00003267 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003268 zShellStatic = azArg[1];
3269 rc = sqlite3_exec(p->db,
3270 "SELECT name FROM sqlite_master "
3271 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3272 "UNION ALL "
3273 "SELECT name FROM sqlite_temp_master "
3274 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3275 "ORDER BY 1",
3276 callback, &data, &zErrMsg
3277 );
3278 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003279 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003280 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003281 rc = 1;
3282 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003283 }
drh75897232000-05-29 14:26:00 +00003284 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003285 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003286 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003287 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003288 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003289 raw_printf(stderr,
3290 "Error: querying sqlite_master and sqlite_temp_master\n");
shane86f5bdb2009-10-24 02:00:07 +00003291 rc = 1;
drh75897232000-05-29 14:26:00 +00003292 }
3293 }else
3294
drhae5e4452007-05-03 17:18:36 +00003295#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003296 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00003297 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003298 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3299 iotrace = 0;
3300 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003301 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003302 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003303 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003304 iotrace = stdout;
3305 }else{
3306 iotrace = fopen(azArg[1], "w");
3307 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003308 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003309 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003310 rc = 1;
drhb0603412007-02-28 04:47:26 +00003311 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003312 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003313 }
3314 }
3315 }else
drhae5e4452007-05-03 17:18:36 +00003316#endif
drh1a513372015-05-02 17:40:23 +00003317 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3318 static const struct {
3319 const char *zLimitName; /* Name of a limit */
3320 int limitCode; /* Integer code for that limit */
3321 } aLimit[] = {
3322 { "length", SQLITE_LIMIT_LENGTH },
3323 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
3324 { "column", SQLITE_LIMIT_COLUMN },
3325 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
3326 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
3327 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
3328 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
3329 { "attached", SQLITE_LIMIT_ATTACHED },
3330 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
3331 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
3332 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
3333 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
3334 };
3335 int i, n2;
3336 open_db(p, 0);
3337 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00003338 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003339 printf("%20s %d\n", aLimit[i].zLimitName,
3340 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3341 }
3342 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00003343 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00003344 rc = 1;
3345 goto meta_command_exit;
3346 }else{
3347 int iLimit = -1;
3348 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00003349 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003350 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3351 if( iLimit<0 ){
3352 iLimit = i;
3353 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003354 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00003355 rc = 1;
3356 goto meta_command_exit;
3357 }
3358 }
3359 }
3360 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003361 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00003362 "enter \".limits\" with no arguments for a list.\n",
3363 azArg[1]);
3364 rc = 1;
3365 goto meta_command_exit;
3366 }
3367 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00003368 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3369 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00003370 }
3371 printf("%20s %d\n", aLimit[iLimit].zLimitName,
3372 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3373 }
3374 }else
drhb0603412007-02-28 04:47:26 +00003375
drh70df4fe2006-06-13 15:12:21 +00003376#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003377 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003378 const char *zFile, *zProc;
3379 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003380 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003381 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00003382 rc = 1;
3383 goto meta_command_exit;
3384 }
drh1e397f82006-06-08 15:28:43 +00003385 zFile = azArg[1];
3386 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003387 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003388 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3389 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003390 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003391 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003392 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003393 }
3394 }else
drh70df4fe2006-06-13 15:12:21 +00003395#endif
drh1e397f82006-06-08 15:28:43 +00003396
drhc2ce0be2014-05-29 12:36:14 +00003397 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3398 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003399 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00003400 rc = 1;
3401 }else{
3402 const char *zFile = azArg[1];
3403 output_file_close(p->pLog);
3404 p->pLog = output_file_open(zFile);
3405 }
drh127f9d72010-02-23 01:47:00 +00003406 }else
3407
drhc2ce0be2014-05-29 12:36:14 +00003408 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3409 const char *zMode = nArg>=2 ? azArg[1] : "";
3410 int n2 = (int)strlen(zMode);
3411 int c2 = zMode[0];
3412 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003413 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003414 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003415 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003416 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003417 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003418 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003419 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003420 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003421 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003422 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003423 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003424 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003425 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003426 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003427 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003428 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003429 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003430 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003431 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003432 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003433 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3434 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003435 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3436 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003437 }else {
mistachkinaae280e2015-12-31 19:06:24 +00003438 raw_printf(stderr, "Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003439 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003440 rc = 1;
drh75897232000-05-29 14:26:00 +00003441 }
3442 }else
3443
drhc2ce0be2014-05-29 12:36:14 +00003444 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3445 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003446 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3447 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003448 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003449 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003450 rc = 1;
3451 }
3452 }else
3453
drh05782482013-10-24 15:20:20 +00003454 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3455 sqlite3 *savedDb = p->db;
3456 const char *zSavedFilename = p->zDbFilename;
3457 char *zNewFilename = 0;
3458 p->db = 0;
drhbbe031f2015-06-17 17:08:22 +00003459 if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3460 p->zDbFilename = zNewFilename;
drh05782482013-10-24 15:20:20 +00003461 open_db(p, 1);
3462 if( p->db!=0 ){
3463 sqlite3_close(savedDb);
3464 sqlite3_free(p->zFreeOnClose);
3465 p->zFreeOnClose = zNewFilename;
3466 }else{
3467 sqlite3_free(zNewFilename);
3468 p->db = savedDb;
3469 p->zDbFilename = zSavedFilename;
3470 }
3471 }else
3472
drhc2ce0be2014-05-29 12:36:14 +00003473 if( c=='o'
3474 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3475 ){
3476 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3477 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003478 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00003479 rc = 1;
3480 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003481 }
drhc2ce0be2014-05-29 12:36:14 +00003482 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3483 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003484 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003485 rc = 1;
3486 goto meta_command_exit;
3487 }
3488 p->outCount = 2;
3489 }else{
3490 p->outCount = 0;
3491 }
3492 output_reset(p);
3493 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003494#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00003495 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00003496 rc = 1;
3497 p->out = stdout;
3498#else
drhc2ce0be2014-05-29 12:36:14 +00003499 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003500 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003501 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003502 p->out = stdout;
3503 rc = 1;
3504 }else{
drhc2ce0be2014-05-29 12:36:14 +00003505 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003506 }
drh8cd5b252015-03-02 22:06:43 +00003507#endif
drh75897232000-05-29 14:26:00 +00003508 }else{
drhc2ce0be2014-05-29 12:36:14 +00003509 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003510 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003511 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003512 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003513 }
drh75897232000-05-29 14:26:00 +00003514 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003515 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003516 } else {
drhc2ce0be2014-05-29 12:36:14 +00003517 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003518 }
3519 }
3520 }else
3521
drh078b1fd2012-09-21 13:40:02 +00003522 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3523 int i;
3524 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00003525 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00003526 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00003527 }
mistachkinaae280e2015-12-31 19:06:24 +00003528 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00003529 }else
3530
drhc2ce0be2014-05-29 12:36:14 +00003531 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003532 if( nArg >= 2) {
3533 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3534 }
3535 if( nArg >= 3) {
3536 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3537 }
3538 }else
3539
drhc2ce0be2014-05-29 12:36:14 +00003540 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003541 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003542 }else
3543
drhc2ce0be2014-05-29 12:36:14 +00003544 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3545 FILE *alt;
3546 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003547 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003548 rc = 1;
3549 goto meta_command_exit;
3550 }
3551 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003552 if( alt==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003553 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
shane9bd1b442009-10-23 01:27:39 +00003554 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003555 }else{
shane9bd1b442009-10-23 01:27:39 +00003556 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003557 fclose(alt);
3558 }
3559 }else
3560
drhc2ce0be2014-05-29 12:36:14 +00003561 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003562 const char *zSrcFile;
3563 const char *zDb;
3564 sqlite3 *pSrc;
3565 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003566 int nTimeout = 0;
3567
drh9ff849f2009-02-04 20:55:57 +00003568 if( nArg==2 ){
3569 zSrcFile = azArg[1];
3570 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003571 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003572 zSrcFile = azArg[2];
3573 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003574 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003575 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003576 rc = 1;
3577 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003578 }
3579 rc = sqlite3_open(zSrcFile, &pSrc);
3580 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003581 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003582 sqlite3_close(pSrc);
3583 return 1;
3584 }
drh05782482013-10-24 15:20:20 +00003585 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003586 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3587 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003588 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00003589 sqlite3_close(pSrc);
3590 return 1;
3591 }
drhdc2c4912009-02-04 22:46:47 +00003592 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3593 || rc==SQLITE_BUSY ){
3594 if( rc==SQLITE_BUSY ){
3595 if( nTimeout++ >= 3 ) break;
3596 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003597 }
3598 }
3599 sqlite3_backup_finish(pBackup);
3600 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003601 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003602 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00003603 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00003604 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003605 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003606 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003607 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003608 }
3609 sqlite3_close(pSrc);
3610 }else
3611
dan8d1edb92014-11-05 09:07:28 +00003612
3613 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3614 if( nArg==2 ){
3615 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003616#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00003617 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00003618#endif
dan8d1edb92014-11-05 09:07:28 +00003619 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003620 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00003621 rc = 1;
3622 }
3623 }else
3624
drhc2ce0be2014-05-29 12:36:14 +00003625 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003626 ShellState data;
drh75897232000-05-29 14:26:00 +00003627 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003628 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003629 memcpy(&data, p, sizeof(data));
3630 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003631 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003632 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003633 int i;
drhf0693c82011-10-11 20:41:54 +00003634 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003635 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003636 char *new_argv[2], *new_colv[2];
3637 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3638 " type text,\n"
3639 " name text,\n"
3640 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003641 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003642 " sql text\n"
3643 ")";
3644 new_argv[1] = 0;
3645 new_colv[0] = "sql";
3646 new_colv[1] = 0;
3647 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003648 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003649 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003650 char *new_argv[2], *new_colv[2];
3651 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3652 " type text,\n"
3653 " name text,\n"
3654 " tbl_name text,\n"
3655 " rootpage integer,\n"
3656 " sql text\n"
3657 ")";
3658 new_argv[1] = 0;
3659 new_colv[0] = "sql";
3660 new_colv[1] = 0;
3661 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003662 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003663 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003664 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003665 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003666 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003667 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003668 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003669 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003670 "WHERE lower(tbl_name) LIKE shellstatic()"
3671 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003672 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003673 callback, &data, &zErrMsg);
3674 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003675 }
drhc2ce0be2014-05-29 12:36:14 +00003676 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003677 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003678 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003679 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003680 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003681 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003682 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003683 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003684 callback, &data, &zErrMsg
3685 );
drhc2ce0be2014-05-29 12:36:14 +00003686 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003687 raw_printf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003688 rc = 1;
3689 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003690 }
drh75897232000-05-29 14:26:00 +00003691 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003692 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003693 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003694 rc = 1;
3695 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003696 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00003697 rc = 1;
3698 }else{
3699 rc = 0;
drh75897232000-05-29 14:26:00 +00003700 }
3701 }else
3702
drhabd4c722014-09-20 18:18:33 +00003703
3704#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3705 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3706 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003707 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003708 }else
3709#endif
3710
3711
drh340f5822013-06-27 13:01:21 +00003712#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003713 /* Undocumented commands for internal testing. Subject to change
3714 ** without notice. */
3715 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3716 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3717 int i, v;
3718 for(i=1; i<nArg; i++){
3719 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00003720 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00003721 }
3722 }
3723 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3724 int i; sqlite3_int64 v;
3725 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003726 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003727 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003728 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00003729 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003730 }
3731 }
3732 }else
drh340f5822013-06-27 13:01:21 +00003733#endif
drh348d19c2013-06-03 12:47:43 +00003734
drhc2ce0be2014-05-29 12:36:14 +00003735 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003736 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00003737 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00003738 rc = 1;
3739 }
drh6976c212014-07-24 12:09:47 +00003740 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003741 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00003742 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00003743 }
3744 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00003745 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3746 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh5bb3eb92007-05-04 13:15:55 +00003747 }
drh75897232000-05-29 14:26:00 +00003748 }else
3749
drh62cdde52014-05-28 20:22:28 +00003750 if( c=='s'
3751 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003752 ){
3753 char *zCmd;
drh54027102014-08-06 14:36:53 +00003754 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003755 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003756 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00003757 rc = 1;
3758 goto meta_command_exit;
3759 }
drhdcb3e3d2014-05-29 03:17:29 +00003760 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003761 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003762 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3763 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003764 }
drh54027102014-08-06 14:36:53 +00003765 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003766 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00003767 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003768 }else
3769
drhc2ce0be2014-05-29 12:36:14 +00003770 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003771 int i;
drhc2ce0be2014-05-29 12:36:14 +00003772 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003773 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00003774 rc = 1;
3775 goto meta_command_exit;
3776 }
mistachkinaae280e2015-12-31 19:06:24 +00003777 utf8_printf(p->out, "%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3778 utf8_printf(p->out, "%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
3779 utf8_printf(p->out,"%9.9s: %s\n","explain",p->normalMode.valid?"on":"off");
3780 utf8_printf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3781 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
3782 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00003783 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00003784 raw_printf(p->out, "\n");
3785 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003786 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00003787 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00003788 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00003789 raw_printf(p->out, "\n");
3790 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00003791 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00003792 raw_printf(p->out, "\n");
3793 utf8_printf(p->out, "%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3794 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00003795 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00003796 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003797 }
mistachkinaae280e2015-12-31 19:06:24 +00003798 raw_printf(p->out, "\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003799 }else
3800
drhc2ce0be2014-05-29 12:36:14 +00003801 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3802 if( nArg==2 ){
3803 p->statsOn = booleanValue(azArg[1]);
3804 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003805 raw_printf(stderr, "Usage: .stats on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00003806 rc = 1;
3807 }
shaneh642d8b82010-07-28 16:05:34 +00003808 }else
3809
drhc2ce0be2014-05-29 12:36:14 +00003810 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003811 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003812 char **azResult;
drh98781232012-04-23 12:38:05 +00003813 int nRow, nAlloc;
3814 char *zSql = 0;
3815 int ii;
drh05782482013-10-24 15:20:20 +00003816 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003817 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00003818 if( rc ) return shellDatabaseError(p->db);
3819
3820 /* Create an SQL statement to query for the list of tables in the
3821 ** main and all attached databases where the table name matches the
3822 ** LIKE pattern bound to variable "?1". */
drh98781232012-04-23 12:38:05 +00003823 zSql = sqlite3_mprintf(
3824 "SELECT name FROM sqlite_master"
3825 " WHERE type IN ('table','view')"
3826 " AND name NOT LIKE 'sqlite_%%'"
3827 " AND name LIKE ?1");
dand95bb392015-09-30 11:19:05 +00003828 while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
drh98781232012-04-23 12:38:05 +00003829 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3830 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3831 if( strcmp(zDbName,"temp")==0 ){
3832 zSql = sqlite3_mprintf(
3833 "%z UNION ALL "
3834 "SELECT 'temp.' || name FROM sqlite_temp_master"
3835 " WHERE type IN ('table','view')"
3836 " AND name NOT LIKE 'sqlite_%%'"
3837 " AND name LIKE ?1", zSql);
3838 }else{
3839 zSql = sqlite3_mprintf(
3840 "%z UNION ALL "
3841 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3842 " WHERE type IN ('table','view')"
3843 " AND name NOT LIKE 'sqlite_%%'"
3844 " AND name LIKE ?1", zSql, zDbName, zDbName);
3845 }
drha50da102000-08-08 20:19:09 +00003846 }
dand95bb392015-09-30 11:19:05 +00003847 rc = sqlite3_finalize(pStmt);
3848 if( zSql && rc==SQLITE_OK ){
3849 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3850 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3851 }
drh98781232012-04-23 12:38:05 +00003852 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00003853 if( !zSql ) return shellNomemError();
3854 if( rc ) return shellDatabaseError(p->db);
3855
3856 /* Run the SQL statement prepared by the above block. Store the results
3857 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00003858 nRow = nAlloc = 0;
3859 azResult = 0;
3860 if( nArg>1 ){
3861 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003862 }else{
drh98781232012-04-23 12:38:05 +00003863 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3864 }
3865 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3866 if( nRow>=nAlloc ){
3867 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00003868 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00003869 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00003870 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00003871 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00003872 break;
3873 }
mistachkin8e189222015-04-19 21:43:16 +00003874 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00003875 azResult = azNew;
3876 }
3877 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00003878 if( 0==azResult[nRow] ){
3879 rc = shellNomemError();
3880 break;
3881 }
3882 nRow++;
drh98781232012-04-23 12:38:05 +00003883 }
dand95bb392015-09-30 11:19:05 +00003884 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
3885 rc = shellDatabaseError(p->db);
3886 }
3887
3888 /* Pretty-print the contents of array azResult[] to the output */
3889 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003890 int len, maxlen = 0;
3891 int i, j;
3892 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003893 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003894 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003895 if( len>maxlen ) maxlen = len;
3896 }
3897 nPrintCol = 80/(maxlen+2);
3898 if( nPrintCol<1 ) nPrintCol = 1;
3899 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3900 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003901 for(j=i; j<nRow; j+=nPrintRow){
3902 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00003903 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
3904 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003905 }
mistachkinaae280e2015-12-31 19:06:24 +00003906 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003907 }
3908 }
dand95bb392015-09-30 11:19:05 +00003909
drh98781232012-04-23 12:38:05 +00003910 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3911 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003912 }else
3913
shaneh96887e12011-02-10 21:08:58 +00003914 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003915 static const struct {
3916 const char *zCtrlName; /* Name of a test-control option */
3917 int ctrlCode; /* Integer code for that option */
3918 } aCtrl[] = {
3919 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3920 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3921 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3922 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3923 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3924 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3925 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3926 { "assert", SQLITE_TESTCTRL_ASSERT },
3927 { "always", SQLITE_TESTCTRL_ALWAYS },
3928 { "reserve", SQLITE_TESTCTRL_RESERVE },
3929 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3930 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003931 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003932 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00003933 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00003934 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00003935 };
shaneh96887e12011-02-10 21:08:58 +00003936 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00003937 int rc2 = 0;
3938 int i, n2;
drh05782482013-10-24 15:20:20 +00003939 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003940
drhd416fe72011-03-17 16:45:50 +00003941 /* convert testctrl text option to value. allow any unique prefix
3942 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00003943 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00003944 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00003945 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00003946 if( testctrl<0 ){
3947 testctrl = aCtrl[i].ctrlCode;
3948 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003949 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003950 testctrl = -1;
3951 break;
3952 }
3953 }
3954 }
drh348d19c2013-06-03 12:47:43 +00003955 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003956 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00003957 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003958 }else{
3959 switch(testctrl){
3960
3961 /* sqlite3_test_control(int, db, int) */
3962 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3963 case SQLITE_TESTCTRL_RESERVE:
3964 if( nArg==3 ){
3965 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003966 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00003967 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003968 } else {
mistachkinaae280e2015-12-31 19:06:24 +00003969 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00003970 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003971 }
3972 break;
3973
3974 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003975 case SQLITE_TESTCTRL_PRNG_SAVE:
3976 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003977 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003978 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003979 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00003980 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00003981 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003982 } else {
mistachkinaae280e2015-12-31 19:06:24 +00003983 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
3984 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003985 }
3986 break;
3987
3988 /* sqlite3_test_control(int, uint) */
3989 case SQLITE_TESTCTRL_PENDING_BYTE:
3990 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003991 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00003992 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00003993 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003994 } else {
mistachkinaae280e2015-12-31 19:06:24 +00003995 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00003996 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003997 }
3998 break;
3999
4000 /* sqlite3_test_control(int, int) */
4001 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00004002 case SQLITE_TESTCTRL_ALWAYS:
4003 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00004004 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00004005 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00004006 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004007 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004008 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004009 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00004010 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004011 }
4012 break;
4013
4014 /* sqlite3_test_control(int, char *) */
4015#ifdef SQLITE_N_KEYWORD
4016 case SQLITE_TESTCTRL_ISKEYWORD:
4017 if( nArg==3 ){
4018 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00004019 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004020 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004021 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004022 utf8_printf(stderr,
4023 "Error: testctrl %s takes a single char * option\n",
4024 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004025 }
4026 break;
4027#endif
4028
drh1ffede82015-01-30 20:59:27 +00004029 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00004030 if( nArg==5 ){
mistachkin8e189222015-04-19 21:43:16 +00004031 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00004032 azArg[2],
drh8964b342015-01-29 17:54:52 +00004033 integerValue(azArg[3]),
4034 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00004035 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00004036 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004037 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00004038 }
4039 break;
4040
shaneh96887e12011-02-10 21:08:58 +00004041 case SQLITE_TESTCTRL_BITVEC_TEST:
4042 case SQLITE_TESTCTRL_FAULT_INSTALL:
4043 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
4044 case SQLITE_TESTCTRL_SCRATCHMALLOC:
4045 default:
mistachkinaae280e2015-12-31 19:06:24 +00004046 utf8_printf(stderr,
4047 "Error: CLI support for testctrl %s not implemented\n",
4048 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004049 break;
4050 }
4051 }
4052 }else
4053
drhc2ce0be2014-05-29 12:36:14 +00004054 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00004055 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004056 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00004057 }else
4058
drhc2ce0be2014-05-29 12:36:14 +00004059 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
4060 if( nArg==2 ){
4061 enableTimer = booleanValue(azArg[1]);
4062 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00004063 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00004064 enableTimer = 0;
4065 }
4066 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004067 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004068 rc = 1;
4069 }
shanehe2aa9d72009-11-06 17:20:17 +00004070 }else
4071
drhc2ce0be2014-05-29 12:36:14 +00004072 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00004073 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004074 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00004075 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004076 rc = 1;
4077 goto meta_command_exit;
4078 }
drh657b4a82015-03-19 13:30:41 +00004079 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00004080 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00004081#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00004082 if( p->traceOut==0 ){
4083 sqlite3_trace(p->db, 0, 0);
4084 }else{
4085 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
4086 }
4087#endif
4088 }else
4089
drhf442e332014-09-10 19:01:14 +00004090#if SQLITE_USER_AUTHENTICATION
4091 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
4092 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00004093 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00004094 rc = 1;
4095 goto meta_command_exit;
4096 }
drh7883ecf2014-09-11 16:19:31 +00004097 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00004098 if( strcmp(azArg[1],"login")==0 ){
4099 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00004100 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00004101 rc = 1;
4102 goto meta_command_exit;
4103 }
drhd39c40f2014-09-11 00:27:53 +00004104 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
4105 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00004106 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004107 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00004108 rc = 1;
4109 }
4110 }else if( strcmp(azArg[1],"add")==0 ){
4111 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00004112 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004113 rc = 1;
4114 goto meta_command_exit;
4115 }
drhd39c40f2014-09-11 00:27:53 +00004116 rc = sqlite3_user_add(p->db, azArg[2],
4117 azArg[3], (int)strlen(azArg[3]),
4118 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004119 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004120 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004121 rc = 1;
4122 }
4123 }else if( strcmp(azArg[1],"edit")==0 ){
4124 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00004125 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004126 rc = 1;
4127 goto meta_command_exit;
4128 }
drhd39c40f2014-09-11 00:27:53 +00004129 rc = sqlite3_user_change(p->db, azArg[2],
4130 azArg[3], (int)strlen(azArg[3]),
4131 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004132 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004133 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004134 rc = 1;
4135 }
4136 }else if( strcmp(azArg[1],"delete")==0 ){
4137 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004138 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00004139 rc = 1;
4140 goto meta_command_exit;
4141 }
4142 rc = sqlite3_user_delete(p->db, azArg[2]);
4143 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004144 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004145 rc = 1;
4146 }
4147 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004148 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00004149 rc = 1;
4150 goto meta_command_exit;
4151 }
4152 }else
4153#endif /* SQLITE_USER_AUTHENTICATION */
4154
drh9fd301b2011-06-03 13:28:22 +00004155 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004156 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00004157 sqlite3_libversion(), sqlite3_sourceid());
4158 }else
4159
drh790f2872015-11-28 18:06:36 +00004160 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
4161 const char *zDbName = nArg==2 ? azArg[1] : "main";
4162 sqlite3_vfs *pVfs;
4163 if( p->db ){
4164 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
4165 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00004166 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
4167 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4168 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4169 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00004170 }
4171 }
4172 }else
4173
drhb19e7352016-01-12 19:37:20 +00004174 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
4175 sqlite3_vfs *pVfs;
4176 sqlite3_vfs *pCurrent = 0;
4177 if( p->db ){
4178 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
4179 }
4180 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
4181 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
4182 pVfs==pCurrent ? " <--- CURRENT" : "");
4183 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4184 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4185 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
4186 if( pVfs->pNext ){
4187 raw_printf(p->out, "-----------------------------------\n");
4188 }
4189 }
4190 }else
4191
drhde60fc22011-12-14 17:53:36 +00004192 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4193 const char *zDbName = nArg==2 ? azArg[1] : "main";
4194 char *zVfsName = 0;
4195 if( p->db ){
4196 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4197 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00004198 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00004199 sqlite3_free(zVfsName);
4200 }
4201 }
4202 }else
4203
drhcef4fc82012-09-21 22:50:45 +00004204#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4205 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4206 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00004207 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00004208 }else
4209#endif
4210
drhc2ce0be2014-05-29 12:36:14 +00004211 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00004212 int j;
drh43617e92006-03-06 20:55:46 +00004213 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00004214 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00004215 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00004216 }
4217 }else
4218
4219 {
mistachkinaae280e2015-12-31 19:06:24 +00004220 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00004221 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00004222 rc = 1;
drh75897232000-05-29 14:26:00 +00004223 }
drh67505e72002-04-19 12:34:06 +00004224
drhc2ce0be2014-05-29 12:36:14 +00004225meta_command_exit:
4226 if( p->outCount ){
4227 p->outCount--;
4228 if( p->outCount==0 ) output_reset(p);
4229 }
drh67505e72002-04-19 12:34:06 +00004230 return rc;
drh75897232000-05-29 14:26:00 +00004231}
4232
drh67505e72002-04-19 12:34:06 +00004233/*
drh91a66392007-09-07 01:12:32 +00004234** Return TRUE if a semicolon occurs anywhere in the first N characters
4235** of string z[].
drh324ccef2003-02-05 14:06:20 +00004236*/
drh9f099fd2013-08-06 14:01:46 +00004237static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00004238 int i;
4239 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
4240 return 0;
drh324ccef2003-02-05 14:06:20 +00004241}
4242
4243/*
drh70c7a4b2003-04-26 03:03:06 +00004244** Test to see if a line consists entirely of whitespace.
4245*/
4246static int _all_whitespace(const char *z){
4247 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00004248 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00004249 if( *z=='/' && z[1]=='*' ){
4250 z += 2;
4251 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4252 if( *z==0 ) return 0;
4253 z++;
4254 continue;
4255 }
4256 if( *z=='-' && z[1]=='-' ){
4257 z += 2;
4258 while( *z && *z!='\n' ){ z++; }
4259 if( *z==0 ) return 1;
4260 continue;
4261 }
4262 return 0;
4263 }
4264 return 1;
4265}
4266
4267/*
drha9b17162003-04-29 18:01:28 +00004268** Return TRUE if the line typed in is an SQL command terminator other
4269** than a semi-colon. The SQL Server style "go" command is understood
4270** as is the Oracle "/".
4271*/
drh9f099fd2013-08-06 14:01:46 +00004272static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004273 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004274 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4275 return 1; /* Oracle */
4276 }
drhf0693c82011-10-11 20:41:54 +00004277 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004278 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004279 return 1; /* SQL Server */
4280 }
4281 return 0;
4282}
4283
4284/*
drh233a5312008-12-18 22:25:13 +00004285** Return true if zSql is a complete SQL statement. Return false if it
4286** ends in the middle of a string literal or C-style comment.
4287*/
drh9f099fd2013-08-06 14:01:46 +00004288static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004289 int rc;
4290 if( zSql==0 ) return 1;
4291 zSql[nSql] = ';';
4292 zSql[nSql+1] = 0;
4293 rc = sqlite3_complete(zSql);
4294 zSql[nSql] = 0;
4295 return rc;
4296}
4297
4298/*
drh67505e72002-04-19 12:34:06 +00004299** Read input from *in and process it. If *in==0 then input
4300** is interactive - the user is typing it it. Otherwise, input
4301** is coming from a file or device. A prompt is issued and history
4302** is saved only if input is interactive. An interrupt signal will
4303** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004304**
4305** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004306*/
drhdcd87a92014-08-18 13:45:42 +00004307static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004308 char *zLine = 0; /* A single input line */
4309 char *zSql = 0; /* Accumulated SQL text */
4310 int nLine; /* Length of current line */
4311 int nSql = 0; /* Bytes of zSql[] used */
4312 int nAlloc = 0; /* Allocated zSql[] space */
4313 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4314 char *zErrMsg; /* Error message returned */
4315 int rc; /* Error code */
4316 int errCnt = 0; /* Number of errors seen */
4317 int lineno = 0; /* Current line number */
4318 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004319
4320 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4321 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004322 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004323 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004324 /* End of input */
4325 if( stdin_is_interactive ) printf("\n");
4326 break;
drhc49f44e2006-10-26 18:15:42 +00004327 }
drh67505e72002-04-19 12:34:06 +00004328 if( seenInterrupt ){
4329 if( in!=0 ) break;
4330 seenInterrupt = 0;
4331 }
drhc28490c2006-10-26 14:25:58 +00004332 lineno++;
drh849a9d92013-12-21 15:46:06 +00004333 if( nSql==0 && _all_whitespace(zLine) ){
4334 if( p->echoOn ) printf("%s\n", zLine);
4335 continue;
4336 }
drh2af0b2d2002-02-21 02:25:02 +00004337 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004338 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004339 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004340 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004341 break;
4342 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004343 errCnt++;
4344 }
drhdaffd0e2001-04-11 14:28:42 +00004345 continue;
4346 }
drh9f099fd2013-08-06 14:01:46 +00004347 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004348 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004349 }
drh9f099fd2013-08-06 14:01:46 +00004350 nLine = strlen30(zLine);
4351 if( nSql+nLine+2>=nAlloc ){
4352 nAlloc = nSql+nLine+100;
4353 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004354 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004355 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004356 exit(1);
4357 }
drhdaffd0e2001-04-11 14:28:42 +00004358 }
drh9f099fd2013-08-06 14:01:46 +00004359 nSqlPrior = nSql;
4360 if( nSql==0 ){
4361 int i;
4362 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004363 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004364 memcpy(zSql, zLine+i, nLine+1-i);
4365 startline = lineno;
4366 nSql = nLine-i;
4367 }else{
4368 zSql[nSql++] = '\n';
4369 memcpy(zSql+nSql, zLine, nLine+1);
4370 nSql += nLine;
4371 }
4372 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004373 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004374 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004375 open_db(p, 0);
drh9569f602015-04-16 15:05:04 +00004376 if( p->backslashOn ) resolve_backslashes(zSql);
drh3b1a9882007-11-02 12:53:03 +00004377 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004378 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004379 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004380 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004381 char zPrefix[100];
4382 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004383 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004384 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004385 }else{
shane9bd1b442009-10-23 01:27:39 +00004386 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004387 }
drh7f953e22002-07-13 17:33:45 +00004388 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004389 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004390 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004391 zErrMsg = 0;
4392 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004393 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004394 }
drhc49f44e2006-10-26 18:15:42 +00004395 errCnt++;
drhdf12f1c2015-12-07 21:46:19 +00004396 }else if( p->countChanges ){
mistachkinaae280e2015-12-31 19:06:24 +00004397 raw_printf(p->out, "changes: %3d total_changes: %d\n",
drhdf12f1c2015-12-07 21:46:19 +00004398 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
drhdaffd0e2001-04-11 14:28:42 +00004399 }
drhdaffd0e2001-04-11 14:28:42 +00004400 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004401 if( p->outCount ){
4402 output_reset(p);
4403 p->outCount = 0;
4404 }
drh9f099fd2013-08-06 14:01:46 +00004405 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004406 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004407 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004408 }
4409 }
drh9f099fd2013-08-06 14:01:46 +00004410 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004411 if( !_all_whitespace(zSql) ){
mistachkinaae280e2015-12-31 19:06:24 +00004412 utf8_printf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004413 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004414 }
drhdaffd0e2001-04-11 14:28:42 +00004415 }
drh1f9ca2c2015-08-25 16:57:52 +00004416 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00004417 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004418 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004419}
4420
drh67505e72002-04-19 12:34:06 +00004421/*
4422** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004423** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004424*/
4425static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004426 static char *home_dir = NULL;
4427 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004428
drh4ace5362014-11-10 14:42:28 +00004429#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4430 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004431 {
4432 struct passwd *pwent;
4433 uid_t uid = getuid();
4434 if( (pwent=getpwuid(uid)) != NULL) {
4435 home_dir = pwent->pw_dir;
4436 }
drh67505e72002-04-19 12:34:06 +00004437 }
4438#endif
4439
chw65d3c132007-11-12 21:09:10 +00004440#if defined(_WIN32_WCE)
4441 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4442 */
drh85e72432012-04-11 11:38:53 +00004443 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004444#else
4445
drh83905c92012-06-21 13:00:37 +00004446#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004447 if (!home_dir) {
4448 home_dir = getenv("USERPROFILE");
4449 }
4450#endif
4451
drh67505e72002-04-19 12:34:06 +00004452 if (!home_dir) {
4453 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004454 }
4455
drh83905c92012-06-21 13:00:37 +00004456#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004457 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004458 char *zDrive, *zPath;
4459 int n;
4460 zDrive = getenv("HOMEDRIVE");
4461 zPath = getenv("HOMEPATH");
4462 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004463 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004464 home_dir = malloc( n );
4465 if( home_dir==0 ) return 0;
4466 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4467 return home_dir;
4468 }
4469 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004470 }
4471#endif
4472
chw65d3c132007-11-12 21:09:10 +00004473#endif /* !_WIN32_WCE */
4474
drh67505e72002-04-19 12:34:06 +00004475 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004476 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004477 char *z = malloc( n );
4478 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004479 home_dir = z;
4480 }
drhe98d4fa2002-04-21 19:06:22 +00004481
drh67505e72002-04-19 12:34:06 +00004482 return home_dir;
4483}
4484
4485/*
4486** Read input from the file given by sqliterc_override. Or if that
4487** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004488**
4489** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004490*/
drh534f4df2015-02-28 14:03:35 +00004491static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004492 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004493 const char *sqliterc_override /* Name of config file. NULL to use default */
4494){
persicom7e2dfdd2002-04-18 02:46:52 +00004495 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004496 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004497 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004498 FILE *in = NULL;
4499
4500 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004501 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004502 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004503 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00004504 " cannot read ~/.sqliterc\n");
4505 return;
drhe98d4fa2002-04-21 19:06:22 +00004506 }
drh2f3de322012-06-27 16:41:31 +00004507 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004508 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4509 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004510 }
drha1f9b5e2004-02-14 16:31:02 +00004511 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004512 if( in ){
drhc28490c2006-10-26 14:25:58 +00004513 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00004514 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004515 }
drh534f4df2015-02-28 14:03:35 +00004516 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004517 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004518 }
drh85e72432012-04-11 11:38:53 +00004519 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004520}
4521
drh67505e72002-04-19 12:34:06 +00004522/*
drhe1e38c42003-05-04 18:30:59 +00004523** Show available command line options
4524*/
4525static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004526 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004527 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004528 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004529 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004530 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004531 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004532 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004533 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004534 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004535#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4536 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4537#endif
drhcc3b4f82012-02-07 14:13:50 +00004538 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004539 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004540 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004541 " -line set output mode to 'line'\n"
4542 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004543 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004544 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004545#ifdef SQLITE_ENABLE_MULTIPLEX
4546 " -multiplex enable the multiplexor VFS\n"
4547#endif
mistachkine0d68852014-12-11 03:12:33 +00004548 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004549 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004550 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4551 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004552 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004553 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004554 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004555 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004556#ifdef SQLITE_ENABLE_VFSTRACE
4557 " -vfstrace enable tracing of all VFS calls\n"
4558#endif
drhe1e38c42003-05-04 18:30:59 +00004559;
4560static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00004561 utf8_printf(stderr,
drh80e8be92006-08-29 12:04:19 +00004562 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4563 "FILENAME is the name of an SQLite database. A new database is created\n"
4564 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004565 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00004566 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004567 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004568 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00004569 }
4570 exit(1);
4571}
4572
4573/*
drh67505e72002-04-19 12:34:06 +00004574** Initialize the state information in data
4575*/
drhdcd87a92014-08-18 13:45:42 +00004576static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004577 memset(data, 0, sizeof(*data));
4578 data->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00004579 memcpy(data->colSeparator,SEP_Column, 2);
4580 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004581 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004582 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004583 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004584 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004585 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004586 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4587 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004588}
4589
drh98d312f2012-10-25 15:23:14 +00004590/*
drh5c7976f2014-02-10 19:59:27 +00004591** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004592*/
4593#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004594static void printBold(const char *zText){
4595 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4596 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4597 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4598 SetConsoleTextAttribute(out,
4599 FOREGROUND_RED|FOREGROUND_INTENSITY
4600 );
4601 printf("%s", zText);
4602 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004603}
4604#else
drh5c7976f2014-02-10 19:59:27 +00004605static void printBold(const char *zText){
4606 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004607}
4608#endif
4609
4610/*
drh98d312f2012-10-25 15:23:14 +00004611** Get the argument to an --option. Throw an error and die if no argument
4612** is available.
4613*/
4614static char *cmdline_option_value(int argc, char **argv, int i){
4615 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00004616 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00004617 argv[0], argv[argc-1]);
4618 exit(1);
4619 }
4620 return argv[i];
4621}
4622
mistachkin44723ce2015-03-21 02:22:37 +00004623int SQLITE_CDECL main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004624 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004625 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004626 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004627 int i;
drhc28490c2006-10-26 14:25:58 +00004628 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004629 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004630 int readStdin = 1;
4631 int nCmd = 0;
4632 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004633
drh69b30ab2014-02-27 15:11:52 +00004634#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004635 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004636 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00004637 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4638 exit(1);
4639 }
drhc7181902014-02-27 15:04:13 +00004640#endif
drh047d4532015-01-18 20:30:23 +00004641 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00004642 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00004643 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004644 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004645 stdin_is_interactive = isatty(0);
drhe05461c2015-12-30 13:36:57 +00004646 stdout_is_console = isatty(1);
persicom7e2dfdd2002-04-18 02:46:52 +00004647
drh44c2eb12003-04-30 11:38:26 +00004648 /* Make sure we have a valid signal handler early, before anything
4649 ** else is done.
4650 */
drh4c504392000-10-16 22:06:40 +00004651#ifdef SIGINT
4652 signal(SIGINT, interrupt_handler);
4653#endif
drh44c2eb12003-04-30 11:38:26 +00004654
drhac5649a2014-11-28 13:35:03 +00004655#ifdef SQLITE_SHELL_DBNAME_PROC
4656 {
4657 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4658 ** of a C-function that will provide the name of the database file. Use
4659 ** this compile-time option to embed this shell program in larger
4660 ** applications. */
4661 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4662 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4663 warnInmemoryDb = 0;
4664 }
4665#endif
4666
drh22fbcb82004-02-01 01:22:50 +00004667 /* Do an initial pass through the command-line argument to locate
4668 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004669 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004670 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004671 */
drh98d312f2012-10-25 15:23:14 +00004672 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004673 char *z;
drhc28490c2006-10-26 14:25:58 +00004674 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004675 if( z[0]!='-' ){
4676 if( data.zDbFilename==0 ){
4677 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004678 }else{
4679 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4680 ** mean that nothing is read from stdin */
4681 readStdin = 0;
4682 nCmd++;
4683 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4684 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004685 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00004686 exit(1);
4687 }
4688 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004689 }
drh98d312f2012-10-25 15:23:14 +00004690 }
drhcc3b4f82012-02-07 14:13:50 +00004691 if( z[1]=='-' ) z++;
4692 if( strcmp(z,"-separator")==0
4693 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004694 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004695 || strcmp(z,"-cmd")==0
4696 ){
drh98d312f2012-10-25 15:23:14 +00004697 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004698 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004699 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004700 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004701 /* Need to check for batch mode here to so we can avoid printing
4702 ** informational messages (like from process_sqliterc) before
4703 ** we do the actual processing of arguments later in a second pass.
4704 */
shanef69573d2009-10-24 02:06:14 +00004705 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004706 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004707#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004708 const char *zSize;
4709 sqlite3_int64 szHeap;
4710
drh98d312f2012-10-25 15:23:14 +00004711 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004712 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004713 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004714 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4715#endif
drh44dec872014-08-30 15:49:25 +00004716 }else if( strcmp(z,"-scratch")==0 ){
4717 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004718 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004719 if( sz>400000 ) sz = 400000;
4720 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004721 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004722 if( n>10 ) n = 10;
4723 if( n<1 ) n = 1;
4724 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4725 data.shellFlgs |= SHFLG_Scratch;
4726 }else if( strcmp(z,"-pagecache")==0 ){
4727 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004728 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004729 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00004730 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004731 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00004732 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
4733 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00004734 data.shellFlgs |= SHFLG_Pagecache;
4735 }else if( strcmp(z,"-lookaside")==0 ){
4736 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004737 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004738 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004739 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004740 if( n<0 ) n = 0;
4741 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4742 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004743#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004744 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004745 extern int vfstrace_register(
4746 const char *zTraceName,
4747 const char *zOldVfsName,
4748 int (*xOut)(const char*,void*),
4749 void *pOutArg,
4750 int makeDefault
4751 );
drh2b625e22011-03-16 17:05:28 +00004752 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004753#endif
drh6f25e892011-07-08 17:02:57 +00004754#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004755 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004756 extern int sqlite3_multiple_initialize(const char*,int);
4757 sqlite3_multiplex_initialize(0, 1);
4758#endif
drh7d9f3942013-04-03 01:26:54 +00004759 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004760 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4761 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004762 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004763 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004764 if( pVfs ){
4765 sqlite3_vfs_register(pVfs, 1);
4766 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004767 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00004768 exit(1);
4769 }
drh44c2eb12003-04-30 11:38:26 +00004770 }
4771 }
drh98d312f2012-10-25 15:23:14 +00004772 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004773#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004774 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004775 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004776#else
mistachkinaae280e2015-12-31 19:06:24 +00004777 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00004778 return 1;
drh01b41712005-08-29 23:06:23 +00004779#endif
drh98d312f2012-10-25 15:23:14 +00004780 }
4781 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004782
drh44c2eb12003-04-30 11:38:26 +00004783 /* Go ahead and open the database file if it already exists. If the
4784 ** file does not exist, delay opening it. This prevents empty database
4785 ** files from being created if a user mistypes the database name argument
4786 ** to the sqlite command-line tool.
4787 */
drhc8d74412004-08-31 23:41:26 +00004788 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004789 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004790 }
4791
drh22fbcb82004-02-01 01:22:50 +00004792 /* Process the initialization file if there is one. If no -init option
4793 ** is given on the command line, look for a file named ~/.sqliterc and
4794 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004795 */
drh534f4df2015-02-28 14:03:35 +00004796 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00004797
drh22fbcb82004-02-01 01:22:50 +00004798 /* Make a second pass through the command-line argument and set
4799 ** options. This second pass is delayed until after the initialization
4800 ** file is processed so that the command-line arguments will override
4801 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004802 */
drh98d312f2012-10-25 15:23:14 +00004803 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004804 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004805 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004806 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004807 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004808 i++;
4809 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004810 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004811 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004812 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004813 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004814 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004815 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004816 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004817 }else if( strcmp(z,"-csv")==0 ){
4818 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004819 memcpy(data.colSeparator,",",2);
4820 }else if( strcmp(z,"-ascii")==0 ){
4821 data.mode = MODE_Ascii;
4822 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004823 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00004824 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004825 SEP_Record);
mistachkine0d68852014-12-11 03:12:33 +00004826 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004827 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4828 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004829 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00004830 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00004831 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004832 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00004833 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00004834 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004835 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004836 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004837 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004838 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004839 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004840 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004841 }else if( strcmp(z,"-eqp")==0 ){
4842 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004843 }else if( strcmp(z,"-stats")==0 ){
4844 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004845 }else if( strcmp(z,"-scanstats")==0 ){
4846 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00004847 }else if( strcmp(z,"-backslash")==0 ){
4848 /* Undocumented command-line option: -backslash
4849 ** Causes C-style backslash escapes to be evaluated in SQL statements
4850 ** prior to sending the SQL into SQLite. Useful for injecting
4851 ** crazy bytes in the middle of SQL statements for testing and debugging.
4852 */
4853 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004854 }else if( strcmp(z,"-bail")==0 ){
4855 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004856 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004857 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004858 return 0;
drhc28490c2006-10-26 14:25:58 +00004859 }else if( strcmp(z,"-interactive")==0 ){
4860 stdin_is_interactive = 1;
4861 }else if( strcmp(z,"-batch")==0 ){
4862 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004863 }else if( strcmp(z,"-heap")==0 ){
4864 i++;
drh44dec872014-08-30 15:49:25 +00004865 }else if( strcmp(z,"-scratch")==0 ){
4866 i+=2;
4867 }else if( strcmp(z,"-pagecache")==0 ){
4868 i+=2;
4869 }else if( strcmp(z,"-lookaside")==0 ){
4870 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004871 }else if( strcmp(z,"-mmap")==0 ){
4872 i++;
drha7e61d82011-03-12 17:02:57 +00004873 }else if( strcmp(z,"-vfs")==0 ){
4874 i++;
drh6f25e892011-07-08 17:02:57 +00004875#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004876 }else if( strcmp(z,"-vfstrace")==0 ){
4877 i++;
drh6f25e892011-07-08 17:02:57 +00004878#endif
4879#ifdef SQLITE_ENABLE_MULTIPLEX
4880 }else if( strcmp(z,"-multiplex")==0 ){
4881 i++;
4882#endif
drhcc3b4f82012-02-07 14:13:50 +00004883 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004884 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004885 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004886 /* Run commands that follow -cmd first and separately from commands
4887 ** that simply appear on the command-line. This seems goofy. It would
4888 ** be better if all commands ran in the order that they appear. But
4889 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004890 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004891 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004892 if( z[0]=='.' ){
4893 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004894 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004895 }else{
drh05782482013-10-24 15:20:20 +00004896 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004897 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4898 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004899 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00004900 if( bail_on_error ) return rc!=0 ? rc : 1;
4901 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004902 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00004903 if( bail_on_error ) return rc;
4904 }
4905 }
drh1e5d0e92000-05-31 23:33:17 +00004906 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004907 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
4908 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004909 return 1;
4910 }
4911 }
drh44c2eb12003-04-30 11:38:26 +00004912
drhac5649a2014-11-28 13:35:03 +00004913 if( !readStdin ){
4914 /* Run all arguments that do not begin with '-' as if they were separate
4915 ** command-line inputs, except for the argToSkip argument which contains
4916 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004917 */
drhac5649a2014-11-28 13:35:03 +00004918 for(i=0; i<nCmd; i++){
4919 if( azCmd[i][0]=='.' ){
4920 rc = do_meta_command(azCmd[i], &data);
4921 if( rc ) return rc==2 ? 0 : rc;
4922 }else{
4923 open_db(&data, 0);
4924 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4925 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004926 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00004927 return rc!=0 ? rc : 1;
4928 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004929 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00004930 return rc;
4931 }
drh6ff13852001-11-25 13:18:23 +00004932 }
drh75897232000-05-29 14:26:00 +00004933 }
drhac5649a2014-11-28 13:35:03 +00004934 free(azCmd);
drh75897232000-05-29 14:26:00 +00004935 }else{
drh44c2eb12003-04-30 11:38:26 +00004936 /* Run commands received from standard input
4937 */
drhc28490c2006-10-26 14:25:58 +00004938 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004939 char *zHome;
4940 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004941 int nHistory;
drh75897232000-05-29 14:26:00 +00004942 printf(
drh743e0032011-12-12 16:51:50 +00004943 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004944 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004945 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004946 );
drhb3735912014-02-10 16:13:42 +00004947 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004948 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004949 printBold("transient in-memory database");
4950 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004951 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004952 }
drh67505e72002-04-19 12:34:06 +00004953 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004954 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004955 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004956 if( (zHistory = malloc(nHistory))!=0 ){
4957 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4958 }
drh67505e72002-04-19 12:34:06 +00004959 }
drhf5ed7ad2015-06-15 14:43:25 +00004960 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00004961 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004962 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00004963 shell_stifle_history(100);
4964 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004965 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004966 }
drhdaffd0e2001-04-11 14:28:42 +00004967 }else{
drhc28490c2006-10-26 14:25:58 +00004968 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004969 }
4970 }
drh33048c02001-10-01 14:29:22 +00004971 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004972 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004973 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004974 }
drh05782482013-10-24 15:20:20 +00004975 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004976 return rc;
drh75897232000-05-29 14:26:00 +00004977}