blob: a6d75176c258a0a50fbd5431fa5802cc9f2f4513 [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);
drhf075cd02007-02-28 06:14:25 +0000385 fprintf(iotrace, "%s", z);
386 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);
551 if( stdout_is_console && out==stdout ){
552 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}
563#else
564# define utf8_printf fprintf
565#endif
566
567/*
drhdcd87a92014-08-18 13:45:42 +0000568** Shell output mode information from before ".explain on",
569** saved so that it can be restored by ".explain off"
570*/
571typedef struct SavedModeInfo SavedModeInfo;
572struct SavedModeInfo {
573 int valid; /* Is there legit data in here? */
574 int mode; /* Mode prior to ".explain on" */
575 int showHeader; /* The ".header" setting prior to ".explain on" */
576 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000577};
drh45e29d82006-11-20 16:21:10 +0000578
drh8e7e7a22000-05-30 18:45:23 +0000579/*
drhdcd87a92014-08-18 13:45:42 +0000580** State information about the database connection is contained in an
581** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000582*/
drhdcd87a92014-08-18 13:45:42 +0000583typedef struct ShellState ShellState;
584struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000585 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000586 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000587 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000588 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000589 int scanstatsOn; /* True to display scan stats before each finalize */
drhdf12f1c2015-12-07 21:46:19 +0000590 int countChanges; /* True to display change counts */
drh9569f602015-04-16 15:05:04 +0000591 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +0000592 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000593 int cnt; /* Number of records displayed so far */
594 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000595 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000596 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000597 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000598 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000599 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000600 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000601 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000602 char colSeparator[20]; /* Column separator character for several modes */
603 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000604 int colWidth[100]; /* Requested width of each column when in column mode*/
605 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +0000606 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +0000607 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000608 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000609 char outfile[FILENAME_MAX]; /* Filename for *out */
610 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000611 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000612 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000613 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000614 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000615 int *aiIndent; /* Array of indents used in MODE_Explain */
616 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000617 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000618};
619
620/*
drh44dec872014-08-30 15:49:25 +0000621** These are the allowed shellFlgs values
622*/
623#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
624#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
625#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
626
627/*
drh75897232000-05-29 14:26:00 +0000628** These are the allowed modes.
629*/
drh967e8b72000-06-21 13:59:10 +0000630#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000631#define MODE_Column 1 /* One record per line in neat columns */
632#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000633#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
634#define MODE_Html 4 /* Generate an XHTML table */
635#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000636#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000637#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000638#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000639#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000640
drh66ce4d02008-02-15 17:38:06 +0000641static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000642 "line",
643 "column",
644 "list",
645 "semi",
646 "html",
drhfeac5f82004-08-01 00:10:45 +0000647 "insert",
648 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000649 "csv",
drh66ce4d02008-02-15 17:38:06 +0000650 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000651 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000652};
drh75897232000-05-29 14:26:00 +0000653
654/*
mistachkinfad42082014-07-24 22:13:12 +0000655** These are the column/row/line separators used by the various
656** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +0000657*/
mistachkinfad42082014-07-24 22:13:12 +0000658#define SEP_Column "|"
659#define SEP_Row "\n"
660#define SEP_Tab "\t"
661#define SEP_Space " "
662#define SEP_Comma ","
663#define SEP_CrLf "\r\n"
664#define SEP_Unit "\x1F"
665#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +0000666
667/*
drh75897232000-05-29 14:26:00 +0000668** Number of elements in an array
669*/
drh902b9ee2008-12-05 17:17:07 +0000670#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000671
672/*
drh127f9d72010-02-23 01:47:00 +0000673** A callback for the sqlite3_log() interface.
674*/
675static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000676 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000677 if( p->pLog==0 ) return;
678 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
679 fflush(p->pLog);
680}
681
682/*
shane626a6e42009-10-22 17:30:15 +0000683** Output the given string as a hex-encoded blob (eg. X'1234' )
684*/
685static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
686 int i;
687 char *zBlob = (char *)pBlob;
688 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000689 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000690 fprintf(out,"'");
691}
692
693/*
drh28bd4bc2000-06-15 15:57:22 +0000694** Output the given string as a quoted string using SQL quoting conventions.
695*/
696static void output_quoted_string(FILE *out, const char *z){
697 int i;
698 int nSingle = 0;
drh047d4532015-01-18 20:30:23 +0000699 setBinaryMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000700 for(i=0; z[i]; i++){
701 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000702 }
703 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +0000704 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000705 }else{
706 fprintf(out,"'");
707 while( *z ){
708 for(i=0; z[i] && z[i]!='\''; i++){}
709 if( i==0 ){
710 fprintf(out,"''");
711 z++;
712 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +0000713 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +0000714 z += i+1;
715 }else{
drhe05461c2015-12-30 13:36:57 +0000716 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000717 break;
718 }
719 }
drhcd7d2732002-02-26 23:24:26 +0000720 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000721 }
drh047d4532015-01-18 20:30:23 +0000722 setTextMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000723}
724
725/*
drhfeac5f82004-08-01 00:10:45 +0000726** Output the given string as a quoted according to C or TCL quoting rules.
727*/
728static void output_c_string(FILE *out, const char *z){
729 unsigned int c;
730 fputc('"', out);
731 while( (c = *(z++))!=0 ){
732 if( c=='\\' ){
733 fputc(c, out);
734 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000735 }else if( c=='"' ){
736 fputc('\\', out);
737 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000738 }else if( c=='\t' ){
739 fputc('\\', out);
740 fputc('t', out);
741 }else if( c=='\n' ){
742 fputc('\\', out);
743 fputc('n', out);
744 }else if( c=='\r' ){
745 fputc('\\', out);
746 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000747 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000748 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000749 }else{
750 fputc(c, out);
751 }
752 }
753 fputc('"', out);
754}
755
756/*
drhc08a4f12000-06-15 16:49:48 +0000757** Output the given string with characters that are special to
758** HTML escaped.
759*/
760static void output_html_string(FILE *out, const char *z){
761 int i;
drhc3d6ba42014-01-13 20:38:35 +0000762 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000763 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000764 for(i=0; z[i]
765 && z[i]!='<'
766 && z[i]!='&'
767 && z[i]!='>'
768 && z[i]!='\"'
769 && z[i]!='\'';
770 i++){}
drhc08a4f12000-06-15 16:49:48 +0000771 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +0000772 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +0000773 }
774 if( z[i]=='<' ){
775 fprintf(out,"&lt;");
776 }else if( z[i]=='&' ){
777 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000778 }else if( z[i]=='>' ){
779 fprintf(out,"&gt;");
780 }else if( z[i]=='\"' ){
781 fprintf(out,"&quot;");
782 }else if( z[i]=='\'' ){
783 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000784 }else{
785 break;
786 }
787 z += i + 1;
788 }
789}
790
791/*
drhc49f44e2006-10-26 18:15:42 +0000792** If a field contains any character identified by a 1 in the following
793** array, then the string must be quoted for CSV.
794*/
795static const char needCsvQuote[] = {
796 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
797 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
798 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
799 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
800 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
801 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
802 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
803 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
807 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
808 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
809 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
810 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
811 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
812};
813
814/*
mistachkindd11f2d2014-12-11 04:49:46 +0000815** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +0000816** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +0000817** the null value. Strings are quoted if necessary. The separator
818** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000819*/
drhdcd87a92014-08-18 13:45:42 +0000820static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000821 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000822 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +0000823 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +0000824 }else{
drhc49f44e2006-10-26 18:15:42 +0000825 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000826 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000827 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000828 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000829 || (z[i]==p->colSeparator[0] &&
830 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000831 i = 0;
832 break;
833 }
834 }
835 if( i==0 ){
836 putc('"', out);
837 for(i=0; z[i]; i++){
838 if( z[i]=='"' ) putc('"', out);
839 putc(z[i], out);
840 }
841 putc('"', out);
842 }else{
drhe05461c2015-12-30 13:36:57 +0000843 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +0000844 }
drh8e64d1c2004-10-07 00:32:39 +0000845 }
846 if( bSep ){
drhe05461c2015-12-30 13:36:57 +0000847 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000848 }
849}
850
danielk19774af00c62005-01-23 23:43:21 +0000851#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000852/*
drh4c504392000-10-16 22:06:40 +0000853** This routine runs when the user presses Ctrl-C
854*/
855static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000856 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000857 seenInterrupt++;
858 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +0000859 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +0000860}
danielk19774af00c62005-01-23 23:43:21 +0000861#endif
drh4c504392000-10-16 22:06:40 +0000862
863/*
shane626a6e42009-10-22 17:30:15 +0000864** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000865** invokes for each row of a query result.
866*/
drh4ace5362014-11-10 14:42:28 +0000867static int shell_callback(
868 void *pArg,
869 int nArg, /* Number of result columns */
870 char **azArg, /* Text of each result column */
871 char **azCol, /* Column names */
872 int *aiType /* Column types */
873){
drh75897232000-05-29 14:26:00 +0000874 int i;
drhdcd87a92014-08-18 13:45:42 +0000875 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000876
drh75897232000-05-29 14:26:00 +0000877 switch( p->mode ){
878 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000879 int w = 5;
drh6a535342001-10-19 16:44:56 +0000880 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000881 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000882 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000883 if( len>w ) w = len;
884 }
drhe05461c2015-12-30 13:36:57 +0000885 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000886 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +0000887 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +0000888 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000889 }
890 break;
891 }
danielk19770d78bae2008-01-03 07:09:48 +0000892 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000893 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000894 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000895 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000896 int w, n;
897 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000898 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000899 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000900 w = 0;
drh75897232000-05-29 14:26:00 +0000901 }
drh078b1fd2012-09-21 13:40:02 +0000902 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000903 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000904 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +0000905 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +0000906 if( w<n ) w = n;
907 }
908 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000909 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000910 }
911 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000912 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000913 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000914 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000915 }else{
drhe05461c2015-12-30 13:36:57 +0000916 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000917 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000918 }
drha0c66f52000-07-29 13:20:21 +0000919 }
920 }
921 if( p->showHeader ){
922 for(i=0; i<nArg; i++){
923 int w;
924 if( i<ArraySize(p->actualWidth) ){
925 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000926 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000927 }else{
928 w = 10;
929 }
drhe05461c2015-12-30 13:36:57 +0000930 fprintf(p->out,"%-*.*s%s",w,w,
931 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +0000932 "----------------------------------------------------------",
mistachkin636bf9f2014-07-19 20:15:16 +0000933 i==nArg-1 ? p->rowSeparator : " ");
drha0c66f52000-07-29 13:20:21 +0000934 }
drh75897232000-05-29 14:26:00 +0000935 }
936 }
drh6a535342001-10-19 16:44:56 +0000937 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000938 for(i=0; i<nArg; i++){
939 int w;
drha0c66f52000-07-29 13:20:21 +0000940 if( i<ArraySize(p->actualWidth) ){
941 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000942 }else{
943 w = 10;
944 }
dana98bf362013-11-13 18:35:01 +0000945 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000946 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000947 }
dana98bf362013-11-13 18:35:01 +0000948 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000949 if( p->iIndent<p->nIndent ){
950 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000951 }
danc4650bb2013-11-18 08:41:06 +0000952 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000953 }
drh078b1fd2012-09-21 13:40:02 +0000954 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000955 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +0000956 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000957 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000958 }else{
drhe05461c2015-12-30 13:36:57 +0000959 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +0000960 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000961 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000962 }
drh75897232000-05-29 14:26:00 +0000963 }
964 break;
965 }
drhe3710332000-09-29 13:30:53 +0000966 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000967 case MODE_List: {
968 if( p->cnt++==0 && p->showHeader ){
969 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +0000970 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +0000971 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +0000972 }
973 }
drh6a535342001-10-19 16:44:56 +0000974 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000975 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000976 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +0000977 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +0000978 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000979 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +0000980 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +0000981 }else if( p->mode==MODE_Semi ){
drhe05461c2015-12-30 13:36:57 +0000982 utf8_printf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000983 }else{
drhe05461c2015-12-30 13:36:57 +0000984 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000985 }
drh75897232000-05-29 14:26:00 +0000986 }
987 break;
988 }
drh1e5d0e92000-05-31 23:33:17 +0000989 case MODE_Html: {
990 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000991 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000992 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000993 fprintf(p->out,"<TH>");
994 output_html_string(p->out, azCol[i]);
995 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000996 }
mihailim57c591a2008-06-23 21:26:05 +0000997 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000998 }
drh6a535342001-10-19 16:44:56 +0000999 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +00001000 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001001 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +00001002 fprintf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001003 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mihailim57c591a2008-06-23 21:26:05 +00001004 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001005 }
mihailim57c591a2008-06-23 21:26:05 +00001006 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001007 break;
1008 }
drhfeac5f82004-08-01 00:10:45 +00001009 case MODE_Tcl: {
1010 if( p->cnt++==0 && p->showHeader ){
1011 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001012 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001013 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001014 }
drhe05461c2015-12-30 13:36:57 +00001015 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001016 }
1017 if( azArg==0 ) break;
1018 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001019 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001020 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001021 }
drhe05461c2015-12-30 13:36:57 +00001022 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001023 break;
1024 }
drh8e64d1c2004-10-07 00:32:39 +00001025 case MODE_Csv: {
drh047d4532015-01-18 20:30:23 +00001026 setBinaryMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001027 if( p->cnt++==0 && p->showHeader ){
1028 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001029 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001030 }
drhe05461c2015-12-30 13:36:57 +00001031 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001032 }
drh40253262014-10-17 21:35:05 +00001033 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001034 for(i=0; i<nArg; i++){
1035 output_csv(p, azArg[i], i<nArg-1);
1036 }
drhe05461c2015-12-30 13:36:57 +00001037 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001038 }
drh047d4532015-01-18 20:30:23 +00001039 setTextMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001040 break;
1041 }
drh28bd4bc2000-06-15 15:57:22 +00001042 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +00001043 p->cnt++;
drh6a535342001-10-19 16:44:56 +00001044 if( azArg==0 ) break;
drhe05461c2015-12-30 13:36:57 +00001045 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
mistachkin151c75a2015-04-07 21:16:40 +00001046 if( p->showHeader ){
1047 fprintf(p->out,"(");
1048 for(i=0; i<nArg; i++){
1049 char *zSep = i>0 ? ",": "";
drhe05461c2015-12-30 13:36:57 +00001050 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
mistachkin151c75a2015-04-07 21:16:40 +00001051 }
1052 fprintf(p->out,")");
1053 }
1054 fprintf(p->out," VALUES(");
drh28bd4bc2000-06-15 15:57:22 +00001055 for(i=0; i<nArg; i++){
1056 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00001057 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +00001058 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00001059 }else if( aiType && aiType[i]==SQLITE_TEXT ){
1060 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1061 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001062 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1063 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00001064 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00001065 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1066 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1067 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1068 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1069 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00001070 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00001071 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00001072 }else{
1073 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1074 output_quoted_string(p->out, azArg[i]);
1075 }
1076 }
1077 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001078 break;
drh28bd4bc2000-06-15 15:57:22 +00001079 }
mistachkin636bf9f2014-07-19 20:15:16 +00001080 case MODE_Ascii: {
1081 if( p->cnt++==0 && p->showHeader ){
1082 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001083 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1084 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00001085 }
drhe05461c2015-12-30 13:36:57 +00001086 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001087 }
1088 if( azArg==0 ) break;
1089 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001090 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1091 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00001092 }
drhe05461c2015-12-30 13:36:57 +00001093 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001094 break;
1095 }
persicom1d0b8722002-04-18 02:53:04 +00001096 }
drh75897232000-05-29 14:26:00 +00001097 return 0;
1098}
1099
1100/*
shane626a6e42009-10-22 17:30:15 +00001101** This is the callback routine that the SQLite library
1102** invokes for each row of a query result.
1103*/
1104static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1105 /* since we don't have type info, call the shell_callback with a NULL value */
1106 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1107}
1108
1109/*
drhdcd87a92014-08-18 13:45:42 +00001110** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00001111** the name of the table given. Escape any quote characters in the
1112** table name.
1113*/
drhdcd87a92014-08-18 13:45:42 +00001114static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00001115 int i, n;
1116 int needQuote;
1117 char *z;
1118
1119 if( p->zDestTable ){
1120 free(p->zDestTable);
1121 p->zDestTable = 0;
1122 }
1123 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001124 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001125 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001126 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001127 needQuote = 1;
1128 if( zName[i]=='\'' ) n++;
1129 }
1130 }
1131 if( needQuote ) n += 2;
1132 z = p->zDestTable = malloc( n+1 );
1133 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +00001134 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00001135 exit(1);
1136 }
1137 n = 0;
1138 if( needQuote ) z[n++] = '\'';
1139 for(i=0; zName[i]; i++){
1140 z[n++] = zName[i];
1141 if( zName[i]=='\'' ) z[n++] = '\'';
1142 }
1143 if( needQuote ) z[n++] = '\'';
1144 z[n] = 0;
1145}
1146
danielk19772a02e332004-06-05 08:04:36 +00001147/* zIn is either a pointer to a NULL-terminated string in memory obtained
1148** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1149** added to zIn, and the result returned in memory obtained from malloc().
1150** zIn, if it was not NULL, is freed.
1151**
1152** If the third argument, quote, is not '\0', then it is used as a
1153** quote character for zAppend.
1154*/
drhc28490c2006-10-26 14:25:58 +00001155static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001156 int len;
1157 int i;
drh4f21c4a2008-12-10 22:15:00 +00001158 int nAppend = strlen30(zAppend);
1159 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001160
1161 len = nAppend+nIn+1;
1162 if( quote ){
1163 len += 2;
1164 for(i=0; i<nAppend; i++){
1165 if( zAppend[i]==quote ) len++;
1166 }
1167 }
1168
1169 zIn = (char *)realloc(zIn, len);
1170 if( !zIn ){
1171 return 0;
1172 }
1173
1174 if( quote ){
1175 char *zCsr = &zIn[nIn];
1176 *zCsr++ = quote;
1177 for(i=0; i<nAppend; i++){
1178 *zCsr++ = zAppend[i];
1179 if( zAppend[i]==quote ) *zCsr++ = quote;
1180 }
1181 *zCsr++ = quote;
1182 *zCsr++ = '\0';
1183 assert( (zCsr-zIn)==len );
1184 }else{
1185 memcpy(&zIn[nIn], zAppend, nAppend);
1186 zIn[len-1] = '\0';
1187 }
1188
1189 return zIn;
1190}
1191
drhdd3d4592004-08-30 01:54:05 +00001192
1193/*
drhb21a8e42012-01-28 21:08:51 +00001194** Execute a query statement that will generate SQL output. Print
1195** the result columns, comma-separated, on a line and then add a
1196** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001197**
drhb21a8e42012-01-28 21:08:51 +00001198** If the number of columns is 1 and that column contains text "--"
1199** then write the semicolon on a separate line. That way, if a
1200** "--" comment occurs at the end of the statement, the comment
1201** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001202*/
drh157e29a2009-05-21 15:15:00 +00001203static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001204 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001205 const char *zSelect, /* SELECT statement to extract content */
1206 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001207){
drhdd3d4592004-08-30 01:54:05 +00001208 sqlite3_stmt *pSelect;
1209 int rc;
drhb21a8e42012-01-28 21:08:51 +00001210 int nResult;
1211 int i;
1212 const char *z;
drhc7181902014-02-27 15:04:13 +00001213 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001214 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001215 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001216 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001217 return rc;
1218 }
1219 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001220 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001221 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001222 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00001223 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001224 zFirstRow = 0;
1225 }
drhb21a8e42012-01-28 21:08:51 +00001226 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00001227 utf8_printf(p->out, "%s", z);
drhb21a8e42012-01-28 21:08:51 +00001228 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00001229 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00001230 }
1231 if( z==0 ) z = "";
1232 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1233 if( z[0] ){
1234 fprintf(p->out, "\n;\n");
1235 }else{
1236 fprintf(p->out, ";\n");
1237 }
drhdd3d4592004-08-30 01:54:05 +00001238 rc = sqlite3_step(pSelect);
1239 }
drh2f464a02011-10-13 00:41:49 +00001240 rc = sqlite3_finalize(pSelect);
1241 if( rc!=SQLITE_OK ){
1242 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001243 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001244 }
1245 return rc;
drhdd3d4592004-08-30 01:54:05 +00001246}
1247
shane626a6e42009-10-22 17:30:15 +00001248/*
1249** Allocate space and save off current error string.
1250*/
1251static char *save_err_msg(
1252 sqlite3 *db /* Database to query */
1253){
1254 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00001255 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00001256 if( zErrMsg ){
1257 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1258 }
1259 return zErrMsg;
1260}
1261
1262/*
shaneh642d8b82010-07-28 16:05:34 +00001263** Display memory stats.
1264*/
1265static int display_stats(
1266 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001267 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001268 int bReset /* True to reset the stats */
1269){
1270 int iCur;
1271 int iHiwtr;
1272
1273 if( pArg && pArg->out ){
1274
1275 iHiwtr = iCur = -1;
1276 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001277 fprintf(pArg->out,
1278 "Memory Used: %d (max %d) bytes\n",
1279 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001280 iHiwtr = iCur = -1;
1281 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001282 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
1283 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001284 if( pArg->shellFlgs & SHFLG_Pagecache ){
1285 iHiwtr = iCur = -1;
1286 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001287 fprintf(pArg->out,
1288 "Number of Pcache Pages Used: %d (max %d) pages\n",
1289 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001290 }
shaneh642d8b82010-07-28 16:05:34 +00001291 iHiwtr = iCur = -1;
1292 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001293 fprintf(pArg->out,
1294 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1295 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001296 if( pArg->shellFlgs & SHFLG_Scratch ){
1297 iHiwtr = iCur = -1;
1298 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001299 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n",
1300 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001301 }
shaneh642d8b82010-07-28 16:05:34 +00001302 iHiwtr = iCur = -1;
1303 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001304 fprintf(pArg->out,
1305 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1306 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001307 iHiwtr = iCur = -1;
1308 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001309 fprintf(pArg->out, "Largest Allocation: %d bytes\n",
1310 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001311 iHiwtr = iCur = -1;
1312 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001313 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
1314 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001315 iHiwtr = iCur = -1;
1316 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001317 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
1318 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001319#ifdef YYTRACKMAXSTACKDEPTH
1320 iHiwtr = iCur = -1;
1321 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001322 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
1323 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001324#endif
1325 }
1326
1327 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001328 if( pArg->shellFlgs & SHFLG_Lookaside ){
1329 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001330 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1331 &iCur, &iHiwtr, bReset);
1332 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n",
1333 iCur, iHiwtr);
1334 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1335 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001336 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001337 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1338 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001339 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001340 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1341 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001342 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1343 }
shaneh642d8b82010-07-28 16:05:34 +00001344 iHiwtr = iCur = -1;
1345 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001346 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n",iCur);
1347 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001348 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1349 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1350 iHiwtr = iCur = -1;
1351 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1352 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001353 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001354 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1355 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1356 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001357 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001358 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001359 iHiwtr = iCur = -1;
1360 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001361 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001362 }
1363
1364 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001365 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1366 bReset);
shaneh642d8b82010-07-28 16:05:34 +00001367 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1368 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1369 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001370 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
shaneh642d8b82010-07-28 16:05:34 +00001371 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001372 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1373 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001374 }
1375
dan5a790282015-08-07 20:06:14 +00001376 /* Do not remove this machine readable comment: extra-stats-output-here */
1377
shaneh642d8b82010-07-28 16:05:34 +00001378 return 0;
1379}
1380
1381/*
dan8d1edb92014-11-05 09:07:28 +00001382** Display scan stats.
1383*/
1384static void display_scanstats(
1385 sqlite3 *db, /* Database to query */
1386 ShellState *pArg /* Pointer to ShellState */
1387){
drhf5ed7ad2015-06-15 14:43:25 +00001388#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1389 UNUSED_PARAMETER(db);
1390 UNUSED_PARAMETER(pArg);
1391#else
drh15f23c22014-11-06 12:46:16 +00001392 int i, k, n, mx;
dan8d1edb92014-11-05 09:07:28 +00001393 fprintf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001394 mx = 0;
1395 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001396 double rEstLoop = 1.0;
1397 for(i=n=0; 1; i++){
1398 sqlite3_stmt *p = pArg->pStmt;
1399 sqlite3_int64 nLoop, nVisit;
1400 double rEst;
1401 int iSid;
1402 const char *zExplain;
1403 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1404 break;
1405 }
1406 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001407 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001408 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001409 if( n==0 ){
1410 rEstLoop = (double)nLoop;
drh15f23c22014-11-06 12:46:16 +00001411 if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001412 }
drh42f30bc2014-11-06 12:08:21 +00001413 n++;
1414 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1415 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1416 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00001417 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00001418 rEstLoop *= rEst;
drh4ace5362014-11-10 14:42:28 +00001419 fprintf(pArg->out,
1420 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001421 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001422 );
dan8d1edb92014-11-05 09:07:28 +00001423 }
dan8d1edb92014-11-05 09:07:28 +00001424 }
dan8d1edb92014-11-05 09:07:28 +00001425 fprintf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001426#endif
dan8d1edb92014-11-05 09:07:28 +00001427}
1428
1429/*
dana98bf362013-11-13 18:35:01 +00001430** Parameter azArray points to a zero-terminated array of strings. zStr
1431** points to a single nul-terminated string. Return non-zero if zStr
1432** is equal, according to strcmp(), to any of the strings in the array.
1433** Otherwise, return zero.
1434*/
1435static int str_in_array(const char *zStr, const char **azArray){
1436 int i;
1437 for(i=0; azArray[i]; i++){
1438 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1439 }
1440 return 0;
1441}
1442
1443/*
1444** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001445** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001446** spaces each opcode should be indented before it is output.
1447**
1448** The indenting rules are:
1449**
1450** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1451** all opcodes that occur between the p2 jump destination and the opcode
1452** itself by 2 spaces.
1453**
drh01752bc2013-11-14 23:59:33 +00001454** * For each "Goto", if the jump destination is earlier in the program
1455** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001456** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001457** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001458** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001459** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001460*/
drhdcd87a92014-08-18 13:45:42 +00001461static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001462 const char *zSql; /* The text of the SQL statement */
1463 const char *z; /* Used to check if this is an EXPLAIN */
1464 int *abYield = 0; /* True if op is an OP_Yield */
1465 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001466 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001467
drh8ad0de32014-03-20 18:45:27 +00001468 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1469 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001470 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1471 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001472 const char *azGoto[] = { "Goto", 0 };
1473
1474 /* Try to figure out if this is really an EXPLAIN statement. If this
1475 ** cannot be verified, return early. */
1476 zSql = sqlite3_sql(pSql);
1477 if( zSql==0 ) return;
1478 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1479 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1480
1481 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1482 int i;
danc4650bb2013-11-18 08:41:06 +00001483 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001484 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001485
1486 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1487 ** p2 is an instruction address, set variable p2op to the index of that
1488 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1489 ** the current instruction is part of a sub-program generated by an
1490 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001491 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001492 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001493
1494 /* Grow the p->aiIndent array as required */
1495 if( iOp>=nAlloc ){
1496 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00001497 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1498 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00001499 }
1500 abYield[iOp] = str_in_array(zOp, azYield);
1501 p->aiIndent[iOp] = 0;
1502 p->nIndent = iOp+1;
1503
1504 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001505 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001506 }
drhfe705102014-03-06 13:38:37 +00001507 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1508 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1509 ){
drhe73f0592014-01-21 22:25:45 +00001510 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001511 }
1512 }
1513
danc4650bb2013-11-18 08:41:06 +00001514 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001515 sqlite3_free(abYield);
1516 sqlite3_reset(pSql);
1517}
1518
1519/*
1520** Free the array allocated by explain_data_prepare().
1521*/
drhdcd87a92014-08-18 13:45:42 +00001522static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001523 sqlite3_free(p->aiIndent);
1524 p->aiIndent = 0;
1525 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001526 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001527}
1528
1529/*
shane626a6e42009-10-22 17:30:15 +00001530** Execute a statement or set of statements. Print
1531** any result rows/columns depending on the current mode
1532** set via the supplied callback.
1533**
1534** This is very similar to SQLite's built-in sqlite3_exec()
1535** function except it takes a slightly different callback
1536** and callback data argument.
1537*/
1538static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001539 sqlite3 *db, /* An open database */
1540 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001541 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001542 /* (not the same as sqlite3_exec) */
1543 ShellState *pArg, /* Pointer to ShellState */
1544 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001545){
dan4564ced2010-01-05 04:59:56 +00001546 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1547 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001548 int rc2;
dan4564ced2010-01-05 04:59:56 +00001549 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001550
1551 if( pzErrMsg ){
1552 *pzErrMsg = NULL;
1553 }
1554
shaneb9fc17d2009-10-22 21:23:35 +00001555 while( zSql[0] && (SQLITE_OK == rc) ){
1556 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1557 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001558 if( pzErrMsg ){
1559 *pzErrMsg = save_err_msg(db);
1560 }
1561 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001562 if( !pStmt ){
1563 /* this happens for a comment or white-space */
1564 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001565 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001566 continue;
1567 }
shane626a6e42009-10-22 17:30:15 +00001568
shaneh642d8b82010-07-28 16:05:34 +00001569 /* save off the prepared statment handle and reset row count */
1570 if( pArg ){
1571 pArg->pStmt = pStmt;
1572 pArg->cnt = 0;
1573 }
1574
shanehb7977c52010-01-18 18:17:10 +00001575 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001576 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001577 const char *zStmtSql = sqlite3_sql(pStmt);
drhe05461c2015-12-30 13:36:57 +00001578 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001579 }
shanehb7977c52010-01-18 18:17:10 +00001580
drhefbf3b12014-02-28 20:47:24 +00001581 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1582 if( pArg && pArg->autoEQP ){
1583 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001584 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1585 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001586 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1587 if( rc==SQLITE_OK ){
1588 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1589 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1590 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1591 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00001592 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00001593 }
1594 }
1595 sqlite3_finalize(pExplain);
1596 sqlite3_free(zEQP);
1597 }
1598
dana98bf362013-11-13 18:35:01 +00001599 /* If the shell is currently in ".explain" mode, gather the extra
1600 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001601 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001602 explain_data_prepare(pArg, pStmt);
1603 }
1604
shaneb9fc17d2009-10-22 21:23:35 +00001605 /* perform the first step. this will tell us if we
1606 ** have a result set or not and how wide it is.
1607 */
1608 rc = sqlite3_step(pStmt);
1609 /* if we have a result set... */
1610 if( SQLITE_ROW == rc ){
1611 /* if we have a callback... */
1612 if( xCallback ){
1613 /* allocate space for col name ptr, value ptr, and type */
1614 int nCol = sqlite3_column_count(pStmt);
drhf3cdcdc2015-04-29 16:50:28 +00001615 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
shaneb9fc17d2009-10-22 21:23:35 +00001616 if( !pData ){
1617 rc = SQLITE_NOMEM;
1618 }else{
1619 char **azCols = (char **)pData; /* Names of result columns */
1620 char **azVals = &azCols[nCol]; /* Results */
1621 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001622 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001623 assert(sizeof(int) <= sizeof(char *));
1624 /* save off ptrs to column names */
1625 for(i=0; i<nCol; i++){
1626 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1627 }
shaneb9fc17d2009-10-22 21:23:35 +00001628 do{
1629 /* extract the data and data types */
1630 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001631 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001632 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001633 azVals[i] = "";
1634 }else{
1635 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1636 }
shaneb9fc17d2009-10-22 21:23:35 +00001637 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1638 rc = SQLITE_NOMEM;
1639 break; /* from for */
1640 }
1641 } /* end for */
1642
1643 /* if data and types extracted successfully... */
1644 if( SQLITE_ROW == rc ){
1645 /* call the supplied callback with the result row data */
1646 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1647 rc = SQLITE_ABORT;
1648 }else{
1649 rc = sqlite3_step(pStmt);
1650 }
1651 }
1652 } while( SQLITE_ROW == rc );
1653 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001654 }
1655 }else{
1656 do{
1657 rc = sqlite3_step(pStmt);
1658 } while( rc == SQLITE_ROW );
1659 }
1660 }
1661
dana98bf362013-11-13 18:35:01 +00001662 explain_data_delete(pArg);
1663
shaneh642d8b82010-07-28 16:05:34 +00001664 /* print usage stats if stats on */
1665 if( pArg && pArg->statsOn ){
1666 display_stats(db, pArg, 0);
1667 }
1668
dan8d1edb92014-11-05 09:07:28 +00001669 /* print loop-counters if required */
1670 if( pArg && pArg->scanstatsOn ){
1671 display_scanstats(db, pArg);
1672 }
1673
dan4564ced2010-01-05 04:59:56 +00001674 /* Finalize the statement just executed. If this fails, save a
1675 ** copy of the error message. Otherwise, set zSql to point to the
1676 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001677 rc2 = sqlite3_finalize(pStmt);
1678 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001679 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001680 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001681 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001682 }else if( pzErrMsg ){
1683 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001684 }
shaneh642d8b82010-07-28 16:05:34 +00001685
1686 /* clear saved stmt handle */
1687 if( pArg ){
1688 pArg->pStmt = NULL;
1689 }
shane626a6e42009-10-22 17:30:15 +00001690 }
shaneb9fc17d2009-10-22 21:23:35 +00001691 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001692
1693 return rc;
1694}
1695
drhdd3d4592004-08-30 01:54:05 +00001696
drh33048c02001-10-01 14:29:22 +00001697/*
drh4c653a02000-06-07 01:27:47 +00001698** This is a different callback routine used for dumping the database.
1699** Each row received by this callback consists of a table name,
1700** the table type ("index" or "table") and SQL to create the table.
1701** This routine should print text sufficient to recreate the table.
1702*/
1703static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001704 int rc;
1705 const char *zTable;
1706 const char *zType;
1707 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001708 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001709 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001710
drh902b9ee2008-12-05 17:17:07 +00001711 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001712 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001713 zTable = azArg[0];
1714 zType = azArg[1];
1715 zSql = azArg[2];
1716
drh00b950d2005-09-11 02:03:03 +00001717 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001718 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001719 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001720 fprintf(p->out, "ANALYZE sqlite_master;\n");
1721 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1722 return 0;
drh45e29d82006-11-20 16:21:10 +00001723 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1724 char *zIns;
1725 if( !p->writableSchema ){
1726 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1727 p->writableSchema = 1;
1728 }
1729 zIns = sqlite3_mprintf(
1730 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1731 "VALUES('table','%q','%q',0,'%q');",
1732 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00001733 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00001734 sqlite3_free(zIns);
1735 return 0;
drh00b950d2005-09-11 02:03:03 +00001736 }else{
drhe05461c2015-12-30 13:36:57 +00001737 utf8_printf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001738 }
danielk19772a02e332004-06-05 08:04:36 +00001739
1740 if( strcmp(zType, "table")==0 ){
1741 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001742 char *zSelect = 0;
1743 char *zTableInfo = 0;
1744 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001745 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001746
1747 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1748 zTableInfo = appendText(zTableInfo, zTable, '"');
1749 zTableInfo = appendText(zTableInfo, ");", 0);
1750
drhc7181902014-02-27 15:04:13 +00001751 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001752 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001753 if( rc!=SQLITE_OK || !pTableInfo ){
1754 return 1;
1755 }
1756
1757 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001758 /* Always quote the table name, even if it appears to be pure ascii,
1759 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1760 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001761 if( zTmp ){
1762 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001763 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001764 }
1765 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1766 rc = sqlite3_step(pTableInfo);
1767 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001768 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001769 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001770 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001771 rc = sqlite3_step(pTableInfo);
1772 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001773 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001774 }else{
1775 zSelect = appendText(zSelect, ") ", 0);
1776 }
drh157e29a2009-05-21 15:15:00 +00001777 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001778 }
1779 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001780 if( rc!=SQLITE_OK || nRow==0 ){
1781 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001782 return 1;
1783 }
1784 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1785 zSelect = appendText(zSelect, zTable, '"');
1786
drh2f464a02011-10-13 00:41:49 +00001787 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001788 if( rc==SQLITE_CORRUPT ){
1789 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001790 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001791 }
drh85e72432012-04-11 11:38:53 +00001792 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001793 }
drh4c653a02000-06-07 01:27:47 +00001794 return 0;
1795}
1796
1797/*
drh45e29d82006-11-20 16:21:10 +00001798** Run zQuery. Use dump_callback() as the callback routine so that
1799** the contents of the query are output as SQL statements.
1800**
drhdd3d4592004-08-30 01:54:05 +00001801** If we get a SQLITE_CORRUPT error, rerun the query after appending
1802** "ORDER BY rowid DESC" to the end.
1803*/
1804static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001805 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001806 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001807){
1808 int rc;
drh2f464a02011-10-13 00:41:49 +00001809 char *zErr = 0;
1810 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001811 if( rc==SQLITE_CORRUPT ){
1812 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001813 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001814 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1815 if( zErr ){
1816 fprintf(p->out, "/****** %s ******/\n", zErr);
1817 sqlite3_free(zErr);
1818 zErr = 0;
1819 }
drhdd3d4592004-08-30 01:54:05 +00001820 zQ2 = malloc( len+100 );
1821 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001822 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001823 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1824 if( rc ){
1825 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1826 }else{
1827 rc = SQLITE_CORRUPT;
1828 }
1829 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001830 free(zQ2);
1831 }
1832 return rc;
1833}
1834
1835/*
drh75897232000-05-29 14:26:00 +00001836** Text of a help message
1837*/
persicom1d0b8722002-04-18 02:53:04 +00001838static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001839 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001840 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00001841 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00001842 ".changes on|off Show number of rows changed by SQL\n"
drh4bbcf102014-02-06 02:46:08 +00001843 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001844 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00001845 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00001846 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001847 " If TABLE specified, only dump tables matching\n"
1848 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001849 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001850 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001851 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001852 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001853 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001854 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001855 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001856 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001857 ".import FILE TABLE Import data from FILE into TABLE\n"
drh0e55db12015-02-06 14:51:13 +00001858 ".indexes ?TABLE? Show names of all indexes\n"
1859 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00001860 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001861#ifdef SQLITE_ENABLE_IOTRACE
1862 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1863#endif
drh1a513372015-05-02 17:40:23 +00001864 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh70df4fe2006-06-13 15:12:21 +00001865#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001866 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001867#endif
drh127f9d72010-02-23 01:47:00 +00001868 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001869 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00001870 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001871 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001872 " column Left-aligned columns. (See .width)\n"
1873 " html HTML <table> code\n"
1874 " insert SQL insert statements for TABLE\n"
1875 " line One value per line\n"
mistachkine0d68852014-12-11 03:12:33 +00001876 " list Values delimited by .separator strings\n"
drhb860bc92004-08-04 15:16:55 +00001877 " tabs Tab-separated values\n"
1878 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001879 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001880 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001881 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001882 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001883 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001884 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001885 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001886 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001887 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001888 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001889 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001890 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001891 " If TABLE specified, only show tables matching\n"
1892 " LIKE pattern TABLE.\n"
mistachkine0d68852014-12-11 03:12:33 +00001893 ".separator COL ?ROW? Change the column separator and optionally the row\n"
1894 " separator for both the output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001895 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001896 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001897 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001898 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001899 ".tables ?TABLE? List names of tables\n"
1900 " If TABLE specified, only list tables matching\n"
1901 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001902 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001903 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001904 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00001905 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhde60fc22011-12-14 17:53:36 +00001906 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001907 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001908 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001909;
1910
drhdaffd0e2001-04-11 14:28:42 +00001911/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001912static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001913/*
1914** Implementation of the "readfile(X)" SQL function. The entire content
1915** of the file named X is read and returned as a BLOB. NULL is returned
1916** if the file does not exist or is unreadable.
1917*/
1918static void readfileFunc(
1919 sqlite3_context *context,
1920 int argc,
1921 sqlite3_value **argv
1922){
1923 const char *zName;
1924 FILE *in;
1925 long nIn;
1926 void *pBuf;
1927
drhf5ed7ad2015-06-15 14:43:25 +00001928 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00001929 zName = (const char*)sqlite3_value_text(argv[0]);
1930 if( zName==0 ) return;
1931 in = fopen(zName, "rb");
1932 if( in==0 ) return;
1933 fseek(in, 0, SEEK_END);
1934 nIn = ftell(in);
1935 rewind(in);
drhf3cdcdc2015-04-29 16:50:28 +00001936 pBuf = sqlite3_malloc64( nIn );
drhba5b0932014-07-24 12:39:59 +00001937 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1938 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1939 }else{
1940 sqlite3_free(pBuf);
1941 }
1942 fclose(in);
1943}
1944
1945/*
1946** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1947** is written into file X. The number of bytes written is returned. Or
1948** NULL is returned if something goes wrong, such as being unable to open
1949** file X for writing.
1950*/
1951static void writefileFunc(
1952 sqlite3_context *context,
1953 int argc,
1954 sqlite3_value **argv
1955){
1956 FILE *out;
1957 const char *z;
drhba5b0932014-07-24 12:39:59 +00001958 sqlite3_int64 rc;
1959 const char *zFile;
1960
drhf5ed7ad2015-06-15 14:43:25 +00001961 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00001962 zFile = (const char*)sqlite3_value_text(argv[0]);
1963 if( zFile==0 ) return;
1964 out = fopen(zFile, "wb");
1965 if( out==0 ) return;
1966 z = (const char*)sqlite3_value_blob(argv[1]);
1967 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001968 rc = 0;
1969 }else{
drh490fe862014-08-11 14:21:32 +00001970 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001971 }
1972 fclose(out);
1973 sqlite3_result_int64(context, rc);
1974}
drhdaffd0e2001-04-11 14:28:42 +00001975
drh75897232000-05-29 14:26:00 +00001976/*
drh44c2eb12003-04-30 11:38:26 +00001977** Make sure the database is open. If it is not, then open it. If
1978** the database fails to open, print an error message and exit.
1979*/
drhdcd87a92014-08-18 13:45:42 +00001980static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001981 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001982 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001983 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00001984 globalDb = p->db;
1985 if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
1986 sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
drh4cea5ba2008-05-05 16:27:24 +00001987 shellstaticFunc, 0, 0);
1988 }
mistachkin8e189222015-04-19 21:43:16 +00001989 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
shane86f5bdb2009-10-24 02:00:07 +00001990 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00001991 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00001992 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001993 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001994 }
drhc2e87a32006-06-27 15:16:14 +00001995#ifndef SQLITE_OMIT_LOAD_EXTENSION
1996 sqlite3_enable_load_extension(p->db, 1);
1997#endif
mistachkin8e189222015-04-19 21:43:16 +00001998 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00001999 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00002000 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00002001 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00002002 }
2003}
2004
2005/*
drhfeac5f82004-08-01 00:10:45 +00002006** Do C-language style dequoting.
2007**
mistachkinf21979d2015-01-18 05:35:01 +00002008** \a -> alarm
2009** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00002010** \t -> tab
2011** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00002012** \v -> vertical tab
2013** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00002014** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00002015** \s -> space
drh4c56b992013-06-27 13:26:55 +00002016** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00002017** \' -> '
drhfeac5f82004-08-01 00:10:45 +00002018** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00002019** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00002020*/
2021static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00002022 int i, j;
2023 char c;
drhc2ce0be2014-05-29 12:36:14 +00002024 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00002025 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00002026 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00002027 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00002028 if( c=='a' ){
2029 c = '\a';
2030 }else if( c=='b' ){
2031 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00002032 }else if( c=='t' ){
2033 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00002034 }else if( c=='n' ){
2035 c = '\n';
2036 }else if( c=='v' ){
2037 c = '\v';
2038 }else if( c=='f' ){
2039 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00002040 }else if( c=='r' ){
2041 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00002042 }else if( c=='"' ){
2043 c = '"';
2044 }else if( c=='\'' ){
2045 c = '\'';
drh4c56b992013-06-27 13:26:55 +00002046 }else if( c=='\\' ){
2047 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00002048 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00002049 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00002050 if( z[i+1]>='0' && z[i+1]<='7' ){
2051 i++;
2052 c = (c<<3) + z[i] - '0';
2053 if( z[i+1]>='0' && z[i+1]<='7' ){
2054 i++;
2055 c = (c<<3) + z[i] - '0';
2056 }
2057 }
2058 }
2059 }
2060 z[j] = c;
2061 }
drhc2ce0be2014-05-29 12:36:14 +00002062 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00002063}
2064
2065/*
drh348d19c2013-06-03 12:47:43 +00002066** Return the value of a hexadecimal digit. Return -1 if the input
2067** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00002068*/
drh348d19c2013-06-03 12:47:43 +00002069static int hexDigitValue(char c){
2070 if( c>='0' && c<='9' ) return c - '0';
2071 if( c>='a' && c<='f' ) return c - 'a' + 10;
2072 if( c>='A' && c<='F' ) return c - 'A' + 10;
2073 return -1;
drhc28490c2006-10-26 14:25:58 +00002074}
2075
2076/*
drh7d9f3942013-04-03 01:26:54 +00002077** Interpret zArg as an integer value, possibly with suffixes.
2078*/
2079static sqlite3_int64 integerValue(const char *zArg){
2080 sqlite3_int64 v = 0;
2081 static const struct { char *zSuffix; int iMult; } aMult[] = {
2082 { "KiB", 1024 },
2083 { "MiB", 1024*1024 },
2084 { "GiB", 1024*1024*1024 },
2085 { "KB", 1000 },
2086 { "MB", 1000000 },
2087 { "GB", 1000000000 },
2088 { "K", 1000 },
2089 { "M", 1000000 },
2090 { "G", 1000000000 },
2091 };
2092 int i;
2093 int isNeg = 0;
2094 if( zArg[0]=='-' ){
2095 isNeg = 1;
2096 zArg++;
2097 }else if( zArg[0]=='+' ){
2098 zArg++;
2099 }
drh348d19c2013-06-03 12:47:43 +00002100 if( zArg[0]=='0' && zArg[1]=='x' ){
2101 int x;
2102 zArg += 2;
2103 while( (x = hexDigitValue(zArg[0]))>=0 ){
2104 v = (v<<4) + x;
2105 zArg++;
2106 }
2107 }else{
2108 while( IsDigit(zArg[0]) ){
2109 v = v*10 + zArg[0] - '0';
2110 zArg++;
2111 }
drh7d9f3942013-04-03 01:26:54 +00002112 }
drhc2bed0a2013-05-24 11:57:50 +00002113 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002114 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2115 v *= aMult[i].iMult;
2116 break;
2117 }
2118 }
2119 return isNeg? -v : v;
2120}
2121
2122/*
drh348d19c2013-06-03 12:47:43 +00002123** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2124** for TRUE and FALSE. Return the integer value if appropriate.
2125*/
2126static int booleanValue(char *zArg){
2127 int i;
2128 if( zArg[0]=='0' && zArg[1]=='x' ){
2129 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2130 }else{
2131 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2132 }
2133 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2134 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2135 return 1;
2136 }
2137 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2138 return 0;
2139 }
2140 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2141 zArg);
2142 return 0;
2143}
2144
2145/*
drh42f64e52012-04-04 16:56:23 +00002146** Close an output file, assuming it is not stderr or stdout
2147*/
2148static void output_file_close(FILE *f){
2149 if( f && f!=stdout && f!=stderr ) fclose(f);
2150}
2151
2152/*
2153** Try to open an output file. The names "stdout" and "stderr" are
2154** recognized and do the right thing. NULL is returned if the output
2155** filename is "off".
2156*/
2157static FILE *output_file_open(const char *zFile){
2158 FILE *f;
2159 if( strcmp(zFile,"stdout")==0 ){
2160 f = stdout;
2161 }else if( strcmp(zFile, "stderr")==0 ){
2162 f = stderr;
2163 }else if( strcmp(zFile, "off")==0 ){
2164 f = 0;
2165 }else{
2166 f = fopen(zFile, "wb");
2167 if( f==0 ){
2168 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2169 }
2170 }
2171 return f;
2172}
2173
2174/*
2175** A routine for handling output from sqlite3_trace().
2176*/
2177static void sql_trace_callback(void *pArg, const char *z){
2178 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002179 if( f ){
2180 int i = (int)strlen(z);
2181 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00002182 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00002183 }
drh42f64e52012-04-04 16:56:23 +00002184}
2185
2186/*
drhd8621b92012-04-17 09:09:33 +00002187** A no-op routine that runs with the ".breakpoint" doc-command. This is
2188** a useful spot to set a debugger breakpoint.
2189*/
2190static void test_breakpoint(void){
2191 static int nCall = 0;
2192 nCall++;
2193}
2194
2195/*
mistachkin636bf9f2014-07-19 20:15:16 +00002196** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002197*/
mistachkin636bf9f2014-07-19 20:15:16 +00002198typedef struct ImportCtx ImportCtx;
2199struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002200 const char *zFile; /* Name of the input file */
2201 FILE *in; /* Read the CSV text from this input stream */
2202 char *z; /* Accumulated text for a field */
2203 int n; /* Number of bytes in z */
2204 int nAlloc; /* Space allocated for z[] */
2205 int nLine; /* Current line number */
2206 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002207 int cColSep; /* The column separator character. (Usually ",") */
2208 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002209};
2210
2211/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002212static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002213 if( p->n+1>=p->nAlloc ){
2214 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00002215 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00002216 if( p->z==0 ){
2217 fprintf(stderr, "out of memory\n");
2218 exit(1);
2219 }
2220 }
2221 p->z[p->n++] = (char)c;
2222}
2223
2224/* Read a single field of CSV text. Compatible with rfc4180 and extended
2225** with the option of having a separator other than ",".
2226**
2227** + Input comes from p->in.
2228** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002229** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002230** + Use p->cSep as the column separator. The default is ",".
2231** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002232** + Keep track of the line number in p->nLine.
2233** + Store the character that terminates the field in p->cTerm. Store
2234** EOF on end-of-file.
2235** + Report syntax errors on stderr
2236*/
mistachkin44723ce2015-03-21 02:22:37 +00002237static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002238 int c;
2239 int cSep = p->cColSep;
2240 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002241 p->n = 0;
2242 c = fgetc(p->in);
2243 if( c==EOF || seenInterrupt ){
2244 p->cTerm = EOF;
2245 return 0;
2246 }
2247 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002248 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002249 int startLine = p->nLine;
2250 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002251 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002252 while( 1 ){
2253 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002254 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002255 if( c==cQuote ){
2256 if( pc==cQuote ){
2257 pc = 0;
2258 continue;
2259 }
2260 }
2261 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002262 || (c==rSep && pc==cQuote)
2263 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002264 || (c==EOF && pc==cQuote)
2265 ){
2266 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002267 p->cTerm = c;
2268 break;
2269 }
2270 if( pc==cQuote && c!='\r' ){
2271 fprintf(stderr, "%s:%d: unescaped %c character\n",
2272 p->zFile, p->nLine, cQuote);
2273 }
2274 if( c==EOF ){
2275 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2276 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002277 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002278 break;
2279 }
mistachkin636bf9f2014-07-19 20:15:16 +00002280 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002281 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002282 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002283 }
drhdb95f682013-06-26 22:46:00 +00002284 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002285 while( c!=EOF && c!=cSep && c!=rSep ){
2286 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002287 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002288 }
mistachkin636bf9f2014-07-19 20:15:16 +00002289 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002290 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002291 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002292 }
drhdb95f682013-06-26 22:46:00 +00002293 p->cTerm = c;
2294 }
drh8dd675e2013-07-12 21:09:24 +00002295 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002296 return p->z;
2297}
2298
mistachkin636bf9f2014-07-19 20:15:16 +00002299/* Read a single field of ASCII delimited text.
2300**
2301** + Input comes from p->in.
2302** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002303** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002304** + Use p->cSep as the column separator. The default is "\x1F".
2305** + Use p->rSep as the row separator. The default is "\x1E".
2306** + Keep track of the row number in p->nLine.
2307** + Store the character that terminates the field in p->cTerm. Store
2308** EOF on end-of-file.
2309** + Report syntax errors on stderr
2310*/
mistachkin44723ce2015-03-21 02:22:37 +00002311static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002312 int c;
2313 int cSep = p->cColSep;
2314 int rSep = p->cRowSep;
2315 p->n = 0;
2316 c = fgetc(p->in);
2317 if( c==EOF || seenInterrupt ){
2318 p->cTerm = EOF;
2319 return 0;
2320 }
2321 while( c!=EOF && c!=cSep && c!=rSep ){
2322 import_append_char(p, c);
2323 c = fgetc(p->in);
2324 }
2325 if( c==rSep ){
2326 p->nLine++;
2327 }
2328 p->cTerm = c;
2329 if( p->z ) p->z[p->n] = 0;
2330 return p->z;
2331}
2332
drhdb95f682013-06-26 22:46:00 +00002333/*
drh4bbcf102014-02-06 02:46:08 +00002334** Try to transfer data for table zTable. If an error is seen while
2335** moving forward, try to go backwards. The backwards movement won't
2336** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002337*/
mistachkine31ae902014-02-06 01:15:29 +00002338static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002339 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002340 sqlite3 *newDb,
2341 const char *zTable
2342){
2343 sqlite3_stmt *pQuery = 0;
2344 sqlite3_stmt *pInsert = 0;
2345 char *zQuery = 0;
2346 char *zInsert = 0;
2347 int rc;
2348 int i, j, n;
2349 int nTable = (int)strlen(zTable);
2350 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002351 int cnt = 0;
2352 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002353
2354 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2355 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2356 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002357 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002358 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2359 zQuery);
2360 goto end_data_xfer;
2361 }
2362 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00002363 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00002364 if( zInsert==0 ){
2365 fprintf(stderr, "out of memory\n");
2366 goto end_data_xfer;
2367 }
2368 sqlite3_snprintf(200+nTable,zInsert,
2369 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2370 i = (int)strlen(zInsert);
2371 for(j=1; j<n; j++){
2372 memcpy(zInsert+i, ",?", 2);
2373 i += 2;
2374 }
2375 memcpy(zInsert+i, ");", 3);
2376 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2377 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002378 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002379 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2380 zQuery);
2381 goto end_data_xfer;
2382 }
2383 for(k=0; k<2; k++){
2384 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2385 for(i=0; i<n; i++){
2386 switch( sqlite3_column_type(pQuery, i) ){
2387 case SQLITE_NULL: {
2388 sqlite3_bind_null(pInsert, i+1);
2389 break;
2390 }
2391 case SQLITE_INTEGER: {
2392 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2393 break;
2394 }
2395 case SQLITE_FLOAT: {
2396 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2397 break;
2398 }
2399 case SQLITE_TEXT: {
2400 sqlite3_bind_text(pInsert, i+1,
2401 (const char*)sqlite3_column_text(pQuery,i),
2402 -1, SQLITE_STATIC);
2403 break;
2404 }
2405 case SQLITE_BLOB: {
2406 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2407 sqlite3_column_bytes(pQuery,i),
2408 SQLITE_STATIC);
2409 break;
2410 }
2411 }
2412 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002413 rc = sqlite3_step(pInsert);
2414 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2415 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2416 sqlite3_errmsg(newDb));
2417 }
drh3350ce92014-02-06 00:49:12 +00002418 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002419 cnt++;
2420 if( (cnt%spinRate)==0 ){
2421 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2422 fflush(stdout);
2423 }
drh3350ce92014-02-06 00:49:12 +00002424 } /* End while */
2425 if( rc==SQLITE_DONE ) break;
2426 sqlite3_finalize(pQuery);
2427 sqlite3_free(zQuery);
2428 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2429 zTable);
2430 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2431 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002432 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2433 break;
drh3350ce92014-02-06 00:49:12 +00002434 }
2435 } /* End for(k=0...) */
2436
2437end_data_xfer:
2438 sqlite3_finalize(pQuery);
2439 sqlite3_finalize(pInsert);
2440 sqlite3_free(zQuery);
2441 sqlite3_free(zInsert);
2442}
2443
2444
2445/*
2446** Try to transfer all rows of the schema that match zWhere. For
2447** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002448** If an error is encountered while moving forward through the
2449** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002450*/
mistachkine31ae902014-02-06 01:15:29 +00002451static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002452 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002453 sqlite3 *newDb,
2454 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002455 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002456){
2457 sqlite3_stmt *pQuery = 0;
2458 char *zQuery = 0;
2459 int rc;
2460 const unsigned char *zName;
2461 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002462 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002463
2464 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2465 " WHERE %s", zWhere);
2466 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2467 if( rc ){
2468 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2469 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2470 zQuery);
2471 goto end_schema_xfer;
2472 }
2473 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2474 zName = sqlite3_column_text(pQuery, 0);
2475 zSql = sqlite3_column_text(pQuery, 1);
2476 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002477 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2478 if( zErrMsg ){
2479 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2480 sqlite3_free(zErrMsg);
2481 zErrMsg = 0;
2482 }
drh3350ce92014-02-06 00:49:12 +00002483 if( xForEach ){
2484 xForEach(p, newDb, (const char*)zName);
2485 }
2486 printf("done\n");
2487 }
2488 if( rc!=SQLITE_DONE ){
2489 sqlite3_finalize(pQuery);
2490 sqlite3_free(zQuery);
2491 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2492 " WHERE %s ORDER BY rowid DESC", zWhere);
2493 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2494 if( rc ){
2495 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2496 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2497 zQuery);
2498 goto end_schema_xfer;
2499 }
2500 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2501 zName = sqlite3_column_text(pQuery, 0);
2502 zSql = sqlite3_column_text(pQuery, 1);
2503 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002504 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2505 if( zErrMsg ){
2506 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2507 sqlite3_free(zErrMsg);
2508 zErrMsg = 0;
2509 }
drh3350ce92014-02-06 00:49:12 +00002510 if( xForEach ){
2511 xForEach(p, newDb, (const char*)zName);
2512 }
2513 printf("done\n");
2514 }
2515 }
2516end_schema_xfer:
2517 sqlite3_finalize(pQuery);
2518 sqlite3_free(zQuery);
2519}
2520
2521/*
2522** Open a new database file named "zNewDb". Try to recover as much information
2523** as possible out of the main database (which might be corrupt) and write it
2524** into zNewDb.
2525*/
drhdcd87a92014-08-18 13:45:42 +00002526static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002527 int rc;
2528 sqlite3 *newDb = 0;
2529 if( access(zNewDb,0)==0 ){
2530 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2531 return;
2532 }
2533 rc = sqlite3_open(zNewDb, &newDb);
2534 if( rc ){
2535 fprintf(stderr, "Cannot create output database: %s\n",
2536 sqlite3_errmsg(newDb));
2537 }else{
drh54d0d2d2014-04-03 00:32:13 +00002538 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002539 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002540 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2541 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002542 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002543 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002544 }
2545 sqlite3_close(newDb);
2546}
2547
2548/*
drhc2ce0be2014-05-29 12:36:14 +00002549** Change the output file back to stdout
2550*/
drhdcd87a92014-08-18 13:45:42 +00002551static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002552 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002553#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002554 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002555#endif
drhc2ce0be2014-05-29 12:36:14 +00002556 }else{
2557 output_file_close(p->out);
2558 }
2559 p->outfile[0] = 0;
2560 p->out = stdout;
2561}
2562
2563/*
drhf7502f02015-02-06 14:19:44 +00002564** Run an SQL command and return the single integer result.
2565*/
2566static int db_int(ShellState *p, const char *zSql){
2567 sqlite3_stmt *pStmt;
2568 int res = 0;
2569 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2570 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2571 res = sqlite3_column_int(pStmt,0);
2572 }
2573 sqlite3_finalize(pStmt);
2574 return res;
2575}
2576
2577/*
2578** Convert a 2-byte or 4-byte big-endian integer into a native integer
2579*/
2580unsigned int get2byteInt(unsigned char *a){
2581 return (a[0]<<8) + a[1];
2582}
2583unsigned int get4byteInt(unsigned char *a){
2584 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2585}
2586
2587/*
2588** Implementation of the ".info" command.
2589**
2590** Return 1 on error, 2 to exit, and 0 otherwise.
2591*/
drh0e55db12015-02-06 14:51:13 +00002592static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002593 static const struct { const char *zName; int ofst; } aField[] = {
2594 { "file change counter:", 24 },
2595 { "database page count:", 28 },
2596 { "freelist page count:", 36 },
2597 { "schema cookie:", 40 },
2598 { "schema format:", 44 },
2599 { "default cache size:", 48 },
2600 { "autovacuum top root:", 52 },
2601 { "incremental vacuum:", 64 },
2602 { "text encoding:", 56 },
2603 { "user version:", 60 },
2604 { "application id:", 68 },
2605 { "software version:", 96 },
2606 };
drh0e55db12015-02-06 14:51:13 +00002607 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2608 { "number of tables:",
2609 "SELECT count(*) FROM %s WHERE type='table'" },
2610 { "number of indexes:",
2611 "SELECT count(*) FROM %s WHERE type='index'" },
2612 { "number of triggers:",
2613 "SELECT count(*) FROM %s WHERE type='trigger'" },
2614 { "number of views:",
2615 "SELECT count(*) FROM %s WHERE type='view'" },
2616 { "schema size:",
2617 "SELECT total(length(sql)) FROM %s" },
2618 };
mistachkinbfe8bd52015-11-17 19:17:14 +00002619 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00002620 int i;
2621 char *zSchemaTab;
2622 char *zDb = nArg>=2 ? azArg[1] : "main";
2623 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002624 open_db(p, 0);
2625 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002626 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002627 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2628 return 1;
2629 }
2630 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2631 if( i!=SQLITE_OK ){
2632 fprintf(stderr, "unable to read database header\n");
2633 return 1;
2634 }
2635 i = get2byteInt(aHdr+16);
2636 if( i==1 ) i = 65536;
2637 fprintf(p->out, "%-20s %d\n", "database page size:", i);
2638 fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2639 fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2640 fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00002641 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00002642 int ofst = aField[i].ofst;
2643 unsigned int val = get4byteInt(aHdr + ofst);
2644 fprintf(p->out, "%-20s %u", aField[i].zName, val);
2645 switch( ofst ){
2646 case 56: {
2647 if( val==1 ) fprintf(p->out, " (utf8)");
2648 if( val==2 ) fprintf(p->out, " (utf16le)");
2649 if( val==3 ) fprintf(p->out, " (utf16be)");
2650 }
2651 }
2652 fprintf(p->out, "\n");
2653 }
drh0e55db12015-02-06 14:51:13 +00002654 if( zDb==0 ){
2655 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2656 }else if( strcmp(zDb,"temp")==0 ){
2657 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2658 }else{
2659 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2660 }
drhf5ed7ad2015-06-15 14:43:25 +00002661 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00002662 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2663 int val = db_int(p, zSql);
2664 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00002665 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00002666 }
2667 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002668 return 0;
2669}
2670
dand95bb392015-09-30 11:19:05 +00002671/*
2672** Print the current sqlite3_errmsg() value to stderr and return 1.
2673*/
2674static int shellDatabaseError(sqlite3 *db){
2675 const char *zErr = sqlite3_errmsg(db);
2676 fprintf(stderr, "Error: %s\n", zErr);
2677 return 1;
2678}
2679
2680/*
2681** Print an out-of-memory message to stderr and return 1.
2682*/
2683static int shellNomemError(void){
2684 fprintf(stderr, "Error: out of memory\n");
2685 return 1;
2686}
drhf7502f02015-02-06 14:19:44 +00002687
2688/*
drh75897232000-05-29 14:26:00 +00002689** If an input line begins with "." then invoke this routine to
2690** process that line.
drh67505e72002-04-19 12:34:06 +00002691**
drh47ad6842006-11-08 12:25:42 +00002692** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002693*/
drhdcd87a92014-08-18 13:45:42 +00002694static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00002695 int h = 1;
drh75897232000-05-29 14:26:00 +00002696 int nArg = 0;
2697 int n, c;
drh67505e72002-04-19 12:34:06 +00002698 int rc = 0;
drh75897232000-05-29 14:26:00 +00002699 char *azArg[50];
2700
2701 /* Parse the input line into tokens.
2702 */
mistachkin8e189222015-04-19 21:43:16 +00002703 while( zLine[h] && nArg<ArraySize(azArg) ){
2704 while( IsSpace(zLine[h]) ){ h++; }
2705 if( zLine[h]==0 ) break;
2706 if( zLine[h]=='\'' || zLine[h]=='"' ){
2707 int delim = zLine[h++];
2708 azArg[nArg++] = &zLine[h];
2709 while( zLine[h] && zLine[h]!=delim ){
2710 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2711 h++;
drh4c56b992013-06-27 13:26:55 +00002712 }
mistachkin8e189222015-04-19 21:43:16 +00002713 if( zLine[h]==delim ){
2714 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00002715 }
drhfeac5f82004-08-01 00:10:45 +00002716 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002717 }else{
mistachkin8e189222015-04-19 21:43:16 +00002718 azArg[nArg++] = &zLine[h];
2719 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2720 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002721 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002722 }
2723 }
2724
2725 /* Process the input line.
2726 */
shane9bd1b442009-10-23 01:27:39 +00002727 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002728 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002729 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002730 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2731 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2732 ){
drhbc46f022013-01-23 18:53:23 +00002733 const char *zDestFile = 0;
2734 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002735 sqlite3 *pDest;
2736 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002737 int j;
2738 for(j=1; j<nArg; j++){
2739 const char *z = azArg[j];
2740 if( z[0]=='-' ){
2741 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002742 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002743 {
2744 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2745 return 1;
2746 }
2747 }else if( zDestFile==0 ){
2748 zDestFile = azArg[j];
2749 }else if( zDb==0 ){
2750 zDb = zDestFile;
2751 zDestFile = azArg[j];
2752 }else{
2753 fprintf(stderr, "too many arguments to .backup\n");
2754 return 1;
2755 }
drh9ff849f2009-02-04 20:55:57 +00002756 }
drhbc46f022013-01-23 18:53:23 +00002757 if( zDestFile==0 ){
2758 fprintf(stderr, "missing FILENAME argument on .backup\n");
2759 return 1;
2760 }
2761 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002762 rc = sqlite3_open(zDestFile, &pDest);
2763 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002764 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002765 sqlite3_close(pDest);
2766 return 1;
2767 }
drh05782482013-10-24 15:20:20 +00002768 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002769 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2770 if( pBackup==0 ){
2771 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2772 sqlite3_close(pDest);
2773 return 1;
2774 }
2775 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2776 sqlite3_backup_finish(pBackup);
2777 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002778 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002779 }else{
2780 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002781 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002782 }
2783 sqlite3_close(pDest);
2784 }else
2785
drhc2ce0be2014-05-29 12:36:14 +00002786 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2787 if( nArg==2 ){
2788 bail_on_error = booleanValue(azArg[1]);
2789 }else{
2790 fprintf(stderr, "Usage: .bail on|off\n");
2791 rc = 1;
2792 }
drhc49f44e2006-10-26 18:15:42 +00002793 }else
2794
mistachkinf21979d2015-01-18 05:35:01 +00002795 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2796 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00002797 if( booleanValue(azArg[1]) ){
2798 setBinaryMode(p->out);
2799 }else{
2800 setTextMode(p->out);
2801 }
mistachkinf21979d2015-01-18 05:35:01 +00002802 }else{
2803 fprintf(stderr, "Usage: .binary on|off\n");
2804 rc = 1;
2805 }
2806 }else
2807
drhd8621b92012-04-17 09:09:33 +00002808 /* The undocumented ".breakpoint" command causes a call to the no-op
2809 ** routine named test_breakpoint().
2810 */
2811 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2812 test_breakpoint();
2813 }else
2814
drhdf12f1c2015-12-07 21:46:19 +00002815 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
2816 if( nArg==2 ){
2817 p->countChanges = booleanValue(azArg[1]);
2818 }else{
2819 fprintf(stderr, "Usage: .changes on|off\n");
2820 rc = 1;
2821 }
2822 }else
2823
drhc2ce0be2014-05-29 12:36:14 +00002824 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2825 if( nArg==2 ){
2826 tryToClone(p, azArg[1]);
2827 }else{
2828 fprintf(stderr, "Usage: .clone FILENAME\n");
2829 rc = 1;
2830 }
mistachkine31ae902014-02-06 01:15:29 +00002831 }else
2832
drhc2ce0be2014-05-29 12:36:14 +00002833 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002834 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002835 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002836 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002837 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002838 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002839 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002840 data.colWidth[0] = 3;
2841 data.colWidth[1] = 15;
2842 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002843 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002844 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002845 if( zErrMsg ){
2846 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002847 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002848 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002849 }
2850 }else
2851
drh0e55db12015-02-06 14:51:13 +00002852 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2853 rc = shell_dbinfo_command(p, nArg, azArg);
2854 }else
2855
drhc2ce0be2014-05-29 12:36:14 +00002856 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002857 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002858 /* When playing back a "dump", the content might appear in an order
2859 ** which causes immediate foreign key constraints to be violated.
2860 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002861 if( nArg!=1 && nArg!=2 ){
2862 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2863 rc = 1;
2864 goto meta_command_exit;
2865 }
drhf1dfc4f2009-09-23 15:51:35 +00002866 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002867 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002868 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002869 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002870 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002871 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002872 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002873 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002874 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002875 );
2876 run_schema_dump_query(p,
2877 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002878 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002879 );
drh2f464a02011-10-13 00:41:49 +00002880 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002881 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002882 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002883 );
drh4c653a02000-06-07 01:27:47 +00002884 }else{
2885 int i;
drhdd3d4592004-08-30 01:54:05 +00002886 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002887 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002888 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002889 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002890 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002891 " AND sql NOT NULL");
2892 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002893 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002894 "WHERE sql NOT NULL"
2895 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002896 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002897 );
danielk1977bc6ada42004-06-30 08:20:16 +00002898 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002899 }
2900 }
drh45e29d82006-11-20 16:21:10 +00002901 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002902 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002903 p->writableSchema = 0;
2904 }
drh56197952011-10-13 16:30:13 +00002905 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2906 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002907 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002908 }else
drh75897232000-05-29 14:26:00 +00002909
drhc2ce0be2014-05-29 12:36:14 +00002910 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2911 if( nArg==2 ){
2912 p->echoOn = booleanValue(azArg[1]);
2913 }else{
2914 fprintf(stderr, "Usage: .echo on|off\n");
2915 rc = 1;
2916 }
drhdaffd0e2001-04-11 14:28:42 +00002917 }else
2918
drhc2ce0be2014-05-29 12:36:14 +00002919 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2920 if( nArg==2 ){
2921 p->autoEQP = booleanValue(azArg[1]);
2922 }else{
2923 fprintf(stderr, "Usage: .eqp on|off\n");
2924 rc = 1;
2925 }
drhefbf3b12014-02-28 20:47:24 +00002926 }else
2927
drhd3ac7d92013-01-25 18:33:43 +00002928 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002929 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002930 rc = 2;
drh75897232000-05-29 14:26:00 +00002931 }else
2932
drhc2ce0be2014-05-29 12:36:14 +00002933 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002934 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002935 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002936 if(!p->normalMode.valid) {
2937 p->normalMode.valid = 1;
2938 p->normalMode.mode = p->mode;
2939 p->normalMode.showHeader = p->showHeader;
2940 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002941 }
2942 /* We could put this code under the !p->explainValid
2943 ** condition so that it does not execute if we are already in
2944 ** explain mode. However, always executing it allows us an easy
2945 ** was to reset to explain mode in case the user previously
2946 ** did an .explain followed by a .width, .mode or .header
2947 ** command.
2948 */
danielk19770d78bae2008-01-03 07:09:48 +00002949 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002950 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002951 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002952 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002953 p->colWidth[1] = 13; /* opcode */
2954 p->colWidth[2] = 4; /* P1 */
2955 p->colWidth[3] = 4; /* P2 */
2956 p->colWidth[4] = 4; /* P3 */
2957 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002958 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002959 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002960 }else if (p->normalMode.valid) {
2961 p->normalMode.valid = 0;
2962 p->mode = p->normalMode.mode;
2963 p->showHeader = p->normalMode.showHeader;
2964 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002965 }
drh75897232000-05-29 14:26:00 +00002966 }else
2967
drhc1971542014-06-23 23:28:13 +00002968 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002969 ShellState data;
drhc1971542014-06-23 23:28:13 +00002970 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002971 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002972 if( nArg!=1 ){
2973 fprintf(stderr, "Usage: .fullschema\n");
2974 rc = 1;
2975 goto meta_command_exit;
2976 }
2977 open_db(p, 0);
2978 memcpy(&data, p, sizeof(data));
2979 data.showHeader = 0;
2980 data.mode = MODE_Semi;
2981 rc = sqlite3_exec(p->db,
2982 "SELECT sql FROM"
2983 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2984 " FROM sqlite_master UNION ALL"
2985 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002986 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002987 "ORDER BY rowid",
2988 callback, &data, &zErrMsg
2989 );
drh56f674c2014-07-18 14:43:29 +00002990 if( rc==SQLITE_OK ){
2991 sqlite3_stmt *pStmt;
2992 rc = sqlite3_prepare_v2(p->db,
2993 "SELECT rowid FROM sqlite_master"
2994 " WHERE name GLOB 'sqlite_stat[134]'",
2995 -1, &pStmt, 0);
2996 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2997 sqlite3_finalize(pStmt);
2998 }
2999 if( doStats==0 ){
3000 fprintf(p->out, "/* No STAT tables available */\n");
3001 }else{
3002 fprintf(p->out, "ANALYZE sqlite_master;\n");
3003 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
3004 callback, &data, &zErrMsg);
3005 data.mode = MODE_Insert;
3006 data.zDestTable = "sqlite_stat1";
3007 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
3008 shell_callback, &data,&zErrMsg);
3009 data.zDestTable = "sqlite_stat3";
3010 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
3011 shell_callback, &data,&zErrMsg);
3012 data.zDestTable = "sqlite_stat4";
3013 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
3014 shell_callback, &data, &zErrMsg);
3015 fprintf(p->out, "ANALYZE sqlite_master;\n");
3016 }
drhc1971542014-06-23 23:28:13 +00003017 }else
3018
drhc2ce0be2014-05-29 12:36:14 +00003019 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
3020 if( nArg==2 ){
3021 p->showHeader = booleanValue(azArg[1]);
3022 }else{
3023 fprintf(stderr, "Usage: .headers on|off\n");
3024 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00003025 }
drh75897232000-05-29 14:26:00 +00003026 }else
3027
drhc2ce0be2014-05-29 12:36:14 +00003028 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
3029 fprintf(p->out, "%s", zHelp);
3030 }else
3031
3032 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00003033 char *zTable; /* Insert data into this table */
3034 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00003035 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00003036 int nCol; /* Number of columns in the table */
3037 int nByte; /* Number of bytes in an SQL string */
3038 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00003039 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00003040 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00003041 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00003042 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00003043 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
3044 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00003045
drhc2ce0be2014-05-29 12:36:14 +00003046 if( nArg!=3 ){
3047 fprintf(stderr, "Usage: .import FILE TABLE\n");
3048 goto meta_command_exit;
3049 }
drh01f37542014-05-31 15:43:33 +00003050 zFile = azArg[1];
3051 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00003052 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00003053 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00003054 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003055 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003056 if( nSep==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003057 fprintf(stderr, "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00003058 return 1;
drhfeac5f82004-08-01 00:10:45 +00003059 }
drhdb95f682013-06-26 22:46:00 +00003060 if( nSep>1 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003061 fprintf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00003062 " for import\n");
3063 return 1;
3064 }
mistachkin636bf9f2014-07-19 20:15:16 +00003065 nSep = strlen30(p->rowSeparator);
3066 if( nSep==0 ){
3067 fprintf(stderr, "Error: non-null row separator required for import\n");
3068 return 1;
3069 }
mistachkine0d68852014-12-11 03:12:33 +00003070 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
3071 /* When importing CSV (only), if the row separator is set to the
3072 ** default output row separator, change it to the default input
3073 ** row separator. This avoids having to maintain different input
3074 ** and output row separators. */
3075 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
3076 nSep = strlen30(p->rowSeparator);
3077 }
mistachkin636bf9f2014-07-19 20:15:16 +00003078 if( nSep>1 ){
3079 fprintf(stderr, "Error: multi-character row separators not allowed"
3080 " for import\n");
3081 return 1;
3082 }
3083 sCtx.zFile = zFile;
3084 sCtx.nLine = 1;
3085 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003086#ifdef SQLITE_OMIT_POPEN
mistachkinba132c72015-03-19 14:48:38 +00003087 fprintf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00003088 return 1;
3089#else
mistachkin636bf9f2014-07-19 20:15:16 +00003090 sCtx.in = popen(sCtx.zFile+1, "r");
3091 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00003092 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00003093#endif
drh5bde8162013-06-27 14:07:53 +00003094 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003095 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00003096 xCloser = fclose;
3097 }
mistachkin636bf9f2014-07-19 20:15:16 +00003098 if( p->mode==MODE_Ascii ){
3099 xRead = ascii_read_one_field;
3100 }else{
3101 xRead = csv_read_one_field;
3102 }
3103 if( sCtx.in==0 ){
drh5bde8162013-06-27 14:07:53 +00003104 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00003105 return 1;
3106 }
mistachkin636bf9f2014-07-19 20:15:16 +00003107 sCtx.cColSep = p->colSeparator[0];
3108 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00003109 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00003110 if( zSql==0 ){
3111 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003112 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003113 return 1;
3114 }
drh4f21c4a2008-12-10 22:15:00 +00003115 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00003116 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003117 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00003118 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00003119 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3120 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00003121 while( xRead(&sCtx) ){
3122 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00003123 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00003124 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00003125 }
drh5bde8162013-06-27 14:07:53 +00003126 if( cSep=='(' ){
3127 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00003128 sqlite3_free(sCtx.z);
3129 xCloser(sCtx.in);
3130 fprintf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003131 return 1;
3132 }
drhdb95f682013-06-26 22:46:00 +00003133 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3134 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3135 sqlite3_free(zCreate);
3136 if( rc ){
3137 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00003138 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003139 sqlite3_free(sCtx.z);
3140 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003141 return 1;
3142 }
drhc7181902014-02-27 15:04:13 +00003143 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003144 }
drhfeac5f82004-08-01 00:10:45 +00003145 sqlite3_free(zSql);
3146 if( rc ){
shane916f9612009-10-23 00:37:15 +00003147 if (pStmt) sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003148 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003149 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003150 return 1;
drhfeac5f82004-08-01 00:10:45 +00003151 }
shane916f9612009-10-23 00:37:15 +00003152 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003153 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003154 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003155 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00003156 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003157 if( zSql==0 ){
3158 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003159 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003160 return 1;
3161 }
drhdb95f682013-06-26 22:46:00 +00003162 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003163 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003164 for(i=1; i<nCol; i++){
3165 zSql[j++] = ',';
3166 zSql[j++] = '?';
3167 }
3168 zSql[j++] = ')';
3169 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003170 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003171 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003172 if( rc ){
mistachkin8e189222015-04-19 21:43:16 +00003173 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00003174 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003175 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003176 return 1;
drhfeac5f82004-08-01 00:10:45 +00003177 }
mistachkin8e189222015-04-19 21:43:16 +00003178 needCommit = sqlite3_get_autocommit(p->db);
3179 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003180 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003181 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003182 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003183 char *z = xRead(&sCtx);
3184 /*
3185 ** Did we reach end-of-file before finding any columns?
3186 ** If so, stop instead of NULL filling the remaining columns.
3187 */
drhdb95f682013-06-26 22:46:00 +00003188 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003189 /*
3190 ** Did we reach end-of-file OR end-of-line before finding any
3191 ** columns in ASCII mode? If so, stop instead of NULL filling
3192 ** the remaining columns.
3193 */
3194 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003195 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003196 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003197 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3198 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003199 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003200 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003201 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003202 }
drhfeac5f82004-08-01 00:10:45 +00003203 }
mistachkin636bf9f2014-07-19 20:15:16 +00003204 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003205 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003206 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003207 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003208 }while( sCtx.cTerm==sCtx.cColSep );
drhdb95f682013-06-26 22:46:00 +00003209 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3210 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003211 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003212 }
drhdb95f682013-06-26 22:46:00 +00003213 if( i>=nCol ){
3214 sqlite3_step(pStmt);
3215 rc = sqlite3_reset(pStmt);
3216 if( rc!=SQLITE_OK ){
mistachkin636bf9f2014-07-19 20:15:16 +00003217 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
mistachkin8e189222015-04-19 21:43:16 +00003218 sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00003219 }
3220 }
mistachkin636bf9f2014-07-19 20:15:16 +00003221 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003222
mistachkin636bf9f2014-07-19 20:15:16 +00003223 xCloser(sCtx.in);
3224 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003225 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003226 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003227 }else
3228
drh0e55db12015-02-06 14:51:13 +00003229 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3230 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003231 ShellState data;
drh75897232000-05-29 14:26:00 +00003232 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003233 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003234 memcpy(&data, p, sizeof(data));
3235 data.showHeader = 0;
3236 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003237 if( nArg==1 ){
3238 rc = sqlite3_exec(p->db,
3239 "SELECT name FROM sqlite_master "
3240 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3241 "UNION ALL "
3242 "SELECT name FROM sqlite_temp_master "
3243 "WHERE type='index' "
3244 "ORDER BY 1",
3245 callback, &data, &zErrMsg
3246 );
drhc2ce0be2014-05-29 12:36:14 +00003247 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003248 zShellStatic = azArg[1];
3249 rc = sqlite3_exec(p->db,
3250 "SELECT name FROM sqlite_master "
3251 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3252 "UNION ALL "
3253 "SELECT name FROM sqlite_temp_master "
3254 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3255 "ORDER BY 1",
3256 callback, &data, &zErrMsg
3257 );
3258 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003259 }else{
drh0e55db12015-02-06 14:51:13 +00003260 fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003261 rc = 1;
3262 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003263 }
drh75897232000-05-29 14:26:00 +00003264 if( zErrMsg ){
3265 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003266 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003267 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003268 }else if( rc != SQLITE_OK ){
3269 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3270 rc = 1;
drh75897232000-05-29 14:26:00 +00003271 }
3272 }else
3273
drhae5e4452007-05-03 17:18:36 +00003274#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003275 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00003276 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003277 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3278 iotrace = 0;
3279 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003280 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003281 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003282 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003283 iotrace = stdout;
3284 }else{
3285 iotrace = fopen(azArg[1], "w");
3286 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00003287 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003288 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003289 rc = 1;
drhb0603412007-02-28 04:47:26 +00003290 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003291 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003292 }
3293 }
3294 }else
drhae5e4452007-05-03 17:18:36 +00003295#endif
drh1a513372015-05-02 17:40:23 +00003296 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3297 static const struct {
3298 const char *zLimitName; /* Name of a limit */
3299 int limitCode; /* Integer code for that limit */
3300 } aLimit[] = {
3301 { "length", SQLITE_LIMIT_LENGTH },
3302 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
3303 { "column", SQLITE_LIMIT_COLUMN },
3304 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
3305 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
3306 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
3307 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
3308 { "attached", SQLITE_LIMIT_ATTACHED },
3309 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
3310 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
3311 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
3312 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
3313 };
3314 int i, n2;
3315 open_db(p, 0);
3316 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00003317 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003318 printf("%20s %d\n", aLimit[i].zLimitName,
3319 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3320 }
3321 }else if( nArg>3 ){
3322 fprintf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
3323 rc = 1;
3324 goto meta_command_exit;
3325 }else{
3326 int iLimit = -1;
3327 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00003328 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003329 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3330 if( iLimit<0 ){
3331 iLimit = i;
3332 }else{
3333 fprintf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
3334 rc = 1;
3335 goto meta_command_exit;
3336 }
3337 }
3338 }
3339 if( iLimit<0 ){
3340 fprintf(stderr, "unknown limit: \"%s\"\n"
3341 "enter \".limits\" with no arguments for a list.\n",
3342 azArg[1]);
3343 rc = 1;
3344 goto meta_command_exit;
3345 }
3346 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00003347 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3348 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00003349 }
3350 printf("%20s %d\n", aLimit[iLimit].zLimitName,
3351 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3352 }
3353 }else
drhb0603412007-02-28 04:47:26 +00003354
drh70df4fe2006-06-13 15:12:21 +00003355#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003356 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003357 const char *zFile, *zProc;
3358 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003359 if( nArg<2 ){
3360 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3361 rc = 1;
3362 goto meta_command_exit;
3363 }
drh1e397f82006-06-08 15:28:43 +00003364 zFile = azArg[1];
3365 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003366 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003367 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3368 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003369 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003370 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003371 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003372 }
3373 }else
drh70df4fe2006-06-13 15:12:21 +00003374#endif
drh1e397f82006-06-08 15:28:43 +00003375
drhc2ce0be2014-05-29 12:36:14 +00003376 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3377 if( nArg!=2 ){
3378 fprintf(stderr, "Usage: .log FILENAME\n");
3379 rc = 1;
3380 }else{
3381 const char *zFile = azArg[1];
3382 output_file_close(p->pLog);
3383 p->pLog = output_file_open(zFile);
3384 }
drh127f9d72010-02-23 01:47:00 +00003385 }else
3386
drhc2ce0be2014-05-29 12:36:14 +00003387 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3388 const char *zMode = nArg>=2 ? azArg[1] : "";
3389 int n2 = (int)strlen(zMode);
3390 int c2 = zMode[0];
3391 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003392 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003393 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003394 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003395 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003396 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003397 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003398 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003399 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003400 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003401 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003402 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003403 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003404 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003405 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003406 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003407 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003408 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003409 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003410 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003411 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003412 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3413 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003414 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3415 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003416 }else {
shane9bd1b442009-10-23 01:27:39 +00003417 fprintf(stderr,"Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003418 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003419 rc = 1;
drh75897232000-05-29 14:26:00 +00003420 }
3421 }else
3422
drhc2ce0be2014-05-29 12:36:14 +00003423 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3424 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003425 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3426 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003427 }else{
3428 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003429 rc = 1;
3430 }
3431 }else
3432
drh05782482013-10-24 15:20:20 +00003433 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3434 sqlite3 *savedDb = p->db;
3435 const char *zSavedFilename = p->zDbFilename;
3436 char *zNewFilename = 0;
3437 p->db = 0;
drhbbe031f2015-06-17 17:08:22 +00003438 if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3439 p->zDbFilename = zNewFilename;
drh05782482013-10-24 15:20:20 +00003440 open_db(p, 1);
3441 if( p->db!=0 ){
3442 sqlite3_close(savedDb);
3443 sqlite3_free(p->zFreeOnClose);
3444 p->zFreeOnClose = zNewFilename;
3445 }else{
3446 sqlite3_free(zNewFilename);
3447 p->db = savedDb;
3448 p->zDbFilename = zSavedFilename;
3449 }
3450 }else
3451
drhc2ce0be2014-05-29 12:36:14 +00003452 if( c=='o'
3453 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3454 ){
3455 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3456 if( nArg>2 ){
3457 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3458 rc = 1;
3459 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003460 }
drhc2ce0be2014-05-29 12:36:14 +00003461 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3462 if( nArg<2 ){
3463 fprintf(stderr, "Usage: .once FILE\n");
3464 rc = 1;
3465 goto meta_command_exit;
3466 }
3467 p->outCount = 2;
3468 }else{
3469 p->outCount = 0;
3470 }
3471 output_reset(p);
3472 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003473#ifdef SQLITE_OMIT_POPEN
3474 fprintf(stderr,"Error: pipes are not supported in this OS\n");
3475 rc = 1;
3476 p->out = stdout;
3477#else
drhc2ce0be2014-05-29 12:36:14 +00003478 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003479 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003480 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003481 p->out = stdout;
3482 rc = 1;
3483 }else{
drhc2ce0be2014-05-29 12:36:14 +00003484 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003485 }
drh8cd5b252015-03-02 22:06:43 +00003486#endif
drh75897232000-05-29 14:26:00 +00003487 }else{
drhc2ce0be2014-05-29 12:36:14 +00003488 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003489 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003490 if( strcmp(zFile,"off")!=0 ){
3491 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003492 }
drh75897232000-05-29 14:26:00 +00003493 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003494 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003495 } else {
drhc2ce0be2014-05-29 12:36:14 +00003496 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003497 }
3498 }
3499 }else
3500
drh078b1fd2012-09-21 13:40:02 +00003501 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3502 int i;
3503 for(i=1; i<nArg; i++){
3504 if( i>1 ) fprintf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00003505 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00003506 }
3507 fprintf(p->out, "\n");
3508 }else
3509
drhc2ce0be2014-05-29 12:36:14 +00003510 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003511 if( nArg >= 2) {
3512 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3513 }
3514 if( nArg >= 3) {
3515 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3516 }
3517 }else
3518
drhc2ce0be2014-05-29 12:36:14 +00003519 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003520 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003521 }else
3522
drhc2ce0be2014-05-29 12:36:14 +00003523 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3524 FILE *alt;
3525 if( nArg!=2 ){
3526 fprintf(stderr, "Usage: .read FILE\n");
3527 rc = 1;
3528 goto meta_command_exit;
3529 }
3530 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003531 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003532 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3533 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003534 }else{
shane9bd1b442009-10-23 01:27:39 +00003535 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003536 fclose(alt);
3537 }
3538 }else
3539
drhc2ce0be2014-05-29 12:36:14 +00003540 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003541 const char *zSrcFile;
3542 const char *zDb;
3543 sqlite3 *pSrc;
3544 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003545 int nTimeout = 0;
3546
drh9ff849f2009-02-04 20:55:57 +00003547 if( nArg==2 ){
3548 zSrcFile = azArg[1];
3549 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003550 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003551 zSrcFile = azArg[2];
3552 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003553 }else{
3554 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3555 rc = 1;
3556 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003557 }
3558 rc = sqlite3_open(zSrcFile, &pSrc);
3559 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003560 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003561 sqlite3_close(pSrc);
3562 return 1;
3563 }
drh05782482013-10-24 15:20:20 +00003564 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003565 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3566 if( pBackup==0 ){
3567 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3568 sqlite3_close(pSrc);
3569 return 1;
3570 }
drhdc2c4912009-02-04 22:46:47 +00003571 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3572 || rc==SQLITE_BUSY ){
3573 if( rc==SQLITE_BUSY ){
3574 if( nTimeout++ >= 3 ) break;
3575 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003576 }
3577 }
3578 sqlite3_backup_finish(pBackup);
3579 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003580 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003581 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003582 fprintf(stderr, "Error: source database is busy\n");
3583 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003584 }else{
3585 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003586 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003587 }
3588 sqlite3_close(pSrc);
3589 }else
3590
dan8d1edb92014-11-05 09:07:28 +00003591
3592 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3593 if( nArg==2 ){
3594 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003595#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3596 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3597#endif
dan8d1edb92014-11-05 09:07:28 +00003598 }else{
3599 fprintf(stderr, "Usage: .scanstats on|off\n");
3600 rc = 1;
3601 }
3602 }else
3603
drhc2ce0be2014-05-29 12:36:14 +00003604 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003605 ShellState data;
drh75897232000-05-29 14:26:00 +00003606 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003607 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003608 memcpy(&data, p, sizeof(data));
3609 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003610 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003611 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003612 int i;
drhf0693c82011-10-11 20:41:54 +00003613 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003614 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003615 char *new_argv[2], *new_colv[2];
3616 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3617 " type text,\n"
3618 " name text,\n"
3619 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003620 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003621 " sql text\n"
3622 ")";
3623 new_argv[1] = 0;
3624 new_colv[0] = "sql";
3625 new_colv[1] = 0;
3626 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003627 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003628 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003629 char *new_argv[2], *new_colv[2];
3630 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3631 " type text,\n"
3632 " name text,\n"
3633 " tbl_name text,\n"
3634 " rootpage integer,\n"
3635 " sql text\n"
3636 ")";
3637 new_argv[1] = 0;
3638 new_colv[0] = "sql";
3639 new_colv[1] = 0;
3640 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003641 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003642 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003643 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003644 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003645 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003646 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003647 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003648 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003649 "WHERE lower(tbl_name) LIKE shellstatic()"
3650 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003651 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003652 callback, &data, &zErrMsg);
3653 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003654 }
drhc2ce0be2014-05-29 12:36:14 +00003655 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003656 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003657 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003658 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003659 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003660 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003661 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003662 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003663 callback, &data, &zErrMsg
3664 );
drhc2ce0be2014-05-29 12:36:14 +00003665 }else{
3666 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3667 rc = 1;
3668 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003669 }
drh75897232000-05-29 14:26:00 +00003670 if( zErrMsg ){
3671 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003672 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003673 rc = 1;
3674 }else if( rc != SQLITE_OK ){
3675 fprintf(stderr,"Error: querying schema information\n");
3676 rc = 1;
3677 }else{
3678 rc = 0;
drh75897232000-05-29 14:26:00 +00003679 }
3680 }else
3681
drhabd4c722014-09-20 18:18:33 +00003682
3683#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3684 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3685 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003686 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003687 }else
3688#endif
3689
3690
drh340f5822013-06-27 13:01:21 +00003691#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003692 /* Undocumented commands for internal testing. Subject to change
3693 ** without notice. */
3694 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3695 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3696 int i, v;
3697 for(i=1; i<nArg; i++){
3698 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00003699 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00003700 }
3701 }
3702 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3703 int i; sqlite3_int64 v;
3704 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003705 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003706 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003707 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00003708 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003709 }
3710 }
3711 }else
drh340f5822013-06-27 13:01:21 +00003712#endif
drh348d19c2013-06-03 12:47:43 +00003713
drhc2ce0be2014-05-29 12:36:14 +00003714 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003715 if( nArg<2 || nArg>3 ){
mistachkine0d68852014-12-11 03:12:33 +00003716 fprintf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00003717 rc = 1;
3718 }
drh6976c212014-07-24 12:09:47 +00003719 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003720 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00003721 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00003722 }
3723 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00003724 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3725 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh5bb3eb92007-05-04 13:15:55 +00003726 }
drh75897232000-05-29 14:26:00 +00003727 }else
3728
drh62cdde52014-05-28 20:22:28 +00003729 if( c=='s'
3730 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003731 ){
3732 char *zCmd;
drh54027102014-08-06 14:36:53 +00003733 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003734 if( nArg<2 ){
3735 fprintf(stderr, "Usage: .system COMMAND\n");
3736 rc = 1;
3737 goto meta_command_exit;
3738 }
drhdcb3e3d2014-05-29 03:17:29 +00003739 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003740 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003741 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3742 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003743 }
drh54027102014-08-06 14:36:53 +00003744 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003745 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003746 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003747 }else
3748
drhc2ce0be2014-05-29 12:36:14 +00003749 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003750 int i;
drhc2ce0be2014-05-29 12:36:14 +00003751 if( nArg!=1 ){
3752 fprintf(stderr, "Usage: .show\n");
3753 rc = 1;
3754 goto meta_command_exit;
3755 }
mistachkin636bf9f2014-07-19 20:15:16 +00003756 fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3757 fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003758 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
mistachkin636bf9f2014-07-19 20:15:16 +00003759 fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3760 fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3761 fprintf(p->out,"%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00003762 output_c_string(p->out, p->nullValue);
drhfeac5f82004-08-01 00:10:45 +00003763 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003764 fprintf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003765 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkin636bf9f2014-07-19 20:15:16 +00003766 fprintf(p->out,"%12.12s: ", "colseparator");
3767 output_c_string(p->out, p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003768 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003769 fprintf(p->out,"%12.12s: ", "rowseparator");
3770 output_c_string(p->out, p->rowSeparator);
3771 fprintf(p->out, "\n");
3772 fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3773 fprintf(p->out,"%12.12s: ","width");
persicom7e2dfdd2002-04-18 02:46:52 +00003774 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003775 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003776 }
drhfeac5f82004-08-01 00:10:45 +00003777 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003778 }else
3779
drhc2ce0be2014-05-29 12:36:14 +00003780 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3781 if( nArg==2 ){
3782 p->statsOn = booleanValue(azArg[1]);
3783 }else{
3784 fprintf(stderr, "Usage: .stats on|off\n");
3785 rc = 1;
3786 }
shaneh642d8b82010-07-28 16:05:34 +00003787 }else
3788
drhc2ce0be2014-05-29 12:36:14 +00003789 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003790 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003791 char **azResult;
drh98781232012-04-23 12:38:05 +00003792 int nRow, nAlloc;
3793 char *zSql = 0;
3794 int ii;
drh05782482013-10-24 15:20:20 +00003795 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003796 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00003797 if( rc ) return shellDatabaseError(p->db);
3798
3799 /* Create an SQL statement to query for the list of tables in the
3800 ** main and all attached databases where the table name matches the
3801 ** LIKE pattern bound to variable "?1". */
drh98781232012-04-23 12:38:05 +00003802 zSql = sqlite3_mprintf(
3803 "SELECT name FROM sqlite_master"
3804 " WHERE type IN ('table','view')"
3805 " AND name NOT LIKE 'sqlite_%%'"
3806 " AND name LIKE ?1");
dand95bb392015-09-30 11:19:05 +00003807 while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
drh98781232012-04-23 12:38:05 +00003808 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3809 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3810 if( strcmp(zDbName,"temp")==0 ){
3811 zSql = sqlite3_mprintf(
3812 "%z UNION ALL "
3813 "SELECT 'temp.' || name FROM sqlite_temp_master"
3814 " WHERE type IN ('table','view')"
3815 " AND name NOT LIKE 'sqlite_%%'"
3816 " AND name LIKE ?1", zSql);
3817 }else{
3818 zSql = sqlite3_mprintf(
3819 "%z UNION ALL "
3820 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3821 " WHERE type IN ('table','view')"
3822 " AND name NOT LIKE 'sqlite_%%'"
3823 " AND name LIKE ?1", zSql, zDbName, zDbName);
3824 }
drha50da102000-08-08 20:19:09 +00003825 }
dand95bb392015-09-30 11:19:05 +00003826 rc = sqlite3_finalize(pStmt);
3827 if( zSql && rc==SQLITE_OK ){
3828 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3829 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3830 }
drh98781232012-04-23 12:38:05 +00003831 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00003832 if( !zSql ) return shellNomemError();
3833 if( rc ) return shellDatabaseError(p->db);
3834
3835 /* Run the SQL statement prepared by the above block. Store the results
3836 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00003837 nRow = nAlloc = 0;
3838 azResult = 0;
3839 if( nArg>1 ){
3840 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003841 }else{
drh98781232012-04-23 12:38:05 +00003842 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3843 }
3844 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3845 if( nRow>=nAlloc ){
3846 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00003847 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00003848 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00003849 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00003850 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00003851 break;
3852 }
mistachkin8e189222015-04-19 21:43:16 +00003853 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00003854 azResult = azNew;
3855 }
3856 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00003857 if( 0==azResult[nRow] ){
3858 rc = shellNomemError();
3859 break;
3860 }
3861 nRow++;
drh98781232012-04-23 12:38:05 +00003862 }
dand95bb392015-09-30 11:19:05 +00003863 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
3864 rc = shellDatabaseError(p->db);
3865 }
3866
3867 /* Pretty-print the contents of array azResult[] to the output */
3868 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003869 int len, maxlen = 0;
3870 int i, j;
3871 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003872 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003873 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003874 if( len>maxlen ) maxlen = len;
3875 }
3876 nPrintCol = 80/(maxlen+2);
3877 if( nPrintCol<1 ) nPrintCol = 1;
3878 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3879 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003880 for(j=i; j<nRow; j+=nPrintRow){
3881 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00003882 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
3883 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003884 }
drh151b7d52013-05-06 20:28:54 +00003885 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003886 }
3887 }
dand95bb392015-09-30 11:19:05 +00003888
drh98781232012-04-23 12:38:05 +00003889 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3890 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003891 }else
3892
shaneh96887e12011-02-10 21:08:58 +00003893 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003894 static const struct {
3895 const char *zCtrlName; /* Name of a test-control option */
3896 int ctrlCode; /* Integer code for that option */
3897 } aCtrl[] = {
3898 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3899 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3900 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3901 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3902 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3903 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3904 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3905 { "assert", SQLITE_TESTCTRL_ASSERT },
3906 { "always", SQLITE_TESTCTRL_ALWAYS },
3907 { "reserve", SQLITE_TESTCTRL_RESERVE },
3908 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3909 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003910 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003911 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00003912 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00003913 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00003914 };
shaneh96887e12011-02-10 21:08:58 +00003915 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00003916 int rc2 = 0;
3917 int i, n2;
drh05782482013-10-24 15:20:20 +00003918 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003919
drhd416fe72011-03-17 16:45:50 +00003920 /* convert testctrl text option to value. allow any unique prefix
3921 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00003922 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00003923 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00003924 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00003925 if( testctrl<0 ){
3926 testctrl = aCtrl[i].ctrlCode;
3927 }else{
drhb07028f2011-10-14 21:49:18 +00003928 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003929 testctrl = -1;
3930 break;
3931 }
3932 }
3933 }
drh348d19c2013-06-03 12:47:43 +00003934 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003935 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3936 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3937 }else{
3938 switch(testctrl){
3939
3940 /* sqlite3_test_control(int, db, int) */
3941 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3942 case SQLITE_TESTCTRL_RESERVE:
3943 if( nArg==3 ){
3944 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003945 rc2 = sqlite3_test_control(testctrl, p->db, opt);
3946 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003947 } else {
drhd416fe72011-03-17 16:45:50 +00003948 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3949 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003950 }
3951 break;
3952
3953 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003954 case SQLITE_TESTCTRL_PRNG_SAVE:
3955 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003956 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003957 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003958 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00003959 rc2 = sqlite3_test_control(testctrl);
3960 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003961 } else {
3962 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3963 }
3964 break;
3965
3966 /* sqlite3_test_control(int, uint) */
3967 case SQLITE_TESTCTRL_PENDING_BYTE:
3968 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003969 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00003970 rc2 = sqlite3_test_control(testctrl, opt);
3971 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003972 } else {
drhd416fe72011-03-17 16:45:50 +00003973 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3974 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003975 }
3976 break;
3977
3978 /* sqlite3_test_control(int, int) */
3979 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00003980 case SQLITE_TESTCTRL_ALWAYS:
3981 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00003982 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003983 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00003984 rc2 = sqlite3_test_control(testctrl, opt);
3985 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003986 } else {
drhd416fe72011-03-17 16:45:50 +00003987 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3988 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003989 }
3990 break;
3991
3992 /* sqlite3_test_control(int, char *) */
3993#ifdef SQLITE_N_KEYWORD
3994 case SQLITE_TESTCTRL_ISKEYWORD:
3995 if( nArg==3 ){
3996 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00003997 rc2 = sqlite3_test_control(testctrl, opt);
3998 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003999 } else {
drhd416fe72011-03-17 16:45:50 +00004000 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
4001 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004002 }
4003 break;
4004#endif
4005
drh1ffede82015-01-30 20:59:27 +00004006 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00004007 if( nArg==5 ){
mistachkin8e189222015-04-19 21:43:16 +00004008 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00004009 azArg[2],
drh8964b342015-01-29 17:54:52 +00004010 integerValue(azArg[3]),
4011 integerValue(azArg[4]));
mistachkin8e189222015-04-19 21:43:16 +00004012 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00004013 }else{
drh6f5a37a2015-03-27 02:27:20 +00004014 fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00004015 }
4016 break;
4017
shaneh96887e12011-02-10 21:08:58 +00004018 case SQLITE_TESTCTRL_BITVEC_TEST:
4019 case SQLITE_TESTCTRL_FAULT_INSTALL:
4020 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
4021 case SQLITE_TESTCTRL_SCRATCHMALLOC:
4022 default:
drhd416fe72011-03-17 16:45:50 +00004023 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
4024 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004025 break;
4026 }
4027 }
4028 }else
4029
drhc2ce0be2014-05-29 12:36:14 +00004030 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00004031 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004032 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00004033 }else
4034
drhc2ce0be2014-05-29 12:36:14 +00004035 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
4036 if( nArg==2 ){
4037 enableTimer = booleanValue(azArg[1]);
4038 if( enableTimer && !HAS_TIMER ){
4039 fprintf(stderr, "Error: timer not available on this system.\n");
4040 enableTimer = 0;
4041 }
4042 }else{
4043 fprintf(stderr, "Usage: .timer on|off\n");
4044 rc = 1;
4045 }
shanehe2aa9d72009-11-06 17:20:17 +00004046 }else
4047
drhc2ce0be2014-05-29 12:36:14 +00004048 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00004049 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004050 if( nArg!=2 ){
4051 fprintf(stderr, "Usage: .trace FILE|off\n");
4052 rc = 1;
4053 goto meta_command_exit;
4054 }
drh657b4a82015-03-19 13:30:41 +00004055 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00004056 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00004057#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00004058 if( p->traceOut==0 ){
4059 sqlite3_trace(p->db, 0, 0);
4060 }else{
4061 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
4062 }
4063#endif
4064 }else
4065
drhf442e332014-09-10 19:01:14 +00004066#if SQLITE_USER_AUTHENTICATION
4067 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
4068 if( nArg<2 ){
4069 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
4070 rc = 1;
4071 goto meta_command_exit;
4072 }
drh7883ecf2014-09-11 16:19:31 +00004073 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00004074 if( strcmp(azArg[1],"login")==0 ){
4075 if( nArg!=4 ){
4076 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
4077 rc = 1;
4078 goto meta_command_exit;
4079 }
drhd39c40f2014-09-11 00:27:53 +00004080 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
4081 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00004082 if( rc ){
4083 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
4084 rc = 1;
4085 }
4086 }else if( strcmp(azArg[1],"add")==0 ){
4087 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00004088 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004089 rc = 1;
4090 goto meta_command_exit;
4091 }
drhd39c40f2014-09-11 00:27:53 +00004092 rc = sqlite3_user_add(p->db, azArg[2],
4093 azArg[3], (int)strlen(azArg[3]),
4094 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004095 if( rc ){
4096 fprintf(stderr, "User-Add failed: %d\n", rc);
4097 rc = 1;
4098 }
4099 }else if( strcmp(azArg[1],"edit")==0 ){
4100 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00004101 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004102 rc = 1;
4103 goto meta_command_exit;
4104 }
drhd39c40f2014-09-11 00:27:53 +00004105 rc = sqlite3_user_change(p->db, azArg[2],
4106 azArg[3], (int)strlen(azArg[3]),
4107 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004108 if( rc ){
4109 fprintf(stderr, "User-Edit failed: %d\n", rc);
4110 rc = 1;
4111 }
4112 }else if( strcmp(azArg[1],"delete")==0 ){
4113 if( nArg!=3 ){
4114 fprintf(stderr, "Usage: .user delete USER\n");
4115 rc = 1;
4116 goto meta_command_exit;
4117 }
4118 rc = sqlite3_user_delete(p->db, azArg[2]);
4119 if( rc ){
4120 fprintf(stderr, "User-Delete failed: %d\n", rc);
4121 rc = 1;
4122 }
4123 }else{
4124 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
4125 rc = 1;
4126 goto meta_command_exit;
4127 }
4128 }else
4129#endif /* SQLITE_USER_AUTHENTICATION */
4130
drh9fd301b2011-06-03 13:28:22 +00004131 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00004132 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00004133 sqlite3_libversion(), sqlite3_sourceid());
4134 }else
4135
drh790f2872015-11-28 18:06:36 +00004136 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
4137 const char *zDbName = nArg==2 ? azArg[1] : "main";
4138 sqlite3_vfs *pVfs;
4139 if( p->db ){
4140 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
4141 if( pVfs ){
4142 fprintf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
4143 fprintf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4144 fprintf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4145 fprintf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
4146 }
4147 }
4148 }else
4149
drhde60fc22011-12-14 17:53:36 +00004150 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4151 const char *zDbName = nArg==2 ? azArg[1] : "main";
4152 char *zVfsName = 0;
4153 if( p->db ){
4154 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4155 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00004156 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00004157 sqlite3_free(zVfsName);
4158 }
4159 }
4160 }else
4161
drhcef4fc82012-09-21 22:50:45 +00004162#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4163 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4164 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00004165 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00004166 }else
4167#endif
4168
drhc2ce0be2014-05-29 12:36:14 +00004169 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00004170 int j;
drh43617e92006-03-06 20:55:46 +00004171 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00004172 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00004173 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00004174 }
4175 }else
4176
4177 {
shane9bd1b442009-10-23 01:27:39 +00004178 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00004179 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00004180 rc = 1;
drh75897232000-05-29 14:26:00 +00004181 }
drh67505e72002-04-19 12:34:06 +00004182
drhc2ce0be2014-05-29 12:36:14 +00004183meta_command_exit:
4184 if( p->outCount ){
4185 p->outCount--;
4186 if( p->outCount==0 ) output_reset(p);
4187 }
drh67505e72002-04-19 12:34:06 +00004188 return rc;
drh75897232000-05-29 14:26:00 +00004189}
4190
drh67505e72002-04-19 12:34:06 +00004191/*
drh91a66392007-09-07 01:12:32 +00004192** Return TRUE if a semicolon occurs anywhere in the first N characters
4193** of string z[].
drh324ccef2003-02-05 14:06:20 +00004194*/
drh9f099fd2013-08-06 14:01:46 +00004195static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00004196 int i;
4197 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
4198 return 0;
drh324ccef2003-02-05 14:06:20 +00004199}
4200
4201/*
drh70c7a4b2003-04-26 03:03:06 +00004202** Test to see if a line consists entirely of whitespace.
4203*/
4204static int _all_whitespace(const char *z){
4205 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00004206 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00004207 if( *z=='/' && z[1]=='*' ){
4208 z += 2;
4209 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4210 if( *z==0 ) return 0;
4211 z++;
4212 continue;
4213 }
4214 if( *z=='-' && z[1]=='-' ){
4215 z += 2;
4216 while( *z && *z!='\n' ){ z++; }
4217 if( *z==0 ) return 1;
4218 continue;
4219 }
4220 return 0;
4221 }
4222 return 1;
4223}
4224
4225/*
drha9b17162003-04-29 18:01:28 +00004226** Return TRUE if the line typed in is an SQL command terminator other
4227** than a semi-colon. The SQL Server style "go" command is understood
4228** as is the Oracle "/".
4229*/
drh9f099fd2013-08-06 14:01:46 +00004230static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004231 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004232 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4233 return 1; /* Oracle */
4234 }
drhf0693c82011-10-11 20:41:54 +00004235 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004236 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004237 return 1; /* SQL Server */
4238 }
4239 return 0;
4240}
4241
4242/*
drh233a5312008-12-18 22:25:13 +00004243** Return true if zSql is a complete SQL statement. Return false if it
4244** ends in the middle of a string literal or C-style comment.
4245*/
drh9f099fd2013-08-06 14:01:46 +00004246static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004247 int rc;
4248 if( zSql==0 ) return 1;
4249 zSql[nSql] = ';';
4250 zSql[nSql+1] = 0;
4251 rc = sqlite3_complete(zSql);
4252 zSql[nSql] = 0;
4253 return rc;
4254}
4255
4256/*
drh67505e72002-04-19 12:34:06 +00004257** Read input from *in and process it. If *in==0 then input
4258** is interactive - the user is typing it it. Otherwise, input
4259** is coming from a file or device. A prompt is issued and history
4260** is saved only if input is interactive. An interrupt signal will
4261** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004262**
4263** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004264*/
drhdcd87a92014-08-18 13:45:42 +00004265static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004266 char *zLine = 0; /* A single input line */
4267 char *zSql = 0; /* Accumulated SQL text */
4268 int nLine; /* Length of current line */
4269 int nSql = 0; /* Bytes of zSql[] used */
4270 int nAlloc = 0; /* Allocated zSql[] space */
4271 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4272 char *zErrMsg; /* Error message returned */
4273 int rc; /* Error code */
4274 int errCnt = 0; /* Number of errors seen */
4275 int lineno = 0; /* Current line number */
4276 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004277
4278 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4279 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004280 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004281 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004282 /* End of input */
4283 if( stdin_is_interactive ) printf("\n");
4284 break;
drhc49f44e2006-10-26 18:15:42 +00004285 }
drh67505e72002-04-19 12:34:06 +00004286 if( seenInterrupt ){
4287 if( in!=0 ) break;
4288 seenInterrupt = 0;
4289 }
drhc28490c2006-10-26 14:25:58 +00004290 lineno++;
drh849a9d92013-12-21 15:46:06 +00004291 if( nSql==0 && _all_whitespace(zLine) ){
4292 if( p->echoOn ) printf("%s\n", zLine);
4293 continue;
4294 }
drh2af0b2d2002-02-21 02:25:02 +00004295 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004296 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004297 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004298 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004299 break;
4300 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004301 errCnt++;
4302 }
drhdaffd0e2001-04-11 14:28:42 +00004303 continue;
4304 }
drh9f099fd2013-08-06 14:01:46 +00004305 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004306 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004307 }
drh9f099fd2013-08-06 14:01:46 +00004308 nLine = strlen30(zLine);
4309 if( nSql+nLine+2>=nAlloc ){
4310 nAlloc = nSql+nLine+100;
4311 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004312 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00004313 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004314 exit(1);
4315 }
drhdaffd0e2001-04-11 14:28:42 +00004316 }
drh9f099fd2013-08-06 14:01:46 +00004317 nSqlPrior = nSql;
4318 if( nSql==0 ){
4319 int i;
4320 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004321 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004322 memcpy(zSql, zLine+i, nLine+1-i);
4323 startline = lineno;
4324 nSql = nLine-i;
4325 }else{
4326 zSql[nSql++] = '\n';
4327 memcpy(zSql+nSql, zLine, nLine+1);
4328 nSql += nLine;
4329 }
4330 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004331 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004332 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004333 open_db(p, 0);
drh9569f602015-04-16 15:05:04 +00004334 if( p->backslashOn ) resolve_backslashes(zSql);
drh3b1a9882007-11-02 12:53:03 +00004335 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004336 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004337 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004338 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004339 char zPrefix[100];
4340 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004341 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004342 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004343 }else{
shane9bd1b442009-10-23 01:27:39 +00004344 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004345 }
drh7f953e22002-07-13 17:33:45 +00004346 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00004347 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004348 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004349 zErrMsg = 0;
4350 }else{
shaned2bed1c2009-10-21 03:56:54 +00004351 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004352 }
drhc49f44e2006-10-26 18:15:42 +00004353 errCnt++;
drhdf12f1c2015-12-07 21:46:19 +00004354 }else if( p->countChanges ){
4355 fprintf(p->out, "changes: %3d total_changes: %d\n",
4356 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
drhdaffd0e2001-04-11 14:28:42 +00004357 }
drhdaffd0e2001-04-11 14:28:42 +00004358 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004359 if( p->outCount ){
4360 output_reset(p);
4361 p->outCount = 0;
4362 }
drh9f099fd2013-08-06 14:01:46 +00004363 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004364 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004365 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004366 }
4367 }
drh9f099fd2013-08-06 14:01:46 +00004368 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004369 if( !_all_whitespace(zSql) ){
4370 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004371 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004372 }
drhdaffd0e2001-04-11 14:28:42 +00004373 }
drh1f9ca2c2015-08-25 16:57:52 +00004374 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00004375 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004376 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004377}
4378
drh67505e72002-04-19 12:34:06 +00004379/*
4380** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004381** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004382*/
4383static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004384 static char *home_dir = NULL;
4385 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004386
drh4ace5362014-11-10 14:42:28 +00004387#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4388 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004389 {
4390 struct passwd *pwent;
4391 uid_t uid = getuid();
4392 if( (pwent=getpwuid(uid)) != NULL) {
4393 home_dir = pwent->pw_dir;
4394 }
drh67505e72002-04-19 12:34:06 +00004395 }
4396#endif
4397
chw65d3c132007-11-12 21:09:10 +00004398#if defined(_WIN32_WCE)
4399 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4400 */
drh85e72432012-04-11 11:38:53 +00004401 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004402#else
4403
drh83905c92012-06-21 13:00:37 +00004404#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004405 if (!home_dir) {
4406 home_dir = getenv("USERPROFILE");
4407 }
4408#endif
4409
drh67505e72002-04-19 12:34:06 +00004410 if (!home_dir) {
4411 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004412 }
4413
drh83905c92012-06-21 13:00:37 +00004414#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004415 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004416 char *zDrive, *zPath;
4417 int n;
4418 zDrive = getenv("HOMEDRIVE");
4419 zPath = getenv("HOMEPATH");
4420 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004421 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004422 home_dir = malloc( n );
4423 if( home_dir==0 ) return 0;
4424 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4425 return home_dir;
4426 }
4427 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004428 }
4429#endif
4430
chw65d3c132007-11-12 21:09:10 +00004431#endif /* !_WIN32_WCE */
4432
drh67505e72002-04-19 12:34:06 +00004433 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004434 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004435 char *z = malloc( n );
4436 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004437 home_dir = z;
4438 }
drhe98d4fa2002-04-21 19:06:22 +00004439
drh67505e72002-04-19 12:34:06 +00004440 return home_dir;
4441}
4442
4443/*
4444** Read input from the file given by sqliterc_override. Or if that
4445** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004446**
4447** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004448*/
drh534f4df2015-02-28 14:03:35 +00004449static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004450 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004451 const char *sqliterc_override /* Name of config file. NULL to use default */
4452){
persicom7e2dfdd2002-04-18 02:46:52 +00004453 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004454 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004455 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004456 FILE *in = NULL;
4457
4458 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004459 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004460 if( home_dir==0 ){
drh534f4df2015-02-28 14:03:35 +00004461 fprintf(stderr, "-- warning: cannot find home directory;"
4462 " cannot read ~/.sqliterc\n");
4463 return;
drhe98d4fa2002-04-21 19:06:22 +00004464 }
drh2f3de322012-06-27 16:41:31 +00004465 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004466 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4467 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004468 }
drha1f9b5e2004-02-14 16:31:02 +00004469 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004470 if( in ){
drhc28490c2006-10-26 14:25:58 +00004471 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00004472 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004473 }
drh534f4df2015-02-28 14:03:35 +00004474 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004475 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004476 }
drh85e72432012-04-11 11:38:53 +00004477 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004478}
4479
drh67505e72002-04-19 12:34:06 +00004480/*
drhe1e38c42003-05-04 18:30:59 +00004481** Show available command line options
4482*/
4483static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004484 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004485 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004486 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004487 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004488 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004489 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004490 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004491 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004492 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004493#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4494 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4495#endif
drhcc3b4f82012-02-07 14:13:50 +00004496 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004497 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004498 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004499 " -line set output mode to 'line'\n"
4500 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004501 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004502 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004503#ifdef SQLITE_ENABLE_MULTIPLEX
4504 " -multiplex enable the multiplexor VFS\n"
4505#endif
mistachkine0d68852014-12-11 03:12:33 +00004506 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004507 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004508 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4509 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004510 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004511 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004512 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004513 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004514#ifdef SQLITE_ENABLE_VFSTRACE
4515 " -vfstrace enable tracing of all VFS calls\n"
4516#endif
drhe1e38c42003-05-04 18:30:59 +00004517;
4518static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00004519 fprintf(stderr,
4520 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4521 "FILENAME is the name of an SQLite database. A new database is created\n"
4522 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004523 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00004524 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004525 }else{
4526 fprintf(stderr, "Use the -help option for additional information\n");
4527 }
4528 exit(1);
4529}
4530
4531/*
drh67505e72002-04-19 12:34:06 +00004532** Initialize the state information in data
4533*/
drhdcd87a92014-08-18 13:45:42 +00004534static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004535 memset(data, 0, sizeof(*data));
4536 data->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00004537 memcpy(data->colSeparator,SEP_Column, 2);
4538 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004539 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004540 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004541 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004542 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004543 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004544 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4545 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004546}
4547
drh98d312f2012-10-25 15:23:14 +00004548/*
drh5c7976f2014-02-10 19:59:27 +00004549** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004550*/
4551#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004552static void printBold(const char *zText){
4553 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4554 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4555 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4556 SetConsoleTextAttribute(out,
4557 FOREGROUND_RED|FOREGROUND_INTENSITY
4558 );
4559 printf("%s", zText);
4560 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004561}
4562#else
drh5c7976f2014-02-10 19:59:27 +00004563static void printBold(const char *zText){
4564 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004565}
4566#endif
4567
4568/*
drh98d312f2012-10-25 15:23:14 +00004569** Get the argument to an --option. Throw an error and die if no argument
4570** is available.
4571*/
4572static char *cmdline_option_value(int argc, char **argv, int i){
4573 if( i==argc ){
4574 fprintf(stderr, "%s: Error: missing argument to %s\n",
4575 argv[0], argv[argc-1]);
4576 exit(1);
4577 }
4578 return argv[i];
4579}
4580
mistachkin44723ce2015-03-21 02:22:37 +00004581int SQLITE_CDECL main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004582 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004583 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004584 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004585 int i;
drhc28490c2006-10-26 14:25:58 +00004586 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004587 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004588 int readStdin = 1;
4589 int nCmd = 0;
4590 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004591
drh69b30ab2014-02-27 15:11:52 +00004592#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004593 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4594 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4595 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4596 exit(1);
4597 }
drhc7181902014-02-27 15:04:13 +00004598#endif
drh047d4532015-01-18 20:30:23 +00004599 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00004600 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00004601 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004602 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004603 stdin_is_interactive = isatty(0);
drhe05461c2015-12-30 13:36:57 +00004604 stdout_is_console = isatty(1);
persicom7e2dfdd2002-04-18 02:46:52 +00004605
drh44c2eb12003-04-30 11:38:26 +00004606 /* Make sure we have a valid signal handler early, before anything
4607 ** else is done.
4608 */
drh4c504392000-10-16 22:06:40 +00004609#ifdef SIGINT
4610 signal(SIGINT, interrupt_handler);
4611#endif
drh44c2eb12003-04-30 11:38:26 +00004612
drhac5649a2014-11-28 13:35:03 +00004613#ifdef SQLITE_SHELL_DBNAME_PROC
4614 {
4615 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4616 ** of a C-function that will provide the name of the database file. Use
4617 ** this compile-time option to embed this shell program in larger
4618 ** applications. */
4619 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4620 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4621 warnInmemoryDb = 0;
4622 }
4623#endif
4624
drh22fbcb82004-02-01 01:22:50 +00004625 /* Do an initial pass through the command-line argument to locate
4626 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004627 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004628 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004629 */
drh98d312f2012-10-25 15:23:14 +00004630 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004631 char *z;
drhc28490c2006-10-26 14:25:58 +00004632 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004633 if( z[0]!='-' ){
4634 if( data.zDbFilename==0 ){
4635 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004636 }else{
4637 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4638 ** mean that nothing is read from stdin */
4639 readStdin = 0;
4640 nCmd++;
4641 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4642 if( azCmd==0 ){
4643 fprintf(stderr, "out of memory\n");
4644 exit(1);
4645 }
4646 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004647 }
drh98d312f2012-10-25 15:23:14 +00004648 }
drhcc3b4f82012-02-07 14:13:50 +00004649 if( z[1]=='-' ) z++;
4650 if( strcmp(z,"-separator")==0
4651 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004652 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004653 || strcmp(z,"-cmd")==0
4654 ){
drh98d312f2012-10-25 15:23:14 +00004655 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004656 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004657 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004658 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004659 /* Need to check for batch mode here to so we can avoid printing
4660 ** informational messages (like from process_sqliterc) before
4661 ** we do the actual processing of arguments later in a second pass.
4662 */
shanef69573d2009-10-24 02:06:14 +00004663 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004664 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004665#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004666 const char *zSize;
4667 sqlite3_int64 szHeap;
4668
drh98d312f2012-10-25 15:23:14 +00004669 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004670 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004671 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004672 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4673#endif
drh44dec872014-08-30 15:49:25 +00004674 }else if( strcmp(z,"-scratch")==0 ){
4675 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004676 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004677 if( sz>400000 ) sz = 400000;
4678 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004679 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004680 if( n>10 ) n = 10;
4681 if( n<1 ) n = 1;
4682 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4683 data.shellFlgs |= SHFLG_Scratch;
4684 }else if( strcmp(z,"-pagecache")==0 ){
4685 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004686 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004687 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00004688 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004689 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00004690 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
4691 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00004692 data.shellFlgs |= SHFLG_Pagecache;
4693 }else if( strcmp(z,"-lookaside")==0 ){
4694 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004695 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004696 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004697 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004698 if( n<0 ) n = 0;
4699 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4700 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004701#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004702 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004703 extern int vfstrace_register(
4704 const char *zTraceName,
4705 const char *zOldVfsName,
4706 int (*xOut)(const char*,void*),
4707 void *pOutArg,
4708 int makeDefault
4709 );
drh2b625e22011-03-16 17:05:28 +00004710 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004711#endif
drh6f25e892011-07-08 17:02:57 +00004712#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004713 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004714 extern int sqlite3_multiple_initialize(const char*,int);
4715 sqlite3_multiplex_initialize(0, 1);
4716#endif
drh7d9f3942013-04-03 01:26:54 +00004717 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004718 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4719 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004720 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004721 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004722 if( pVfs ){
4723 sqlite3_vfs_register(pVfs, 1);
4724 }else{
4725 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4726 exit(1);
4727 }
drh44c2eb12003-04-30 11:38:26 +00004728 }
4729 }
drh98d312f2012-10-25 15:23:14 +00004730 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004731#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004732 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004733 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004734#else
shane86f5bdb2009-10-24 02:00:07 +00004735 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4736 return 1;
drh01b41712005-08-29 23:06:23 +00004737#endif
drh98d312f2012-10-25 15:23:14 +00004738 }
4739 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004740
drh44c2eb12003-04-30 11:38:26 +00004741 /* Go ahead and open the database file if it already exists. If the
4742 ** file does not exist, delay opening it. This prevents empty database
4743 ** files from being created if a user mistypes the database name argument
4744 ** to the sqlite command-line tool.
4745 */
drhc8d74412004-08-31 23:41:26 +00004746 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004747 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004748 }
4749
drh22fbcb82004-02-01 01:22:50 +00004750 /* Process the initialization file if there is one. If no -init option
4751 ** is given on the command line, look for a file named ~/.sqliterc and
4752 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004753 */
drh534f4df2015-02-28 14:03:35 +00004754 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00004755
drh22fbcb82004-02-01 01:22:50 +00004756 /* Make a second pass through the command-line argument and set
4757 ** options. This second pass is delayed until after the initialization
4758 ** file is processed so that the command-line arguments will override
4759 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004760 */
drh98d312f2012-10-25 15:23:14 +00004761 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004762 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004763 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004764 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004765 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004766 i++;
4767 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004768 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004769 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004770 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004771 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004772 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004773 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004774 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004775 }else if( strcmp(z,"-csv")==0 ){
4776 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004777 memcpy(data.colSeparator,",",2);
4778 }else if( strcmp(z,"-ascii")==0 ){
4779 data.mode = MODE_Ascii;
4780 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004781 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00004782 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004783 SEP_Record);
mistachkine0d68852014-12-11 03:12:33 +00004784 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004785 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4786 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004787 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00004788 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00004789 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004790 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00004791 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00004792 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004793 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004794 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004795 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004796 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004797 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004798 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004799 }else if( strcmp(z,"-eqp")==0 ){
4800 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004801 }else if( strcmp(z,"-stats")==0 ){
4802 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004803 }else if( strcmp(z,"-scanstats")==0 ){
4804 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00004805 }else if( strcmp(z,"-backslash")==0 ){
4806 /* Undocumented command-line option: -backslash
4807 ** Causes C-style backslash escapes to be evaluated in SQL statements
4808 ** prior to sending the SQL into SQLite. Useful for injecting
4809 ** crazy bytes in the middle of SQL statements for testing and debugging.
4810 */
4811 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004812 }else if( strcmp(z,"-bail")==0 ){
4813 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004814 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004815 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004816 return 0;
drhc28490c2006-10-26 14:25:58 +00004817 }else if( strcmp(z,"-interactive")==0 ){
4818 stdin_is_interactive = 1;
4819 }else if( strcmp(z,"-batch")==0 ){
4820 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004821 }else if( strcmp(z,"-heap")==0 ){
4822 i++;
drh44dec872014-08-30 15:49:25 +00004823 }else if( strcmp(z,"-scratch")==0 ){
4824 i+=2;
4825 }else if( strcmp(z,"-pagecache")==0 ){
4826 i+=2;
4827 }else if( strcmp(z,"-lookaside")==0 ){
4828 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004829 }else if( strcmp(z,"-mmap")==0 ){
4830 i++;
drha7e61d82011-03-12 17:02:57 +00004831 }else if( strcmp(z,"-vfs")==0 ){
4832 i++;
drh6f25e892011-07-08 17:02:57 +00004833#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004834 }else if( strcmp(z,"-vfstrace")==0 ){
4835 i++;
drh6f25e892011-07-08 17:02:57 +00004836#endif
4837#ifdef SQLITE_ENABLE_MULTIPLEX
4838 }else if( strcmp(z,"-multiplex")==0 ){
4839 i++;
4840#endif
drhcc3b4f82012-02-07 14:13:50 +00004841 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004842 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004843 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004844 /* Run commands that follow -cmd first and separately from commands
4845 ** that simply appear on the command-line. This seems goofy. It would
4846 ** be better if all commands ran in the order that they appear. But
4847 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004848 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004849 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004850 if( z[0]=='.' ){
4851 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004852 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004853 }else{
drh05782482013-10-24 15:20:20 +00004854 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004855 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4856 if( zErrMsg!=0 ){
4857 fprintf(stderr,"Error: %s\n", zErrMsg);
4858 if( bail_on_error ) return rc!=0 ? rc : 1;
4859 }else if( rc!=0 ){
4860 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4861 if( bail_on_error ) return rc;
4862 }
4863 }
drh1e5d0e92000-05-31 23:33:17 +00004864 }else{
shane86f5bdb2009-10-24 02:00:07 +00004865 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004866 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004867 return 1;
4868 }
4869 }
drh44c2eb12003-04-30 11:38:26 +00004870
drhac5649a2014-11-28 13:35:03 +00004871 if( !readStdin ){
4872 /* Run all arguments that do not begin with '-' as if they were separate
4873 ** command-line inputs, except for the argToSkip argument which contains
4874 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004875 */
drhac5649a2014-11-28 13:35:03 +00004876 for(i=0; i<nCmd; i++){
4877 if( azCmd[i][0]=='.' ){
4878 rc = do_meta_command(azCmd[i], &data);
4879 if( rc ) return rc==2 ? 0 : rc;
4880 }else{
4881 open_db(&data, 0);
4882 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4883 if( zErrMsg!=0 ){
4884 fprintf(stderr,"Error: %s\n", zErrMsg);
4885 return rc!=0 ? rc : 1;
4886 }else if( rc!=0 ){
4887 fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4888 return rc;
4889 }
drh6ff13852001-11-25 13:18:23 +00004890 }
drh75897232000-05-29 14:26:00 +00004891 }
drhac5649a2014-11-28 13:35:03 +00004892 free(azCmd);
drh75897232000-05-29 14:26:00 +00004893 }else{
drh44c2eb12003-04-30 11:38:26 +00004894 /* Run commands received from standard input
4895 */
drhc28490c2006-10-26 14:25:58 +00004896 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004897 char *zHome;
4898 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004899 int nHistory;
drh75897232000-05-29 14:26:00 +00004900 printf(
drh743e0032011-12-12 16:51:50 +00004901 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004902 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004903 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004904 );
drhb3735912014-02-10 16:13:42 +00004905 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004906 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004907 printBold("transient in-memory database");
4908 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004909 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004910 }
drh67505e72002-04-19 12:34:06 +00004911 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004912 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004913 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004914 if( (zHistory = malloc(nHistory))!=0 ){
4915 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4916 }
drh67505e72002-04-19 12:34:06 +00004917 }
drhf5ed7ad2015-06-15 14:43:25 +00004918 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00004919 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004920 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00004921 shell_stifle_history(100);
4922 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004923 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004924 }
drhdaffd0e2001-04-11 14:28:42 +00004925 }else{
drhc28490c2006-10-26 14:25:58 +00004926 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004927 }
4928 }
drh33048c02001-10-01 14:29:22 +00004929 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004930 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004931 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004932 }
drh05782482013-10-24 15:20:20 +00004933 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004934 return rc;
drh75897232000-05-29 14:26:00 +00004935}