blob: 2ce2f292dc3104ae8925cf0e20d3ad4cfb6943b7 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
mistachkin2318d332015-01-12 18:02:52 +000021** If requested, include the SQLite compiler options file for MSVC.
22*/
23#if defined(INCLUDE_MSVC_H)
24#include "msvc.h"
25#endif
26
27/*
drh8cd5b252015-03-02 22:06:43 +000028** No support for loadable extensions in VxWorks.
29*/
drhada3f2b2015-03-23 21:32:50 +000030#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
drh8cd5b252015-03-02 22:06:43 +000031# define SQLITE_OMIT_LOAD_EXTENSION 1
32#endif
33
34/*
drh36f7dd32011-10-13 16:02:17 +000035** Enable large-file support for fopen() and friends on unix.
36*/
37#ifndef SQLITE_DISABLE_LFS
38# define _LARGE_FILE 1
39# ifndef _FILE_OFFSET_BITS
40# define _FILE_OFFSET_BITS 64
41# endif
42# define _LARGEFILE_SOURCE 1
43#endif
44
drh75897232000-05-29 14:26:00 +000045#include <stdlib.h>
46#include <string.h>
47#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000048#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000049#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000050#if SQLITE_USER_AUTHENTICATION
51# include "sqlite3userauth.h"
52#endif
drh75897232000-05-29 14:26:00 +000053#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000054#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000055
drh83905c92012-06-21 13:00:37 +000056#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000057# include <signal.h>
chw97185482008-11-17 08:05:31 +000058# if !defined(__RTP__) && !defined(_WRS_KERNEL)
59# include <pwd.h>
60# endif
drhdd45df82002-04-18 12:39:03 +000061# include <unistd.h>
62# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000063#endif
drh75897232000-05-29 14:26:00 +000064
drh0ede9eb2015-01-10 16:49:23 +000065#if HAVE_READLINE
drh8e7e7a22000-05-30 18:45:23 +000066# include <readline/readline.h>
67# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000068#endif
danfd34d6d2015-02-25 10:54:53 +000069
drh0ede9eb2015-01-10 16:49:23 +000070#if HAVE_EDITLINE
drhaaa21b42014-02-11 14:37:51 +000071# include <editline/readline.h>
72#endif
danfd34d6d2015-02-25 10:54:53 +000073
74#if HAVE_EDITLINE || HAVE_READLINE
75
76# define shell_add_history(X) add_history(X)
77# define shell_read_history(X) read_history(X)
78# define shell_write_history(X) write_history(X)
79# define shell_stifle_history(X) stifle_history(X)
80# define shell_readline(X) readline(X)
81
82#elif HAVE_LINENOISE
83
84# include "linenoise.h"
85# define shell_add_history(X) linenoiseHistoryAdd(X)
86# define shell_read_history(X) linenoiseHistoryLoad(X)
87# define shell_write_history(X) linenoiseHistorySave(X)
88# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89# define shell_readline(X) linenoise(X)
90
91#else
92
93# define shell_read_history(X)
94# define shell_write_history(X)
95# define shell_stifle_history(X)
96
97# define SHELL_USE_LOCAL_GETLINE 1
drh75897232000-05-29 14:26:00 +000098#endif
99
danfd34d6d2015-02-25 10:54:53 +0000100
adamd2e8464a2006-09-06 21:39:40 +0000101#if defined(_WIN32) || defined(WIN32)
102# include <io.h>
drh6976c212014-07-24 12:09:47 +0000103# include <fcntl.h>
mistachkin073664d2015-06-17 18:57:37 +0000104# define isatty(h) _isatty(h)
105# ifndef access
106# define access(f,m) _access((f),(m))
107# endif
108# undef popen
109# define popen _popen
110# undef pclose
111# define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000112#else
mistachkin073664d2015-06-17 18:57:37 +0000113 /* Make sure isatty() has a prototype. */
114 extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000115
mistachkin073664d2015-06-17 18:57:37 +0000116# if !defined(__RTP__) && !defined(_WRS_KERNEL)
117 /* popen and pclose are not C89 functions and so are
118 ** sometimes omitted from the <stdio.h> header */
119 extern FILE *popen(const char*,const char*);
120 extern int pclose(FILE*);
121# else
122# define SQLITE_OMIT_POPEN 1
123# endif
mistachkinf6418892013-08-28 01:54:12 +0000124#endif
drh53371f92013-07-25 17:07:03 +0000125
chw65d3c132007-11-12 21:09:10 +0000126#if defined(_WIN32_WCE)
127/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128 * thus we always assume that we have a console. That can be
129 * overridden with the -batch command line option.
130 */
131#define isatty(x) 1
132#endif
133
drhf0693c82011-10-11 20:41:54 +0000134/* ctype macros that work with signed characters */
135#define IsSpace(X) isspace((unsigned char)X)
136#define IsDigit(X) isdigit((unsigned char)X)
137#define ToLower(X) (char)tolower((unsigned char)X)
138
drh047d4532015-01-18 20:30:23 +0000139/* On Windows, we normally run with output mode of TEXT so that \n characters
140** are automatically translated into \r\n. However, this behavior needs
141** to be disabled in some cases (ex: when generating CSV output and when
142** rendering quoted strings that contain \n characters). The following
143** routines take care of that.
144*/
145#if defined(_WIN32) || defined(WIN32)
mistachkine4a0d792015-01-27 21:24:33 +0000146static void setBinaryMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000147 fflush(out);
148 _setmode(_fileno(out), _O_BINARY);
149}
mistachkine4a0d792015-01-27 21:24:33 +0000150static void setTextMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000151 fflush(out);
152 _setmode(_fileno(out), _O_TEXT);
153}
154#else
155# define setBinaryMode(X)
156# define setTextMode(X)
157#endif
158
drh43408312013-10-30 12:43:36 +0000159
160/* True if the timer is enabled */
161static int enableTimer = 0;
162
163/* Return the current wall-clock time */
164static sqlite3_int64 timeOfDay(void){
165 static sqlite3_vfs *clockVfs = 0;
166 sqlite3_int64 t;
167 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000168 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000169 clockVfs->xCurrentTimeInt64(clockVfs, &t);
170 }else{
171 double r;
172 clockVfs->xCurrentTime(clockVfs, &r);
173 t = (sqlite3_int64)(r*86400000.0);
174 }
175 return t;
176}
177
drh91eb93c2015-03-03 19:56:20 +0000178#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000179#include <sys/time.h>
180#include <sys/resource.h>
181
drh91eb93c2015-03-03 19:56:20 +0000182/* VxWorks does not support getrusage() as far as we can determine */
183#if defined(_WRS_KERNEL) || defined(__RTP__)
184struct rusage {
185 struct timeval ru_utime; /* user CPU time used */
186 struct timeval ru_stime; /* system CPU time used */
187};
188#define getrusage(A,B) memset(B,0,sizeof(*B))
189#endif
190
drhda108222009-02-25 19:07:24 +0000191/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000192static struct rusage sBegin; /* CPU time at start */
193static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000194
drhda108222009-02-25 19:07:24 +0000195/*
196** Begin timing an operation
197*/
198static void beginTimer(void){
199 if( enableTimer ){
200 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000201 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000202 }
203}
204
205/* Return the difference of two time_structs in seconds */
206static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
207 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
208 (double)(pEnd->tv_sec - pStart->tv_sec);
209}
210
211/*
212** Print the timing results.
213*/
214static void endTimer(void){
215 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000216 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000217 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000218 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000219 printf("Run Time: real %.3f user %f sys %f\n",
220 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000221 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
222 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
223 }
224}
shaneb320ccd2009-10-21 03:42:58 +0000225
drhda108222009-02-25 19:07:24 +0000226#define BEGIN_TIMER beginTimer()
227#define END_TIMER endTimer()
228#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000229
230#elif (defined(_WIN32) || defined(WIN32))
231
232#include <windows.h>
233
234/* Saved resource information for the beginning of an operation */
235static HANDLE hProcess;
236static FILETIME ftKernelBegin;
237static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000238static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000239typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
240 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000241static GETPROCTIMES getProcessTimesAddr = NULL;
242
shaneb320ccd2009-10-21 03:42:58 +0000243/*
244** Check to see if we have timer support. Return 1 if necessary
245** support found (or found previously).
246*/
247static int hasTimer(void){
248 if( getProcessTimesAddr ){
249 return 1;
250 } else {
drh4ace5362014-11-10 14:42:28 +0000251 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
252 ** versions. See if the version we are running on has it, and if it
253 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000254 */
255 hProcess = GetCurrentProcess();
256 if( hProcess ){
257 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
258 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000259 getProcessTimesAddr =
260 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000261 if( NULL != getProcessTimesAddr ){
262 return 1;
263 }
264 FreeLibrary(hinstLib);
265 }
266 }
267 }
268 return 0;
269}
270
271/*
272** Begin timing an operation
273*/
274static void beginTimer(void){
275 if( enableTimer && getProcessTimesAddr ){
276 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000277 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
278 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000279 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000280 }
281}
282
283/* Return the difference of two FILETIME structs in seconds */
284static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
285 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
286 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
287 return (double) ((i64End - i64Start) / 10000000.0);
288}
289
290/*
291** Print the timing results.
292*/
293static void endTimer(void){
294 if( enableTimer && getProcessTimesAddr){
295 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000296 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000297 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000298 printf("Run Time: real %.3f user %f sys %f\n",
299 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000300 timeDiff(&ftUserBegin, &ftUserEnd),
301 timeDiff(&ftKernelBegin, &ftKernelEnd));
302 }
303}
304
305#define BEGIN_TIMER beginTimer()
306#define END_TIMER endTimer()
307#define HAS_TIMER hasTimer()
308
drhda108222009-02-25 19:07:24 +0000309#else
310#define BEGIN_TIMER
311#define END_TIMER
312#define HAS_TIMER 0
313#endif
314
shanec0688ea2009-03-05 03:48:06 +0000315/*
316** Used to prevent warnings about unused parameters
317*/
318#define UNUSED_PARAMETER(x) (void)(x)
319
drhe91d16b2008-12-08 18:27:31 +0000320/*
drhc49f44e2006-10-26 18:15:42 +0000321** If the following flag is set, then command execution stops
322** at an error if we are not interactive.
323*/
324static int bail_on_error = 0;
325
326/*
drhc28490c2006-10-26 14:25:58 +0000327** Threat stdin as an interactive input if the following variable
328** is true. Otherwise, assume stdin is connected to a file or pipe.
329*/
330static int stdin_is_interactive = 1;
331
332/*
drhe05461c2015-12-30 13:36:57 +0000333** On Windows systems we have to know if standard output is a console
334** in order to translate UTF-8 into MBCS. The following variable is
335** true if translation is required.
336*/
337static int stdout_is_console = 1;
338
339/*
drh4c504392000-10-16 22:06:40 +0000340** The following is the open SQLite database. We make a pointer
341** to this database a static variable so that it can be accessed
342** by the SIGINT handler to interrupt database processing.
343*/
mistachkin8e189222015-04-19 21:43:16 +0000344static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000345
346/*
drh67505e72002-04-19 12:34:06 +0000347** True if an interrupt (Control-C) has been received.
348*/
drh43617e92006-03-06 20:55:46 +0000349static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000350
351/*
persicom7e2dfdd2002-04-18 02:46:52 +0000352** This is the name of our program. It is set in main(), used
353** in a number of other places, mostly for error messages.
354*/
355static char *Argv0;
356
357/*
358** Prompt strings. Initialized in main. Settable with
359** .prompt main continue
360*/
361static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
362static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
363
drhb0603412007-02-28 04:47:26 +0000364/*
365** Write I/O traces to the following stream.
366*/
rsebe0a9092007-07-30 18:24:38 +0000367#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000368static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000369#endif
drhb0603412007-02-28 04:47:26 +0000370
371/*
372** This routine works like printf in that its first argument is a
373** format string and subsequent arguments are values to be substituted
374** in place of % fields. The result of formatting this string
375** is written to iotrace.
376*/
rsebe0a9092007-07-30 18:24:38 +0000377#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000378static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000379 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000380 char *z;
drhb0603412007-02-28 04:47:26 +0000381 if( iotrace==0 ) return;
382 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000383 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000384 va_end(ap);
drh41d0ba72016-01-03 11:27:47 +0000385 fprintf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000386 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000387}
rsebe0a9092007-07-30 18:24:38 +0000388#endif
drhb0603412007-02-28 04:47:26 +0000389
drh44c2eb12003-04-30 11:38:26 +0000390
persicom7e2dfdd2002-04-18 02:46:52 +0000391/*
drh83965662003-04-17 02:54:13 +0000392** Determines if a string is a number of not.
393*/
danielk19772e588c72005-12-09 14:25:08 +0000394static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000395 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000396 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000397 return 0;
398 }
399 z++;
400 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000401 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000402 if( *z=='.' ){
403 z++;
drhf0693c82011-10-11 20:41:54 +0000404 if( !IsDigit(*z) ) return 0;
405 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000406 if( realnum ) *realnum = 1;
407 }
408 if( *z=='e' || *z=='E' ){
409 z++;
410 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000411 if( !IsDigit(*z) ) return 0;
412 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000413 if( realnum ) *realnum = 1;
414 }
415 return *z==0;
416}
drh83965662003-04-17 02:54:13 +0000417
418/*
danielk1977bc6ada42004-06-30 08:20:16 +0000419** A global char* and an SQL function to access its current value
420** from within an SQL statement. This program used to use the
421** sqlite_exec_printf() API to substitue a string into an SQL statement.
422** The correct way to do this with sqlite3 is to use the bind API, but
423** since the shell is built around the callback paradigm it would be a lot
424** of work. Instead just use this hack, which is quite harmless.
425*/
426static const char *zShellStatic = 0;
427static void shellstaticFunc(
428 sqlite3_context *context,
429 int argc,
430 sqlite3_value **argv
431){
432 assert( 0==argc );
433 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000434 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000435 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000436 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
437}
438
439
440/*
drhe05461c2015-12-30 13:36:57 +0000441** Compute a string length that is limited to what can be stored in
442** lower 30 bits of a 32-bit signed integer.
443*/
444static int strlen30(const char *z){
445 const char *z2 = z;
446 while( *z2 ){ z2++; }
447 return 0x3fffffff & (int)(z2 - z);
448}
449
450/*
drhfeac5f82004-08-01 00:10:45 +0000451** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000452** the text in memory obtained from malloc() and returns a pointer
453** to the text. NULL is returned at end of file, or if malloc()
454** fails.
455**
drh9f099fd2013-08-06 14:01:46 +0000456** If zLine is not NULL then it is a malloced buffer returned from
457** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000458*/
drh9f099fd2013-08-06 14:01:46 +0000459static char *local_getline(char *zLine, FILE *in){
460 int nLine = zLine==0 ? 0 : 100;
461 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000462
drhb07028f2011-10-14 21:49:18 +0000463 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000464 if( n+100>nLine ){
465 nLine = nLine*2 + 100;
466 zLine = realloc(zLine, nLine);
467 if( zLine==0 ) return 0;
468 }
drhdaffd0e2001-04-11 14:28:42 +0000469 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000470 if( n==0 ){
471 free(zLine);
472 return 0;
473 }
474 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000475 break;
476 }
drh9f099fd2013-08-06 14:01:46 +0000477 while( zLine[n] ) n++;
478 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000479 n--;
shaneh13b36022009-12-17 21:07:15 +0000480 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000481 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000482 break;
drh8e7e7a22000-05-30 18:45:23 +0000483 }
484 }
drhe05461c2015-12-30 13:36:57 +0000485#if defined(_WIN32) || defined(WIN32)
486 /* For interactive input on Windows systems, translate the
487 ** multi-byte characterset characters into UTF-8. */
488 if( stdin_is_interactive ){
489 extern char *sqlite3_win32_mbcs_to_utf8(const char*);
490 char *zTrans = sqlite3_win32_mbcs_to_utf8(zLine);
491 if( zTrans ){
492 int nTrans = strlen30(zTrans)+1;
493 if( nTrans>nLine ){
494 zLine = realloc(zLine, nTrans);
495 if( zLine==0 ){
496 sqlite3_free(zTrans);
497 return 0;
498 }
499 }
500 memcpy(zLine, zTrans, nTrans);
501 sqlite3_free(zTrans);
502 }
503 }
504#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000505 return zLine;
506}
507
508/*
drhc28490c2006-10-26 14:25:58 +0000509** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000510**
drh9f099fd2013-08-06 14:01:46 +0000511** If in==0 then read from standard input and prompt before each line.
512** If isContinuation is true, then a continuation prompt is appropriate.
513** If isContinuation is zero, then the main prompt should be used.
514**
515** If zPrior is not NULL then it is a buffer from a prior call to this
516** routine that can be reused.
517**
518** The result is stored in space obtained from malloc() and must either
519** be freed by the caller or else passed back into this routine via the
520** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000521*/
drh9f099fd2013-08-06 14:01:46 +0000522static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000523 char *zPrompt;
524 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000525 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000526 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000527 }else{
drh9f099fd2013-08-06 14:01:46 +0000528 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000529#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000530 printf("%s", zPrompt);
531 fflush(stdout);
532 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000533#else
534 free(zPrior);
535 zResult = shell_readline(zPrompt);
536 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000537#endif
drh9f099fd2013-08-06 14:01:46 +0000538 }
drh8e7e7a22000-05-30 18:45:23 +0000539 return zResult;
540}
541
drhe6229612014-08-18 15:08:26 +0000542#if defined(SQLITE_ENABLE_SESSION)
543/*
544** State information for a single open session
545*/
546typedef struct OpenSession OpenSession;
547struct OpenSession {
548 char *zName; /* Symbolic name for this session */
549 int nFilter; /* Number of xFilter rejection GLOB patterns */
550 char **azFilter; /* Array of xFilter rejection GLOB patterns */
551 sqlite3_session *p; /* The open session */
552};
553#endif
554
drhdcd87a92014-08-18 13:45:42 +0000555/*
drhe05461c2015-12-30 13:36:57 +0000556** Render output like fprintf(). Except, if the output is going to the
557** console and if this is running on a Windows machine, translate the
558** output from UTF-8 into MBCS.
559*/
560#if defined(_WIN32) || defined(WIN32)
561void utf8_printf(FILE *out, const char *zFormat, ...){
562 va_list ap;
563 va_start(ap, zFormat);
mistachkinaae280e2015-12-31 19:06:24 +0000564 if( stdout_is_console && (out==stdout || out==stderr) ){
drhe05461c2015-12-30 13:36:57 +0000565 extern char *sqlite3_win32_utf8_to_mbcs(const char*);
566 char *z1 = sqlite3_vmprintf(zFormat, ap);
567 char *z2 = sqlite3_win32_utf8_to_mbcs(z1);
568 sqlite3_free(z1);
569 fputs(z2, out);
570 sqlite3_free(z2);
571 }else{
572 vfprintf(out, zFormat, ap);
573 }
574 va_end(ap);
575}
mistachkinaae280e2015-12-31 19:06:24 +0000576#elif !defined(utf8_printf)
drhe05461c2015-12-30 13:36:57 +0000577# define utf8_printf fprintf
578#endif
579
580/*
mistachkinaae280e2015-12-31 19:06:24 +0000581** Render output like fprintf(). This should not be used on anything that
582** includes string formatting (e.g. "%s").
583*/
584#if !defined(raw_printf)
585# define raw_printf fprintf
586#endif
587
588/*
drhdcd87a92014-08-18 13:45:42 +0000589** Shell output mode information from before ".explain on",
590** saved so that it can be restored by ".explain off"
591*/
592typedef struct SavedModeInfo SavedModeInfo;
593struct SavedModeInfo {
594 int valid; /* Is there legit data in here? */
595 int mode; /* Mode prior to ".explain on" */
596 int showHeader; /* The ".header" setting prior to ".explain on" */
597 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000598};
drh45e29d82006-11-20 16:21:10 +0000599
drh8e7e7a22000-05-30 18:45:23 +0000600/*
drhdcd87a92014-08-18 13:45:42 +0000601** State information about the database connection is contained in an
602** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000603*/
drhdcd87a92014-08-18 13:45:42 +0000604typedef struct ShellState ShellState;
605struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000606 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000607 int echoOn; /* True to echo input commands */
drh700c2522016-02-09 18:39:25 +0000608 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +0000609 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000610 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000611 int scanstatsOn; /* True to display scan stats before each finalize */
drhdf12f1c2015-12-07 21:46:19 +0000612 int countChanges; /* True to display change counts */
drh9569f602015-04-16 15:05:04 +0000613 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +0000614 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000615 int cnt; /* Number of records displayed so far */
616 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000617 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000618 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000619 int mode; /* An output mode setting */
drh700c2522016-02-09 18:39:25 +0000620 int cMode; /* temporary output mode for the current query */
621 int normalMode; /* Output mode before ".explain on" */
drh45e29d82006-11-20 16:21:10 +0000622 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000623 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000624 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000625 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000626 char colSeparator[20]; /* Column separator character for several modes */
627 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000628 int colWidth[100]; /* Requested width of each column when in column mode*/
629 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +0000630 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +0000631 ** the database */
drh44c2eb12003-04-30 11:38:26 +0000632 char outfile[FILENAME_MAX]; /* Filename for *out */
633 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000634 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000635 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000636 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000637 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000638 int *aiIndent; /* Array of indents used in MODE_Explain */
639 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000640 int iIndent; /* Index of current op in aiIndent[] */
drhe6229612014-08-18 15:08:26 +0000641#if defined(SQLITE_ENABLE_SESSION)
642 int nSession; /* Number of active sessions */
643 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
644#endif
drh75897232000-05-29 14:26:00 +0000645};
646
647/*
drh44dec872014-08-30 15:49:25 +0000648** These are the allowed shellFlgs values
649*/
650#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
651#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
652#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
653
654/*
drh75897232000-05-29 14:26:00 +0000655** These are the allowed modes.
656*/
drh967e8b72000-06-21 13:59:10 +0000657#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000658#define MODE_Column 1 /* One record per line in neat columns */
659#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000660#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
661#define MODE_Html 4 /* Generate an XHTML table */
662#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000663#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000664#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000665#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000666#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000667
drh66ce4d02008-02-15 17:38:06 +0000668static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000669 "line",
670 "column",
671 "list",
672 "semi",
673 "html",
drhfeac5f82004-08-01 00:10:45 +0000674 "insert",
675 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000676 "csv",
drh66ce4d02008-02-15 17:38:06 +0000677 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000678 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000679};
drh75897232000-05-29 14:26:00 +0000680
681/*
mistachkinfad42082014-07-24 22:13:12 +0000682** These are the column/row/line separators used by the various
683** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +0000684*/
mistachkinfad42082014-07-24 22:13:12 +0000685#define SEP_Column "|"
686#define SEP_Row "\n"
687#define SEP_Tab "\t"
688#define SEP_Space " "
689#define SEP_Comma ","
690#define SEP_CrLf "\r\n"
691#define SEP_Unit "\x1F"
692#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +0000693
694/*
drh75897232000-05-29 14:26:00 +0000695** Number of elements in an array
696*/
drh902b9ee2008-12-05 17:17:07 +0000697#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000698
699/*
drh127f9d72010-02-23 01:47:00 +0000700** A callback for the sqlite3_log() interface.
701*/
702static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000703 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000704 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +0000705 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +0000706 fflush(p->pLog);
707}
708
709/*
shane626a6e42009-10-22 17:30:15 +0000710** Output the given string as a hex-encoded blob (eg. X'1234' )
711*/
712static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
713 int i;
714 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +0000715 raw_printf(out,"X'");
716 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
717 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +0000718}
719
720/*
drh28bd4bc2000-06-15 15:57:22 +0000721** Output the given string as a quoted string using SQL quoting conventions.
722*/
723static void output_quoted_string(FILE *out, const char *z){
724 int i;
725 int nSingle = 0;
drh047d4532015-01-18 20:30:23 +0000726 setBinaryMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000727 for(i=0; z[i]; i++){
728 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000729 }
730 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +0000731 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000732 }else{
mistachkinaae280e2015-12-31 19:06:24 +0000733 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000734 while( *z ){
735 for(i=0; z[i] && z[i]!='\''; i++){}
736 if( i==0 ){
mistachkinaae280e2015-12-31 19:06:24 +0000737 raw_printf(out,"''");
drh28bd4bc2000-06-15 15:57:22 +0000738 z++;
739 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +0000740 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +0000741 z += i+1;
742 }else{
drhe05461c2015-12-30 13:36:57 +0000743 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000744 break;
745 }
746 }
mistachkinaae280e2015-12-31 19:06:24 +0000747 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000748 }
drh047d4532015-01-18 20:30:23 +0000749 setTextMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000750}
751
752/*
drhfeac5f82004-08-01 00:10:45 +0000753** Output the given string as a quoted according to C or TCL quoting rules.
754*/
755static void output_c_string(FILE *out, const char *z){
756 unsigned int c;
757 fputc('"', out);
758 while( (c = *(z++))!=0 ){
759 if( c=='\\' ){
760 fputc(c, out);
761 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000762 }else if( c=='"' ){
763 fputc('\\', out);
764 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000765 }else if( c=='\t' ){
766 fputc('\\', out);
767 fputc('t', out);
768 }else if( c=='\n' ){
769 fputc('\\', out);
770 fputc('n', out);
771 }else if( c=='\r' ){
772 fputc('\\', out);
773 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000774 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +0000775 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000776 }else{
777 fputc(c, out);
778 }
779 }
780 fputc('"', out);
781}
782
783/*
drhc08a4f12000-06-15 16:49:48 +0000784** Output the given string with characters that are special to
785** HTML escaped.
786*/
787static void output_html_string(FILE *out, const char *z){
788 int i;
drhc3d6ba42014-01-13 20:38:35 +0000789 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000790 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000791 for(i=0; z[i]
792 && z[i]!='<'
793 && z[i]!='&'
794 && z[i]!='>'
795 && z[i]!='\"'
796 && z[i]!='\'';
797 i++){}
drhc08a4f12000-06-15 16:49:48 +0000798 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +0000799 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +0000800 }
801 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +0000802 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +0000803 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +0000804 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000805 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +0000806 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +0000807 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +0000808 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +0000809 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +0000810 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000811 }else{
812 break;
813 }
814 z += i + 1;
815 }
816}
817
818/*
drhc49f44e2006-10-26 18:15:42 +0000819** If a field contains any character identified by a 1 in the following
820** array, then the string must be quoted for CSV.
821*/
822static const char needCsvQuote[] = {
823 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
824 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
825 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
827 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
829 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
830 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
831 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
832 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
833 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
834 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
835 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
836 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
837 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
838 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
839};
840
841/*
mistachkindd11f2d2014-12-11 04:49:46 +0000842** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +0000843** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +0000844** the null value. Strings are quoted if necessary. The separator
845** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000846*/
drhdcd87a92014-08-18 13:45:42 +0000847static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000848 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000849 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +0000850 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +0000851 }else{
drhc49f44e2006-10-26 18:15:42 +0000852 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000853 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000854 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000855 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000856 || (z[i]==p->colSeparator[0] &&
857 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000858 i = 0;
859 break;
860 }
861 }
862 if( i==0 ){
863 putc('"', out);
864 for(i=0; z[i]; i++){
865 if( z[i]=='"' ) putc('"', out);
866 putc(z[i], out);
867 }
868 putc('"', out);
869 }else{
drhe05461c2015-12-30 13:36:57 +0000870 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +0000871 }
drh8e64d1c2004-10-07 00:32:39 +0000872 }
873 if( bSep ){
drhe05461c2015-12-30 13:36:57 +0000874 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000875 }
876}
877
danielk19774af00c62005-01-23 23:43:21 +0000878#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000879/*
drh4c504392000-10-16 22:06:40 +0000880** This routine runs when the user presses Ctrl-C
881*/
882static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000883 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000884 seenInterrupt++;
885 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +0000886 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +0000887}
danielk19774af00c62005-01-23 23:43:21 +0000888#endif
drh4c504392000-10-16 22:06:40 +0000889
890/*
shane626a6e42009-10-22 17:30:15 +0000891** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000892** invokes for each row of a query result.
893*/
drh4ace5362014-11-10 14:42:28 +0000894static int shell_callback(
895 void *pArg,
896 int nArg, /* Number of result columns */
897 char **azArg, /* Text of each result column */
898 char **azCol, /* Column names */
899 int *aiType /* Column types */
900){
drh75897232000-05-29 14:26:00 +0000901 int i;
drhdcd87a92014-08-18 13:45:42 +0000902 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000903
drh700c2522016-02-09 18:39:25 +0000904 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +0000905 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000906 int w = 5;
drh6a535342001-10-19 16:44:56 +0000907 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000908 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000909 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000910 if( len>w ) w = len;
911 }
drhe05461c2015-12-30 13:36:57 +0000912 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000913 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +0000914 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +0000915 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000916 }
917 break;
918 }
danielk19770d78bae2008-01-03 07:09:48 +0000919 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000920 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +0000921 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
922 const int *colWidth;
923 int showHdr;
924 char *rowSep;
925 if( p->cMode==MODE_Column ){
926 colWidth = p->colWidth;
927 showHdr = p->showHeader;
928 rowSep = p->rowSeparator;
929 }else{
930 colWidth = aExplainWidths;
931 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +0000932 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +0000933 }
drha0c66f52000-07-29 13:20:21 +0000934 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000935 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000936 int w, n;
937 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +0000938 w = colWidth[i];
drh75897232000-05-29 14:26:00 +0000939 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000940 w = 0;
drh75897232000-05-29 14:26:00 +0000941 }
drh078b1fd2012-09-21 13:40:02 +0000942 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000943 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000944 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +0000945 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +0000946 if( w<n ) w = n;
947 }
948 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000949 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000950 }
drh700c2522016-02-09 18:39:25 +0000951 if( showHdr ){
drh078b1fd2012-09-21 13:40:02 +0000952 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000953 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
drh700c2522016-02-09 18:39:25 +0000954 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +0000955 }else{
drhe05461c2015-12-30 13:36:57 +0000956 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
drh700c2522016-02-09 18:39:25 +0000957 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +0000958 }
drha0c66f52000-07-29 13:20:21 +0000959 }
960 }
drh700c2522016-02-09 18:39:25 +0000961 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +0000962 for(i=0; i<nArg; i++){
963 int w;
964 if( i<ArraySize(p->actualWidth) ){
965 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000966 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000967 }else{
968 w = 10;
969 }
mistachkinaae280e2015-12-31 19:06:24 +0000970 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +0000971 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +0000972 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +0000973 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +0000974 }
drh75897232000-05-29 14:26:00 +0000975 }
976 }
drh6a535342001-10-19 16:44:56 +0000977 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000978 for(i=0; i<nArg; i++){
979 int w;
drha0c66f52000-07-29 13:20:21 +0000980 if( i<ArraySize(p->actualWidth) ){
981 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000982 }else{
983 w = 10;
984 }
drh700c2522016-02-09 18:39:25 +0000985 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000986 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000987 }
dana98bf362013-11-13 18:35:01 +0000988 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000989 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +0000990 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000991 }
danc4650bb2013-11-18 08:41:06 +0000992 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000993 }
drh078b1fd2012-09-21 13:40:02 +0000994 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +0000995 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +0000996 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +0000997 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +0000998 }else{
drhe05461c2015-12-30 13:36:57 +0000999 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +00001000 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001001 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001002 }
drh75897232000-05-29 14:26:00 +00001003 }
1004 break;
1005 }
drhe3710332000-09-29 13:30:53 +00001006 case MODE_Semi:
drh75897232000-05-29 14:26:00 +00001007 case MODE_List: {
1008 if( p->cnt++==0 && p->showHeader ){
1009 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001010 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00001011 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00001012 }
1013 }
drh6a535342001-10-19 16:44:56 +00001014 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001015 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001016 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00001017 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00001018 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001019 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00001020 utf8_printf(p->out, "%s", p->colSeparator);
drh700c2522016-02-09 18:39:25 +00001021 }else if( p->cMode==MODE_Semi ){
drhe05461c2015-12-30 13:36:57 +00001022 utf8_printf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001023 }else{
drhe05461c2015-12-30 13:36:57 +00001024 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001025 }
drh75897232000-05-29 14:26:00 +00001026 }
1027 break;
1028 }
drh1e5d0e92000-05-31 23:33:17 +00001029 case MODE_Html: {
1030 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001031 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001032 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001033 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001034 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001035 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001036 }
mistachkinaae280e2015-12-31 19:06:24 +00001037 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001038 }
drh6a535342001-10-19 16:44:56 +00001039 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001040 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001041 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001042 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001043 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001044 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001045 }
mistachkinaae280e2015-12-31 19:06:24 +00001046 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001047 break;
1048 }
drhfeac5f82004-08-01 00:10:45 +00001049 case MODE_Tcl: {
1050 if( p->cnt++==0 && p->showHeader ){
1051 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001052 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001053 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001054 }
drhe05461c2015-12-30 13:36:57 +00001055 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001056 }
1057 if( azArg==0 ) break;
1058 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001059 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001060 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001061 }
drhe05461c2015-12-30 13:36:57 +00001062 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001063 break;
1064 }
drh8e64d1c2004-10-07 00:32:39 +00001065 case MODE_Csv: {
drh047d4532015-01-18 20:30:23 +00001066 setBinaryMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001067 if( p->cnt++==0 && p->showHeader ){
1068 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001069 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001070 }
drhe05461c2015-12-30 13:36:57 +00001071 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001072 }
drh40253262014-10-17 21:35:05 +00001073 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001074 for(i=0; i<nArg; i++){
1075 output_csv(p, azArg[i], i<nArg-1);
1076 }
drhe05461c2015-12-30 13:36:57 +00001077 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001078 }
drh047d4532015-01-18 20:30:23 +00001079 setTextMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +00001080 break;
1081 }
drh28bd4bc2000-06-15 15:57:22 +00001082 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +00001083 p->cnt++;
drh6a535342001-10-19 16:44:56 +00001084 if( azArg==0 ) break;
drhe05461c2015-12-30 13:36:57 +00001085 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
mistachkin151c75a2015-04-07 21:16:40 +00001086 if( p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001087 raw_printf(p->out,"(");
mistachkin151c75a2015-04-07 21:16:40 +00001088 for(i=0; i<nArg; i++){
1089 char *zSep = i>0 ? ",": "";
drhe05461c2015-12-30 13:36:57 +00001090 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
mistachkin151c75a2015-04-07 21:16:40 +00001091 }
mistachkinaae280e2015-12-31 19:06:24 +00001092 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00001093 }
mistachkinaae280e2015-12-31 19:06:24 +00001094 raw_printf(p->out," VALUES(");
drh28bd4bc2000-06-15 15:57:22 +00001095 for(i=0; i<nArg; i++){
1096 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00001097 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00001098 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00001099 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00001100 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00001101 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001102 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1103 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00001104 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00001105 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1106 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1107 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00001108 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00001109 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00001110 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00001111 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00001112 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001113 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00001114 output_quoted_string(p->out, azArg[i]);
1115 }
1116 }
mistachkinaae280e2015-12-31 19:06:24 +00001117 raw_printf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001118 break;
drh28bd4bc2000-06-15 15:57:22 +00001119 }
mistachkin636bf9f2014-07-19 20:15:16 +00001120 case MODE_Ascii: {
1121 if( p->cnt++==0 && p->showHeader ){
1122 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001123 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1124 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00001125 }
drhe05461c2015-12-30 13:36:57 +00001126 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001127 }
1128 if( azArg==0 ) break;
1129 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001130 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1131 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00001132 }
drhe05461c2015-12-30 13:36:57 +00001133 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00001134 break;
1135 }
persicom1d0b8722002-04-18 02:53:04 +00001136 }
drh75897232000-05-29 14:26:00 +00001137 return 0;
1138}
1139
1140/*
shane626a6e42009-10-22 17:30:15 +00001141** This is the callback routine that the SQLite library
1142** invokes for each row of a query result.
1143*/
1144static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1145 /* since we don't have type info, call the shell_callback with a NULL value */
1146 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1147}
1148
1149/*
drhdcd87a92014-08-18 13:45:42 +00001150** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00001151** the name of the table given. Escape any quote characters in the
1152** table name.
1153*/
drhdcd87a92014-08-18 13:45:42 +00001154static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00001155 int i, n;
1156 int needQuote;
1157 char *z;
1158
1159 if( p->zDestTable ){
1160 free(p->zDestTable);
1161 p->zDestTable = 0;
1162 }
1163 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001164 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001165 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001166 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001167 needQuote = 1;
1168 if( zName[i]=='\'' ) n++;
1169 }
1170 }
1171 if( needQuote ) n += 2;
1172 z = p->zDestTable = malloc( n+1 );
1173 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001174 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00001175 exit(1);
1176 }
1177 n = 0;
1178 if( needQuote ) z[n++] = '\'';
1179 for(i=0; zName[i]; i++){
1180 z[n++] = zName[i];
1181 if( zName[i]=='\'' ) z[n++] = '\'';
1182 }
1183 if( needQuote ) z[n++] = '\'';
1184 z[n] = 0;
1185}
1186
danielk19772a02e332004-06-05 08:04:36 +00001187/* zIn is either a pointer to a NULL-terminated string in memory obtained
1188** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1189** added to zIn, and the result returned in memory obtained from malloc().
1190** zIn, if it was not NULL, is freed.
1191**
1192** If the third argument, quote, is not '\0', then it is used as a
1193** quote character for zAppend.
1194*/
drhc28490c2006-10-26 14:25:58 +00001195static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001196 int len;
1197 int i;
drh4f21c4a2008-12-10 22:15:00 +00001198 int nAppend = strlen30(zAppend);
1199 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001200
1201 len = nAppend+nIn+1;
1202 if( quote ){
1203 len += 2;
1204 for(i=0; i<nAppend; i++){
1205 if( zAppend[i]==quote ) len++;
1206 }
1207 }
1208
1209 zIn = (char *)realloc(zIn, len);
1210 if( !zIn ){
1211 return 0;
1212 }
1213
1214 if( quote ){
1215 char *zCsr = &zIn[nIn];
1216 *zCsr++ = quote;
1217 for(i=0; i<nAppend; i++){
1218 *zCsr++ = zAppend[i];
1219 if( zAppend[i]==quote ) *zCsr++ = quote;
1220 }
1221 *zCsr++ = quote;
1222 *zCsr++ = '\0';
1223 assert( (zCsr-zIn)==len );
1224 }else{
1225 memcpy(&zIn[nIn], zAppend, nAppend);
1226 zIn[len-1] = '\0';
1227 }
1228
1229 return zIn;
1230}
1231
drhdd3d4592004-08-30 01:54:05 +00001232
1233/*
drhb21a8e42012-01-28 21:08:51 +00001234** Execute a query statement that will generate SQL output. Print
1235** the result columns, comma-separated, on a line and then add a
1236** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001237**
drhb21a8e42012-01-28 21:08:51 +00001238** If the number of columns is 1 and that column contains text "--"
1239** then write the semicolon on a separate line. That way, if a
1240** "--" comment occurs at the end of the statement, the comment
1241** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001242*/
drh157e29a2009-05-21 15:15:00 +00001243static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001244 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001245 const char *zSelect, /* SELECT statement to extract content */
1246 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001247){
drhdd3d4592004-08-30 01:54:05 +00001248 sqlite3_stmt *pSelect;
1249 int rc;
drhb21a8e42012-01-28 21:08:51 +00001250 int nResult;
1251 int i;
1252 const char *z;
drhc7181902014-02-27 15:04:13 +00001253 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001254 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00001255 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1256 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001257 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001258 return rc;
1259 }
1260 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001261 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001262 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001263 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00001264 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001265 zFirstRow = 0;
1266 }
drhb21a8e42012-01-28 21:08:51 +00001267 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00001268 utf8_printf(p->out, "%s", z);
drhb21a8e42012-01-28 21:08:51 +00001269 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00001270 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00001271 }
1272 if( z==0 ) z = "";
1273 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1274 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00001275 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00001276 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001277 raw_printf(p->out, ";\n");
drhb21a8e42012-01-28 21:08:51 +00001278 }
drhdd3d4592004-08-30 01:54:05 +00001279 rc = sqlite3_step(pSelect);
1280 }
drh2f464a02011-10-13 00:41:49 +00001281 rc = sqlite3_finalize(pSelect);
1282 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00001283 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1284 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001285 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001286 }
1287 return rc;
drhdd3d4592004-08-30 01:54:05 +00001288}
1289
shane626a6e42009-10-22 17:30:15 +00001290/*
1291** Allocate space and save off current error string.
1292*/
1293static char *save_err_msg(
1294 sqlite3 *db /* Database to query */
1295){
1296 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00001297 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00001298 if( zErrMsg ){
1299 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1300 }
1301 return zErrMsg;
1302}
1303
drh34784902016-02-27 17:12:36 +00001304#ifdef __linux__
1305/*
1306** Attempt to display I/O stats on Linux using /proc/PID/io
1307*/
1308static void displayLinuxIoStats(FILE *out){
1309 FILE *in;
1310 char z[200];
1311 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
1312 in = fopen(z, "rb");
1313 if( in==0 ) return;
1314 while( fgets(z, sizeof(z), in)!=0 ){
1315 static const struct {
1316 const char *zPattern;
1317 const char *zDesc;
1318 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00001319 { "rchar: ", "Bytes received by read():" },
1320 { "wchar: ", "Bytes sent to write():" },
1321 { "syscr: ", "Read() system calls:" },
1322 { "syscw: ", "Write() system calls:" },
1323 { "read_bytes: ", "Bytes read from storage:" },
1324 { "write_bytes: ", "Bytes written to storage:" },
1325 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00001326 };
1327 int i;
1328 for(i=0; i<ArraySize(aTrans); i++){
1329 int n = (int)strlen(aTrans[i].zPattern);
1330 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
1331 raw_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
1332 break;
1333 }
1334 }
1335 }
1336 fclose(in);
1337}
1338#endif
1339
1340
shane626a6e42009-10-22 17:30:15 +00001341/*
shaneh642d8b82010-07-28 16:05:34 +00001342** Display memory stats.
1343*/
1344static int display_stats(
1345 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001346 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001347 int bReset /* True to reset the stats */
1348){
1349 int iCur;
1350 int iHiwtr;
1351
1352 if( pArg && pArg->out ){
1353
1354 iHiwtr = iCur = -1;
1355 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001356 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001357 "Memory Used: %d (max %d) bytes\n",
1358 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001359 iHiwtr = iCur = -1;
1360 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001361 raw_printf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001362 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001363 if( pArg->shellFlgs & SHFLG_Pagecache ){
1364 iHiwtr = iCur = -1;
1365 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001366 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001367 "Number of Pcache Pages Used: %d (max %d) pages\n",
1368 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001369 }
shaneh642d8b82010-07-28 16:05:34 +00001370 iHiwtr = iCur = -1;
1371 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001372 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001373 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1374 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001375 if( pArg->shellFlgs & SHFLG_Scratch ){
1376 iHiwtr = iCur = -1;
1377 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001378 raw_printf(pArg->out,
1379 "Number of Scratch Allocations Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001380 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001381 }
shaneh642d8b82010-07-28 16:05:34 +00001382 iHiwtr = iCur = -1;
1383 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001384 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001385 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1386 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001387 iHiwtr = iCur = -1;
1388 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001389 raw_printf(pArg->out, "Largest Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001390 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001391 iHiwtr = iCur = -1;
1392 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001393 raw_printf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001394 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001395 iHiwtr = iCur = -1;
1396 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001397 raw_printf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00001398 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001399#ifdef YYTRACKMAXSTACKDEPTH
1400 iHiwtr = iCur = -1;
1401 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001402 raw_printf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001403 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001404#endif
1405 }
1406
1407 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001408 if( pArg->shellFlgs & SHFLG_Lookaside ){
1409 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001410 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1411 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001412 raw_printf(pArg->out,
1413 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00001414 iCur, iHiwtr);
1415 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1416 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001417 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
1418 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001419 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1420 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001421 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
1422 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001423 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1424 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001425 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
1426 iHiwtr);
drh44dec872014-08-30 15:49:25 +00001427 }
shaneh642d8b82010-07-28 16:05:34 +00001428 iHiwtr = iCur = -1;
1429 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001430 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
1431 iCur);
drh4ace5362014-11-10 14:42:28 +00001432 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001433 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001434 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00001435 iHiwtr = iCur = -1;
1436 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001437 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001438 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001439 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00001440 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00001441 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001442 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001443 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
1444 iCur);
shaneh642d8b82010-07-28 16:05:34 +00001445 iHiwtr = iCur = -1;
1446 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001447 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
1448 iCur);
shaneh642d8b82010-07-28 16:05:34 +00001449 }
1450
1451 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001452 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1453 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001454 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001455 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001456 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001457 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001458 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001459 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00001460 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001461 }
1462
drh34784902016-02-27 17:12:36 +00001463#ifdef __linux__
1464 displayLinuxIoStats(pArg->out);
1465#endif
1466
dan5a790282015-08-07 20:06:14 +00001467 /* Do not remove this machine readable comment: extra-stats-output-here */
1468
shaneh642d8b82010-07-28 16:05:34 +00001469 return 0;
1470}
1471
1472/*
dan8d1edb92014-11-05 09:07:28 +00001473** Display scan stats.
1474*/
1475static void display_scanstats(
1476 sqlite3 *db, /* Database to query */
1477 ShellState *pArg /* Pointer to ShellState */
1478){
drhf5ed7ad2015-06-15 14:43:25 +00001479#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1480 UNUSED_PARAMETER(db);
1481 UNUSED_PARAMETER(pArg);
1482#else
drh15f23c22014-11-06 12:46:16 +00001483 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00001484 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001485 mx = 0;
1486 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001487 double rEstLoop = 1.0;
1488 for(i=n=0; 1; i++){
1489 sqlite3_stmt *p = pArg->pStmt;
1490 sqlite3_int64 nLoop, nVisit;
1491 double rEst;
1492 int iSid;
1493 const char *zExplain;
1494 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1495 break;
1496 }
1497 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001498 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001499 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001500 if( n==0 ){
1501 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00001502 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001503 }
drh42f30bc2014-11-06 12:08:21 +00001504 n++;
1505 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1506 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1507 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00001508 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00001509 rEstLoop *= rEst;
mistachkinaae280e2015-12-31 19:06:24 +00001510 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00001511 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001512 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001513 );
dan8d1edb92014-11-05 09:07:28 +00001514 }
dan8d1edb92014-11-05 09:07:28 +00001515 }
mistachkinaae280e2015-12-31 19:06:24 +00001516 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001517#endif
dan8d1edb92014-11-05 09:07:28 +00001518}
1519
1520/*
dana98bf362013-11-13 18:35:01 +00001521** Parameter azArray points to a zero-terminated array of strings. zStr
1522** points to a single nul-terminated string. Return non-zero if zStr
1523** is equal, according to strcmp(), to any of the strings in the array.
1524** Otherwise, return zero.
1525*/
1526static int str_in_array(const char *zStr, const char **azArray){
1527 int i;
1528 for(i=0; azArray[i]; i++){
1529 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1530 }
1531 return 0;
1532}
1533
1534/*
1535** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001536** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001537** spaces each opcode should be indented before it is output.
1538**
1539** The indenting rules are:
1540**
1541** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1542** all opcodes that occur between the p2 jump destination and the opcode
1543** itself by 2 spaces.
1544**
drh01752bc2013-11-14 23:59:33 +00001545** * For each "Goto", if the jump destination is earlier in the program
1546** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001547** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001548** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001549** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001550** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001551*/
drhdcd87a92014-08-18 13:45:42 +00001552static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001553 const char *zSql; /* The text of the SQL statement */
1554 const char *z; /* Used to check if this is an EXPLAIN */
1555 int *abYield = 0; /* True if op is an OP_Yield */
1556 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001557 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001558
drh8ad0de32014-03-20 18:45:27 +00001559 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1560 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001561 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1562 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001563 const char *azGoto[] = { "Goto", 0 };
1564
1565 /* Try to figure out if this is really an EXPLAIN statement. If this
1566 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00001567 if( sqlite3_column_count(pSql)!=8 ){
1568 p->cMode = p->mode;
1569 return;
1570 }
dana98bf362013-11-13 18:35:01 +00001571 zSql = sqlite3_sql(pSql);
1572 if( zSql==0 ) return;
1573 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00001574 if( sqlite3_strnicmp(z, "explain", 7) ){
1575 p->cMode = p->mode;
1576 return;
1577 }
dana98bf362013-11-13 18:35:01 +00001578
1579 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1580 int i;
danc4650bb2013-11-18 08:41:06 +00001581 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001582 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001583
1584 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1585 ** p2 is an instruction address, set variable p2op to the index of that
1586 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1587 ** the current instruction is part of a sub-program generated by an
1588 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001589 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001590 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001591
1592 /* Grow the p->aiIndent array as required */
1593 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00001594 if( iOp==0 ){
1595 /* Do further verfication that this is explain output. Abort if
1596 ** it is not */
1597 static const char *explainCols[] = {
1598 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
1599 int jj;
1600 for(jj=0; jj<ArraySize(explainCols); jj++){
1601 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
1602 p->cMode = p->mode;
1603 sqlite3_reset(pSql);
1604 return;
1605 }
1606 }
1607 }
dana98bf362013-11-13 18:35:01 +00001608 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00001609 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1610 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00001611 }
1612 abYield[iOp] = str_in_array(zOp, azYield);
1613 p->aiIndent[iOp] = 0;
1614 p->nIndent = iOp+1;
1615
1616 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001617 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001618 }
drhfe705102014-03-06 13:38:37 +00001619 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1620 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1621 ){
drhe73f0592014-01-21 22:25:45 +00001622 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001623 }
1624 }
1625
danc4650bb2013-11-18 08:41:06 +00001626 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001627 sqlite3_free(abYield);
1628 sqlite3_reset(pSql);
1629}
1630
1631/*
1632** Free the array allocated by explain_data_prepare().
1633*/
drhdcd87a92014-08-18 13:45:42 +00001634static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001635 sqlite3_free(p->aiIndent);
1636 p->aiIndent = 0;
1637 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001638 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001639}
1640
1641/*
shane626a6e42009-10-22 17:30:15 +00001642** Execute a statement or set of statements. Print
1643** any result rows/columns depending on the current mode
1644** set via the supplied callback.
1645**
1646** This is very similar to SQLite's built-in sqlite3_exec()
1647** function except it takes a slightly different callback
1648** and callback data argument.
1649*/
1650static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001651 sqlite3 *db, /* An open database */
1652 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001653 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001654 /* (not the same as sqlite3_exec) */
1655 ShellState *pArg, /* Pointer to ShellState */
1656 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001657){
dan4564ced2010-01-05 04:59:56 +00001658 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1659 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001660 int rc2;
dan4564ced2010-01-05 04:59:56 +00001661 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001662
1663 if( pzErrMsg ){
1664 *pzErrMsg = NULL;
1665 }
1666
shaneb9fc17d2009-10-22 21:23:35 +00001667 while( zSql[0] && (SQLITE_OK == rc) ){
1668 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1669 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001670 if( pzErrMsg ){
1671 *pzErrMsg = save_err_msg(db);
1672 }
1673 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001674 if( !pStmt ){
1675 /* this happens for a comment or white-space */
1676 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001677 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001678 continue;
1679 }
shane626a6e42009-10-22 17:30:15 +00001680
shaneh642d8b82010-07-28 16:05:34 +00001681 /* save off the prepared statment handle and reset row count */
1682 if( pArg ){
1683 pArg->pStmt = pStmt;
1684 pArg->cnt = 0;
1685 }
1686
shanehb7977c52010-01-18 18:17:10 +00001687 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001688 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001689 const char *zStmtSql = sqlite3_sql(pStmt);
drhe05461c2015-12-30 13:36:57 +00001690 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001691 }
shanehb7977c52010-01-18 18:17:10 +00001692
drhefbf3b12014-02-28 20:47:24 +00001693 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1694 if( pArg && pArg->autoEQP ){
1695 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001696 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1697 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001698 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1699 if( rc==SQLITE_OK ){
1700 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00001701 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
1702 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1703 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00001704 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00001705 }
1706 }
1707 sqlite3_finalize(pExplain);
1708 sqlite3_free(zEQP);
1709 }
1710
drh700c2522016-02-09 18:39:25 +00001711 if( pArg ){
1712 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00001713 if( pArg->autoExplain
1714 && sqlite3_column_count(pStmt)==8
drh700c2522016-02-09 18:39:25 +00001715 && sqlite3_strlike("%EXPLAIN%", sqlite3_sql(pStmt),0)==0
drh700c2522016-02-09 18:39:25 +00001716 ){
1717 pArg->cMode = MODE_Explain;
1718 }
1719
1720 /* If the shell is currently in ".explain" mode, gather the extra
1721 ** data required to add indents to the output.*/
1722 if( pArg->cMode==MODE_Explain ){
1723 explain_data_prepare(pArg, pStmt);
1724 }
dana98bf362013-11-13 18:35:01 +00001725 }
1726
shaneb9fc17d2009-10-22 21:23:35 +00001727 /* perform the first step. this will tell us if we
1728 ** have a result set or not and how wide it is.
1729 */
1730 rc = sqlite3_step(pStmt);
1731 /* if we have a result set... */
1732 if( SQLITE_ROW == rc ){
1733 /* if we have a callback... */
1734 if( xCallback ){
1735 /* allocate space for col name ptr, value ptr, and type */
1736 int nCol = sqlite3_column_count(pStmt);
drhf3cdcdc2015-04-29 16:50:28 +00001737 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
shaneb9fc17d2009-10-22 21:23:35 +00001738 if( !pData ){
1739 rc = SQLITE_NOMEM;
1740 }else{
1741 char **azCols = (char **)pData; /* Names of result columns */
1742 char **azVals = &azCols[nCol]; /* Results */
1743 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001744 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001745 assert(sizeof(int) <= sizeof(char *));
1746 /* save off ptrs to column names */
1747 for(i=0; i<nCol; i++){
1748 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1749 }
shaneb9fc17d2009-10-22 21:23:35 +00001750 do{
1751 /* extract the data and data types */
1752 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001753 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh700c2522016-02-09 18:39:25 +00001754 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001755 azVals[i] = "";
1756 }else{
1757 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1758 }
shaneb9fc17d2009-10-22 21:23:35 +00001759 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1760 rc = SQLITE_NOMEM;
1761 break; /* from for */
1762 }
1763 } /* end for */
1764
1765 /* if data and types extracted successfully... */
1766 if( SQLITE_ROW == rc ){
1767 /* call the supplied callback with the result row data */
1768 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1769 rc = SQLITE_ABORT;
1770 }else{
1771 rc = sqlite3_step(pStmt);
1772 }
1773 }
1774 } while( SQLITE_ROW == rc );
1775 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001776 }
1777 }else{
1778 do{
1779 rc = sqlite3_step(pStmt);
1780 } while( rc == SQLITE_ROW );
1781 }
1782 }
1783
dana98bf362013-11-13 18:35:01 +00001784 explain_data_delete(pArg);
1785
shaneh642d8b82010-07-28 16:05:34 +00001786 /* print usage stats if stats on */
1787 if( pArg && pArg->statsOn ){
1788 display_stats(db, pArg, 0);
1789 }
1790
dan8d1edb92014-11-05 09:07:28 +00001791 /* print loop-counters if required */
1792 if( pArg && pArg->scanstatsOn ){
1793 display_scanstats(db, pArg);
1794 }
1795
dan4564ced2010-01-05 04:59:56 +00001796 /* Finalize the statement just executed. If this fails, save a
1797 ** copy of the error message. Otherwise, set zSql to point to the
1798 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001799 rc2 = sqlite3_finalize(pStmt);
1800 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001801 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001802 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001803 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001804 }else if( pzErrMsg ){
1805 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001806 }
shaneh642d8b82010-07-28 16:05:34 +00001807
1808 /* clear saved stmt handle */
1809 if( pArg ){
1810 pArg->pStmt = NULL;
1811 }
shane626a6e42009-10-22 17:30:15 +00001812 }
shaneb9fc17d2009-10-22 21:23:35 +00001813 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001814
1815 return rc;
1816}
1817
drhdd3d4592004-08-30 01:54:05 +00001818
drh33048c02001-10-01 14:29:22 +00001819/*
drh4c653a02000-06-07 01:27:47 +00001820** This is a different callback routine used for dumping the database.
1821** Each row received by this callback consists of a table name,
1822** the table type ("index" or "table") and SQL to create the table.
1823** This routine should print text sufficient to recreate the table.
1824*/
1825static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001826 int rc;
1827 const char *zTable;
1828 const char *zType;
1829 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001830 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001831 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001832
drh902b9ee2008-12-05 17:17:07 +00001833 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001834 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001835 zTable = azArg[0];
1836 zType = azArg[1];
1837 zSql = azArg[2];
1838
drh00b950d2005-09-11 02:03:03 +00001839 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001840 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001841 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001842 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00001843 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1844 return 0;
drh45e29d82006-11-20 16:21:10 +00001845 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1846 char *zIns;
1847 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00001848 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00001849 p->writableSchema = 1;
1850 }
1851 zIns = sqlite3_mprintf(
1852 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1853 "VALUES('table','%q','%q',0,'%q');",
1854 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00001855 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00001856 sqlite3_free(zIns);
1857 return 0;
drh00b950d2005-09-11 02:03:03 +00001858 }else{
drhe05461c2015-12-30 13:36:57 +00001859 utf8_printf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001860 }
danielk19772a02e332004-06-05 08:04:36 +00001861
1862 if( strcmp(zType, "table")==0 ){
1863 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001864 char *zSelect = 0;
1865 char *zTableInfo = 0;
1866 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001867 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001868
1869 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1870 zTableInfo = appendText(zTableInfo, zTable, '"');
1871 zTableInfo = appendText(zTableInfo, ");", 0);
1872
drhc7181902014-02-27 15:04:13 +00001873 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001874 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001875 if( rc!=SQLITE_OK || !pTableInfo ){
1876 return 1;
1877 }
1878
1879 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001880 /* Always quote the table name, even if it appears to be pure ascii,
1881 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1882 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001883 if( zTmp ){
1884 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001885 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001886 }
1887 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1888 rc = sqlite3_step(pTableInfo);
1889 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001890 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001891 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001892 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001893 rc = sqlite3_step(pTableInfo);
1894 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001895 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001896 }else{
1897 zSelect = appendText(zSelect, ") ", 0);
1898 }
drh157e29a2009-05-21 15:15:00 +00001899 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001900 }
1901 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001902 if( rc!=SQLITE_OK || nRow==0 ){
1903 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001904 return 1;
1905 }
1906 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1907 zSelect = appendText(zSelect, zTable, '"');
1908
drh2f464a02011-10-13 00:41:49 +00001909 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001910 if( rc==SQLITE_CORRUPT ){
1911 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001912 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001913 }
drh85e72432012-04-11 11:38:53 +00001914 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001915 }
drh4c653a02000-06-07 01:27:47 +00001916 return 0;
1917}
1918
1919/*
drh45e29d82006-11-20 16:21:10 +00001920** Run zQuery. Use dump_callback() as the callback routine so that
1921** the contents of the query are output as SQL statements.
1922**
drhdd3d4592004-08-30 01:54:05 +00001923** If we get a SQLITE_CORRUPT error, rerun the query after appending
1924** "ORDER BY rowid DESC" to the end.
1925*/
1926static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001927 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001928 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001929){
1930 int rc;
drh2f464a02011-10-13 00:41:49 +00001931 char *zErr = 0;
1932 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001933 if( rc==SQLITE_CORRUPT ){
1934 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001935 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00001936 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00001937 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00001938 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00001939 sqlite3_free(zErr);
1940 zErr = 0;
1941 }
drhdd3d4592004-08-30 01:54:05 +00001942 zQ2 = malloc( len+100 );
1943 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001944 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001945 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1946 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00001947 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00001948 }else{
1949 rc = SQLITE_CORRUPT;
1950 }
1951 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001952 free(zQ2);
1953 }
1954 return rc;
1955}
1956
1957/*
drh75897232000-05-29 14:26:00 +00001958** Text of a help message
1959*/
persicom1d0b8722002-04-18 02:53:04 +00001960static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001961 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001962 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00001963 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00001964 ".changes on|off Show number of rows changed by SQL\n"
drh4bbcf102014-02-06 02:46:08 +00001965 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001966 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00001967 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00001968 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001969 " If TABLE specified, only dump tables matching\n"
1970 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001971 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001972 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001973 ".exit Exit this program\n"
drh700c2522016-02-09 18:39:25 +00001974 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
drhc1971542014-06-23 23:28:13 +00001975 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001976 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001977 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001978 ".import FILE TABLE Import data from FILE into TABLE\n"
drh0e55db12015-02-06 14:51:13 +00001979 ".indexes ?TABLE? Show names of all indexes\n"
1980 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00001981 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001982#ifdef SQLITE_ENABLE_IOTRACE
1983 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1984#endif
drh1a513372015-05-02 17:40:23 +00001985 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh70df4fe2006-06-13 15:12:21 +00001986#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001987 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001988#endif
drh127f9d72010-02-23 01:47:00 +00001989 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001990 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00001991 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001992 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001993 " column Left-aligned columns. (See .width)\n"
1994 " html HTML <table> code\n"
1995 " insert SQL insert statements for TABLE\n"
1996 " line One value per line\n"
mistachkine0d68852014-12-11 03:12:33 +00001997 " list Values delimited by .separator strings\n"
drhb860bc92004-08-04 15:16:55 +00001998 " tabs Tab-separated values\n"
1999 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00002000 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00002001 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00002002 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00002003 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00002004 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00002005 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00002006 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00002007 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00002008 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00002009 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00002010 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00002011 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00002012 " If TABLE specified, only show tables matching\n"
2013 " LIKE pattern TABLE.\n"
mistachkine0d68852014-12-11 03:12:33 +00002014 ".separator COL ?ROW? Change the column separator and optionally the row\n"
2015 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00002016#if defined(SQLITE_ENABLE_SESSION)
2017 ".session CMD ... Create or control sessions\n"
2018#endif
drh62cdde52014-05-28 20:22:28 +00002019 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00002020 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00002021 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00002022 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00002023 ".tables ?TABLE? List names of tables\n"
2024 " If TABLE specified, only list tables matching\n"
2025 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00002026 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00002027 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00002028 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00002029 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00002030 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00002031 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00002032 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00002033 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00002034;
2035
drhe6229612014-08-18 15:08:26 +00002036#if defined(SQLITE_ENABLE_SESSION)
2037/*
2038** Print help information for the ".sessions" command
2039*/
2040void session_help(ShellState *p){
2041 fprintf(p->out,
2042 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
2043 "If ?NAME? is omitted, the first defined session is used.\n"
2044 "Subcommands:\n"
2045 " attach TABLE Attach TABLE\n"
2046 " changeset FILE Write a changeset into FILE\n"
2047 " close Close one session\n"
2048 " enable ?BOOLEAN? Set or query the enable bit\n"
2049 " filter GLOB... Reject tables matching GLOBs\n"
2050 " indirect ?BOOLEAN? Mark or query the indirect status\n"
2051 " isempty Query whether the session is empty\n"
2052 " list List currently open session names\n"
2053 " open DB NAME Open a new session on DB\n"
2054 " patchset FILE Write a patchset into FILE\n"
2055 );
2056}
2057#endif
2058
2059
drhdaffd0e2001-04-11 14:28:42 +00002060/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00002061static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00002062/*
2063** Implementation of the "readfile(X)" SQL function. The entire content
2064** of the file named X is read and returned as a BLOB. NULL is returned
2065** if the file does not exist or is unreadable.
2066*/
2067static void readfileFunc(
2068 sqlite3_context *context,
2069 int argc,
2070 sqlite3_value **argv
2071){
2072 const char *zName;
2073 FILE *in;
2074 long nIn;
2075 void *pBuf;
2076
drhf5ed7ad2015-06-15 14:43:25 +00002077 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00002078 zName = (const char*)sqlite3_value_text(argv[0]);
2079 if( zName==0 ) return;
2080 in = fopen(zName, "rb");
2081 if( in==0 ) return;
2082 fseek(in, 0, SEEK_END);
2083 nIn = ftell(in);
2084 rewind(in);
drhf3cdcdc2015-04-29 16:50:28 +00002085 pBuf = sqlite3_malloc64( nIn );
drhba5b0932014-07-24 12:39:59 +00002086 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
2087 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
2088 }else{
2089 sqlite3_free(pBuf);
2090 }
2091 fclose(in);
2092}
2093
2094/*
2095** Implementation of the "writefile(X,Y)" SQL function. The argument Y
2096** is written into file X. The number of bytes written is returned. Or
2097** NULL is returned if something goes wrong, such as being unable to open
2098** file X for writing.
2099*/
2100static void writefileFunc(
2101 sqlite3_context *context,
2102 int argc,
2103 sqlite3_value **argv
2104){
2105 FILE *out;
2106 const char *z;
drhba5b0932014-07-24 12:39:59 +00002107 sqlite3_int64 rc;
2108 const char *zFile;
2109
drhf5ed7ad2015-06-15 14:43:25 +00002110 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00002111 zFile = (const char*)sqlite3_value_text(argv[0]);
2112 if( zFile==0 ) return;
2113 out = fopen(zFile, "wb");
2114 if( out==0 ) return;
2115 z = (const char*)sqlite3_value_blob(argv[1]);
2116 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00002117 rc = 0;
2118 }else{
drh490fe862014-08-11 14:21:32 +00002119 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00002120 }
2121 fclose(out);
2122 sqlite3_result_int64(context, rc);
2123}
drhdaffd0e2001-04-11 14:28:42 +00002124
drhe6229612014-08-18 15:08:26 +00002125#if defined(SQLITE_ENABLE_SESSION)
2126/*
2127** Close a single OpenSession object and release all of its associated
2128** resources.
2129*/
2130static void session_close(OpenSession *pSession){
2131 int i;
2132 sqlite3session_delete(pSession->p);
2133 sqlite3_free(pSession->zName);
2134 for(i=0; i<pSession->nFilter; i++){
2135 sqlite3_free(pSession->azFilter[i]);
2136 }
2137 sqlite3_free(pSession->azFilter);
2138 memset(pSession, 0, sizeof(OpenSession));
2139}
2140#endif
2141
2142/*
2143** Close all OpenSession objects and release all assocaited resources.
2144*/
2145static void session_close_all(ShellState *p){
2146#if defined(SQLITE_ENABLE_SESSION)
2147 int i;
2148 for(i=0; i<p->nSession; i++){
2149 session_close(&p->aSession[i]);
2150 }
2151 p->nSession = 0;
2152#endif
2153}
2154
drh75897232000-05-29 14:26:00 +00002155/*
drh03168ca2014-08-18 20:01:31 +00002156** Implementation of the xFilter function for an open session. Omit
2157** any tables named by ".session filter" but let all other table through.
2158*/
2159#if defined(SQLITE_ENABLE_SESSION)
2160static int session_filter(void *pCtx, const char *zTab){
2161 OpenSession *pSession = (OpenSession*)pCtx;
2162 int i;
2163 for(i=0; i<pSession->nFilter; i++){
2164 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
2165 }
2166 return 1;
2167}
2168#endif
2169
2170/*
drh44c2eb12003-04-30 11:38:26 +00002171** Make sure the database is open. If it is not, then open it. If
2172** the database fails to open, print an error message and exit.
2173*/
drhdcd87a92014-08-18 13:45:42 +00002174static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00002175 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00002176 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00002177 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00002178 globalDb = p->db;
2179 if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
2180 sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
drh4cea5ba2008-05-05 16:27:24 +00002181 shellstaticFunc, 0, 0);
2182 }
mistachkin8e189222015-04-19 21:43:16 +00002183 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkinaae280e2015-12-31 19:06:24 +00002184 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00002185 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00002186 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00002187 exit(1);
drh44c2eb12003-04-30 11:38:26 +00002188 }
drhc2e87a32006-06-27 15:16:14 +00002189#ifndef SQLITE_OMIT_LOAD_EXTENSION
2190 sqlite3_enable_load_extension(p->db, 1);
2191#endif
mistachkin8e189222015-04-19 21:43:16 +00002192 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00002193 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00002194 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00002195 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00002196 }
2197}
2198
2199/*
drhfeac5f82004-08-01 00:10:45 +00002200** Do C-language style dequoting.
2201**
mistachkinf21979d2015-01-18 05:35:01 +00002202** \a -> alarm
2203** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00002204** \t -> tab
2205** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00002206** \v -> vertical tab
2207** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00002208** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00002209** \s -> space
drh4c56b992013-06-27 13:26:55 +00002210** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00002211** \' -> '
drhfeac5f82004-08-01 00:10:45 +00002212** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00002213** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00002214*/
2215static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00002216 int i, j;
2217 char c;
drhc2ce0be2014-05-29 12:36:14 +00002218 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00002219 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00002220 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00002221 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00002222 if( c=='a' ){
2223 c = '\a';
2224 }else if( c=='b' ){
2225 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00002226 }else if( c=='t' ){
2227 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00002228 }else if( c=='n' ){
2229 c = '\n';
2230 }else if( c=='v' ){
2231 c = '\v';
2232 }else if( c=='f' ){
2233 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00002234 }else if( c=='r' ){
2235 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00002236 }else if( c=='"' ){
2237 c = '"';
2238 }else if( c=='\'' ){
2239 c = '\'';
drh4c56b992013-06-27 13:26:55 +00002240 }else if( c=='\\' ){
2241 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00002242 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00002243 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00002244 if( z[i+1]>='0' && z[i+1]<='7' ){
2245 i++;
2246 c = (c<<3) + z[i] - '0';
2247 if( z[i+1]>='0' && z[i+1]<='7' ){
2248 i++;
2249 c = (c<<3) + z[i] - '0';
2250 }
2251 }
2252 }
2253 }
2254 z[j] = c;
2255 }
drhc2ce0be2014-05-29 12:36:14 +00002256 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00002257}
2258
2259/*
drh348d19c2013-06-03 12:47:43 +00002260** Return the value of a hexadecimal digit. Return -1 if the input
2261** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00002262*/
drh348d19c2013-06-03 12:47:43 +00002263static int hexDigitValue(char c){
2264 if( c>='0' && c<='9' ) return c - '0';
2265 if( c>='a' && c<='f' ) return c - 'a' + 10;
2266 if( c>='A' && c<='F' ) return c - 'A' + 10;
2267 return -1;
drhc28490c2006-10-26 14:25:58 +00002268}
2269
2270/*
drh7d9f3942013-04-03 01:26:54 +00002271** Interpret zArg as an integer value, possibly with suffixes.
2272*/
2273static sqlite3_int64 integerValue(const char *zArg){
2274 sqlite3_int64 v = 0;
2275 static const struct { char *zSuffix; int iMult; } aMult[] = {
2276 { "KiB", 1024 },
2277 { "MiB", 1024*1024 },
2278 { "GiB", 1024*1024*1024 },
2279 { "KB", 1000 },
2280 { "MB", 1000000 },
2281 { "GB", 1000000000 },
2282 { "K", 1000 },
2283 { "M", 1000000 },
2284 { "G", 1000000000 },
2285 };
2286 int i;
2287 int isNeg = 0;
2288 if( zArg[0]=='-' ){
2289 isNeg = 1;
2290 zArg++;
2291 }else if( zArg[0]=='+' ){
2292 zArg++;
2293 }
drh348d19c2013-06-03 12:47:43 +00002294 if( zArg[0]=='0' && zArg[1]=='x' ){
2295 int x;
2296 zArg += 2;
2297 while( (x = hexDigitValue(zArg[0]))>=0 ){
2298 v = (v<<4) + x;
2299 zArg++;
2300 }
2301 }else{
2302 while( IsDigit(zArg[0]) ){
2303 v = v*10 + zArg[0] - '0';
2304 zArg++;
2305 }
drh7d9f3942013-04-03 01:26:54 +00002306 }
drhc2bed0a2013-05-24 11:57:50 +00002307 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002308 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2309 v *= aMult[i].iMult;
2310 break;
2311 }
2312 }
2313 return isNeg? -v : v;
2314}
2315
2316/*
drh348d19c2013-06-03 12:47:43 +00002317** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2318** for TRUE and FALSE. Return the integer value if appropriate.
2319*/
2320static int booleanValue(char *zArg){
2321 int i;
2322 if( zArg[0]=='0' && zArg[1]=='x' ){
2323 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2324 }else{
2325 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2326 }
2327 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2328 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2329 return 1;
2330 }
2331 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2332 return 0;
2333 }
mistachkinaae280e2015-12-31 19:06:24 +00002334 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00002335 zArg);
2336 return 0;
2337}
2338
2339/*
drh42f64e52012-04-04 16:56:23 +00002340** Close an output file, assuming it is not stderr or stdout
2341*/
2342static void output_file_close(FILE *f){
2343 if( f && f!=stdout && f!=stderr ) fclose(f);
2344}
2345
2346/*
2347** Try to open an output file. The names "stdout" and "stderr" are
2348** recognized and do the right thing. NULL is returned if the output
2349** filename is "off".
2350*/
2351static FILE *output_file_open(const char *zFile){
2352 FILE *f;
2353 if( strcmp(zFile,"stdout")==0 ){
2354 f = stdout;
2355 }else if( strcmp(zFile, "stderr")==0 ){
2356 f = stderr;
2357 }else if( strcmp(zFile, "off")==0 ){
2358 f = 0;
2359 }else{
2360 f = fopen(zFile, "wb");
2361 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002362 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002363 }
2364 }
2365 return f;
2366}
2367
2368/*
2369** A routine for handling output from sqlite3_trace().
2370*/
2371static void sql_trace_callback(void *pArg, const char *z){
2372 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002373 if( f ){
2374 int i = (int)strlen(z);
2375 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00002376 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00002377 }
drh42f64e52012-04-04 16:56:23 +00002378}
2379
2380/*
drhd8621b92012-04-17 09:09:33 +00002381** A no-op routine that runs with the ".breakpoint" doc-command. This is
2382** a useful spot to set a debugger breakpoint.
2383*/
2384static void test_breakpoint(void){
2385 static int nCall = 0;
2386 nCall++;
2387}
2388
2389/*
mistachkin636bf9f2014-07-19 20:15:16 +00002390** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002391*/
mistachkin636bf9f2014-07-19 20:15:16 +00002392typedef struct ImportCtx ImportCtx;
2393struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002394 const char *zFile; /* Name of the input file */
2395 FILE *in; /* Read the CSV text from this input stream */
2396 char *z; /* Accumulated text for a field */
2397 int n; /* Number of bytes in z */
2398 int nAlloc; /* Space allocated for z[] */
2399 int nLine; /* Current line number */
2400 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002401 int cColSep; /* The column separator character. (Usually ",") */
2402 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002403};
2404
2405/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002406static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002407 if( p->n+1>=p->nAlloc ){
2408 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00002409 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00002410 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002411 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00002412 exit(1);
2413 }
2414 }
2415 p->z[p->n++] = (char)c;
2416}
2417
2418/* Read a single field of CSV text. Compatible with rfc4180 and extended
2419** with the option of having a separator other than ",".
2420**
2421** + Input comes from p->in.
2422** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002423** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002424** + Use p->cSep as the column separator. The default is ",".
2425** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002426** + Keep track of the line number in p->nLine.
2427** + Store the character that terminates the field in p->cTerm. Store
2428** EOF on end-of-file.
2429** + Report syntax errors on stderr
2430*/
mistachkin44723ce2015-03-21 02:22:37 +00002431static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002432 int c;
2433 int cSep = p->cColSep;
2434 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002435 p->n = 0;
2436 c = fgetc(p->in);
2437 if( c==EOF || seenInterrupt ){
2438 p->cTerm = EOF;
2439 return 0;
2440 }
2441 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002442 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002443 int startLine = p->nLine;
2444 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002445 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002446 while( 1 ){
2447 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002448 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002449 if( c==cQuote ){
2450 if( pc==cQuote ){
2451 pc = 0;
2452 continue;
2453 }
2454 }
2455 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002456 || (c==rSep && pc==cQuote)
2457 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002458 || (c==EOF && pc==cQuote)
2459 ){
2460 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002461 p->cTerm = c;
2462 break;
2463 }
2464 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00002465 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00002466 p->zFile, p->nLine, cQuote);
2467 }
2468 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00002469 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00002470 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002471 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002472 break;
2473 }
mistachkin636bf9f2014-07-19 20:15:16 +00002474 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002475 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002476 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002477 }
drhdb95f682013-06-26 22:46:00 +00002478 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002479 while( c!=EOF && c!=cSep && c!=rSep ){
2480 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002481 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002482 }
mistachkin636bf9f2014-07-19 20:15:16 +00002483 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002484 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002485 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002486 }
drhdb95f682013-06-26 22:46:00 +00002487 p->cTerm = c;
2488 }
drh8dd675e2013-07-12 21:09:24 +00002489 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002490 return p->z;
2491}
2492
mistachkin636bf9f2014-07-19 20:15:16 +00002493/* Read a single field of ASCII delimited text.
2494**
2495** + Input comes from p->in.
2496** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00002497** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00002498** + Use p->cSep as the column separator. The default is "\x1F".
2499** + Use p->rSep as the row separator. The default is "\x1E".
2500** + Keep track of the row number in p->nLine.
2501** + Store the character that terminates the field in p->cTerm. Store
2502** EOF on end-of-file.
2503** + Report syntax errors on stderr
2504*/
mistachkin44723ce2015-03-21 02:22:37 +00002505static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002506 int c;
2507 int cSep = p->cColSep;
2508 int rSep = p->cRowSep;
2509 p->n = 0;
2510 c = fgetc(p->in);
2511 if( c==EOF || seenInterrupt ){
2512 p->cTerm = EOF;
2513 return 0;
2514 }
2515 while( c!=EOF && c!=cSep && c!=rSep ){
2516 import_append_char(p, c);
2517 c = fgetc(p->in);
2518 }
2519 if( c==rSep ){
2520 p->nLine++;
2521 }
2522 p->cTerm = c;
2523 if( p->z ) p->z[p->n] = 0;
2524 return p->z;
2525}
2526
drhdb95f682013-06-26 22:46:00 +00002527/*
drh4bbcf102014-02-06 02:46:08 +00002528** Try to transfer data for table zTable. If an error is seen while
2529** moving forward, try to go backwards. The backwards movement won't
2530** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002531*/
mistachkine31ae902014-02-06 01:15:29 +00002532static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002533 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002534 sqlite3 *newDb,
2535 const char *zTable
2536){
2537 sqlite3_stmt *pQuery = 0;
2538 sqlite3_stmt *pInsert = 0;
2539 char *zQuery = 0;
2540 char *zInsert = 0;
2541 int rc;
2542 int i, j, n;
2543 int nTable = (int)strlen(zTable);
2544 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002545 int cnt = 0;
2546 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002547
2548 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2549 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2550 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002551 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002552 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2553 zQuery);
2554 goto end_data_xfer;
2555 }
2556 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00002557 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00002558 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002559 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00002560 goto end_data_xfer;
2561 }
2562 sqlite3_snprintf(200+nTable,zInsert,
2563 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2564 i = (int)strlen(zInsert);
2565 for(j=1; j<n; j++){
2566 memcpy(zInsert+i, ",?", 2);
2567 i += 2;
2568 }
2569 memcpy(zInsert+i, ");", 3);
2570 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2571 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002572 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002573 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2574 zQuery);
2575 goto end_data_xfer;
2576 }
2577 for(k=0; k<2; k++){
2578 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2579 for(i=0; i<n; i++){
2580 switch( sqlite3_column_type(pQuery, i) ){
2581 case SQLITE_NULL: {
2582 sqlite3_bind_null(pInsert, i+1);
2583 break;
2584 }
2585 case SQLITE_INTEGER: {
2586 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2587 break;
2588 }
2589 case SQLITE_FLOAT: {
2590 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2591 break;
2592 }
2593 case SQLITE_TEXT: {
2594 sqlite3_bind_text(pInsert, i+1,
2595 (const char*)sqlite3_column_text(pQuery,i),
2596 -1, SQLITE_STATIC);
2597 break;
2598 }
2599 case SQLITE_BLOB: {
2600 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2601 sqlite3_column_bytes(pQuery,i),
2602 SQLITE_STATIC);
2603 break;
2604 }
2605 }
2606 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002607 rc = sqlite3_step(pInsert);
2608 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00002609 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00002610 sqlite3_errmsg(newDb));
2611 }
drh3350ce92014-02-06 00:49:12 +00002612 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002613 cnt++;
2614 if( (cnt%spinRate)==0 ){
2615 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2616 fflush(stdout);
2617 }
drh3350ce92014-02-06 00:49:12 +00002618 } /* End while */
2619 if( rc==SQLITE_DONE ) break;
2620 sqlite3_finalize(pQuery);
2621 sqlite3_free(zQuery);
2622 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2623 zTable);
2624 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2625 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002626 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00002627 break;
drh3350ce92014-02-06 00:49:12 +00002628 }
2629 } /* End for(k=0...) */
2630
2631end_data_xfer:
2632 sqlite3_finalize(pQuery);
2633 sqlite3_finalize(pInsert);
2634 sqlite3_free(zQuery);
2635 sqlite3_free(zInsert);
2636}
2637
2638
2639/*
2640** Try to transfer all rows of the schema that match zWhere. For
2641** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002642** If an error is encountered while moving forward through the
2643** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002644*/
mistachkine31ae902014-02-06 01:15:29 +00002645static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002646 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002647 sqlite3 *newDb,
2648 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002649 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002650){
2651 sqlite3_stmt *pQuery = 0;
2652 char *zQuery = 0;
2653 int rc;
2654 const unsigned char *zName;
2655 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002656 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002657
2658 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2659 " WHERE %s", zWhere);
2660 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2661 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002662 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002663 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2664 zQuery);
2665 goto end_schema_xfer;
2666 }
2667 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2668 zName = sqlite3_column_text(pQuery, 0);
2669 zSql = sqlite3_column_text(pQuery, 1);
2670 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002671 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2672 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00002673 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00002674 sqlite3_free(zErrMsg);
2675 zErrMsg = 0;
2676 }
drh3350ce92014-02-06 00:49:12 +00002677 if( xForEach ){
2678 xForEach(p, newDb, (const char*)zName);
2679 }
2680 printf("done\n");
2681 }
2682 if( rc!=SQLITE_DONE ){
2683 sqlite3_finalize(pQuery);
2684 sqlite3_free(zQuery);
2685 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2686 " WHERE %s ORDER BY rowid DESC", zWhere);
2687 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2688 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002689 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002690 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2691 zQuery);
2692 goto end_schema_xfer;
2693 }
2694 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2695 zName = sqlite3_column_text(pQuery, 0);
2696 zSql = sqlite3_column_text(pQuery, 1);
2697 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002698 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2699 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00002700 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00002701 sqlite3_free(zErrMsg);
2702 zErrMsg = 0;
2703 }
drh3350ce92014-02-06 00:49:12 +00002704 if( xForEach ){
2705 xForEach(p, newDb, (const char*)zName);
2706 }
2707 printf("done\n");
2708 }
2709 }
2710end_schema_xfer:
2711 sqlite3_finalize(pQuery);
2712 sqlite3_free(zQuery);
2713}
2714
2715/*
2716** Open a new database file named "zNewDb". Try to recover as much information
2717** as possible out of the main database (which might be corrupt) and write it
2718** into zNewDb.
2719*/
drhdcd87a92014-08-18 13:45:42 +00002720static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002721 int rc;
2722 sqlite3 *newDb = 0;
2723 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002724 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00002725 return;
2726 }
2727 rc = sqlite3_open(zNewDb, &newDb);
2728 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002729 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00002730 sqlite3_errmsg(newDb));
2731 }else{
drh54d0d2d2014-04-03 00:32:13 +00002732 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002733 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002734 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2735 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002736 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002737 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002738 }
2739 sqlite3_close(newDb);
2740}
2741
2742/*
drhc2ce0be2014-05-29 12:36:14 +00002743** Change the output file back to stdout
2744*/
drhdcd87a92014-08-18 13:45:42 +00002745static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002746 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002747#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002748 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002749#endif
drhc2ce0be2014-05-29 12:36:14 +00002750 }else{
2751 output_file_close(p->out);
2752 }
2753 p->outfile[0] = 0;
2754 p->out = stdout;
2755}
2756
2757/*
drhf7502f02015-02-06 14:19:44 +00002758** Run an SQL command and return the single integer result.
2759*/
2760static int db_int(ShellState *p, const char *zSql){
2761 sqlite3_stmt *pStmt;
2762 int res = 0;
2763 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2764 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2765 res = sqlite3_column_int(pStmt,0);
2766 }
2767 sqlite3_finalize(pStmt);
2768 return res;
2769}
2770
2771/*
2772** Convert a 2-byte or 4-byte big-endian integer into a native integer
2773*/
2774unsigned int get2byteInt(unsigned char *a){
2775 return (a[0]<<8) + a[1];
2776}
2777unsigned int get4byteInt(unsigned char *a){
2778 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2779}
2780
2781/*
2782** Implementation of the ".info" command.
2783**
2784** Return 1 on error, 2 to exit, and 0 otherwise.
2785*/
drh0e55db12015-02-06 14:51:13 +00002786static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002787 static const struct { const char *zName; int ofst; } aField[] = {
2788 { "file change counter:", 24 },
2789 { "database page count:", 28 },
2790 { "freelist page count:", 36 },
2791 { "schema cookie:", 40 },
2792 { "schema format:", 44 },
2793 { "default cache size:", 48 },
2794 { "autovacuum top root:", 52 },
2795 { "incremental vacuum:", 64 },
2796 { "text encoding:", 56 },
2797 { "user version:", 60 },
2798 { "application id:", 68 },
2799 { "software version:", 96 },
2800 };
drh0e55db12015-02-06 14:51:13 +00002801 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2802 { "number of tables:",
2803 "SELECT count(*) FROM %s WHERE type='table'" },
2804 { "number of indexes:",
2805 "SELECT count(*) FROM %s WHERE type='index'" },
2806 { "number of triggers:",
2807 "SELECT count(*) FROM %s WHERE type='trigger'" },
2808 { "number of views:",
2809 "SELECT count(*) FROM %s WHERE type='view'" },
2810 { "schema size:",
2811 "SELECT total(length(sql)) FROM %s" },
2812 };
mistachkinbfe8bd52015-11-17 19:17:14 +00002813 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00002814 int i;
2815 char *zSchemaTab;
2816 char *zDb = nArg>=2 ? azArg[1] : "main";
2817 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002818 open_db(p, 0);
2819 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002820 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002821 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2822 return 1;
2823 }
2824 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2825 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002826 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00002827 return 1;
2828 }
2829 i = get2byteInt(aHdr+16);
2830 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00002831 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
2832 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2833 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2834 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00002835 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00002836 int ofst = aField[i].ofst;
2837 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00002838 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00002839 switch( ofst ){
2840 case 56: {
mistachkinaae280e2015-12-31 19:06:24 +00002841 if( val==1 ) raw_printf(p->out, " (utf8)");
2842 if( val==2 ) raw_printf(p->out, " (utf16le)");
2843 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00002844 }
2845 }
mistachkinaae280e2015-12-31 19:06:24 +00002846 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00002847 }
drh0e55db12015-02-06 14:51:13 +00002848 if( zDb==0 ){
2849 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2850 }else if( strcmp(zDb,"temp")==0 ){
2851 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2852 }else{
2853 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2854 }
drhf5ed7ad2015-06-15 14:43:25 +00002855 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00002856 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2857 int val = db_int(p, zSql);
2858 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00002859 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00002860 }
2861 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002862 return 0;
2863}
2864
dand95bb392015-09-30 11:19:05 +00002865/*
2866** Print the current sqlite3_errmsg() value to stderr and return 1.
2867*/
2868static int shellDatabaseError(sqlite3 *db){
2869 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00002870 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00002871 return 1;
2872}
2873
2874/*
2875** Print an out-of-memory message to stderr and return 1.
2876*/
2877static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00002878 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00002879 return 1;
2880}
drhf7502f02015-02-06 14:19:44 +00002881
2882/*
drh75897232000-05-29 14:26:00 +00002883** If an input line begins with "." then invoke this routine to
2884** process that line.
drh67505e72002-04-19 12:34:06 +00002885**
drh47ad6842006-11-08 12:25:42 +00002886** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002887*/
drhdcd87a92014-08-18 13:45:42 +00002888static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00002889 int h = 1;
drh75897232000-05-29 14:26:00 +00002890 int nArg = 0;
2891 int n, c;
drh67505e72002-04-19 12:34:06 +00002892 int rc = 0;
drh75897232000-05-29 14:26:00 +00002893 char *azArg[50];
2894
2895 /* Parse the input line into tokens.
2896 */
mistachkin8e189222015-04-19 21:43:16 +00002897 while( zLine[h] && nArg<ArraySize(azArg) ){
2898 while( IsSpace(zLine[h]) ){ h++; }
2899 if( zLine[h]==0 ) break;
2900 if( zLine[h]=='\'' || zLine[h]=='"' ){
2901 int delim = zLine[h++];
2902 azArg[nArg++] = &zLine[h];
2903 while( zLine[h] && zLine[h]!=delim ){
2904 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2905 h++;
drh4c56b992013-06-27 13:26:55 +00002906 }
mistachkin8e189222015-04-19 21:43:16 +00002907 if( zLine[h]==delim ){
2908 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00002909 }
drhfeac5f82004-08-01 00:10:45 +00002910 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002911 }else{
mistachkin8e189222015-04-19 21:43:16 +00002912 azArg[nArg++] = &zLine[h];
2913 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2914 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002915 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002916 }
2917 }
2918
2919 /* Process the input line.
2920 */
shane9bd1b442009-10-23 01:27:39 +00002921 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002922 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002923 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002924 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2925 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2926 ){
drhbc46f022013-01-23 18:53:23 +00002927 const char *zDestFile = 0;
2928 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002929 sqlite3 *pDest;
2930 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002931 int j;
2932 for(j=1; j<nArg; j++){
2933 const char *z = azArg[j];
2934 if( z[0]=='-' ){
2935 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002936 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002937 {
mistachkinaae280e2015-12-31 19:06:24 +00002938 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00002939 return 1;
2940 }
2941 }else if( zDestFile==0 ){
2942 zDestFile = azArg[j];
2943 }else if( zDb==0 ){
2944 zDb = zDestFile;
2945 zDestFile = azArg[j];
2946 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002947 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00002948 return 1;
2949 }
drh9ff849f2009-02-04 20:55:57 +00002950 }
drhbc46f022013-01-23 18:53:23 +00002951 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002952 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00002953 return 1;
2954 }
2955 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002956 rc = sqlite3_open(zDestFile, &pDest);
2957 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002958 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002959 sqlite3_close(pDest);
2960 return 1;
2961 }
drh05782482013-10-24 15:20:20 +00002962 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002963 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2964 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002965 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00002966 sqlite3_close(pDest);
2967 return 1;
2968 }
2969 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2970 sqlite3_backup_finish(pBackup);
2971 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002972 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002973 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002974 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002975 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002976 }
2977 sqlite3_close(pDest);
2978 }else
2979
drhc2ce0be2014-05-29 12:36:14 +00002980 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2981 if( nArg==2 ){
2982 bail_on_error = booleanValue(azArg[1]);
2983 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002984 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00002985 rc = 1;
2986 }
drhc49f44e2006-10-26 18:15:42 +00002987 }else
2988
mistachkinf21979d2015-01-18 05:35:01 +00002989 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2990 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00002991 if( booleanValue(azArg[1]) ){
2992 setBinaryMode(p->out);
2993 }else{
2994 setTextMode(p->out);
2995 }
mistachkinf21979d2015-01-18 05:35:01 +00002996 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002997 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00002998 rc = 1;
2999 }
3000 }else
3001
drhd8621b92012-04-17 09:09:33 +00003002 /* The undocumented ".breakpoint" command causes a call to the no-op
3003 ** routine named test_breakpoint().
3004 */
3005 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
3006 test_breakpoint();
3007 }else
3008
drhdf12f1c2015-12-07 21:46:19 +00003009 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
3010 if( nArg==2 ){
3011 p->countChanges = booleanValue(azArg[1]);
3012 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003013 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00003014 rc = 1;
3015 }
3016 }else
3017
drhc2ce0be2014-05-29 12:36:14 +00003018 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
3019 if( nArg==2 ){
3020 tryToClone(p, azArg[1]);
3021 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003022 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00003023 rc = 1;
3024 }
mistachkine31ae902014-02-06 01:15:29 +00003025 }else
3026
drhc2ce0be2014-05-29 12:36:14 +00003027 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003028 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00003029 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003030 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00003031 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00003032 data.showHeader = 1;
drh700c2522016-02-09 18:39:25 +00003033 data.cMode = data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00003034 data.colWidth[0] = 3;
3035 data.colWidth[1] = 15;
3036 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00003037 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00003038 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00003039 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003040 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003041 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003042 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00003043 }
3044 }else
3045
drh0e55db12015-02-06 14:51:13 +00003046 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
3047 rc = shell_dbinfo_command(p, nArg, azArg);
3048 }else
3049
drhc2ce0be2014-05-29 12:36:14 +00003050 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00003051 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00003052 /* When playing back a "dump", the content might appear in an order
3053 ** which causes immediate foreign key constraints to be violated.
3054 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00003055 if( nArg!=1 && nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003056 raw_printf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003057 rc = 1;
3058 goto meta_command_exit;
3059 }
mistachkinaae280e2015-12-31 19:06:24 +00003060 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
3061 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00003062 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00003063 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00003064 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00003065 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00003066 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00003067 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00003068 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00003069 );
3070 run_schema_dump_query(p,
3071 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00003072 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00003073 );
drh2f464a02011-10-13 00:41:49 +00003074 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00003075 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00003076 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00003077 );
drh4c653a02000-06-07 01:27:47 +00003078 }else{
3079 int i;
drhdd3d4592004-08-30 01:54:05 +00003080 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00003081 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00003082 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00003083 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00003084 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00003085 " AND sql NOT NULL");
3086 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00003087 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00003088 "WHERE sql NOT NULL"
3089 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00003090 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00003091 );
danielk1977bc6ada42004-06-30 08:20:16 +00003092 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00003093 }
3094 }
drh45e29d82006-11-20 16:21:10 +00003095 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00003096 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00003097 p->writableSchema = 0;
3098 }
drh56197952011-10-13 16:30:13 +00003099 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
3100 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00003101 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00003102 }else
drh75897232000-05-29 14:26:00 +00003103
drhc2ce0be2014-05-29 12:36:14 +00003104 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
3105 if( nArg==2 ){
3106 p->echoOn = booleanValue(azArg[1]);
3107 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003108 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00003109 rc = 1;
3110 }
drhdaffd0e2001-04-11 14:28:42 +00003111 }else
3112
drhc2ce0be2014-05-29 12:36:14 +00003113 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
3114 if( nArg==2 ){
3115 p->autoEQP = booleanValue(azArg[1]);
3116 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003117 raw_printf(stderr, "Usage: .eqp on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00003118 rc = 1;
3119 }
drhefbf3b12014-02-28 20:47:24 +00003120 }else
3121
drhd3ac7d92013-01-25 18:33:43 +00003122 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00003123 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00003124 rc = 2;
drh75897232000-05-29 14:26:00 +00003125 }else
3126
drhc2ce0be2014-05-29 12:36:14 +00003127 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00003128 int val = 1;
3129 if( nArg>=2 ){
3130 if( strcmp(azArg[1],"auto")==0 ){
3131 val = 99;
3132 }else{
3133 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00003134 }
drh700c2522016-02-09 18:39:25 +00003135 }
3136 if( val==1 && p->mode!=MODE_Explain ){
3137 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00003138 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00003139 p->autoExplain = 0;
3140 }else if( val==0 ){
3141 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
3142 p->autoExplain = 0;
3143 }else if( val==99 ){
3144 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
3145 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003146 }
drh75897232000-05-29 14:26:00 +00003147 }else
3148
drhc1971542014-06-23 23:28:13 +00003149 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003150 ShellState data;
drhc1971542014-06-23 23:28:13 +00003151 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00003152 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00003153 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003154 raw_printf(stderr, "Usage: .fullschema\n");
drhc1971542014-06-23 23:28:13 +00003155 rc = 1;
3156 goto meta_command_exit;
3157 }
3158 open_db(p, 0);
3159 memcpy(&data, p, sizeof(data));
3160 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00003161 data.cMode = data.mode = MODE_Semi;
drhc1971542014-06-23 23:28:13 +00003162 rc = sqlite3_exec(p->db,
3163 "SELECT sql FROM"
3164 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3165 " FROM sqlite_master UNION ALL"
3166 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003167 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00003168 "ORDER BY rowid",
3169 callback, &data, &zErrMsg
3170 );
drh56f674c2014-07-18 14:43:29 +00003171 if( rc==SQLITE_OK ){
3172 sqlite3_stmt *pStmt;
3173 rc = sqlite3_prepare_v2(p->db,
3174 "SELECT rowid FROM sqlite_master"
3175 " WHERE name GLOB 'sqlite_stat[134]'",
3176 -1, &pStmt, 0);
3177 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
3178 sqlite3_finalize(pStmt);
3179 }
3180 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003181 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00003182 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003183 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00003184 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
3185 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00003186 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00003187 data.zDestTable = "sqlite_stat1";
3188 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
3189 shell_callback, &data,&zErrMsg);
3190 data.zDestTable = "sqlite_stat3";
3191 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
3192 shell_callback, &data,&zErrMsg);
3193 data.zDestTable = "sqlite_stat4";
3194 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
3195 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00003196 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00003197 }
drhc1971542014-06-23 23:28:13 +00003198 }else
3199
drhc2ce0be2014-05-29 12:36:14 +00003200 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
3201 if( nArg==2 ){
3202 p->showHeader = booleanValue(azArg[1]);
3203 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003204 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00003205 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00003206 }
drh75897232000-05-29 14:26:00 +00003207 }else
3208
drhc2ce0be2014-05-29 12:36:14 +00003209 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003210 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00003211 }else
3212
3213 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00003214 char *zTable; /* Insert data into this table */
3215 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00003216 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00003217 int nCol; /* Number of columns in the table */
3218 int nByte; /* Number of bytes in an SQL string */
3219 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00003220 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00003221 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00003222 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00003223 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00003224 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
3225 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00003226
drhc2ce0be2014-05-29 12:36:14 +00003227 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00003228 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00003229 goto meta_command_exit;
3230 }
drh01f37542014-05-31 15:43:33 +00003231 zFile = azArg[1];
3232 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00003233 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00003234 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00003235 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003236 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003237 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003238 raw_printf(stderr,
3239 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00003240 return 1;
drhfeac5f82004-08-01 00:10:45 +00003241 }
drhdb95f682013-06-26 22:46:00 +00003242 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003243 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00003244 " for import\n");
3245 return 1;
3246 }
mistachkin636bf9f2014-07-19 20:15:16 +00003247 nSep = strlen30(p->rowSeparator);
3248 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003249 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003250 return 1;
3251 }
mistachkine0d68852014-12-11 03:12:33 +00003252 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
3253 /* When importing CSV (only), if the row separator is set to the
3254 ** default output row separator, change it to the default input
3255 ** row separator. This avoids having to maintain different input
3256 ** and output row separators. */
3257 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
3258 nSep = strlen30(p->rowSeparator);
3259 }
mistachkin636bf9f2014-07-19 20:15:16 +00003260 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00003261 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00003262 " for import\n");
3263 return 1;
3264 }
3265 sCtx.zFile = zFile;
3266 sCtx.nLine = 1;
3267 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003268#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00003269 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00003270 return 1;
3271#else
mistachkin636bf9f2014-07-19 20:15:16 +00003272 sCtx.in = popen(sCtx.zFile+1, "r");
3273 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00003274 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00003275#endif
drh5bde8162013-06-27 14:07:53 +00003276 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003277 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00003278 xCloser = fclose;
3279 }
mistachkin636bf9f2014-07-19 20:15:16 +00003280 if( p->mode==MODE_Ascii ){
3281 xRead = ascii_read_one_field;
3282 }else{
3283 xRead = csv_read_one_field;
3284 }
3285 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003286 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00003287 return 1;
3288 }
mistachkin636bf9f2014-07-19 20:15:16 +00003289 sCtx.cColSep = p->colSeparator[0];
3290 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00003291 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00003292 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003293 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003294 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003295 return 1;
3296 }
drh4f21c4a2008-12-10 22:15:00 +00003297 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00003298 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00003299 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00003300 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00003301 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3302 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00003303 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00003304 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00003305 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00003306 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00003307 }
drh5bde8162013-06-27 14:07:53 +00003308 if( cSep=='(' ){
3309 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00003310 sqlite3_free(sCtx.z);
3311 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00003312 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003313 return 1;
3314 }
drhdb95f682013-06-26 22:46:00 +00003315 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3316 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3317 sqlite3_free(zCreate);
3318 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003319 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00003320 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003321 sqlite3_free(sCtx.z);
3322 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003323 return 1;
3324 }
drhc7181902014-02-27 15:04:13 +00003325 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003326 }
drhfeac5f82004-08-01 00:10:45 +00003327 sqlite3_free(zSql);
3328 if( rc ){
shane916f9612009-10-23 00:37:15 +00003329 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00003330 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003331 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003332 return 1;
drhfeac5f82004-08-01 00:10:45 +00003333 }
shane916f9612009-10-23 00:37:15 +00003334 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003335 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003336 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003337 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00003338 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003339 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003340 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003341 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003342 return 1;
3343 }
drhdb95f682013-06-26 22:46:00 +00003344 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003345 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003346 for(i=1; i<nCol; i++){
3347 zSql[j++] = ',';
3348 zSql[j++] = '?';
3349 }
3350 zSql[j++] = ')';
3351 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003352 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003353 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003354 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003355 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00003356 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003357 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003358 return 1;
drhfeac5f82004-08-01 00:10:45 +00003359 }
mistachkin8e189222015-04-19 21:43:16 +00003360 needCommit = sqlite3_get_autocommit(p->db);
3361 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003362 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003363 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003364 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003365 char *z = xRead(&sCtx);
3366 /*
3367 ** Did we reach end-of-file before finding any columns?
3368 ** If so, stop instead of NULL filling the remaining columns.
3369 */
drhdb95f682013-06-26 22:46:00 +00003370 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003371 /*
3372 ** Did we reach end-of-file OR end-of-line before finding any
3373 ** columns in ASCII mode? If so, stop instead of NULL filling
3374 ** the remaining columns.
3375 */
3376 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003377 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003378 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00003379 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00003380 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003381 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003382 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003383 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003384 }
drhfeac5f82004-08-01 00:10:45 +00003385 }
mistachkin636bf9f2014-07-19 20:15:16 +00003386 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003387 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003388 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003389 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003390 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00003391 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00003392 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003393 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003394 }
drhdb95f682013-06-26 22:46:00 +00003395 if( i>=nCol ){
3396 sqlite3_step(pStmt);
3397 rc = sqlite3_reset(pStmt);
3398 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003399 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
3400 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00003401 }
3402 }
mistachkin636bf9f2014-07-19 20:15:16 +00003403 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003404
mistachkin636bf9f2014-07-19 20:15:16 +00003405 xCloser(sCtx.in);
3406 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003407 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003408 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003409 }else
3410
drh0e55db12015-02-06 14:51:13 +00003411 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3412 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003413 ShellState data;
drh75897232000-05-29 14:26:00 +00003414 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003415 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003416 memcpy(&data, p, sizeof(data));
3417 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00003418 data.cMode = data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003419 if( nArg==1 ){
3420 rc = sqlite3_exec(p->db,
3421 "SELECT name FROM sqlite_master "
3422 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3423 "UNION ALL "
3424 "SELECT name FROM sqlite_temp_master "
3425 "WHERE type='index' "
3426 "ORDER BY 1",
3427 callback, &data, &zErrMsg
3428 );
drhc2ce0be2014-05-29 12:36:14 +00003429 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003430 zShellStatic = azArg[1];
3431 rc = sqlite3_exec(p->db,
3432 "SELECT name FROM sqlite_master "
3433 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3434 "UNION ALL "
3435 "SELECT name FROM sqlite_temp_master "
3436 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3437 "ORDER BY 1",
3438 callback, &data, &zErrMsg
3439 );
3440 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003441 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003442 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003443 rc = 1;
3444 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003445 }
drh75897232000-05-29 14:26:00 +00003446 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003447 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003448 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003449 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003450 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003451 raw_printf(stderr,
3452 "Error: querying sqlite_master and sqlite_temp_master\n");
shane86f5bdb2009-10-24 02:00:07 +00003453 rc = 1;
drh75897232000-05-29 14:26:00 +00003454 }
3455 }else
3456
drhae5e4452007-05-03 17:18:36 +00003457#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003458 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00003459 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003460 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3461 iotrace = 0;
3462 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003463 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003464 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003465 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003466 iotrace = stdout;
3467 }else{
3468 iotrace = fopen(azArg[1], "w");
3469 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003470 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003471 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003472 rc = 1;
drhb0603412007-02-28 04:47:26 +00003473 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003474 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003475 }
3476 }
3477 }else
drhae5e4452007-05-03 17:18:36 +00003478#endif
drh1a513372015-05-02 17:40:23 +00003479 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3480 static const struct {
3481 const char *zLimitName; /* Name of a limit */
3482 int limitCode; /* Integer code for that limit */
3483 } aLimit[] = {
3484 { "length", SQLITE_LIMIT_LENGTH },
3485 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
3486 { "column", SQLITE_LIMIT_COLUMN },
3487 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
3488 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
3489 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
3490 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
3491 { "attached", SQLITE_LIMIT_ATTACHED },
3492 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
3493 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
3494 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
3495 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
3496 };
3497 int i, n2;
3498 open_db(p, 0);
3499 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00003500 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003501 printf("%20s %d\n", aLimit[i].zLimitName,
3502 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3503 }
3504 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00003505 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00003506 rc = 1;
3507 goto meta_command_exit;
3508 }else{
3509 int iLimit = -1;
3510 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00003511 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00003512 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3513 if( iLimit<0 ){
3514 iLimit = i;
3515 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003516 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00003517 rc = 1;
3518 goto meta_command_exit;
3519 }
3520 }
3521 }
3522 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003523 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00003524 "enter \".limits\" with no arguments for a list.\n",
3525 azArg[1]);
3526 rc = 1;
3527 goto meta_command_exit;
3528 }
3529 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00003530 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3531 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00003532 }
3533 printf("%20s %d\n", aLimit[iLimit].zLimitName,
3534 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3535 }
3536 }else
drhb0603412007-02-28 04:47:26 +00003537
drh70df4fe2006-06-13 15:12:21 +00003538#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003539 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003540 const char *zFile, *zProc;
3541 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003542 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003543 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00003544 rc = 1;
3545 goto meta_command_exit;
3546 }
drh1e397f82006-06-08 15:28:43 +00003547 zFile = azArg[1];
3548 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003549 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003550 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3551 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003552 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003553 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003554 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003555 }
3556 }else
drh70df4fe2006-06-13 15:12:21 +00003557#endif
drh1e397f82006-06-08 15:28:43 +00003558
drhc2ce0be2014-05-29 12:36:14 +00003559 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3560 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003561 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00003562 rc = 1;
3563 }else{
3564 const char *zFile = azArg[1];
3565 output_file_close(p->pLog);
3566 p->pLog = output_file_open(zFile);
3567 }
drh127f9d72010-02-23 01:47:00 +00003568 }else
3569
drhc2ce0be2014-05-29 12:36:14 +00003570 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3571 const char *zMode = nArg>=2 ? azArg[1] : "";
3572 int n2 = (int)strlen(zMode);
3573 int c2 = zMode[0];
3574 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003575 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003576 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003577 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003578 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003579 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003580 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003581 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003582 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003583 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003584 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003585 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003586 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003587 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003588 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003589 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003590 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003591 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003592 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003593 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003594 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003595 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3596 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003597 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3598 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003599 }else {
mistachkinaae280e2015-12-31 19:06:24 +00003600 raw_printf(stderr, "Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003601 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003602 rc = 1;
drh75897232000-05-29 14:26:00 +00003603 }
drh700c2522016-02-09 18:39:25 +00003604 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00003605 }else
3606
drhc2ce0be2014-05-29 12:36:14 +00003607 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3608 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003609 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3610 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003611 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003612 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003613 rc = 1;
3614 }
3615 }else
3616
drh05782482013-10-24 15:20:20 +00003617 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3618 sqlite3 *savedDb = p->db;
3619 const char *zSavedFilename = p->zDbFilename;
3620 char *zNewFilename = 0;
3621 p->db = 0;
drhbbe031f2015-06-17 17:08:22 +00003622 if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3623 p->zDbFilename = zNewFilename;
drh05782482013-10-24 15:20:20 +00003624 open_db(p, 1);
3625 if( p->db!=0 ){
drhe6229612014-08-18 15:08:26 +00003626 session_close_all(p);
drh05782482013-10-24 15:20:20 +00003627 sqlite3_close(savedDb);
3628 sqlite3_free(p->zFreeOnClose);
3629 p->zFreeOnClose = zNewFilename;
3630 }else{
3631 sqlite3_free(zNewFilename);
3632 p->db = savedDb;
3633 p->zDbFilename = zSavedFilename;
3634 }
3635 }else
3636
drhc2ce0be2014-05-29 12:36:14 +00003637 if( c=='o'
3638 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3639 ){
3640 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3641 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003642 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00003643 rc = 1;
3644 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003645 }
drhc2ce0be2014-05-29 12:36:14 +00003646 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3647 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003648 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003649 rc = 1;
3650 goto meta_command_exit;
3651 }
3652 p->outCount = 2;
3653 }else{
3654 p->outCount = 0;
3655 }
3656 output_reset(p);
3657 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003658#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00003659 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00003660 rc = 1;
3661 p->out = stdout;
3662#else
drhc2ce0be2014-05-29 12:36:14 +00003663 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003664 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003665 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003666 p->out = stdout;
3667 rc = 1;
3668 }else{
drhc2ce0be2014-05-29 12:36:14 +00003669 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003670 }
drh8cd5b252015-03-02 22:06:43 +00003671#endif
drh75897232000-05-29 14:26:00 +00003672 }else{
drhc2ce0be2014-05-29 12:36:14 +00003673 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003674 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003675 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003676 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003677 }
drh75897232000-05-29 14:26:00 +00003678 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003679 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003680 } else {
drhc2ce0be2014-05-29 12:36:14 +00003681 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003682 }
3683 }
3684 }else
3685
drh078b1fd2012-09-21 13:40:02 +00003686 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3687 int i;
3688 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00003689 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00003690 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00003691 }
mistachkinaae280e2015-12-31 19:06:24 +00003692 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00003693 }else
3694
drhc2ce0be2014-05-29 12:36:14 +00003695 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003696 if( nArg >= 2) {
3697 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3698 }
3699 if( nArg >= 3) {
3700 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3701 }
3702 }else
3703
drhc2ce0be2014-05-29 12:36:14 +00003704 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003705 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003706 }else
3707
drhc2ce0be2014-05-29 12:36:14 +00003708 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3709 FILE *alt;
3710 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00003711 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003712 rc = 1;
3713 goto meta_command_exit;
3714 }
3715 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003716 if( alt==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003717 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
shane9bd1b442009-10-23 01:27:39 +00003718 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003719 }else{
shane9bd1b442009-10-23 01:27:39 +00003720 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003721 fclose(alt);
3722 }
3723 }else
3724
drhc2ce0be2014-05-29 12:36:14 +00003725 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003726 const char *zSrcFile;
3727 const char *zDb;
3728 sqlite3 *pSrc;
3729 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003730 int nTimeout = 0;
3731
drh9ff849f2009-02-04 20:55:57 +00003732 if( nArg==2 ){
3733 zSrcFile = azArg[1];
3734 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003735 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003736 zSrcFile = azArg[2];
3737 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003738 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003739 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00003740 rc = 1;
3741 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003742 }
3743 rc = sqlite3_open(zSrcFile, &pSrc);
3744 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003745 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003746 sqlite3_close(pSrc);
3747 return 1;
3748 }
drh05782482013-10-24 15:20:20 +00003749 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003750 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3751 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003752 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00003753 sqlite3_close(pSrc);
3754 return 1;
3755 }
drhdc2c4912009-02-04 22:46:47 +00003756 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3757 || rc==SQLITE_BUSY ){
3758 if( rc==SQLITE_BUSY ){
3759 if( nTimeout++ >= 3 ) break;
3760 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003761 }
3762 }
3763 sqlite3_backup_finish(pBackup);
3764 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003765 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003766 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00003767 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00003768 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003769 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003770 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003771 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003772 }
3773 sqlite3_close(pSrc);
3774 }else
3775
dan8d1edb92014-11-05 09:07:28 +00003776
3777 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3778 if( nArg==2 ){
3779 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003780#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00003781 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00003782#endif
dan8d1edb92014-11-05 09:07:28 +00003783 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003784 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00003785 rc = 1;
3786 }
3787 }else
3788
drhc2ce0be2014-05-29 12:36:14 +00003789 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003790 ShellState data;
drh75897232000-05-29 14:26:00 +00003791 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003792 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003793 memcpy(&data, p, sizeof(data));
3794 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00003795 data.cMode = data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003796 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003797 int i;
drhf0693c82011-10-11 20:41:54 +00003798 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003799 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003800 char *new_argv[2], *new_colv[2];
3801 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3802 " type text,\n"
3803 " name text,\n"
3804 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003805 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003806 " sql text\n"
3807 ")";
3808 new_argv[1] = 0;
3809 new_colv[0] = "sql";
3810 new_colv[1] = 0;
3811 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003812 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003813 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003814 char *new_argv[2], *new_colv[2];
3815 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3816 " type text,\n"
3817 " name text,\n"
3818 " tbl_name text,\n"
3819 " rootpage integer,\n"
3820 " sql text\n"
3821 ")";
3822 new_argv[1] = 0;
3823 new_colv[0] = "sql";
3824 new_colv[1] = 0;
3825 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003826 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003827 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003828 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003829 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003830 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003831 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003832 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003833 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003834 "WHERE lower(tbl_name) LIKE shellstatic()"
3835 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003836 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003837 callback, &data, &zErrMsg);
3838 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003839 }
drhc2ce0be2014-05-29 12:36:14 +00003840 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003841 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003842 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003843 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003844 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003845 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003846 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003847 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003848 callback, &data, &zErrMsg
3849 );
drhc2ce0be2014-05-29 12:36:14 +00003850 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003851 raw_printf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003852 rc = 1;
3853 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003854 }
drh75897232000-05-29 14:26:00 +00003855 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003856 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003857 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003858 rc = 1;
3859 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003860 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00003861 rc = 1;
3862 }else{
3863 rc = 0;
drh75897232000-05-29 14:26:00 +00003864 }
3865 }else
3866
drhabd4c722014-09-20 18:18:33 +00003867#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3868 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3869 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003870 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003871 }else
3872#endif
3873
drhe6229612014-08-18 15:08:26 +00003874#if defined(SQLITE_ENABLE_SESSION)
3875 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
3876 OpenSession *pSession = &p->aSession[0];
3877 char **azCmd = &azArg[1];
3878 int iSes = 0;
3879 int nCmd = nArg - 1;
3880 int i;
3881 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00003882 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00003883 if( nArg>=3 ){
3884 for(iSes=0; iSes<p->nSession; iSes++){
3885 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
3886 }
3887 if( iSes<p->nSession ){
3888 pSession = &p->aSession[iSes];
3889 azCmd++;
3890 nCmd--;
3891 }else{
3892 pSession = &p->aSession[0];
3893 iSes = 0;
3894 }
3895 }
3896
drh3a67b042014-08-18 17:56:31 +00003897 /* .session attach TABLE
3898 ** Invoke the sqlite3session_attach() interface to attach a particular
3899 ** table so that it is never filtered.
3900 */
3901 if( strcmp(azCmd[0],"attach")==0 ){
3902 if( nCmd!=2 ) goto session_syntax_error;
3903 if( pSession->p==0 ){
3904 session_not_open:
3905 fprintf(stderr, "ERROR: No sessions are open\n");
3906 }else{
3907 rc = sqlite3session_attach(pSession->p, azCmd[1]);
3908 if( rc ){
3909 fprintf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
3910 rc = 0;
3911 }
3912 }
3913 }else
3914
3915 /* .session changeset FILE
3916 ** .session patchset FILE
3917 ** Write a changeset or patchset into a file. The file is overwritten.
3918 */
3919 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
3920 FILE *out = 0;
3921 if( nCmd!=2 ) goto session_syntax_error;
3922 if( pSession->p==0 ) goto session_not_open;
3923 out = fopen(azCmd[1], "wb");
3924 if( out==0 ){
3925 fprintf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
3926 }else{
3927 int szChng;
3928 void *pChng;
3929 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00003930 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00003931 }else{
drh2967e0c2014-08-19 00:26:17 +00003932 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
3933 }
3934 if( rc ){
3935 printf("Error: error code %d\n", rc);
3936 rc = 0;
drh3a67b042014-08-18 17:56:31 +00003937 }
3938 if( pChng
3939 && fwrite(pChng, szChng, 1, out)!=1 ){
3940 fprintf(stderr, "ERROR: Failed to write entire %d-byte output\n",
3941 szChng);
3942 }
3943 sqlite3_free(pChng);
3944 fclose(out);
3945 }
3946 }else
3947
drhe6229612014-08-18 15:08:26 +00003948 /* .session close
3949 ** Close the identified session
3950 */
3951 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00003952 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00003953 if( p->nSession ){
3954 session_close(pSession);
3955 p->aSession[iSes] = p->aSession[--p->nSession];
3956 }
3957 }else
3958
drh03168ca2014-08-18 20:01:31 +00003959 /* .session enable ?BOOLEAN?
3960 ** Query or set the enable flag
3961 */
3962 if( strcmp(azCmd[0], "enable")==0 ){
3963 int ii;
3964 if( nCmd>2 ) goto session_syntax_error;
3965 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
3966 if( p->nSession ){
3967 ii = sqlite3session_enable(pSession->p, ii);
3968 fprintf(p->out, "session %s enable flag = %d\n", pSession->zName, ii);
3969 }
3970 }else
3971
3972 /* .session filter GLOB ....
3973 ** Set a list of GLOB patterns of table names to be excluded.
3974 */
3975 if( strcmp(azCmd[0], "filter")==0 ){
3976 int ii, nByte;
3977 if( nCmd<2 ) goto session_syntax_error;
3978 if( p->nSession ){
3979 for(ii=0; ii<pSession->nFilter; ii++){
3980 sqlite3_free(pSession->azFilter[ii]);
3981 }
3982 sqlite3_free(pSession->azFilter);
3983 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
3984 pSession->azFilter = sqlite3_malloc( nByte );
3985 if( pSession->azFilter==0 ){
3986 fprintf(stderr, "Error: out or memory\n");
3987 exit(1);
3988 }
3989 for(ii=1; ii<nCmd; ii++){
3990 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
3991 }
3992 pSession->nFilter = ii-1;
3993 }
3994 }else
3995
3996 /* .session indirect ?BOOLEAN?
3997 ** Query or set the indirect flag
3998 */
3999 if( strcmp(azCmd[0], "indirect")==0 ){
4000 int ii;
4001 if( nCmd>2 ) goto session_syntax_error;
4002 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
4003 if( p->nSession ){
4004 ii = sqlite3session_indirect(pSession->p, ii);
4005 fprintf(p->out, "session %s indirect flag = %d\n", pSession->zName,ii);
4006 }
4007 }else
4008
4009 /* .session isempty
4010 ** Determine if the session is empty
4011 */
4012 if( strcmp(azCmd[0], "isempty")==0 ){
4013 int ii;
4014 if( nCmd!=1 ) goto session_syntax_error;
4015 if( p->nSession ){
4016 ii = sqlite3session_isempty(pSession->p);
4017 fprintf(p->out, "session %s isempty flag = %d\n", pSession->zName, ii);
4018 }
4019 }else
4020
drhe6229612014-08-18 15:08:26 +00004021 /* .session list
4022 ** List all currently open sessions
4023 */
4024 if( strcmp(azCmd[0],"list")==0 ){
4025 for(i=0; i<p->nSession; i++){
4026 fprintf(p->out, "%d %s\n", i, p->aSession[i].zName);
4027 }
4028 }else
4029
4030 /* .session open DB NAME
4031 ** Open a new session called NAME on the attached database DB.
4032 ** DB is normally "main".
4033 */
4034 if( strcmp(azCmd[0],"open")==0 ){
4035 char *zName;
4036 if( nCmd!=3 ) goto session_syntax_error;
4037 zName = azCmd[2];
4038 if( zName[0]==0 ) goto session_syntax_error;
4039 for(i=0; i<p->nSession; i++){
4040 if( strcmp(p->aSession[i].zName,zName)==0 ){
4041 fprintf(stderr, "Session \"%s\" already exists\n", zName);
4042 goto meta_command_exit;
4043 }
4044 }
4045 if( p->nSession>=ArraySize(p->aSession) ){
4046 fprintf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
4047 goto meta_command_exit;
4048 }
4049 pSession = &p->aSession[p->nSession];
4050 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
4051 if( rc ){
4052 fprintf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00004053 rc = 0;
drhe6229612014-08-18 15:08:26 +00004054 goto meta_command_exit;
4055 }
drh03168ca2014-08-18 20:01:31 +00004056 pSession->nFilter = 0;
4057 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00004058 p->nSession++;
4059 pSession->zName = sqlite3_mprintf("%s", zName);
4060 }else
4061 /* If no command name matches, show a syntax error */
4062 session_syntax_error:
4063 session_help(p);
4064 }else
4065#endif
4066
drh340f5822013-06-27 13:01:21 +00004067#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00004068 /* Undocumented commands for internal testing. Subject to change
4069 ** without notice. */
4070 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
4071 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
4072 int i, v;
4073 for(i=1; i<nArg; i++){
4074 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00004075 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00004076 }
4077 }
4078 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
4079 int i; sqlite3_int64 v;
4080 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00004081 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00004082 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00004083 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00004084 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00004085 }
4086 }
4087 }else
drh340f5822013-06-27 13:01:21 +00004088#endif
drh348d19c2013-06-03 12:47:43 +00004089
drhc2ce0be2014-05-29 12:36:14 +00004090 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00004091 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004092 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00004093 rc = 1;
4094 }
drh6976c212014-07-24 12:09:47 +00004095 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004096 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00004097 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00004098 }
4099 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00004100 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
4101 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00004102 }
drh75897232000-05-29 14:26:00 +00004103 }else
4104
drh62cdde52014-05-28 20:22:28 +00004105 if( c=='s'
4106 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00004107 ){
4108 char *zCmd;
drh54027102014-08-06 14:36:53 +00004109 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00004110 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00004111 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00004112 rc = 1;
4113 goto meta_command_exit;
4114 }
drhdcb3e3d2014-05-29 03:17:29 +00004115 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00004116 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00004117 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
4118 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00004119 }
drh54027102014-08-06 14:36:53 +00004120 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00004121 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00004122 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00004123 }else
4124
drhc2ce0be2014-05-29 12:36:14 +00004125 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00004126 int i;
drhc2ce0be2014-05-29 12:36:14 +00004127 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004128 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00004129 rc = 1;
4130 goto meta_command_exit;
4131 }
mistachkinaae280e2015-12-31 19:06:24 +00004132 utf8_printf(p->out, "%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
4133 utf8_printf(p->out, "%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh700c2522016-02-09 18:39:25 +00004134 utf8_printf(p->out, "%12.12s: %s\n","explain",
4135 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
mistachkinaae280e2015-12-31 19:06:24 +00004136 utf8_printf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
4137 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
4138 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00004139 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00004140 raw_printf(p->out, "\n");
4141 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00004142 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00004143 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00004144 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00004145 raw_printf(p->out, "\n");
4146 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00004147 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00004148 raw_printf(p->out, "\n");
4149 utf8_printf(p->out, "%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
4150 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00004151 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00004152 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00004153 }
mistachkinaae280e2015-12-31 19:06:24 +00004154 raw_printf(p->out, "\n");
persicom7e2dfdd2002-04-18 02:46:52 +00004155 }else
4156
drhc2ce0be2014-05-29 12:36:14 +00004157 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
4158 if( nArg==2 ){
4159 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00004160 }else if( nArg==1 ){
4161 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004162 }else{
drh34784902016-02-27 17:12:36 +00004163 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00004164 rc = 1;
4165 }
shaneh642d8b82010-07-28 16:05:34 +00004166 }else
4167
drhc2ce0be2014-05-29 12:36:14 +00004168 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00004169 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00004170 char **azResult;
drh98781232012-04-23 12:38:05 +00004171 int nRow, nAlloc;
4172 char *zSql = 0;
4173 int ii;
drh05782482013-10-24 15:20:20 +00004174 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00004175 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00004176 if( rc ) return shellDatabaseError(p->db);
4177
4178 /* Create an SQL statement to query for the list of tables in the
4179 ** main and all attached databases where the table name matches the
4180 ** LIKE pattern bound to variable "?1". */
drh98781232012-04-23 12:38:05 +00004181 zSql = sqlite3_mprintf(
4182 "SELECT name FROM sqlite_master"
4183 " WHERE type IN ('table','view')"
4184 " AND name NOT LIKE 'sqlite_%%'"
4185 " AND name LIKE ?1");
dand95bb392015-09-30 11:19:05 +00004186 while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
drh98781232012-04-23 12:38:05 +00004187 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
4188 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
4189 if( strcmp(zDbName,"temp")==0 ){
4190 zSql = sqlite3_mprintf(
4191 "%z UNION ALL "
4192 "SELECT 'temp.' || name FROM sqlite_temp_master"
4193 " WHERE type IN ('table','view')"
4194 " AND name NOT LIKE 'sqlite_%%'"
4195 " AND name LIKE ?1", zSql);
4196 }else{
4197 zSql = sqlite3_mprintf(
4198 "%z UNION ALL "
4199 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
4200 " WHERE type IN ('table','view')"
4201 " AND name NOT LIKE 'sqlite_%%'"
4202 " AND name LIKE ?1", zSql, zDbName, zDbName);
4203 }
drha50da102000-08-08 20:19:09 +00004204 }
dand95bb392015-09-30 11:19:05 +00004205 rc = sqlite3_finalize(pStmt);
4206 if( zSql && rc==SQLITE_OK ){
4207 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
4208 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4209 }
drh98781232012-04-23 12:38:05 +00004210 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00004211 if( !zSql ) return shellNomemError();
4212 if( rc ) return shellDatabaseError(p->db);
4213
4214 /* Run the SQL statement prepared by the above block. Store the results
4215 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00004216 nRow = nAlloc = 0;
4217 azResult = 0;
4218 if( nArg>1 ){
4219 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00004220 }else{
drh98781232012-04-23 12:38:05 +00004221 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
4222 }
4223 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4224 if( nRow>=nAlloc ){
4225 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00004226 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00004227 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00004228 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00004229 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00004230 break;
4231 }
mistachkin8e189222015-04-19 21:43:16 +00004232 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00004233 azResult = azNew;
4234 }
4235 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00004236 if( 0==azResult[nRow] ){
4237 rc = shellNomemError();
4238 break;
4239 }
4240 nRow++;
drh98781232012-04-23 12:38:05 +00004241 }
dand95bb392015-09-30 11:19:05 +00004242 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
4243 rc = shellDatabaseError(p->db);
4244 }
4245
4246 /* Pretty-print the contents of array azResult[] to the output */
4247 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00004248 int len, maxlen = 0;
4249 int i, j;
4250 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00004251 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00004252 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00004253 if( len>maxlen ) maxlen = len;
4254 }
4255 nPrintCol = 80/(maxlen+2);
4256 if( nPrintCol<1 ) nPrintCol = 1;
4257 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
4258 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00004259 for(j=i; j<nRow; j+=nPrintRow){
4260 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00004261 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
4262 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00004263 }
mistachkinaae280e2015-12-31 19:06:24 +00004264 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00004265 }
4266 }
dand95bb392015-09-30 11:19:05 +00004267
drh98781232012-04-23 12:38:05 +00004268 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
4269 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00004270 }else
4271
shaneh96887e12011-02-10 21:08:58 +00004272 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00004273 static const struct {
4274 const char *zCtrlName; /* Name of a test-control option */
4275 int ctrlCode; /* Integer code for that option */
4276 } aCtrl[] = {
4277 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
4278 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
4279 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
4280 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
4281 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
4282 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
4283 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
4284 { "assert", SQLITE_TESTCTRL_ASSERT },
4285 { "always", SQLITE_TESTCTRL_ALWAYS },
4286 { "reserve", SQLITE_TESTCTRL_RESERVE },
4287 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
4288 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00004289 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00004290 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00004291 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00004292 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00004293 };
shaneh96887e12011-02-10 21:08:58 +00004294 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00004295 int rc2 = 0;
4296 int i, n2;
drh05782482013-10-24 15:20:20 +00004297 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00004298
drhd416fe72011-03-17 16:45:50 +00004299 /* convert testctrl text option to value. allow any unique prefix
4300 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00004301 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00004302 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00004303 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00004304 if( testctrl<0 ){
4305 testctrl = aCtrl[i].ctrlCode;
4306 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004307 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00004308 testctrl = -1;
4309 break;
4310 }
4311 }
4312 }
drh348d19c2013-06-03 12:47:43 +00004313 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004314 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00004315 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004316 }else{
4317 switch(testctrl){
4318
4319 /* sqlite3_test_control(int, db, int) */
4320 case SQLITE_TESTCTRL_OPTIMIZATIONS:
4321 case SQLITE_TESTCTRL_RESERVE:
4322 if( nArg==3 ){
4323 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00004324 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004325 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004326 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004327 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00004328 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004329 }
4330 break;
4331
4332 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00004333 case SQLITE_TESTCTRL_PRNG_SAVE:
4334 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00004335 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00004336 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00004337 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00004338 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00004339 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004340 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004341 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
4342 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004343 }
4344 break;
4345
4346 /* sqlite3_test_control(int, uint) */
4347 case SQLITE_TESTCTRL_PENDING_BYTE:
4348 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00004349 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00004350 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004351 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004352 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004353 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00004354 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004355 }
4356 break;
4357
4358 /* sqlite3_test_control(int, int) */
4359 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00004360 case SQLITE_TESTCTRL_ALWAYS:
4361 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00004362 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00004363 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00004364 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004365 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004366 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004367 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00004368 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004369 }
4370 break;
4371
4372 /* sqlite3_test_control(int, char *) */
4373#ifdef SQLITE_N_KEYWORD
4374 case SQLITE_TESTCTRL_ISKEYWORD:
4375 if( nArg==3 ){
4376 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00004377 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00004378 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00004379 } else {
mistachkinaae280e2015-12-31 19:06:24 +00004380 utf8_printf(stderr,
4381 "Error: testctrl %s takes a single char * option\n",
4382 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004383 }
4384 break;
4385#endif
4386
drh1ffede82015-01-30 20:59:27 +00004387 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00004388 if( nArg==5 ){
mistachkin8e189222015-04-19 21:43:16 +00004389 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00004390 azArg[2],
drh8964b342015-01-29 17:54:52 +00004391 integerValue(azArg[3]),
4392 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00004393 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00004394 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004395 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00004396 }
4397 break;
4398
shaneh96887e12011-02-10 21:08:58 +00004399 case SQLITE_TESTCTRL_BITVEC_TEST:
4400 case SQLITE_TESTCTRL_FAULT_INSTALL:
4401 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
4402 case SQLITE_TESTCTRL_SCRATCHMALLOC:
4403 default:
mistachkinaae280e2015-12-31 19:06:24 +00004404 utf8_printf(stderr,
4405 "Error: CLI support for testctrl %s not implemented\n",
4406 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00004407 break;
4408 }
4409 }
4410 }else
4411
drhc2ce0be2014-05-29 12:36:14 +00004412 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00004413 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004414 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00004415 }else
4416
drhc2ce0be2014-05-29 12:36:14 +00004417 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
4418 if( nArg==2 ){
4419 enableTimer = booleanValue(azArg[1]);
4420 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00004421 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00004422 enableTimer = 0;
4423 }
4424 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004425 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004426 rc = 1;
4427 }
shanehe2aa9d72009-11-06 17:20:17 +00004428 }else
4429
drhc2ce0be2014-05-29 12:36:14 +00004430 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00004431 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00004432 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00004433 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004434 rc = 1;
4435 goto meta_command_exit;
4436 }
drh657b4a82015-03-19 13:30:41 +00004437 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00004438 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00004439#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00004440 if( p->traceOut==0 ){
4441 sqlite3_trace(p->db, 0, 0);
4442 }else{
4443 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
4444 }
4445#endif
4446 }else
4447
drhf442e332014-09-10 19:01:14 +00004448#if SQLITE_USER_AUTHENTICATION
4449 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
4450 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00004451 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00004452 rc = 1;
4453 goto meta_command_exit;
4454 }
drh7883ecf2014-09-11 16:19:31 +00004455 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00004456 if( strcmp(azArg[1],"login")==0 ){
4457 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00004458 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00004459 rc = 1;
4460 goto meta_command_exit;
4461 }
drhd39c40f2014-09-11 00:27:53 +00004462 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
4463 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00004464 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004465 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00004466 rc = 1;
4467 }
4468 }else if( strcmp(azArg[1],"add")==0 ){
4469 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00004470 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004471 rc = 1;
4472 goto meta_command_exit;
4473 }
drhd39c40f2014-09-11 00:27:53 +00004474 rc = sqlite3_user_add(p->db, azArg[2],
4475 azArg[3], (int)strlen(azArg[3]),
4476 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004477 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004478 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004479 rc = 1;
4480 }
4481 }else if( strcmp(azArg[1],"edit")==0 ){
4482 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00004483 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00004484 rc = 1;
4485 goto meta_command_exit;
4486 }
drhd39c40f2014-09-11 00:27:53 +00004487 rc = sqlite3_user_change(p->db, azArg[2],
4488 azArg[3], (int)strlen(azArg[3]),
4489 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00004490 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004491 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004492 rc = 1;
4493 }
4494 }else if( strcmp(azArg[1],"delete")==0 ){
4495 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004496 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00004497 rc = 1;
4498 goto meta_command_exit;
4499 }
4500 rc = sqlite3_user_delete(p->db, azArg[2]);
4501 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004502 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00004503 rc = 1;
4504 }
4505 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004506 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00004507 rc = 1;
4508 goto meta_command_exit;
4509 }
4510 }else
4511#endif /* SQLITE_USER_AUTHENTICATION */
4512
drh9fd301b2011-06-03 13:28:22 +00004513 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004514 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00004515 sqlite3_libversion(), sqlite3_sourceid());
4516 }else
4517
drh790f2872015-11-28 18:06:36 +00004518 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
4519 const char *zDbName = nArg==2 ? azArg[1] : "main";
4520 sqlite3_vfs *pVfs;
4521 if( p->db ){
4522 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
4523 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00004524 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
4525 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4526 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4527 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00004528 }
4529 }
4530 }else
4531
drhb19e7352016-01-12 19:37:20 +00004532 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
4533 sqlite3_vfs *pVfs;
4534 sqlite3_vfs *pCurrent = 0;
4535 if( p->db ){
4536 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
4537 }
4538 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
4539 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
4540 pVfs==pCurrent ? " <--- CURRENT" : "");
4541 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4542 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4543 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
4544 if( pVfs->pNext ){
4545 raw_printf(p->out, "-----------------------------------\n");
4546 }
4547 }
4548 }else
4549
drhde60fc22011-12-14 17:53:36 +00004550 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4551 const char *zDbName = nArg==2 ? azArg[1] : "main";
4552 char *zVfsName = 0;
4553 if( p->db ){
4554 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4555 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00004556 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00004557 sqlite3_free(zVfsName);
4558 }
4559 }
4560 }else
4561
drhcef4fc82012-09-21 22:50:45 +00004562#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4563 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4564 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00004565 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00004566 }else
4567#endif
4568
drhc2ce0be2014-05-29 12:36:14 +00004569 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00004570 int j;
drh43617e92006-03-06 20:55:46 +00004571 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00004572 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00004573 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00004574 }
4575 }else
4576
4577 {
mistachkinaae280e2015-12-31 19:06:24 +00004578 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00004579 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00004580 rc = 1;
drh75897232000-05-29 14:26:00 +00004581 }
drh67505e72002-04-19 12:34:06 +00004582
drhc2ce0be2014-05-29 12:36:14 +00004583meta_command_exit:
4584 if( p->outCount ){
4585 p->outCount--;
4586 if( p->outCount==0 ) output_reset(p);
4587 }
drh67505e72002-04-19 12:34:06 +00004588 return rc;
drh75897232000-05-29 14:26:00 +00004589}
4590
drh67505e72002-04-19 12:34:06 +00004591/*
drh91a66392007-09-07 01:12:32 +00004592** Return TRUE if a semicolon occurs anywhere in the first N characters
4593** of string z[].
drh324ccef2003-02-05 14:06:20 +00004594*/
drh9f099fd2013-08-06 14:01:46 +00004595static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00004596 int i;
4597 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
4598 return 0;
drh324ccef2003-02-05 14:06:20 +00004599}
4600
4601/*
drh70c7a4b2003-04-26 03:03:06 +00004602** Test to see if a line consists entirely of whitespace.
4603*/
4604static int _all_whitespace(const char *z){
4605 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00004606 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00004607 if( *z=='/' && z[1]=='*' ){
4608 z += 2;
4609 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4610 if( *z==0 ) return 0;
4611 z++;
4612 continue;
4613 }
4614 if( *z=='-' && z[1]=='-' ){
4615 z += 2;
4616 while( *z && *z!='\n' ){ z++; }
4617 if( *z==0 ) return 1;
4618 continue;
4619 }
4620 return 0;
4621 }
4622 return 1;
4623}
4624
4625/*
drha9b17162003-04-29 18:01:28 +00004626** Return TRUE if the line typed in is an SQL command terminator other
4627** than a semi-colon. The SQL Server style "go" command is understood
4628** as is the Oracle "/".
4629*/
drh9f099fd2013-08-06 14:01:46 +00004630static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004631 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004632 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4633 return 1; /* Oracle */
4634 }
drhf0693c82011-10-11 20:41:54 +00004635 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004636 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004637 return 1; /* SQL Server */
4638 }
4639 return 0;
4640}
4641
4642/*
drh233a5312008-12-18 22:25:13 +00004643** Return true if zSql is a complete SQL statement. Return false if it
4644** ends in the middle of a string literal or C-style comment.
4645*/
drh9f099fd2013-08-06 14:01:46 +00004646static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004647 int rc;
4648 if( zSql==0 ) return 1;
4649 zSql[nSql] = ';';
4650 zSql[nSql+1] = 0;
4651 rc = sqlite3_complete(zSql);
4652 zSql[nSql] = 0;
4653 return rc;
4654}
4655
4656/*
drh67505e72002-04-19 12:34:06 +00004657** Read input from *in and process it. If *in==0 then input
4658** is interactive - the user is typing it it. Otherwise, input
4659** is coming from a file or device. A prompt is issued and history
4660** is saved only if input is interactive. An interrupt signal will
4661** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004662**
4663** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004664*/
drhdcd87a92014-08-18 13:45:42 +00004665static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004666 char *zLine = 0; /* A single input line */
4667 char *zSql = 0; /* Accumulated SQL text */
4668 int nLine; /* Length of current line */
4669 int nSql = 0; /* Bytes of zSql[] used */
4670 int nAlloc = 0; /* Allocated zSql[] space */
4671 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4672 char *zErrMsg; /* Error message returned */
4673 int rc; /* Error code */
4674 int errCnt = 0; /* Number of errors seen */
4675 int lineno = 0; /* Current line number */
4676 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004677
4678 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4679 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004680 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004681 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004682 /* End of input */
4683 if( stdin_is_interactive ) printf("\n");
4684 break;
drhc49f44e2006-10-26 18:15:42 +00004685 }
drh67505e72002-04-19 12:34:06 +00004686 if( seenInterrupt ){
4687 if( in!=0 ) break;
4688 seenInterrupt = 0;
4689 }
drhc28490c2006-10-26 14:25:58 +00004690 lineno++;
drh849a9d92013-12-21 15:46:06 +00004691 if( nSql==0 && _all_whitespace(zLine) ){
4692 if( p->echoOn ) printf("%s\n", zLine);
4693 continue;
4694 }
drh2af0b2d2002-02-21 02:25:02 +00004695 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004696 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004697 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004698 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004699 break;
4700 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004701 errCnt++;
4702 }
drhdaffd0e2001-04-11 14:28:42 +00004703 continue;
4704 }
drh9f099fd2013-08-06 14:01:46 +00004705 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004706 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004707 }
drh9f099fd2013-08-06 14:01:46 +00004708 nLine = strlen30(zLine);
4709 if( nSql+nLine+2>=nAlloc ){
4710 nAlloc = nSql+nLine+100;
4711 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004712 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004713 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004714 exit(1);
4715 }
drhdaffd0e2001-04-11 14:28:42 +00004716 }
drh9f099fd2013-08-06 14:01:46 +00004717 nSqlPrior = nSql;
4718 if( nSql==0 ){
4719 int i;
4720 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004721 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004722 memcpy(zSql, zLine+i, nLine+1-i);
4723 startline = lineno;
4724 nSql = nLine-i;
4725 }else{
4726 zSql[nSql++] = '\n';
4727 memcpy(zSql+nSql, zLine, nLine+1);
4728 nSql += nLine;
4729 }
4730 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004731 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004732 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004733 open_db(p, 0);
drh9569f602015-04-16 15:05:04 +00004734 if( p->backslashOn ) resolve_backslashes(zSql);
drh3b1a9882007-11-02 12:53:03 +00004735 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004736 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004737 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004738 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004739 char zPrefix[100];
4740 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004741 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004742 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004743 }else{
shane9bd1b442009-10-23 01:27:39 +00004744 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004745 }
drh7f953e22002-07-13 17:33:45 +00004746 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004747 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004748 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004749 zErrMsg = 0;
4750 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004751 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004752 }
drhc49f44e2006-10-26 18:15:42 +00004753 errCnt++;
drhdf12f1c2015-12-07 21:46:19 +00004754 }else if( p->countChanges ){
mistachkinaae280e2015-12-31 19:06:24 +00004755 raw_printf(p->out, "changes: %3d total_changes: %d\n",
drhdf12f1c2015-12-07 21:46:19 +00004756 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
drhdaffd0e2001-04-11 14:28:42 +00004757 }
drhdaffd0e2001-04-11 14:28:42 +00004758 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004759 if( p->outCount ){
4760 output_reset(p);
4761 p->outCount = 0;
4762 }
drh9f099fd2013-08-06 14:01:46 +00004763 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004764 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004765 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004766 }
4767 }
drh9f099fd2013-08-06 14:01:46 +00004768 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004769 if( !_all_whitespace(zSql) ){
mistachkinaae280e2015-12-31 19:06:24 +00004770 utf8_printf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004771 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004772 }
drhdaffd0e2001-04-11 14:28:42 +00004773 }
drh1f9ca2c2015-08-25 16:57:52 +00004774 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00004775 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004776 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004777}
4778
drh67505e72002-04-19 12:34:06 +00004779/*
4780** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004781** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004782*/
4783static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004784 static char *home_dir = NULL;
4785 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004786
drh4ace5362014-11-10 14:42:28 +00004787#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4788 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004789 {
4790 struct passwd *pwent;
4791 uid_t uid = getuid();
4792 if( (pwent=getpwuid(uid)) != NULL) {
4793 home_dir = pwent->pw_dir;
4794 }
drh67505e72002-04-19 12:34:06 +00004795 }
4796#endif
4797
chw65d3c132007-11-12 21:09:10 +00004798#if defined(_WIN32_WCE)
4799 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4800 */
drh85e72432012-04-11 11:38:53 +00004801 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004802#else
4803
drh83905c92012-06-21 13:00:37 +00004804#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004805 if (!home_dir) {
4806 home_dir = getenv("USERPROFILE");
4807 }
4808#endif
4809
drh67505e72002-04-19 12:34:06 +00004810 if (!home_dir) {
4811 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004812 }
4813
drh83905c92012-06-21 13:00:37 +00004814#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004815 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004816 char *zDrive, *zPath;
4817 int n;
4818 zDrive = getenv("HOMEDRIVE");
4819 zPath = getenv("HOMEPATH");
4820 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004821 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004822 home_dir = malloc( n );
4823 if( home_dir==0 ) return 0;
4824 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4825 return home_dir;
4826 }
4827 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004828 }
4829#endif
4830
chw65d3c132007-11-12 21:09:10 +00004831#endif /* !_WIN32_WCE */
4832
drh67505e72002-04-19 12:34:06 +00004833 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004834 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004835 char *z = malloc( n );
4836 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004837 home_dir = z;
4838 }
drhe98d4fa2002-04-21 19:06:22 +00004839
drh67505e72002-04-19 12:34:06 +00004840 return home_dir;
4841}
4842
4843/*
4844** Read input from the file given by sqliterc_override. Or if that
4845** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004846**
4847** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004848*/
drh534f4df2015-02-28 14:03:35 +00004849static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004850 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004851 const char *sqliterc_override /* Name of config file. NULL to use default */
4852){
persicom7e2dfdd2002-04-18 02:46:52 +00004853 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004854 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004855 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004856 FILE *in = NULL;
4857
4858 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004859 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004860 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004861 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00004862 " cannot read ~/.sqliterc\n");
4863 return;
drhe98d4fa2002-04-21 19:06:22 +00004864 }
drh2f3de322012-06-27 16:41:31 +00004865 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004866 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4867 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004868 }
drha1f9b5e2004-02-14 16:31:02 +00004869 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004870 if( in ){
drhc28490c2006-10-26 14:25:58 +00004871 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00004872 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004873 }
drh534f4df2015-02-28 14:03:35 +00004874 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004875 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004876 }
drh85e72432012-04-11 11:38:53 +00004877 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004878}
4879
drh67505e72002-04-19 12:34:06 +00004880/*
drhe1e38c42003-05-04 18:30:59 +00004881** Show available command line options
4882*/
4883static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004884 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004885 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004886 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004887 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004888 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004889 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004890 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004891 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004892 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004893#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4894 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4895#endif
drhcc3b4f82012-02-07 14:13:50 +00004896 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004897 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004898 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004899 " -line set output mode to 'line'\n"
4900 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004901 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004902 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004903#ifdef SQLITE_ENABLE_MULTIPLEX
4904 " -multiplex enable the multiplexor VFS\n"
4905#endif
mistachkine0d68852014-12-11 03:12:33 +00004906 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004907 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004908 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4909 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004910 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004911 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004912 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004913 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004914#ifdef SQLITE_ENABLE_VFSTRACE
4915 " -vfstrace enable tracing of all VFS calls\n"
4916#endif
drhe1e38c42003-05-04 18:30:59 +00004917;
4918static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00004919 utf8_printf(stderr,
drh80e8be92006-08-29 12:04:19 +00004920 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4921 "FILENAME is the name of an SQLite database. A new database is created\n"
4922 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004923 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00004924 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004925 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004926 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00004927 }
4928 exit(1);
4929}
4930
4931/*
drh67505e72002-04-19 12:34:06 +00004932** Initialize the state information in data
4933*/
drhdcd87a92014-08-18 13:45:42 +00004934static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004935 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00004936 data->normalMode = data->cMode = data->mode = MODE_List;
4937 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00004938 memcpy(data->colSeparator,SEP_Column, 2);
4939 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004940 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004941 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004942 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004943 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004944 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004945 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4946 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004947}
4948
drh98d312f2012-10-25 15:23:14 +00004949/*
drh5c7976f2014-02-10 19:59:27 +00004950** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004951*/
4952#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004953static void printBold(const char *zText){
4954 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4955 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4956 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4957 SetConsoleTextAttribute(out,
4958 FOREGROUND_RED|FOREGROUND_INTENSITY
4959 );
4960 printf("%s", zText);
4961 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004962}
4963#else
drh5c7976f2014-02-10 19:59:27 +00004964static void printBold(const char *zText){
4965 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004966}
4967#endif
4968
4969/*
drh98d312f2012-10-25 15:23:14 +00004970** Get the argument to an --option. Throw an error and die if no argument
4971** is available.
4972*/
4973static char *cmdline_option_value(int argc, char **argv, int i){
4974 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00004975 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00004976 argv[0], argv[argc-1]);
4977 exit(1);
4978 }
4979 return argv[i];
4980}
4981
mistachkin44723ce2015-03-21 02:22:37 +00004982int SQLITE_CDECL main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004983 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004984 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004985 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004986 int i;
drhc28490c2006-10-26 14:25:58 +00004987 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004988 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004989 int readStdin = 1;
4990 int nCmd = 0;
4991 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004992
drh69b30ab2014-02-27 15:11:52 +00004993#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004994 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004995 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00004996 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4997 exit(1);
4998 }
drhc7181902014-02-27 15:04:13 +00004999#endif
drh047d4532015-01-18 20:30:23 +00005000 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00005001 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00005002 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00005003 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00005004 stdin_is_interactive = isatty(0);
drhe05461c2015-12-30 13:36:57 +00005005 stdout_is_console = isatty(1);
persicom7e2dfdd2002-04-18 02:46:52 +00005006
drh44c2eb12003-04-30 11:38:26 +00005007 /* Make sure we have a valid signal handler early, before anything
5008 ** else is done.
5009 */
drh4c504392000-10-16 22:06:40 +00005010#ifdef SIGINT
5011 signal(SIGINT, interrupt_handler);
5012#endif
drh44c2eb12003-04-30 11:38:26 +00005013
drhac5649a2014-11-28 13:35:03 +00005014#ifdef SQLITE_SHELL_DBNAME_PROC
5015 {
5016 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
5017 ** of a C-function that will provide the name of the database file. Use
5018 ** this compile-time option to embed this shell program in larger
5019 ** applications. */
5020 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
5021 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
5022 warnInmemoryDb = 0;
5023 }
5024#endif
5025
drh22fbcb82004-02-01 01:22:50 +00005026 /* Do an initial pass through the command-line argument to locate
5027 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00005028 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00005029 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00005030 */
drh98d312f2012-10-25 15:23:14 +00005031 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00005032 char *z;
drhc28490c2006-10-26 14:25:58 +00005033 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00005034 if( z[0]!='-' ){
5035 if( data.zDbFilename==0 ){
5036 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00005037 }else{
5038 /* Excesss arguments are interpreted as SQL (or dot-commands) and
5039 ** mean that nothing is read from stdin */
5040 readStdin = 0;
5041 nCmd++;
5042 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
5043 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005044 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00005045 exit(1);
5046 }
5047 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00005048 }
drh98d312f2012-10-25 15:23:14 +00005049 }
drhcc3b4f82012-02-07 14:13:50 +00005050 if( z[1]=='-' ) z++;
5051 if( strcmp(z,"-separator")==0
5052 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00005053 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00005054 || strcmp(z,"-cmd")==0
5055 ){
drh98d312f2012-10-25 15:23:14 +00005056 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00005057 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00005058 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00005059 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00005060 /* Need to check for batch mode here to so we can avoid printing
5061 ** informational messages (like from process_sqliterc) before
5062 ** we do the actual processing of arguments later in a second pass.
5063 */
shanef69573d2009-10-24 02:06:14 +00005064 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00005065 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00005066#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00005067 const char *zSize;
5068 sqlite3_int64 szHeap;
5069
drh98d312f2012-10-25 15:23:14 +00005070 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00005071 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00005072 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00005073 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
5074#endif
drh44dec872014-08-30 15:49:25 +00005075 }else if( strcmp(z,"-scratch")==0 ){
5076 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00005077 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00005078 if( sz>400000 ) sz = 400000;
5079 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00005080 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00005081 if( n>10 ) n = 10;
5082 if( n<1 ) n = 1;
5083 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
5084 data.shellFlgs |= SHFLG_Scratch;
5085 }else if( strcmp(z,"-pagecache")==0 ){
5086 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00005087 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00005088 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00005089 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00005090 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00005091 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
5092 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00005093 data.shellFlgs |= SHFLG_Pagecache;
5094 }else if( strcmp(z,"-lookaside")==0 ){
5095 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00005096 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00005097 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00005098 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00005099 if( n<0 ) n = 0;
5100 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
5101 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00005102#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00005103 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00005104 extern int vfstrace_register(
5105 const char *zTraceName,
5106 const char *zOldVfsName,
5107 int (*xOut)(const char*,void*),
5108 void *pOutArg,
5109 int makeDefault
5110 );
drh2b625e22011-03-16 17:05:28 +00005111 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00005112#endif
drh6f25e892011-07-08 17:02:57 +00005113#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00005114 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00005115 extern int sqlite3_multiple_initialize(const char*,int);
5116 sqlite3_multiplex_initialize(0, 1);
5117#endif
drh7d9f3942013-04-03 01:26:54 +00005118 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00005119 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
5120 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00005121 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00005122 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00005123 if( pVfs ){
5124 sqlite3_vfs_register(pVfs, 1);
5125 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005126 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00005127 exit(1);
5128 }
drh44c2eb12003-04-30 11:38:26 +00005129 }
5130 }
drh98d312f2012-10-25 15:23:14 +00005131 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00005132#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00005133 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00005134 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00005135#else
mistachkinaae280e2015-12-31 19:06:24 +00005136 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00005137 return 1;
drh01b41712005-08-29 23:06:23 +00005138#endif
drh98d312f2012-10-25 15:23:14 +00005139 }
5140 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00005141
drh44c2eb12003-04-30 11:38:26 +00005142 /* Go ahead and open the database file if it already exists. If the
5143 ** file does not exist, delay opening it. This prevents empty database
5144 ** files from being created if a user mistypes the database name argument
5145 ** to the sqlite command-line tool.
5146 */
drhc8d74412004-08-31 23:41:26 +00005147 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00005148 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00005149 }
5150
drh22fbcb82004-02-01 01:22:50 +00005151 /* Process the initialization file if there is one. If no -init option
5152 ** is given on the command line, look for a file named ~/.sqliterc and
5153 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00005154 */
drh534f4df2015-02-28 14:03:35 +00005155 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00005156
drh22fbcb82004-02-01 01:22:50 +00005157 /* Make a second pass through the command-line argument and set
5158 ** options. This second pass is delayed until after the initialization
5159 ** file is processed so that the command-line arguments will override
5160 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00005161 */
drh98d312f2012-10-25 15:23:14 +00005162 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00005163 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00005164 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00005165 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00005166 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00005167 i++;
5168 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005169 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00005170 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005171 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00005172 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005173 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00005174 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00005175 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00005176 }else if( strcmp(z,"-csv")==0 ){
5177 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00005178 memcpy(data.colSeparator,",",2);
5179 }else if( strcmp(z,"-ascii")==0 ){
5180 data.mode = MODE_Ascii;
5181 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00005182 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00005183 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00005184 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00005185 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00005186 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00005187 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00005188 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00005189 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00005190 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00005191 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00005192 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00005193 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00005194 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005195 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00005196 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005197 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00005198 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00005199 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00005200 }else if( strcmp(z,"-eqp")==0 ){
5201 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00005202 }else if( strcmp(z,"-stats")==0 ){
5203 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00005204 }else if( strcmp(z,"-scanstats")==0 ){
5205 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00005206 }else if( strcmp(z,"-backslash")==0 ){
5207 /* Undocumented command-line option: -backslash
5208 ** Causes C-style backslash escapes to be evaluated in SQL statements
5209 ** prior to sending the SQL into SQLite. Useful for injecting
5210 ** crazy bytes in the middle of SQL statements for testing and debugging.
5211 */
5212 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00005213 }else if( strcmp(z,"-bail")==0 ){
5214 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00005215 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00005216 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00005217 return 0;
drhc28490c2006-10-26 14:25:58 +00005218 }else if( strcmp(z,"-interactive")==0 ){
5219 stdin_is_interactive = 1;
5220 }else if( strcmp(z,"-batch")==0 ){
5221 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00005222 }else if( strcmp(z,"-heap")==0 ){
5223 i++;
drh44dec872014-08-30 15:49:25 +00005224 }else if( strcmp(z,"-scratch")==0 ){
5225 i+=2;
5226 }else if( strcmp(z,"-pagecache")==0 ){
5227 i+=2;
5228 }else if( strcmp(z,"-lookaside")==0 ){
5229 i+=2;
drh7d9f3942013-04-03 01:26:54 +00005230 }else if( strcmp(z,"-mmap")==0 ){
5231 i++;
drha7e61d82011-03-12 17:02:57 +00005232 }else if( strcmp(z,"-vfs")==0 ){
5233 i++;
drh6f25e892011-07-08 17:02:57 +00005234#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00005235 }else if( strcmp(z,"-vfstrace")==0 ){
5236 i++;
drh6f25e892011-07-08 17:02:57 +00005237#endif
5238#ifdef SQLITE_ENABLE_MULTIPLEX
5239 }else if( strcmp(z,"-multiplex")==0 ){
5240 i++;
5241#endif
drhcc3b4f82012-02-07 14:13:50 +00005242 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00005243 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00005244 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00005245 /* Run commands that follow -cmd first and separately from commands
5246 ** that simply appear on the command-line. This seems goofy. It would
5247 ** be better if all commands ran in the order that they appear. But
5248 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00005249 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00005250 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00005251 if( z[0]=='.' ){
5252 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00005253 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00005254 }else{
drh05782482013-10-24 15:20:20 +00005255 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00005256 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
5257 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005258 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00005259 if( bail_on_error ) return rc!=0 ? rc : 1;
5260 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005261 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00005262 if( bail_on_error ) return rc;
5263 }
5264 }
drh1e5d0e92000-05-31 23:33:17 +00005265 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005266 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
5267 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00005268 return 1;
5269 }
drh700c2522016-02-09 18:39:25 +00005270 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00005271 }
drh44c2eb12003-04-30 11:38:26 +00005272
drhac5649a2014-11-28 13:35:03 +00005273 if( !readStdin ){
5274 /* Run all arguments that do not begin with '-' as if they were separate
5275 ** command-line inputs, except for the argToSkip argument which contains
5276 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00005277 */
drhac5649a2014-11-28 13:35:03 +00005278 for(i=0; i<nCmd; i++){
5279 if( azCmd[i][0]=='.' ){
5280 rc = do_meta_command(azCmd[i], &data);
5281 if( rc ) return rc==2 ? 0 : rc;
5282 }else{
5283 open_db(&data, 0);
5284 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
5285 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005286 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00005287 return rc!=0 ? rc : 1;
5288 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005289 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00005290 return rc;
5291 }
drh6ff13852001-11-25 13:18:23 +00005292 }
drh75897232000-05-29 14:26:00 +00005293 }
drhac5649a2014-11-28 13:35:03 +00005294 free(azCmd);
drh75897232000-05-29 14:26:00 +00005295 }else{
drh44c2eb12003-04-30 11:38:26 +00005296 /* Run commands received from standard input
5297 */
drhc28490c2006-10-26 14:25:58 +00005298 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00005299 char *zHome;
5300 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00005301 int nHistory;
drh75897232000-05-29 14:26:00 +00005302 printf(
drh743e0032011-12-12 16:51:50 +00005303 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00005304 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00005305 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00005306 );
drhb3735912014-02-10 16:13:42 +00005307 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00005308 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00005309 printBold("transient in-memory database");
5310 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00005311 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00005312 }
drh67505e72002-04-19 12:34:06 +00005313 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00005314 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00005315 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00005316 if( (zHistory = malloc(nHistory))!=0 ){
5317 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
5318 }
drh67505e72002-04-19 12:34:06 +00005319 }
drhf5ed7ad2015-06-15 14:43:25 +00005320 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00005321 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00005322 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00005323 shell_stifle_history(100);
5324 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00005325 free(zHistory);
drh67505e72002-04-19 12:34:06 +00005326 }
drhdaffd0e2001-04-11 14:28:42 +00005327 }else{
drhc28490c2006-10-26 14:25:58 +00005328 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00005329 }
5330 }
drh33048c02001-10-01 14:29:22 +00005331 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00005332 if( data.db ){
drhe6229612014-08-18 15:08:26 +00005333 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00005334 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00005335 }
drh05782482013-10-24 15:20:20 +00005336 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00005337 return rc;
drh75897232000-05-29 14:26:00 +00005338}