blob: 378729d09bf24086e3ab532c8dc8710c6666d19f [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
mistachkin1fe36bb2016-04-04 02:16:44 +000093# define shell_read_history(X)
danfd34d6d2015-02-25 10:54:53 +000094# 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
mistachkin1fe36bb2016-04-04 02:16:44 +0000139#if defined(_WIN32) || defined(WIN32)
140#include <windows.h>
141
142/* string conversion routines only needed on Win32 */
143extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
144extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
145extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
mistachkin8145fc62016-09-16 20:39:21 +0000146extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
mistachkin1fe36bb2016-04-04 02:16:44 +0000147#endif
148
drh047d4532015-01-18 20:30:23 +0000149/* On Windows, we normally run with output mode of TEXT so that \n characters
150** are automatically translated into \r\n. However, this behavior needs
151** to be disabled in some cases (ex: when generating CSV output and when
152** rendering quoted strings that contain \n characters). The following
153** routines take care of that.
154*/
155#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000156static void setBinaryMode(FILE *file, int isOutput){
157 if( isOutput ) fflush(file);
158 _setmode(_fileno(file), _O_BINARY);
drh047d4532015-01-18 20:30:23 +0000159}
mistachkin1fe36bb2016-04-04 02:16:44 +0000160static void setTextMode(FILE *file, int isOutput){
161 if( isOutput ) fflush(file);
162 _setmode(_fileno(file), _O_TEXT);
drh047d4532015-01-18 20:30:23 +0000163}
164#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000165# define setBinaryMode(X,Y)
166# define setTextMode(X,Y)
drh047d4532015-01-18 20:30:23 +0000167#endif
168
drh43408312013-10-30 12:43:36 +0000169
170/* True if the timer is enabled */
171static int enableTimer = 0;
172
173/* Return the current wall-clock time */
174static sqlite3_int64 timeOfDay(void){
175 static sqlite3_vfs *clockVfs = 0;
176 sqlite3_int64 t;
177 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000178 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000179 clockVfs->xCurrentTimeInt64(clockVfs, &t);
180 }else{
181 double r;
182 clockVfs->xCurrentTime(clockVfs, &r);
183 t = (sqlite3_int64)(r*86400000.0);
184 }
185 return t;
186}
187
drh91eb93c2015-03-03 19:56:20 +0000188#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000189#include <sys/time.h>
190#include <sys/resource.h>
191
drh91eb93c2015-03-03 19:56:20 +0000192/* VxWorks does not support getrusage() as far as we can determine */
193#if defined(_WRS_KERNEL) || defined(__RTP__)
194struct rusage {
195 struct timeval ru_utime; /* user CPU time used */
196 struct timeval ru_stime; /* system CPU time used */
197};
198#define getrusage(A,B) memset(B,0,sizeof(*B))
199#endif
200
drhda108222009-02-25 19:07:24 +0000201/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000202static struct rusage sBegin; /* CPU time at start */
203static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000204
drhda108222009-02-25 19:07:24 +0000205/*
206** Begin timing an operation
207*/
208static void beginTimer(void){
209 if( enableTimer ){
210 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000211 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000212 }
213}
214
215/* Return the difference of two time_structs in seconds */
216static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
mistachkin1fe36bb2016-04-04 02:16:44 +0000217 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
drhda108222009-02-25 19:07:24 +0000218 (double)(pEnd->tv_sec - pStart->tv_sec);
219}
220
221/*
222** Print the timing results.
223*/
224static void endTimer(void){
225 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000226 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000227 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000228 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000229 printf("Run Time: real %.3f user %f sys %f\n",
230 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000231 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
232 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
233 }
234}
shaneb320ccd2009-10-21 03:42:58 +0000235
drhda108222009-02-25 19:07:24 +0000236#define BEGIN_TIMER beginTimer()
237#define END_TIMER endTimer()
238#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000239
240#elif (defined(_WIN32) || defined(WIN32))
241
shaneb320ccd2009-10-21 03:42:58 +0000242/* Saved resource information for the beginning of an operation */
243static HANDLE hProcess;
244static FILETIME ftKernelBegin;
245static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000246static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000247typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
248 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000249static GETPROCTIMES getProcessTimesAddr = NULL;
250
shaneb320ccd2009-10-21 03:42:58 +0000251/*
252** Check to see if we have timer support. Return 1 if necessary
253** support found (or found previously).
254*/
255static int hasTimer(void){
256 if( getProcessTimesAddr ){
257 return 1;
258 } else {
drh4ace5362014-11-10 14:42:28 +0000259 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
260 ** versions. See if the version we are running on has it, and if it
261 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000262 */
263 hProcess = GetCurrentProcess();
264 if( hProcess ){
265 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
266 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000267 getProcessTimesAddr =
268 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000269 if( NULL != getProcessTimesAddr ){
270 return 1;
271 }
mistachkin1fe36bb2016-04-04 02:16:44 +0000272 FreeLibrary(hinstLib);
shaneb320ccd2009-10-21 03:42:58 +0000273 }
274 }
275 }
276 return 0;
277}
278
279/*
280** Begin timing an operation
281*/
282static void beginTimer(void){
283 if( enableTimer && getProcessTimesAddr ){
284 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000285 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
286 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000287 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000288 }
289}
290
291/* Return the difference of two FILETIME structs in seconds */
292static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
293 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
294 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
295 return (double) ((i64End - i64Start) / 10000000.0);
296}
297
298/*
299** Print the timing results.
300*/
301static void endTimer(void){
302 if( enableTimer && getProcessTimesAddr){
303 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000304 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000305 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000306 printf("Run Time: real %.3f user %f sys %f\n",
307 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000308 timeDiff(&ftUserBegin, &ftUserEnd),
309 timeDiff(&ftKernelBegin, &ftKernelEnd));
310 }
311}
312
313#define BEGIN_TIMER beginTimer()
314#define END_TIMER endTimer()
315#define HAS_TIMER hasTimer()
316
drhda108222009-02-25 19:07:24 +0000317#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000318#define BEGIN_TIMER
drhda108222009-02-25 19:07:24 +0000319#define END_TIMER
320#define HAS_TIMER 0
321#endif
322
shanec0688ea2009-03-05 03:48:06 +0000323/*
324** Used to prevent warnings about unused parameters
325*/
326#define UNUSED_PARAMETER(x) (void)(x)
327
drhe91d16b2008-12-08 18:27:31 +0000328/*
drhc49f44e2006-10-26 18:15:42 +0000329** If the following flag is set, then command execution stops
330** at an error if we are not interactive.
331*/
332static int bail_on_error = 0;
333
334/*
drhc28490c2006-10-26 14:25:58 +0000335** Threat stdin as an interactive input if the following variable
336** is true. Otherwise, assume stdin is connected to a file or pipe.
337*/
338static int stdin_is_interactive = 1;
339
340/*
drhe05461c2015-12-30 13:36:57 +0000341** On Windows systems we have to know if standard output is a console
342** in order to translate UTF-8 into MBCS. The following variable is
343** true if translation is required.
344*/
345static int stdout_is_console = 1;
346
347/*
drh4c504392000-10-16 22:06:40 +0000348** The following is the open SQLite database. We make a pointer
349** to this database a static variable so that it can be accessed
350** by the SIGINT handler to interrupt database processing.
351*/
mistachkin8e189222015-04-19 21:43:16 +0000352static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000353
354/*
drh67505e72002-04-19 12:34:06 +0000355** True if an interrupt (Control-C) has been received.
356*/
drh43617e92006-03-06 20:55:46 +0000357static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000358
359/*
persicom7e2dfdd2002-04-18 02:46:52 +0000360** This is the name of our program. It is set in main(), used
361** in a number of other places, mostly for error messages.
362*/
363static char *Argv0;
364
365/*
366** Prompt strings. Initialized in main. Settable with
367** .prompt main continue
368*/
369static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
370static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
371
drhb0603412007-02-28 04:47:26 +0000372/*
mistachkin710b33b2016-01-03 18:59:28 +0000373** Render output like fprintf(). Except, if the output is going to the
374** console and if this is running on a Windows machine, translate the
375** output from UTF-8 into MBCS.
376*/
377#if defined(_WIN32) || defined(WIN32)
378void utf8_printf(FILE *out, const char *zFormat, ...){
379 va_list ap;
380 va_start(ap, zFormat);
381 if( stdout_is_console && (out==stdout || out==stderr) ){
mistachkin710b33b2016-01-03 18:59:28 +0000382 char *z1 = sqlite3_vmprintf(zFormat, ap);
mistachkin1fe36bb2016-04-04 02:16:44 +0000383 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
mistachkin710b33b2016-01-03 18:59:28 +0000384 sqlite3_free(z1);
385 fputs(z2, out);
386 sqlite3_free(z2);
387 }else{
388 vfprintf(out, zFormat, ap);
389 }
390 va_end(ap);
391}
392#elif !defined(utf8_printf)
393# define utf8_printf fprintf
394#endif
395
396/*
397** Render output like fprintf(). This should not be used on anything that
398** includes string formatting (e.g. "%s").
399*/
400#if !defined(raw_printf)
401# define raw_printf fprintf
402#endif
403
404/*
drhb0603412007-02-28 04:47:26 +0000405** Write I/O traces to the following stream.
406*/
rsebe0a9092007-07-30 18:24:38 +0000407#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000408static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000409#endif
drhb0603412007-02-28 04:47:26 +0000410
411/*
412** This routine works like printf in that its first argument is a
413** format string and subsequent arguments are values to be substituted
414** in place of % fields. The result of formatting this string
415** is written to iotrace.
416*/
rsebe0a9092007-07-30 18:24:38 +0000417#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000418static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000419 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000420 char *z;
drhb0603412007-02-28 04:47:26 +0000421 if( iotrace==0 ) return;
422 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000423 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000424 va_end(ap);
mistachkin710b33b2016-01-03 18:59:28 +0000425 utf8_printf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000426 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000427}
rsebe0a9092007-07-30 18:24:38 +0000428#endif
drhb0603412007-02-28 04:47:26 +0000429
drh44c2eb12003-04-30 11:38:26 +0000430
persicom7e2dfdd2002-04-18 02:46:52 +0000431/*
drh83965662003-04-17 02:54:13 +0000432** Determines if a string is a number of not.
433*/
danielk19772e588c72005-12-09 14:25:08 +0000434static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000435 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000436 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000437 return 0;
438 }
439 z++;
440 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000441 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000442 if( *z=='.' ){
443 z++;
drhf0693c82011-10-11 20:41:54 +0000444 if( !IsDigit(*z) ) return 0;
445 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000446 if( realnum ) *realnum = 1;
447 }
448 if( *z=='e' || *z=='E' ){
449 z++;
450 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000451 if( !IsDigit(*z) ) return 0;
452 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000453 if( realnum ) *realnum = 1;
454 }
455 return *z==0;
456}
drh83965662003-04-17 02:54:13 +0000457
458/*
drhe05461c2015-12-30 13:36:57 +0000459** Compute a string length that is limited to what can be stored in
460** lower 30 bits of a 32-bit signed integer.
461*/
462static int strlen30(const char *z){
463 const char *z2 = z;
464 while( *z2 ){ z2++; }
465 return 0x3fffffff & (int)(z2 - z);
466}
467
468/*
drhfeac5f82004-08-01 00:10:45 +0000469** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000470** the text in memory obtained from malloc() and returns a pointer
471** to the text. NULL is returned at end of file, or if malloc()
472** fails.
473**
drh9f099fd2013-08-06 14:01:46 +0000474** If zLine is not NULL then it is a malloced buffer returned from
475** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000476*/
drh9f099fd2013-08-06 14:01:46 +0000477static char *local_getline(char *zLine, FILE *in){
478 int nLine = zLine==0 ? 0 : 100;
479 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000480
drhb07028f2011-10-14 21:49:18 +0000481 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000482 if( n+100>nLine ){
483 nLine = nLine*2 + 100;
484 zLine = realloc(zLine, nLine);
485 if( zLine==0 ) return 0;
486 }
drhdaffd0e2001-04-11 14:28:42 +0000487 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000488 if( n==0 ){
489 free(zLine);
490 return 0;
491 }
492 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000493 break;
494 }
drh9f099fd2013-08-06 14:01:46 +0000495 while( zLine[n] ) n++;
496 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000497 n--;
shaneh13b36022009-12-17 21:07:15 +0000498 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000499 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000500 break;
drh8e7e7a22000-05-30 18:45:23 +0000501 }
502 }
drhe05461c2015-12-30 13:36:57 +0000503#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000504 /* For interactive input on Windows systems, translate the
drhe05461c2015-12-30 13:36:57 +0000505 ** multi-byte characterset characters into UTF-8. */
drhfc8b40f2016-09-07 10:10:18 +0000506 if( stdin_is_interactive && in==stdin ){
mistachkin1fe36bb2016-04-04 02:16:44 +0000507 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
drhe05461c2015-12-30 13:36:57 +0000508 if( zTrans ){
509 int nTrans = strlen30(zTrans)+1;
510 if( nTrans>nLine ){
511 zLine = realloc(zLine, nTrans);
512 if( zLine==0 ){
513 sqlite3_free(zTrans);
514 return 0;
515 }
516 }
517 memcpy(zLine, zTrans, nTrans);
518 sqlite3_free(zTrans);
519 }
520 }
521#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000522 return zLine;
523}
524
525/*
drhc28490c2006-10-26 14:25:58 +0000526** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000527**
drh9f099fd2013-08-06 14:01:46 +0000528** If in==0 then read from standard input and prompt before each line.
529** If isContinuation is true, then a continuation prompt is appropriate.
530** If isContinuation is zero, then the main prompt should be used.
531**
532** If zPrior is not NULL then it is a buffer from a prior call to this
533** routine that can be reused.
534**
535** The result is stored in space obtained from malloc() and must either
536** be freed by the caller or else passed back into this routine via the
537** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000538*/
drh9f099fd2013-08-06 14:01:46 +0000539static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000540 char *zPrompt;
541 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000542 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000543 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000544 }else{
drh9f099fd2013-08-06 14:01:46 +0000545 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000546#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000547 printf("%s", zPrompt);
548 fflush(stdout);
549 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000550#else
551 free(zPrior);
552 zResult = shell_readline(zPrompt);
553 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000554#endif
drh9f099fd2013-08-06 14:01:46 +0000555 }
drh8e7e7a22000-05-30 18:45:23 +0000556 return zResult;
557}
drhf42d3182017-03-08 12:25:18 +0000558/*
559** A variable length string to which one can append text.
560*/
561typedef struct ShellText ShellText;
562struct ShellText {
563 char *z;
564 int n;
565 int nAlloc;
566};
567
568/*
569** Initialize and destroy a ShellText object
570*/
571static void initText(ShellText *p){
572 memset(p, 0, sizeof(*p));
573}
574static void freeText(ShellText *p){
575 free(p->z);
576 initText(p);
577}
578
579/* zIn is either a pointer to a NULL-terminated string in memory obtained
580** from malloc(), or a NULL pointer. The string pointed to by zAppend is
581** added to zIn, and the result returned in memory obtained from malloc().
582** zIn, if it was not NULL, is freed.
583**
584** If the third argument, quote, is not '\0', then it is used as a
585** quote character for zAppend.
586*/
587static void appendText(ShellText *p, char const *zAppend, char quote){
588 int len;
589 int i;
590 int nAppend = strlen30(zAppend);
591
592 len = nAppend+p->n+1;
593 if( quote ){
594 len += 2;
595 for(i=0; i<nAppend; i++){
596 if( zAppend[i]==quote ) len++;
597 }
598 }
599
600 if( p->n+len>=p->nAlloc ){
601 p->nAlloc = p->nAlloc*2 + len + 20;
602 p->z = realloc(p->z, p->nAlloc);
603 if( p->z==0 ){
604 memset(p, 0, sizeof(*p));
605 return;
606 }
607 }
608
609 if( quote ){
610 char *zCsr = p->z+p->n;
611 *zCsr++ = quote;
612 for(i=0; i<nAppend; i++){
613 *zCsr++ = zAppend[i];
614 if( zAppend[i]==quote ) *zCsr++ = quote;
615 }
616 *zCsr++ = quote;
617 p->n = (int)(zCsr - p->z);
618 *zCsr = '\0';
619 }else{
620 memcpy(p->z+p->n, zAppend, nAppend);
621 p->n += nAppend;
622 p->z[p->n] = '\0';
623 }
624}
625
626/*
627** Attempt to determine if identifier zName needs to be quoted, either
628** because it contains non-alphanumeric characters, or because it is an
629** SQLite keyword. Be conservative in this estimate: When in doubt assume
630** that quoting is required.
631**
632** Return '"' if quoting is required. Return 0 if no quoting is required.
633*/
634static char quoteChar(const char *zName){
635 /* All SQLite keywords, in alphabetical order */
636 static const char *azKeywords[] = {
637 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
638 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
639 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
640 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
641 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
642 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
643 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
644 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
645 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
646 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
647 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
648 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
649 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
650 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
651 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
652 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
653 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
654 "WITH", "WITHOUT",
655 };
656 int i, lwr, upr, mid, c;
657 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
658 for(i=0; zName[i]; i++){
659 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
660 }
661 lwr = 0;
662 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
663 while( lwr<=upr ){
664 mid = (lwr+upr)/2;
665 c = sqlite3_stricmp(azKeywords[mid], zName);
666 if( c==0 ) return '"';
667 if( c<0 ){
668 lwr = mid+1;
669 }else{
670 upr = mid-1;
671 }
672 }
673 return 0;
674}
drh8e7e7a22000-05-30 18:45:23 +0000675
drh1554bc82017-03-08 16:10:34 +0000676/******************************************************************************
677** SHA3 hash implementation copied from ../ext/misc/shathree.c
678*/
679typedef sqlite3_uint64 u64;
680/*
681** Macros to determine whether the machine is big or little endian,
682** and whether or not that determination is run-time or compile-time.
683**
684** For best performance, an attempt is made to guess at the byte-order
685** using C-preprocessor macros. If that is unsuccessful, or if
686** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
687** at run-time.
688*/
689#ifndef SHA3_BYTEORDER
690# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
691 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
692 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
693 defined(__arm__)
694# define SHA3_BYTEORDER 1234
695# elif defined(sparc) || defined(__ppc__)
696# define SHA3_BYTEORDER 4321
697# else
698# define SHA3_BYTEORDER 0
699# endif
700#endif
701
702
703/*
704** State structure for a SHA3 hash in progress
705*/
706typedef struct SHA3Context SHA3Context;
707struct SHA3Context {
708 union {
709 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
710 unsigned char x[1600]; /* ... or 1600 bytes */
711 } u;
712 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
713 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
714 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
715};
716
717/*
718** A single step of the Keccak mixing function for a 1600-bit state
719*/
720static void KeccakF1600Step(SHA3Context *p){
721 int i;
722 u64 B0, B1, B2, B3, B4;
723 u64 C0, C1, C2, C3, C4;
724 u64 D0, D1, D2, D3, D4;
725 static const u64 RC[] = {
726 0x0000000000000001ULL, 0x0000000000008082ULL,
727 0x800000000000808aULL, 0x8000000080008000ULL,
728 0x000000000000808bULL, 0x0000000080000001ULL,
729 0x8000000080008081ULL, 0x8000000000008009ULL,
730 0x000000000000008aULL, 0x0000000000000088ULL,
731 0x0000000080008009ULL, 0x000000008000000aULL,
732 0x000000008000808bULL, 0x800000000000008bULL,
733 0x8000000000008089ULL, 0x8000000000008003ULL,
734 0x8000000000008002ULL, 0x8000000000000080ULL,
735 0x000000000000800aULL, 0x800000008000000aULL,
736 0x8000000080008081ULL, 0x8000000000008080ULL,
737 0x0000000080000001ULL, 0x8000000080008008ULL
738 };
739# define A00 (p->u.s[0])
740# define A01 (p->u.s[1])
741# define A02 (p->u.s[2])
742# define A03 (p->u.s[3])
743# define A04 (p->u.s[4])
744# define A10 (p->u.s[5])
745# define A11 (p->u.s[6])
746# define A12 (p->u.s[7])
747# define A13 (p->u.s[8])
748# define A14 (p->u.s[9])
749# define A20 (p->u.s[10])
750# define A21 (p->u.s[11])
751# define A22 (p->u.s[12])
752# define A23 (p->u.s[13])
753# define A24 (p->u.s[14])
754# define A30 (p->u.s[15])
755# define A31 (p->u.s[16])
756# define A32 (p->u.s[17])
757# define A33 (p->u.s[18])
758# define A34 (p->u.s[19])
759# define A40 (p->u.s[20])
760# define A41 (p->u.s[21])
761# define A42 (p->u.s[22])
762# define A43 (p->u.s[23])
763# define A44 (p->u.s[24])
764# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
765
766 for(i=0; i<24; i+=4){
767 C0 = A00^A10^A20^A30^A40;
768 C1 = A01^A11^A21^A31^A41;
769 C2 = A02^A12^A22^A32^A42;
770 C3 = A03^A13^A23^A33^A43;
771 C4 = A04^A14^A24^A34^A44;
772 D0 = C4^ROL64(C1, 1);
773 D1 = C0^ROL64(C2, 1);
774 D2 = C1^ROL64(C3, 1);
775 D3 = C2^ROL64(C4, 1);
776 D4 = C3^ROL64(C0, 1);
777
778 B0 = (A00^D0);
779 B1 = ROL64((A11^D1), 44);
780 B2 = ROL64((A22^D2), 43);
781 B3 = ROL64((A33^D3), 21);
782 B4 = ROL64((A44^D4), 14);
783 A00 = B0 ^((~B1)& B2 );
784 A00 ^= RC[i];
785 A11 = B1 ^((~B2)& B3 );
786 A22 = B2 ^((~B3)& B4 );
787 A33 = B3 ^((~B4)& B0 );
788 A44 = B4 ^((~B0)& B1 );
789
790 B2 = ROL64((A20^D0), 3);
791 B3 = ROL64((A31^D1), 45);
792 B4 = ROL64((A42^D2), 61);
793 B0 = ROL64((A03^D3), 28);
794 B1 = ROL64((A14^D4), 20);
795 A20 = B0 ^((~B1)& B2 );
796 A31 = B1 ^((~B2)& B3 );
797 A42 = B2 ^((~B3)& B4 );
798 A03 = B3 ^((~B4)& B0 );
799 A14 = B4 ^((~B0)& B1 );
800
801 B4 = ROL64((A40^D0), 18);
802 B0 = ROL64((A01^D1), 1);
803 B1 = ROL64((A12^D2), 6);
804 B2 = ROL64((A23^D3), 25);
805 B3 = ROL64((A34^D4), 8);
806 A40 = B0 ^((~B1)& B2 );
807 A01 = B1 ^((~B2)& B3 );
808 A12 = B2 ^((~B3)& B4 );
809 A23 = B3 ^((~B4)& B0 );
810 A34 = B4 ^((~B0)& B1 );
811
812 B1 = ROL64((A10^D0), 36);
813 B2 = ROL64((A21^D1), 10);
814 B3 = ROL64((A32^D2), 15);
815 B4 = ROL64((A43^D3), 56);
816 B0 = ROL64((A04^D4), 27);
817 A10 = B0 ^((~B1)& B2 );
818 A21 = B1 ^((~B2)& B3 );
819 A32 = B2 ^((~B3)& B4 );
820 A43 = B3 ^((~B4)& B0 );
821 A04 = B4 ^((~B0)& B1 );
822
823 B3 = ROL64((A30^D0), 41);
824 B4 = ROL64((A41^D1), 2);
825 B0 = ROL64((A02^D2), 62);
826 B1 = ROL64((A13^D3), 55);
827 B2 = ROL64((A24^D4), 39);
828 A30 = B0 ^((~B1)& B2 );
829 A41 = B1 ^((~B2)& B3 );
830 A02 = B2 ^((~B3)& B4 );
831 A13 = B3 ^((~B4)& B0 );
832 A24 = B4 ^((~B0)& B1 );
833
834 C0 = A00^A20^A40^A10^A30;
835 C1 = A11^A31^A01^A21^A41;
836 C2 = A22^A42^A12^A32^A02;
837 C3 = A33^A03^A23^A43^A13;
838 C4 = A44^A14^A34^A04^A24;
839 D0 = C4^ROL64(C1, 1);
840 D1 = C0^ROL64(C2, 1);
841 D2 = C1^ROL64(C3, 1);
842 D3 = C2^ROL64(C4, 1);
843 D4 = C3^ROL64(C0, 1);
844
845 B0 = (A00^D0);
846 B1 = ROL64((A31^D1), 44);
847 B2 = ROL64((A12^D2), 43);
848 B3 = ROL64((A43^D3), 21);
849 B4 = ROL64((A24^D4), 14);
850 A00 = B0 ^((~B1)& B2 );
851 A00 ^= RC[i+1];
852 A31 = B1 ^((~B2)& B3 );
853 A12 = B2 ^((~B3)& B4 );
854 A43 = B3 ^((~B4)& B0 );
855 A24 = B4 ^((~B0)& B1 );
856
857 B2 = ROL64((A40^D0), 3);
858 B3 = ROL64((A21^D1), 45);
859 B4 = ROL64((A02^D2), 61);
860 B0 = ROL64((A33^D3), 28);
861 B1 = ROL64((A14^D4), 20);
862 A40 = B0 ^((~B1)& B2 );
863 A21 = B1 ^((~B2)& B3 );
864 A02 = B2 ^((~B3)& B4 );
865 A33 = B3 ^((~B4)& B0 );
866 A14 = B4 ^((~B0)& B1 );
867
868 B4 = ROL64((A30^D0), 18);
869 B0 = ROL64((A11^D1), 1);
870 B1 = ROL64((A42^D2), 6);
871 B2 = ROL64((A23^D3), 25);
872 B3 = ROL64((A04^D4), 8);
873 A30 = B0 ^((~B1)& B2 );
874 A11 = B1 ^((~B2)& B3 );
875 A42 = B2 ^((~B3)& B4 );
876 A23 = B3 ^((~B4)& B0 );
877 A04 = B4 ^((~B0)& B1 );
878
879 B1 = ROL64((A20^D0), 36);
880 B2 = ROL64((A01^D1), 10);
881 B3 = ROL64((A32^D2), 15);
882 B4 = ROL64((A13^D3), 56);
883 B0 = ROL64((A44^D4), 27);
884 A20 = B0 ^((~B1)& B2 );
885 A01 = B1 ^((~B2)& B3 );
886 A32 = B2 ^((~B3)& B4 );
887 A13 = B3 ^((~B4)& B0 );
888 A44 = B4 ^((~B0)& B1 );
889
890 B3 = ROL64((A10^D0), 41);
891 B4 = ROL64((A41^D1), 2);
892 B0 = ROL64((A22^D2), 62);
893 B1 = ROL64((A03^D3), 55);
894 B2 = ROL64((A34^D4), 39);
895 A10 = B0 ^((~B1)& B2 );
896 A41 = B1 ^((~B2)& B3 );
897 A22 = B2 ^((~B3)& B4 );
898 A03 = B3 ^((~B4)& B0 );
899 A34 = B4 ^((~B0)& B1 );
900
901 C0 = A00^A40^A30^A20^A10;
902 C1 = A31^A21^A11^A01^A41;
903 C2 = A12^A02^A42^A32^A22;
904 C3 = A43^A33^A23^A13^A03;
905 C4 = A24^A14^A04^A44^A34;
906 D0 = C4^ROL64(C1, 1);
907 D1 = C0^ROL64(C2, 1);
908 D2 = C1^ROL64(C3, 1);
909 D3 = C2^ROL64(C4, 1);
910 D4 = C3^ROL64(C0, 1);
911
912 B0 = (A00^D0);
913 B1 = ROL64((A21^D1), 44);
914 B2 = ROL64((A42^D2), 43);
915 B3 = ROL64((A13^D3), 21);
916 B4 = ROL64((A34^D4), 14);
917 A00 = B0 ^((~B1)& B2 );
918 A00 ^= RC[i+2];
919 A21 = B1 ^((~B2)& B3 );
920 A42 = B2 ^((~B3)& B4 );
921 A13 = B3 ^((~B4)& B0 );
922 A34 = B4 ^((~B0)& B1 );
923
924 B2 = ROL64((A30^D0), 3);
925 B3 = ROL64((A01^D1), 45);
926 B4 = ROL64((A22^D2), 61);
927 B0 = ROL64((A43^D3), 28);
928 B1 = ROL64((A14^D4), 20);
929 A30 = B0 ^((~B1)& B2 );
930 A01 = B1 ^((~B2)& B3 );
931 A22 = B2 ^((~B3)& B4 );
932 A43 = B3 ^((~B4)& B0 );
933 A14 = B4 ^((~B0)& B1 );
934
935 B4 = ROL64((A10^D0), 18);
936 B0 = ROL64((A31^D1), 1);
937 B1 = ROL64((A02^D2), 6);
938 B2 = ROL64((A23^D3), 25);
939 B3 = ROL64((A44^D4), 8);
940 A10 = B0 ^((~B1)& B2 );
941 A31 = B1 ^((~B2)& B3 );
942 A02 = B2 ^((~B3)& B4 );
943 A23 = B3 ^((~B4)& B0 );
944 A44 = B4 ^((~B0)& B1 );
945
946 B1 = ROL64((A40^D0), 36);
947 B2 = ROL64((A11^D1), 10);
948 B3 = ROL64((A32^D2), 15);
949 B4 = ROL64((A03^D3), 56);
950 B0 = ROL64((A24^D4), 27);
951 A40 = B0 ^((~B1)& B2 );
952 A11 = B1 ^((~B2)& B3 );
953 A32 = B2 ^((~B3)& B4 );
954 A03 = B3 ^((~B4)& B0 );
955 A24 = B4 ^((~B0)& B1 );
956
957 B3 = ROL64((A20^D0), 41);
958 B4 = ROL64((A41^D1), 2);
959 B0 = ROL64((A12^D2), 62);
960 B1 = ROL64((A33^D3), 55);
961 B2 = ROL64((A04^D4), 39);
962 A20 = B0 ^((~B1)& B2 );
963 A41 = B1 ^((~B2)& B3 );
964 A12 = B2 ^((~B3)& B4 );
965 A33 = B3 ^((~B4)& B0 );
966 A04 = B4 ^((~B0)& B1 );
967
968 C0 = A00^A30^A10^A40^A20;
969 C1 = A21^A01^A31^A11^A41;
970 C2 = A42^A22^A02^A32^A12;
971 C3 = A13^A43^A23^A03^A33;
972 C4 = A34^A14^A44^A24^A04;
973 D0 = C4^ROL64(C1, 1);
974 D1 = C0^ROL64(C2, 1);
975 D2 = C1^ROL64(C3, 1);
976 D3 = C2^ROL64(C4, 1);
977 D4 = C3^ROL64(C0, 1);
978
979 B0 = (A00^D0);
980 B1 = ROL64((A01^D1), 44);
981 B2 = ROL64((A02^D2), 43);
982 B3 = ROL64((A03^D3), 21);
983 B4 = ROL64((A04^D4), 14);
984 A00 = B0 ^((~B1)& B2 );
985 A00 ^= RC[i+3];
986 A01 = B1 ^((~B2)& B3 );
987 A02 = B2 ^((~B3)& B4 );
988 A03 = B3 ^((~B4)& B0 );
989 A04 = B4 ^((~B0)& B1 );
990
991 B2 = ROL64((A10^D0), 3);
992 B3 = ROL64((A11^D1), 45);
993 B4 = ROL64((A12^D2), 61);
994 B0 = ROL64((A13^D3), 28);
995 B1 = ROL64((A14^D4), 20);
996 A10 = B0 ^((~B1)& B2 );
997 A11 = B1 ^((~B2)& B3 );
998 A12 = B2 ^((~B3)& B4 );
999 A13 = B3 ^((~B4)& B0 );
1000 A14 = B4 ^((~B0)& B1 );
1001
1002 B4 = ROL64((A20^D0), 18);
1003 B0 = ROL64((A21^D1), 1);
1004 B1 = ROL64((A22^D2), 6);
1005 B2 = ROL64((A23^D3), 25);
1006 B3 = ROL64((A24^D4), 8);
1007 A20 = B0 ^((~B1)& B2 );
1008 A21 = B1 ^((~B2)& B3 );
1009 A22 = B2 ^((~B3)& B4 );
1010 A23 = B3 ^((~B4)& B0 );
1011 A24 = B4 ^((~B0)& B1 );
1012
1013 B1 = ROL64((A30^D0), 36);
1014 B2 = ROL64((A31^D1), 10);
1015 B3 = ROL64((A32^D2), 15);
1016 B4 = ROL64((A33^D3), 56);
1017 B0 = ROL64((A34^D4), 27);
1018 A30 = B0 ^((~B1)& B2 );
1019 A31 = B1 ^((~B2)& B3 );
1020 A32 = B2 ^((~B3)& B4 );
1021 A33 = B3 ^((~B4)& B0 );
1022 A34 = B4 ^((~B0)& B1 );
1023
1024 B3 = ROL64((A40^D0), 41);
1025 B4 = ROL64((A41^D1), 2);
1026 B0 = ROL64((A42^D2), 62);
1027 B1 = ROL64((A43^D3), 55);
1028 B2 = ROL64((A44^D4), 39);
1029 A40 = B0 ^((~B1)& B2 );
1030 A41 = B1 ^((~B2)& B3 );
1031 A42 = B2 ^((~B3)& B4 );
1032 A43 = B3 ^((~B4)& B0 );
1033 A44 = B4 ^((~B0)& B1 );
1034 }
1035}
1036
1037/*
1038** Initialize a new hash. iSize determines the size of the hash
1039** in bits and should be one of 224, 256, 384, or 512. Or iSize
1040** can be zero to use the default hash size of 256 bits.
1041*/
1042static void SHA3Init(SHA3Context *p, int iSize){
1043 memset(p, 0, sizeof(*p));
1044 if( iSize>=128 && iSize<=512 ){
1045 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1046 }else{
1047 p->nRate = (1600 - 2*256)/8;
1048 }
1049#if SHA3_BYTEORDER==1234
1050 /* Known to be little-endian at compile-time. No-op */
1051#elif SHA3_BYTEORDER==4321
1052 p->ixMask = 7; /* Big-endian */
1053#else
1054 {
1055 static unsigned int one = 1;
1056 if( 1==*(unsigned char*)&one ){
1057 /* Little endian. No byte swapping. */
1058 p->ixMask = 0;
1059 }else{
1060 /* Big endian. Byte swap. */
1061 p->ixMask = 7;
1062 }
1063 }
1064#endif
1065}
1066
1067/*
1068** Make consecutive calls to the SHA3Update function to add new content
1069** to the hash
1070*/
1071static void SHA3Update(
1072 SHA3Context *p,
1073 const unsigned char *aData,
1074 unsigned int nData
1075){
1076 unsigned int i = 0;
1077#if SHA3_BYTEORDER==1234
1078 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1079 for(; i+7<nData; i+=8){
1080 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1081 p->nLoaded += 8;
1082 if( p->nLoaded>=p->nRate ){
1083 KeccakF1600Step(p);
1084 p->nLoaded = 0;
1085 }
1086 }
1087 }
1088#endif
1089 for(; i<nData; i++){
1090#if SHA3_BYTEORDER==1234
1091 p->u.x[p->nLoaded] ^= aData[i];
1092#elif SHA3_BYTEORDER==4321
1093 p->u.x[p->nLoaded^0x07] ^= aData[i];
1094#else
1095 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1096#endif
1097 p->nLoaded++;
1098 if( p->nLoaded==p->nRate ){
1099 KeccakF1600Step(p);
1100 p->nLoaded = 0;
1101 }
1102 }
1103}
1104
1105/*
1106** After all content has been added, invoke SHA3Final() to compute
1107** the final hash. The function returns a pointer to the binary
1108** hash value.
1109*/
1110static unsigned char *SHA3Final(SHA3Context *p){
1111 unsigned int i;
1112 if( p->nLoaded==p->nRate-1 ){
1113 const unsigned char c1 = 0x86;
1114 SHA3Update(p, &c1, 1);
1115 }else{
1116 const unsigned char c2 = 0x06;
1117 const unsigned char c3 = 0x80;
1118 SHA3Update(p, &c2, 1);
1119 p->nLoaded = p->nRate - 1;
1120 SHA3Update(p, &c3, 1);
1121 }
1122 for(i=0; i<p->nRate; i++){
1123 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1124 }
1125 return &p->u.x[p->nRate];
1126}
1127
1128/*
1129** Implementation of the sha3(X,SIZE) function.
1130**
1131** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
1132** size is 256. If X is a BLOB, it is hashed as is.
1133** For all other non-NULL types of input, X is converted into a UTF-8 string
1134** and the string is hashed without the trailing 0x00 terminator. The hash
1135** of a NULL value is NULL.
1136*/
1137static void sha3Func(
1138 sqlite3_context *context,
1139 int argc,
1140 sqlite3_value **argv
1141){
1142 SHA3Context cx;
1143 int eType = sqlite3_value_type(argv[0]);
1144 int nByte = sqlite3_value_bytes(argv[0]);
1145 int iSize;
1146 if( argc==1 ){
1147 iSize = 256;
1148 }else{
1149 iSize = sqlite3_value_int(argv[1]);
1150 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1151 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1152 "384 512", -1);
1153 return;
1154 }
1155 }
1156 if( eType==SQLITE_NULL ) return;
1157 SHA3Init(&cx, iSize);
1158 if( eType==SQLITE_BLOB ){
1159 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1160 }else{
1161 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1162 }
1163 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1164}
1165
1166/* Compute a string using sqlite3_vsnprintf() with a maximum length
1167** of 50 bytes and add it to the hash.
1168*/
1169static void hash_step_vformat(
1170 SHA3Context *p, /* Add content to this context */
1171 const char *zFormat,
1172 ...
1173){
1174 va_list ap;
1175 int n;
1176 char zBuf[50];
1177 va_start(ap, zFormat);
1178 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1179 va_end(ap);
1180 n = (int)strlen(zBuf);
1181 SHA3Update(p, (unsigned char*)zBuf, n);
1182}
1183
1184/*
1185** Implementation of the sha3_query(SQL,SIZE) function.
1186**
1187** This function compiles and runs the SQL statement(s) given in the
1188** argument. The results are hashed using a SIZE-bit SHA3. The default
1189** size is 256.
1190**
1191** The format of the byte stream that is hashed is summarized as follows:
1192**
1193** S<n>:<sql>
1194** R
1195** N
1196** I<int>
1197** F<ieee-float>
1198** B<size>:<bytes>
1199** T<size>:<text>
1200**
1201** <sql> is the original SQL text for each statement run and <n> is
1202** the size of that text. The SQL text is UTF-8. A single R character
1203** occurs before the start of each row. N means a NULL value.
1204** I mean an 8-byte little-endian integer <int>. F is a floating point
1205** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1206** B means blobs of <size> bytes. T means text rendered as <size>
1207** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
1208** text integers.
1209**
1210** For each SQL statement in the X input, there is one S segment. Each
1211** S segment is followed by zero or more R segments, one for each row in the
1212** result set. After each R, there are one or more N, I, F, B, or T segments,
1213** one for each column in the result set. Segments are concatentated directly
1214** with no delimiters of any kind.
1215*/
1216static void sha3QueryFunc(
1217 sqlite3_context *context,
1218 int argc,
1219 sqlite3_value **argv
1220){
1221 sqlite3 *db = sqlite3_context_db_handle(context);
1222 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1223 sqlite3_stmt *pStmt = 0;
1224 int nCol; /* Number of columns in the result set */
1225 int i; /* Loop counter */
1226 int rc;
1227 int n;
1228 const char *z;
1229 SHA3Context cx;
1230 int iSize;
1231
1232 if( argc==1 ){
1233 iSize = 256;
1234 }else{
1235 iSize = sqlite3_value_int(argv[1]);
1236 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1237 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1238 "384 512", -1);
1239 return;
1240 }
1241 }
1242 if( zSql==0 ) return;
1243 SHA3Init(&cx, iSize);
1244 while( zSql[0] ){
1245 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1246 if( rc ){
1247 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1248 zSql, sqlite3_errmsg(db));
1249 sqlite3_finalize(pStmt);
1250 sqlite3_result_error(context, zMsg, -1);
1251 sqlite3_free(zMsg);
1252 return;
1253 }
1254 if( !sqlite3_stmt_readonly(pStmt) ){
1255 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1256 sqlite3_finalize(pStmt);
1257 sqlite3_result_error(context, zMsg, -1);
1258 sqlite3_free(zMsg);
1259 return;
1260 }
1261 nCol = sqlite3_column_count(pStmt);
1262 z = sqlite3_sql(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00001263 if( z==0 ){
1264 sqlite3_finalize(pStmt);
1265 continue;
1266 }
drh1554bc82017-03-08 16:10:34 +00001267 n = (int)strlen(z);
1268 hash_step_vformat(&cx,"S%d:",n);
1269 SHA3Update(&cx,(unsigned char*)z,n);
1270
1271 /* Compute a hash over the result of the query */
1272 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1273 SHA3Update(&cx,(const unsigned char*)"R",1);
1274 for(i=0; i<nCol; i++){
1275 switch( sqlite3_column_type(pStmt,i) ){
1276 case SQLITE_NULL: {
1277 SHA3Update(&cx, (const unsigned char*)"N",1);
1278 break;
1279 }
1280 case SQLITE_INTEGER: {
1281 sqlite3_uint64 u;
1282 int j;
1283 unsigned char x[9];
1284 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1285 memcpy(&u, &v, 8);
1286 for(j=8; j>=1; j--){
1287 x[j] = u & 0xff;
1288 u >>= 8;
1289 }
1290 x[0] = 'I';
1291 SHA3Update(&cx, x, 9);
1292 break;
1293 }
1294 case SQLITE_FLOAT: {
1295 sqlite3_uint64 u;
1296 int j;
1297 unsigned char x[9];
1298 double r = sqlite3_column_double(pStmt,i);
1299 memcpy(&u, &r, 8);
1300 for(j=8; j>=1; j--){
1301 x[j] = u & 0xff;
1302 u >>= 8;
1303 }
1304 x[0] = 'F';
1305 SHA3Update(&cx,x,9);
1306 break;
1307 }
1308 case SQLITE_TEXT: {
1309 int n2 = sqlite3_column_bytes(pStmt, i);
1310 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1311 hash_step_vformat(&cx,"T%d:",n2);
1312 SHA3Update(&cx, z2, n2);
1313 break;
1314 }
1315 case SQLITE_BLOB: {
1316 int n2 = sqlite3_column_bytes(pStmt, i);
1317 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1318 hash_step_vformat(&cx,"B%d:",n2);
1319 SHA3Update(&cx, z2, n2);
1320 break;
1321 }
1322 }
1323 }
1324 }
1325 sqlite3_finalize(pStmt);
1326 }
1327 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1328}
1329/* End of SHA3 hashing logic copy/pasted from ../ext/misc/shathree.c
1330********************************************************************************/
1331
drhe6229612014-08-18 15:08:26 +00001332#if defined(SQLITE_ENABLE_SESSION)
1333/*
1334** State information for a single open session
1335*/
1336typedef struct OpenSession OpenSession;
1337struct OpenSession {
1338 char *zName; /* Symbolic name for this session */
1339 int nFilter; /* Number of xFilter rejection GLOB patterns */
1340 char **azFilter; /* Array of xFilter rejection GLOB patterns */
1341 sqlite3_session *p; /* The open session */
1342};
1343#endif
1344
drhdcd87a92014-08-18 13:45:42 +00001345/*
mistachkin1fe36bb2016-04-04 02:16:44 +00001346** Shell output mode information from before ".explain on",
drhdcd87a92014-08-18 13:45:42 +00001347** saved so that it can be restored by ".explain off"
1348*/
1349typedef struct SavedModeInfo SavedModeInfo;
1350struct SavedModeInfo {
1351 int valid; /* Is there legit data in here? */
1352 int mode; /* Mode prior to ".explain on" */
1353 int showHeader; /* The ".header" setting prior to ".explain on" */
1354 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +00001355};
drh45e29d82006-11-20 16:21:10 +00001356
drh8e7e7a22000-05-30 18:45:23 +00001357/*
drhdcd87a92014-08-18 13:45:42 +00001358** State information about the database connection is contained in an
1359** instance of the following structure.
drh75897232000-05-29 14:26:00 +00001360*/
drhdcd87a92014-08-18 13:45:42 +00001361typedef struct ShellState ShellState;
1362struct ShellState {
shane626a6e42009-10-22 17:30:15 +00001363 sqlite3 *db; /* The database */
drh700c2522016-02-09 18:39:25 +00001364 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +00001365 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +00001366 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +00001367 int scanstatsOn; /* True to display scan stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +00001368 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +00001369 int cnt; /* Number of records displayed so far */
1370 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +00001371 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +00001372 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +00001373 int mode; /* An output mode setting */
drh700c2522016-02-09 18:39:25 +00001374 int cMode; /* temporary output mode for the current query */
1375 int normalMode; /* Output mode before ".explain on" */
drh45e29d82006-11-20 16:21:10 +00001376 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +00001377 int showHeader; /* True to show column names in List or Column mode */
drh760c8162016-09-16 02:52:22 +00001378 int nCheck; /* Number of ".check" commands run */
drh44dec872014-08-30 15:49:25 +00001379 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +00001380 char *zDestTable; /* Name of destination table when MODE_Insert */
drh760c8162016-09-16 02:52:22 +00001381 char zTestcase[30]; /* Name of current test case */
mistachkin636bf9f2014-07-19 20:15:16 +00001382 char colSeparator[20]; /* Column separator character for several modes */
1383 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +00001384 int colWidth[100]; /* Requested width of each column when in column mode*/
1385 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +00001386 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +00001387 ** the database */
drh44c2eb12003-04-30 11:38:26 +00001388 char outfile[FILENAME_MAX]; /* Filename for *out */
1389 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +00001390 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +00001391 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +00001392 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +00001393 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +00001394 int *aiIndent; /* Array of indents used in MODE_Explain */
1395 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +00001396 int iIndent; /* Index of current op in aiIndent[] */
drhe6229612014-08-18 15:08:26 +00001397#if defined(SQLITE_ENABLE_SESSION)
1398 int nSession; /* Number of active sessions */
1399 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1400#endif
drh75897232000-05-29 14:26:00 +00001401};
1402
1403/*
drh44dec872014-08-30 15:49:25 +00001404** These are the allowed shellFlgs values
1405*/
drhe6e1d122017-03-09 13:50:49 +00001406#define SHFLG_Scratch 0x00000001 /* The --scratch option is used */
1407#define SHFLG_Pagecache 0x00000002 /* The --pagecache option is used */
1408#define SHFLG_Lookaside 0x00000004 /* Lookaside memory is used */
1409#define SHFLG_Backslash 0x00000008 /* The --backslash option is used */
1410#define SHFLG_PreserveRowid 0x00000010 /* .dump preserves rowid values */
1411#define SHFLG_CountChanges 0x00000020 /* .changes setting */
1412#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
1413
1414/*
1415** Macros for testing and setting shellFlgs
1416*/
1417#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
1418#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
1419#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
drh44dec872014-08-30 15:49:25 +00001420
1421/*
drh75897232000-05-29 14:26:00 +00001422** These are the allowed modes.
1423*/
drh967e8b72000-06-21 13:59:10 +00001424#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00001425#define MODE_Column 1 /* One record per line in neat columns */
1426#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00001427#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1428#define MODE_Html 4 /* Generate an XHTML table */
1429#define MODE_Insert 5 /* Generate SQL "insert" statements */
drh41f5f6e2016-10-21 17:39:30 +00001430#define MODE_Quote 6 /* Quote values as for SQL */
1431#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1432#define MODE_Csv 8 /* Quote strings, numbers are plain */
1433#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1434#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1435#define MODE_Pretty 11 /* Pretty-print schemas */
persicom7e2dfdd2002-04-18 02:46:52 +00001436
drh66ce4d02008-02-15 17:38:06 +00001437static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00001438 "line",
1439 "column",
1440 "list",
1441 "semi",
1442 "html",
drhfeac5f82004-08-01 00:10:45 +00001443 "insert",
drh41f5f6e2016-10-21 17:39:30 +00001444 "quote",
drhfeac5f82004-08-01 00:10:45 +00001445 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00001446 "csv",
drh66ce4d02008-02-15 17:38:06 +00001447 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +00001448 "ascii",
drh4926fec2016-04-13 15:33:42 +00001449 "prettyprint",
persicom7e2dfdd2002-04-18 02:46:52 +00001450};
drh75897232000-05-29 14:26:00 +00001451
1452/*
mistachkinfad42082014-07-24 22:13:12 +00001453** These are the column/row/line separators used by the various
1454** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +00001455*/
mistachkinfad42082014-07-24 22:13:12 +00001456#define SEP_Column "|"
1457#define SEP_Row "\n"
1458#define SEP_Tab "\t"
1459#define SEP_Space " "
1460#define SEP_Comma ","
1461#define SEP_CrLf "\r\n"
1462#define SEP_Unit "\x1F"
1463#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +00001464
1465/*
drh75897232000-05-29 14:26:00 +00001466** Number of elements in an array
1467*/
drh902b9ee2008-12-05 17:17:07 +00001468#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00001469
1470/*
drh127f9d72010-02-23 01:47:00 +00001471** A callback for the sqlite3_log() interface.
1472*/
1473static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +00001474 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +00001475 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +00001476 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +00001477 fflush(p->pLog);
1478}
1479
1480/*
shane626a6e42009-10-22 17:30:15 +00001481** Output the given string as a hex-encoded blob (eg. X'1234' )
1482*/
1483static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1484 int i;
1485 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +00001486 raw_printf(out,"X'");
1487 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1488 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +00001489}
1490
1491/*
drh28bd4bc2000-06-15 15:57:22 +00001492** Output the given string as a quoted string using SQL quoting conventions.
1493*/
1494static void output_quoted_string(FILE *out, const char *z){
1495 int i;
1496 int nSingle = 0;
mistachkin1fe36bb2016-04-04 02:16:44 +00001497 setBinaryMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001498 for(i=0; z[i]; i++){
1499 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +00001500 }
1501 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +00001502 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00001503 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001504 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001505 while( *z ){
1506 for(i=0; z[i] && z[i]!='\''; i++){}
1507 if( i==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001508 raw_printf(out,"''");
drh28bd4bc2000-06-15 15:57:22 +00001509 z++;
1510 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +00001511 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +00001512 z += i+1;
1513 }else{
drhe05461c2015-12-30 13:36:57 +00001514 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +00001515 break;
1516 }
1517 }
mistachkinaae280e2015-12-31 19:06:24 +00001518 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001519 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001520 setTextMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001521}
1522
1523/*
drhfeac5f82004-08-01 00:10:45 +00001524** Output the given string as a quoted according to C or TCL quoting rules.
1525*/
1526static void output_c_string(FILE *out, const char *z){
1527 unsigned int c;
1528 fputc('"', out);
1529 while( (c = *(z++))!=0 ){
1530 if( c=='\\' ){
1531 fputc(c, out);
1532 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +00001533 }else if( c=='"' ){
1534 fputc('\\', out);
1535 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +00001536 }else if( c=='\t' ){
1537 fputc('\\', out);
1538 fputc('t', out);
1539 }else if( c=='\n' ){
1540 fputc('\\', out);
1541 fputc('n', out);
1542 }else if( c=='\r' ){
1543 fputc('\\', out);
1544 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +00001545 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +00001546 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00001547 }else{
1548 fputc(c, out);
1549 }
1550 }
1551 fputc('"', out);
1552}
1553
1554/*
drhc08a4f12000-06-15 16:49:48 +00001555** Output the given string with characters that are special to
1556** HTML escaped.
1557*/
1558static void output_html_string(FILE *out, const char *z){
1559 int i;
drhc3d6ba42014-01-13 20:38:35 +00001560 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +00001561 while( *z ){
mistachkin1fe36bb2016-04-04 02:16:44 +00001562 for(i=0; z[i]
1563 && z[i]!='<'
1564 && z[i]!='&'
1565 && z[i]!='>'
1566 && z[i]!='\"'
shane43d9cb22009-10-21 14:11:48 +00001567 && z[i]!='\'';
1568 i++){}
drhc08a4f12000-06-15 16:49:48 +00001569 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +00001570 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +00001571 }
1572 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +00001573 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +00001574 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +00001575 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +00001576 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +00001577 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +00001578 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +00001579 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +00001580 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +00001581 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +00001582 }else{
1583 break;
1584 }
1585 z += i + 1;
1586 }
1587}
1588
1589/*
drhc49f44e2006-10-26 18:15:42 +00001590** If a field contains any character identified by a 1 in the following
1591** array, then the string must be quoted for CSV.
1592*/
1593static const char needCsvQuote[] = {
mistachkin1fe36bb2016-04-04 02:16:44 +00001594 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1595 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1596 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1597 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1598 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1599 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1600 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1601 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1602 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1603 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1604 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1605 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1606 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1607 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1608 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1609 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
drhc49f44e2006-10-26 18:15:42 +00001610};
1611
1612/*
mistachkindd11f2d2014-12-11 04:49:46 +00001613** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +00001614** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +00001615** the null value. Strings are quoted if necessary. The separator
1616** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +00001617*/
drhdcd87a92014-08-18 13:45:42 +00001618static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00001619 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00001620 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +00001621 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +00001622 }else{
drhc49f44e2006-10-26 18:15:42 +00001623 int i;
mistachkin636bf9f2014-07-19 20:15:16 +00001624 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +00001625 for(i=0; z[i]; i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00001626 if( needCsvQuote[((unsigned char*)z)[i]]
1627 || (z[i]==p->colSeparator[0] &&
mistachkin636bf9f2014-07-19 20:15:16 +00001628 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00001629 i = 0;
1630 break;
1631 }
1632 }
1633 if( i==0 ){
1634 putc('"', out);
1635 for(i=0; z[i]; i++){
1636 if( z[i]=='"' ) putc('"', out);
1637 putc(z[i], out);
1638 }
1639 putc('"', out);
1640 }else{
drhe05461c2015-12-30 13:36:57 +00001641 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +00001642 }
drh8e64d1c2004-10-07 00:32:39 +00001643 }
1644 if( bSep ){
drhe05461c2015-12-30 13:36:57 +00001645 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001646 }
1647}
1648
danielk19774af00c62005-01-23 23:43:21 +00001649#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00001650/*
drh4c504392000-10-16 22:06:40 +00001651** This routine runs when the user presses Ctrl-C
1652*/
1653static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00001654 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +00001655 seenInterrupt++;
1656 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +00001657 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +00001658}
danielk19774af00c62005-01-23 23:43:21 +00001659#endif
drh4c504392000-10-16 22:06:40 +00001660
drha0daa752016-09-16 11:53:10 +00001661#ifndef SQLITE_OMIT_AUTHORIZATION
drh4c504392000-10-16 22:06:40 +00001662/*
drhde613c62016-04-04 17:23:10 +00001663** When the ".auth ON" is set, the following authorizer callback is
1664** invoked. It always returns SQLITE_OK.
1665*/
1666static int shellAuth(
1667 void *pClientData,
1668 int op,
1669 const char *zA1,
1670 const char *zA2,
1671 const char *zA3,
1672 const char *zA4
1673){
1674 ShellState *p = (ShellState*)pClientData;
1675 static const char *azAction[] = { 0,
1676 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1677 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1678 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1679 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1680 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1681 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1682 "PRAGMA", "READ", "SELECT",
1683 "TRANSACTION", "UPDATE", "ATTACH",
1684 "DETACH", "ALTER_TABLE", "REINDEX",
1685 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1686 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1687 };
1688 int i;
1689 const char *az[4];
1690 az[0] = zA1;
1691 az[1] = zA2;
1692 az[2] = zA3;
1693 az[3] = zA4;
mistachkin8145fc62016-09-16 20:39:21 +00001694 utf8_printf(p->out, "authorizer: %s", azAction[op]);
drhde613c62016-04-04 17:23:10 +00001695 for(i=0; i<4; i++){
1696 raw_printf(p->out, " ");
1697 if( az[i] ){
1698 output_c_string(p->out, az[i]);
1699 }else{
1700 raw_printf(p->out, "NULL");
1701 }
1702 }
1703 raw_printf(p->out, "\n");
1704 return SQLITE_OK;
1705}
drha0daa752016-09-16 11:53:10 +00001706#endif
mistachkin8145fc62016-09-16 20:39:21 +00001707
drh79f20e92016-12-13 23:22:39 +00001708/*
1709** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1710**
1711** This routine converts some CREATE TABLE statements for shadow tables
1712** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1713*/
1714static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1715 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1716 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1717 }else{
1718 utf8_printf(out, "%s%s", z, zTail);
1719 }
1720}
1721static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1722 char c = z[n];
1723 z[n] = 0;
1724 printSchemaLine(out, z, zTail);
1725 z[n] = c;
1726}
drhde613c62016-04-04 17:23:10 +00001727
1728/*
shane626a6e42009-10-22 17:30:15 +00001729** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +00001730** invokes for each row of a query result.
1731*/
drh4ace5362014-11-10 14:42:28 +00001732static int shell_callback(
1733 void *pArg,
1734 int nArg, /* Number of result columns */
1735 char **azArg, /* Text of each result column */
1736 char **azCol, /* Column names */
1737 int *aiType /* Column types */
1738){
drh75897232000-05-29 14:26:00 +00001739 int i;
drhdcd87a92014-08-18 13:45:42 +00001740 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +00001741
drh700c2522016-02-09 18:39:25 +00001742 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +00001743 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00001744 int w = 5;
drh6a535342001-10-19 16:44:56 +00001745 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00001746 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00001747 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00001748 if( len>w ) w = len;
1749 }
drhe05461c2015-12-30 13:36:57 +00001750 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001751 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001752 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +00001753 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001754 }
1755 break;
1756 }
danielk19770d78bae2008-01-03 07:09:48 +00001757 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00001758 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +00001759 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1760 const int *colWidth;
1761 int showHdr;
1762 char *rowSep;
1763 if( p->cMode==MODE_Column ){
1764 colWidth = p->colWidth;
1765 showHdr = p->showHeader;
1766 rowSep = p->rowSeparator;
1767 }else{
1768 colWidth = aExplainWidths;
1769 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +00001770 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +00001771 }
drha0c66f52000-07-29 13:20:21 +00001772 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00001773 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00001774 int w, n;
1775 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +00001776 w = colWidth[i];
drh75897232000-05-29 14:26:00 +00001777 }else{
danielk19770d78bae2008-01-03 07:09:48 +00001778 w = 0;
drh75897232000-05-29 14:26:00 +00001779 }
drh078b1fd2012-09-21 13:40:02 +00001780 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +00001781 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00001782 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +00001783 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +00001784 if( w<n ) w = n;
1785 }
1786 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00001787 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00001788 }
drh700c2522016-02-09 18:39:25 +00001789 if( showHdr ){
drh078b1fd2012-09-21 13:40:02 +00001790 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001791 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001792 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001793 }else{
drhe05461c2015-12-30 13:36:57 +00001794 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001795 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001796 }
drha0c66f52000-07-29 13:20:21 +00001797 }
1798 }
drh700c2522016-02-09 18:39:25 +00001799 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +00001800 for(i=0; i<nArg; i++){
1801 int w;
1802 if( i<ArraySize(p->actualWidth) ){
1803 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +00001804 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +00001805 }else{
1806 w = 10;
1807 }
mistachkinaae280e2015-12-31 19:06:24 +00001808 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +00001809 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +00001810 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +00001811 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00001812 }
drh75897232000-05-29 14:26:00 +00001813 }
1814 }
drh6a535342001-10-19 16:44:56 +00001815 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001816 for(i=0; i<nArg; i++){
1817 int w;
drha0c66f52000-07-29 13:20:21 +00001818 if( i<ArraySize(p->actualWidth) ){
1819 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00001820 }else{
1821 w = 10;
1822 }
drh700c2522016-02-09 18:39:25 +00001823 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +00001824 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00001825 }
dana98bf362013-11-13 18:35:01 +00001826 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +00001827 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +00001828 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +00001829 }
danc4650bb2013-11-18 08:41:06 +00001830 p->iIndent++;
dana98bf362013-11-13 18:35:01 +00001831 }
drh078b1fd2012-09-21 13:40:02 +00001832 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001833 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +00001834 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001835 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001836 }else{
drhe05461c2015-12-30 13:36:57 +00001837 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +00001838 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001839 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001840 }
drh75897232000-05-29 14:26:00 +00001841 }
1842 break;
1843 }
drh4926fec2016-04-13 15:33:42 +00001844 case MODE_Semi: { /* .schema and .fullschema output */
drh79f20e92016-12-13 23:22:39 +00001845 printSchemaLine(p->out, azArg[0], ";\n");
drh4926fec2016-04-13 15:33:42 +00001846 break;
1847 }
1848 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1849 char *z;
drh07d683f2016-04-13 21:00:36 +00001850 int j;
drh4926fec2016-04-13 15:33:42 +00001851 int nParen = 0;
1852 char cEnd = 0;
1853 char c;
1854 int nLine = 0;
1855 assert( nArg==1 );
1856 if( azArg[0]==0 ) break;
1857 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1858 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1859 ){
1860 utf8_printf(p->out, "%s;\n", azArg[0]);
1861 break;
1862 }
1863 z = sqlite3_mprintf("%s", azArg[0]);
1864 j = 0;
1865 for(i=0; IsSpace(z[i]); i++){}
1866 for(; (c = z[i])!=0; i++){
1867 if( IsSpace(c) ){
1868 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1869 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1870 j--;
1871 }
1872 z[j++] = c;
1873 }
1874 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1875 z[j] = 0;
1876 if( strlen30(z)>=79 ){
drh07d683f2016-04-13 21:00:36 +00001877 for(i=j=0; (c = z[i])!=0; i++){
drh4926fec2016-04-13 15:33:42 +00001878 if( c==cEnd ){
1879 cEnd = 0;
1880 }else if( c=='"' || c=='\'' || c=='`' ){
1881 cEnd = c;
1882 }else if( c=='[' ){
1883 cEnd = ']';
1884 }else if( c=='(' ){
1885 nParen++;
1886 }else if( c==')' ){
1887 nParen--;
1888 if( nLine>0 && nParen==0 && j>0 ){
drh79f20e92016-12-13 23:22:39 +00001889 printSchemaLineN(p->out, z, j, "\n");
drh4926fec2016-04-13 15:33:42 +00001890 j = 0;
1891 }
1892 }
1893 z[j++] = c;
1894 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1895 if( c=='\n' ) j--;
drh79f20e92016-12-13 23:22:39 +00001896 printSchemaLineN(p->out, z, j, "\n ");
drh4926fec2016-04-13 15:33:42 +00001897 j = 0;
1898 nLine++;
1899 while( IsSpace(z[i+1]) ){ i++; }
1900 }
1901 }
1902 z[j] = 0;
1903 }
drh79f20e92016-12-13 23:22:39 +00001904 printSchemaLine(p->out, z, ";\n");
drh4926fec2016-04-13 15:33:42 +00001905 sqlite3_free(z);
1906 break;
1907 }
drh75897232000-05-29 14:26:00 +00001908 case MODE_List: {
1909 if( p->cnt++==0 && p->showHeader ){
1910 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001911 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00001912 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00001913 }
1914 }
drh6a535342001-10-19 16:44:56 +00001915 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001916 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001917 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00001918 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00001919 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001920 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00001921 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +00001922 }else{
drhe05461c2015-12-30 13:36:57 +00001923 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001924 }
drh75897232000-05-29 14:26:00 +00001925 }
1926 break;
1927 }
drh1e5d0e92000-05-31 23:33:17 +00001928 case MODE_Html: {
1929 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001930 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001931 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001932 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001933 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001934 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001935 }
mistachkinaae280e2015-12-31 19:06:24 +00001936 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001937 }
drh6a535342001-10-19 16:44:56 +00001938 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001939 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001940 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001941 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001942 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001943 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001944 }
mistachkinaae280e2015-12-31 19:06:24 +00001945 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001946 break;
1947 }
drhfeac5f82004-08-01 00:10:45 +00001948 case MODE_Tcl: {
1949 if( p->cnt++==0 && p->showHeader ){
1950 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001951 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001952 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001953 }
drhe05461c2015-12-30 13:36:57 +00001954 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001955 }
1956 if( azArg==0 ) break;
1957 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001958 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001959 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001960 }
drhe05461c2015-12-30 13:36:57 +00001961 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001962 break;
1963 }
drh8e64d1c2004-10-07 00:32:39 +00001964 case MODE_Csv: {
mistachkin1fe36bb2016-04-04 02:16:44 +00001965 setBinaryMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001966 if( p->cnt++==0 && p->showHeader ){
1967 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001968 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001969 }
drhe05461c2015-12-30 13:36:57 +00001970 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001971 }
drh40253262014-10-17 21:35:05 +00001972 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001973 for(i=0; i<nArg; i++){
1974 output_csv(p, azArg[i], i<nArg-1);
1975 }
drhe05461c2015-12-30 13:36:57 +00001976 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001977 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001978 setTextMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001979 break;
1980 }
drh41f5f6e2016-10-21 17:39:30 +00001981 case MODE_Quote:
drh28bd4bc2000-06-15 15:57:22 +00001982 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00001983 if( azArg==0 ) break;
drh41f5f6e2016-10-21 17:39:30 +00001984 if( p->cMode==MODE_Insert ){
1985 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
1986 if( p->showHeader ){
1987 raw_printf(p->out,"(");
1988 for(i=0; i<nArg; i++){
1989 char *zSep = i>0 ? ",": "";
1990 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
1991 }
1992 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00001993 }
drh41f5f6e2016-10-21 17:39:30 +00001994 raw_printf(p->out," VALUES(");
drh59ce2c42016-11-03 13:12:28 +00001995 }else if( p->cnt==0 && p->showHeader ){
1996 for(i=0; i<nArg; i++){
mistachkin2f9a6132016-11-11 05:19:45 +00001997 if( i>0 ) raw_printf(p->out, ",");
drh59ce2c42016-11-03 13:12:28 +00001998 output_quoted_string(p->out, azCol[i]);
1999 }
mistachkin2f9a6132016-11-11 05:19:45 +00002000 raw_printf(p->out,"\n");
mistachkin151c75a2015-04-07 21:16:40 +00002001 }
drh59ce2c42016-11-03 13:12:28 +00002002 p->cnt++;
drh28bd4bc2000-06-15 15:57:22 +00002003 for(i=0; i<nArg; i++){
2004 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00002005 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00002006 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00002007 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00002008 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00002009 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00002010 }else if( aiType && (aiType[i]==SQLITE_INTEGER
2011 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00002012 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00002013 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2014 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2015 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00002016 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00002017 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00002018 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00002019 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00002020 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002021 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00002022 output_quoted_string(p->out, azArg[i]);
2023 }
2024 }
drh41f5f6e2016-10-21 17:39:30 +00002025 raw_printf(p->out,p->cMode==MODE_Quote?"\n":");\n");
drh6a535342001-10-19 16:44:56 +00002026 break;
drh28bd4bc2000-06-15 15:57:22 +00002027 }
mistachkin636bf9f2014-07-19 20:15:16 +00002028 case MODE_Ascii: {
2029 if( p->cnt++==0 && p->showHeader ){
2030 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002031 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2032 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00002033 }
drhe05461c2015-12-30 13:36:57 +00002034 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002035 }
2036 if( azArg==0 ) break;
2037 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002038 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2039 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00002040 }
drhe05461c2015-12-30 13:36:57 +00002041 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002042 break;
2043 }
persicom1d0b8722002-04-18 02:53:04 +00002044 }
drh75897232000-05-29 14:26:00 +00002045 return 0;
2046}
2047
2048/*
shane626a6e42009-10-22 17:30:15 +00002049** This is the callback routine that the SQLite library
2050** invokes for each row of a query result.
2051*/
2052static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2053 /* since we don't have type info, call the shell_callback with a NULL value */
2054 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2055}
2056
drhfb546af2017-03-09 22:00:33 +00002057/*
2058** This is the callback routine from sqlite3_exec() that appends all
2059** output onto the end of a ShellText object.
2060*/
2061static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2062 ShellText *p = (ShellText*)pArg;
2063 int i;
2064 if( p->n ) appendText(p, "|", 0);
2065 for(i=0; i<nArg; i++){
2066 if( i ) appendText(p, ",", 0);
2067 if( azArg[i] ) appendText(p, azArg[i], 0);
2068 }
2069 return 0;
2070}
2071
2072/*
2073** Generate an appropriate SELFTEST table in the main database.
2074*/
2075static void createSelftestTable(ShellState *p){
drhf157d102017-03-10 01:05:38 +00002076 char *zErrMsg = 0;
drhfb546af2017-03-09 22:00:33 +00002077 sqlite3_exec(p->db,
drhf157d102017-03-10 01:05:38 +00002078 "SAVEPOINT selftest_init;\n"
2079 "CREATE TABLE IF NOT EXISTS selftest(\n"
drhfb546af2017-03-09 22:00:33 +00002080 " tno INTEGER PRIMARY KEY,\n" /* Test number */
2081 " op TEXT,\n" /* Operator: memo run */
2082 " cmd TEXT,\n" /* Command text */
2083 " ans TEXT\n" /* Desired answer */
2084 ");"
drhf157d102017-03-10 01:05:38 +00002085 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2086 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2087 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2088 " 'memo','Tests generated by --init');\n"
2089 "INSERT INTO [_shell$self]\n"
2090 " SELECT 'run',\n"
2091 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2092 "FROM sqlite_master ORDER BY 2'',224))',\n"
2093 " hex(sha3_query('SELECT type,name,tbl_name,sql "
2094 "FROM sqlite_master ORDER BY 2',224));\n"
2095 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00002096 " SELECT 'run',"
2097 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2098 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2099 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2100 " FROM (\n"
2101 " SELECT name FROM sqlite_master\n"
2102 " WHERE type='table'\n"
2103 " AND name<>'selftest'\n"
2104 " AND coalesce(rootpage,0)>0\n"
2105 " )\n"
2106 " ORDER BY name;\n"
drhf157d102017-03-10 01:05:38 +00002107 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00002108 " VALUES('run','PRAGMA integrity_check','ok');\n"
drhf157d102017-03-10 01:05:38 +00002109 "INSERT INTO selftest(tno,op,cmd,ans)"
2110 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2111 "DROP TABLE [_shell$self];"
2112 ,0,0,&zErrMsg);
2113 if( zErrMsg ){
2114 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2115 sqlite3_free(zErrMsg);
2116 }
2117 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
drhfb546af2017-03-09 22:00:33 +00002118}
2119
drhf42d3182017-03-08 12:25:18 +00002120
shane626a6e42009-10-22 17:30:15 +00002121/*
drhdcd87a92014-08-18 13:45:42 +00002122** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00002123** the name of the table given. Escape any quote characters in the
2124** table name.
2125*/
drhdcd87a92014-08-18 13:45:42 +00002126static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00002127 int i, n;
drhf42d3182017-03-08 12:25:18 +00002128 int cQuote;
drh33048c02001-10-01 14:29:22 +00002129 char *z;
2130
2131 if( p->zDestTable ){
2132 free(p->zDestTable);
2133 p->zDestTable = 0;
2134 }
2135 if( zName==0 ) return;
drhf42d3182017-03-08 12:25:18 +00002136 cQuote = quoteChar(zName);
2137 n = strlen30(zName);
2138 if( cQuote ) n += 2;
drh33048c02001-10-01 14:29:22 +00002139 z = p->zDestTable = malloc( n+1 );
2140 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002141 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00002142 exit(1);
2143 }
2144 n = 0;
drhf42d3182017-03-08 12:25:18 +00002145 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002146 for(i=0; zName[i]; i++){
2147 z[n++] = zName[i];
drhf42d3182017-03-08 12:25:18 +00002148 if( zName[i]==cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002149 }
drhf42d3182017-03-08 12:25:18 +00002150 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002151 z[n] = 0;
2152}
2153
drhdd3d4592004-08-30 01:54:05 +00002154
2155/*
drhb21a8e42012-01-28 21:08:51 +00002156** Execute a query statement that will generate SQL output. Print
2157** the result columns, comma-separated, on a line and then add a
2158** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00002159**
drhb21a8e42012-01-28 21:08:51 +00002160** If the number of columns is 1 and that column contains text "--"
mistachkin1fe36bb2016-04-04 02:16:44 +00002161** then write the semicolon on a separate line. That way, if a
drhb21a8e42012-01-28 21:08:51 +00002162** "--" comment occurs at the end of the statement, the comment
2163** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00002164*/
drh157e29a2009-05-21 15:15:00 +00002165static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00002166 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00002167 const char *zSelect, /* SELECT statement to extract content */
2168 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00002169){
drhdd3d4592004-08-30 01:54:05 +00002170 sqlite3_stmt *pSelect;
2171 int rc;
drhb21a8e42012-01-28 21:08:51 +00002172 int nResult;
2173 int i;
2174 const char *z;
drhc7181902014-02-27 15:04:13 +00002175 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00002176 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00002177 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2178 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002179 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00002180 return rc;
2181 }
2182 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00002183 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00002184 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00002185 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00002186 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00002187 zFirstRow = 0;
2188 }
drhb21a8e42012-01-28 21:08:51 +00002189 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00002190 utf8_printf(p->out, "%s", z);
mistachkin1fe36bb2016-04-04 02:16:44 +00002191 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00002192 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00002193 }
2194 if( z==0 ) z = "";
2195 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2196 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00002197 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00002198 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002199 raw_printf(p->out, ";\n");
mistachkin1fe36bb2016-04-04 02:16:44 +00002200 }
drhdd3d4592004-08-30 01:54:05 +00002201 rc = sqlite3_step(pSelect);
2202 }
drh2f464a02011-10-13 00:41:49 +00002203 rc = sqlite3_finalize(pSelect);
2204 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002205 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2206 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002207 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00002208 }
2209 return rc;
drhdd3d4592004-08-30 01:54:05 +00002210}
2211
shane626a6e42009-10-22 17:30:15 +00002212/*
2213** Allocate space and save off current error string.
2214*/
2215static char *save_err_msg(
2216 sqlite3 *db /* Database to query */
2217){
2218 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00002219 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00002220 if( zErrMsg ){
2221 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2222 }
2223 return zErrMsg;
2224}
2225
drh34784902016-02-27 17:12:36 +00002226#ifdef __linux__
2227/*
2228** Attempt to display I/O stats on Linux using /proc/PID/io
2229*/
2230static void displayLinuxIoStats(FILE *out){
2231 FILE *in;
2232 char z[200];
2233 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2234 in = fopen(z, "rb");
2235 if( in==0 ) return;
2236 while( fgets(z, sizeof(z), in)!=0 ){
2237 static const struct {
2238 const char *zPattern;
2239 const char *zDesc;
2240 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00002241 { "rchar: ", "Bytes received by read():" },
2242 { "wchar: ", "Bytes sent to write():" },
2243 { "syscr: ", "Read() system calls:" },
2244 { "syscw: ", "Write() system calls:" },
2245 { "read_bytes: ", "Bytes read from storage:" },
2246 { "write_bytes: ", "Bytes written to storage:" },
2247 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00002248 };
2249 int i;
2250 for(i=0; i<ArraySize(aTrans); i++){
2251 int n = (int)strlen(aTrans[i].zPattern);
2252 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00002253 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
drh34784902016-02-27 17:12:36 +00002254 break;
2255 }
2256 }
2257 }
2258 fclose(in);
mistachkin1fe36bb2016-04-04 02:16:44 +00002259}
drh34784902016-02-27 17:12:36 +00002260#endif
2261
drha2df53b2017-03-10 14:36:10 +00002262/*
2263** Display a single line of status using 64-bit values.
2264*/
2265static void displayStatLine(
2266 ShellState *p, /* The shell context */
2267 char *zLabel, /* Label for this one line */
2268 char *zFormat, /* Format for the result */
2269 int iStatusCtrl, /* Which status to display */
2270 int bReset /* True to reset the stats */
2271){
2272 sqlite3_int64 iCur = -1;
2273 sqlite3_int64 iHiwtr = -1;
2274 int i, nPercent;
2275 char zLine[200];
2276 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2277 for(i=0, nPercent=0; zFormat[i]; i++){
2278 if( zFormat[i]=='%' ) nPercent++;
2279 }
2280 if( nPercent>1 ){
2281 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2282 }else{
2283 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2284 }
2285 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2286}
drh34784902016-02-27 17:12:36 +00002287
shane626a6e42009-10-22 17:30:15 +00002288/*
shaneh642d8b82010-07-28 16:05:34 +00002289** Display memory stats.
2290*/
2291static int display_stats(
2292 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00002293 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00002294 int bReset /* True to reset the stats */
2295){
2296 int iCur;
2297 int iHiwtr;
2298
2299 if( pArg && pArg->out ){
drha2df53b2017-03-10 14:36:10 +00002300 displayStatLine(pArg, "Memory Used:",
2301 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2302 displayStatLine(pArg, "Number of Outstanding Allocations:",
2303 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
drh44dec872014-08-30 15:49:25 +00002304 if( pArg->shellFlgs & SHFLG_Pagecache ){
drha2df53b2017-03-10 14:36:10 +00002305 displayStatLine(pArg, "Number of Pcache Pages Used:",
2306 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
drh44dec872014-08-30 15:49:25 +00002307 }
drha2df53b2017-03-10 14:36:10 +00002308 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2309 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
drh44dec872014-08-30 15:49:25 +00002310 if( pArg->shellFlgs & SHFLG_Scratch ){
drha2df53b2017-03-10 14:36:10 +00002311 displayStatLine(pArg, "Number of Scratch Allocations Used:",
2312 "%lld (max %lld)", SQLITE_STATUS_SCRATCH_USED, bReset);
drh44dec872014-08-30 15:49:25 +00002313 }
drha2df53b2017-03-10 14:36:10 +00002314 displayStatLine(pArg, "Number of Scratch Overflow Bytes:",
2315 "%lld (max %lld) bytes", SQLITE_STATUS_SCRATCH_OVERFLOW, bReset);
2316 displayStatLine(pArg, "Largest Allocation:",
2317 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2318 displayStatLine(pArg, "Largest Pcache Allocation:",
2319 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2320 displayStatLine(pArg, "Largest Scratch Allocation:",
2321 "%lld bytes", SQLITE_STATUS_SCRATCH_SIZE, bReset);
shaneh642d8b82010-07-28 16:05:34 +00002322#ifdef YYTRACKMAXSTACKDEPTH
drha2df53b2017-03-10 14:36:10 +00002323 displayStatLine(pArg, "Deepest Parser Stack:",
2324 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
shaneh642d8b82010-07-28 16:05:34 +00002325#endif
2326 }
2327
2328 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00002329 if( pArg->shellFlgs & SHFLG_Lookaside ){
2330 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00002331 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2332 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002333 raw_printf(pArg->out,
2334 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002335 iCur, iHiwtr);
2336 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2337 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002338 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2339 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002340 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2341 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002342 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2343 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002344 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2345 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002346 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2347 iHiwtr);
drh44dec872014-08-30 15:49:25 +00002348 }
shaneh642d8b82010-07-28 16:05:34 +00002349 iHiwtr = iCur = -1;
2350 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002351 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2352 iCur);
drh4ace5362014-11-10 14:42:28 +00002353 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00002354 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00002355 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00002356 iHiwtr = iCur = -1;
2357 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002358 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002359 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00002360 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002361 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00002362 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00002363 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002364 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002365 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002366 iHiwtr = iCur = -1;
2367 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002368 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002369 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002370 }
2371
2372 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00002373 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2374 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002375 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002376 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002377 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00002378 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002379 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00002380 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002381 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002382 }
2383
drh34784902016-02-27 17:12:36 +00002384#ifdef __linux__
2385 displayLinuxIoStats(pArg->out);
2386#endif
2387
dan5a790282015-08-07 20:06:14 +00002388 /* Do not remove this machine readable comment: extra-stats-output-here */
2389
shaneh642d8b82010-07-28 16:05:34 +00002390 return 0;
2391}
2392
2393/*
dan8d1edb92014-11-05 09:07:28 +00002394** Display scan stats.
2395*/
2396static void display_scanstats(
2397 sqlite3 *db, /* Database to query */
2398 ShellState *pArg /* Pointer to ShellState */
2399){
drhf5ed7ad2015-06-15 14:43:25 +00002400#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2401 UNUSED_PARAMETER(db);
2402 UNUSED_PARAMETER(pArg);
2403#else
drh15f23c22014-11-06 12:46:16 +00002404 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00002405 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00002406 mx = 0;
2407 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00002408 double rEstLoop = 1.0;
2409 for(i=n=0; 1; i++){
2410 sqlite3_stmt *p = pArg->pStmt;
2411 sqlite3_int64 nLoop, nVisit;
2412 double rEst;
2413 int iSid;
2414 const char *zExplain;
2415 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2416 break;
2417 }
2418 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00002419 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00002420 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00002421 if( n==0 ){
2422 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00002423 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00002424 }
drh42f30bc2014-11-06 12:08:21 +00002425 n++;
2426 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2427 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2428 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00002429 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00002430 rEstLoop *= rEst;
mistachkin1fe36bb2016-04-04 02:16:44 +00002431 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002432 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00002433 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00002434 );
dan8d1edb92014-11-05 09:07:28 +00002435 }
dan8d1edb92014-11-05 09:07:28 +00002436 }
mistachkinaae280e2015-12-31 19:06:24 +00002437 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00002438#endif
dan8d1edb92014-11-05 09:07:28 +00002439}
2440
2441/*
dana98bf362013-11-13 18:35:01 +00002442** Parameter azArray points to a zero-terminated array of strings. zStr
2443** points to a single nul-terminated string. Return non-zero if zStr
2444** is equal, according to strcmp(), to any of the strings in the array.
2445** Otherwise, return zero.
2446*/
2447static int str_in_array(const char *zStr, const char **azArray){
2448 int i;
2449 for(i=0; azArray[i]; i++){
2450 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2451 }
2452 return 0;
2453}
2454
2455/*
2456** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00002457** and populate the ShellState.aiIndent[] array with the number of
mistachkin1fe36bb2016-04-04 02:16:44 +00002458** spaces each opcode should be indented before it is output.
dana98bf362013-11-13 18:35:01 +00002459**
2460** The indenting rules are:
2461**
2462** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2463** all opcodes that occur between the p2 jump destination and the opcode
2464** itself by 2 spaces.
2465**
drh01752bc2013-11-14 23:59:33 +00002466** * For each "Goto", if the jump destination is earlier in the program
2467** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00002468** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00002469** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00002470** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00002471** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00002472*/
drhdcd87a92014-08-18 13:45:42 +00002473static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00002474 const char *zSql; /* The text of the SQL statement */
2475 const char *z; /* Used to check if this is an EXPLAIN */
2476 int *abYield = 0; /* True if op is an OP_Yield */
2477 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00002478 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00002479
drh8ad0de32014-03-20 18:45:27 +00002480 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2481 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00002482 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2483 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00002484 const char *azGoto[] = { "Goto", 0 };
2485
2486 /* Try to figure out if this is really an EXPLAIN statement. If this
2487 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00002488 if( sqlite3_column_count(pSql)!=8 ){
2489 p->cMode = p->mode;
2490 return;
2491 }
dana98bf362013-11-13 18:35:01 +00002492 zSql = sqlite3_sql(pSql);
2493 if( zSql==0 ) return;
2494 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00002495 if( sqlite3_strnicmp(z, "explain", 7) ){
2496 p->cMode = p->mode;
2497 return;
2498 }
dana98bf362013-11-13 18:35:01 +00002499
2500 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2501 int i;
danc4650bb2013-11-18 08:41:06 +00002502 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00002503 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00002504
2505 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2506 ** p2 is an instruction address, set variable p2op to the index of that
2507 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2508 ** the current instruction is part of a sub-program generated by an
2509 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00002510 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00002511 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00002512
2513 /* Grow the p->aiIndent array as required */
2514 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00002515 if( iOp==0 ){
2516 /* Do further verfication that this is explain output. Abort if
2517 ** it is not */
2518 static const char *explainCols[] = {
2519 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2520 int jj;
2521 for(jj=0; jj<ArraySize(explainCols); jj++){
2522 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2523 p->cMode = p->mode;
2524 sqlite3_reset(pSql);
2525 return;
2526 }
2527 }
2528 }
dana98bf362013-11-13 18:35:01 +00002529 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00002530 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2531 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00002532 }
2533 abYield[iOp] = str_in_array(zOp, azYield);
2534 p->aiIndent[iOp] = 0;
2535 p->nIndent = iOp+1;
2536
2537 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00002538 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002539 }
drhfe705102014-03-06 13:38:37 +00002540 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2541 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2542 ){
drheacd29d2016-04-15 15:03:27 +00002543 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002544 }
2545 }
2546
danc4650bb2013-11-18 08:41:06 +00002547 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002548 sqlite3_free(abYield);
2549 sqlite3_reset(pSql);
2550}
2551
2552/*
2553** Free the array allocated by explain_data_prepare().
2554*/
drhdcd87a92014-08-18 13:45:42 +00002555static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00002556 sqlite3_free(p->aiIndent);
2557 p->aiIndent = 0;
2558 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00002559 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002560}
2561
2562/*
drheacd29d2016-04-15 15:03:27 +00002563** Disable and restore .wheretrace and .selecttrace settings.
2564*/
2565#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2566extern int sqlite3SelectTrace;
2567static int savedSelectTrace;
2568#endif
2569#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2570extern int sqlite3WhereTrace;
2571static int savedWhereTrace;
2572#endif
2573static void disable_debug_trace_modes(void){
2574#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2575 savedSelectTrace = sqlite3SelectTrace;
2576 sqlite3SelectTrace = 0;
2577#endif
2578#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2579 savedWhereTrace = sqlite3WhereTrace;
2580 sqlite3WhereTrace = 0;
2581#endif
2582}
2583static void restore_debug_trace_modes(void){
2584#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2585 sqlite3SelectTrace = savedSelectTrace;
2586#endif
2587#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2588 sqlite3WhereTrace = savedWhereTrace;
2589#endif
2590}
2591
2592/*
2593** Run a prepared statement
2594*/
2595static void exec_prepared_stmt(
2596 ShellState *pArg, /* Pointer to ShellState */
2597 sqlite3_stmt *pStmt, /* Statment to run */
2598 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
2599){
2600 int rc;
2601
2602 /* perform the first step. this will tell us if we
2603 ** have a result set or not and how wide it is.
2604 */
2605 rc = sqlite3_step(pStmt);
2606 /* if we have a result set... */
2607 if( SQLITE_ROW == rc ){
2608 /* if we have a callback... */
2609 if( xCallback ){
2610 /* allocate space for col name ptr, value ptr, and type */
2611 int nCol = sqlite3_column_count(pStmt);
2612 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2613 if( !pData ){
2614 rc = SQLITE_NOMEM;
2615 }else{
2616 char **azCols = (char **)pData; /* Names of result columns */
2617 char **azVals = &azCols[nCol]; /* Results */
2618 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2619 int i, x;
2620 assert(sizeof(int) <= sizeof(char *));
2621 /* save off ptrs to column names */
2622 for(i=0; i<nCol; i++){
2623 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2624 }
2625 do{
2626 /* extract the data and data types */
2627 for(i=0; i<nCol; i++){
2628 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2629 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2630 azVals[i] = "";
2631 }else{
2632 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2633 }
2634 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2635 rc = SQLITE_NOMEM;
2636 break; /* from for */
2637 }
2638 } /* end for */
2639
2640 /* if data and types extracted successfully... */
2641 if( SQLITE_ROW == rc ){
2642 /* call the supplied callback with the result row data */
2643 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
2644 rc = SQLITE_ABORT;
2645 }else{
2646 rc = sqlite3_step(pStmt);
2647 }
2648 }
2649 } while( SQLITE_ROW == rc );
2650 sqlite3_free(pData);
2651 }
2652 }else{
2653 do{
2654 rc = sqlite3_step(pStmt);
2655 } while( rc == SQLITE_ROW );
2656 }
2657 }
2658}
2659
2660/*
mistachkin1fe36bb2016-04-04 02:16:44 +00002661** Execute a statement or set of statements. Print
2662** any result rows/columns depending on the current mode
shane626a6e42009-10-22 17:30:15 +00002663** set via the supplied callback.
2664**
mistachkin1fe36bb2016-04-04 02:16:44 +00002665** This is very similar to SQLite's built-in sqlite3_exec()
2666** function except it takes a slightly different callback
shane626a6e42009-10-22 17:30:15 +00002667** and callback data argument.
2668*/
2669static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00002670 sqlite3 *db, /* An open database */
2671 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00002672 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00002673 /* (not the same as sqlite3_exec) */
2674 ShellState *pArg, /* Pointer to ShellState */
2675 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00002676){
dan4564ced2010-01-05 04:59:56 +00002677 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2678 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00002679 int rc2;
dan4564ced2010-01-05 04:59:56 +00002680 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00002681
2682 if( pzErrMsg ){
2683 *pzErrMsg = NULL;
2684 }
2685
shaneb9fc17d2009-10-22 21:23:35 +00002686 while( zSql[0] && (SQLITE_OK == rc) ){
drheacd29d2016-04-15 15:03:27 +00002687 static const char *zStmtSql;
shaneb9fc17d2009-10-22 21:23:35 +00002688 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2689 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00002690 if( pzErrMsg ){
2691 *pzErrMsg = save_err_msg(db);
2692 }
2693 }else{
shaneb9fc17d2009-10-22 21:23:35 +00002694 if( !pStmt ){
2695 /* this happens for a comment or white-space */
2696 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002697 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00002698 continue;
2699 }
drheacd29d2016-04-15 15:03:27 +00002700 zStmtSql = sqlite3_sql(pStmt);
drh60275612016-11-03 02:25:30 +00002701 if( zStmtSql==0 ) zStmtSql = "";
drheacd29d2016-04-15 15:03:27 +00002702 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
shane626a6e42009-10-22 17:30:15 +00002703
shaneh642d8b82010-07-28 16:05:34 +00002704 /* save off the prepared statment handle and reset row count */
2705 if( pArg ){
2706 pArg->pStmt = pStmt;
2707 pArg->cnt = 0;
2708 }
2709
shanehb7977c52010-01-18 18:17:10 +00002710 /* echo the sql statement if echo on */
drhe6e1d122017-03-09 13:50:49 +00002711 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
drhe05461c2015-12-30 13:36:57 +00002712 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00002713 }
shanehb7977c52010-01-18 18:17:10 +00002714
drhefbf3b12014-02-28 20:47:24 +00002715 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
drheacd29d2016-04-15 15:03:27 +00002716 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
drhefbf3b12014-02-28 20:47:24 +00002717 sqlite3_stmt *pExplain;
drheacd29d2016-04-15 15:03:27 +00002718 char *zEQP;
2719 disable_debug_trace_modes();
2720 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
drhefbf3b12014-02-28 20:47:24 +00002721 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2722 if( rc==SQLITE_OK ){
2723 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00002724 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
2725 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
2726 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00002727 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00002728 }
2729 }
2730 sqlite3_finalize(pExplain);
2731 sqlite3_free(zEQP);
drheacd29d2016-04-15 15:03:27 +00002732 if( pArg->autoEQP>=2 ){
2733 /* Also do an EXPLAIN for ".eqp full" mode */
2734 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2735 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2736 if( rc==SQLITE_OK ){
2737 pArg->cMode = MODE_Explain;
2738 explain_data_prepare(pArg, pExplain);
2739 exec_prepared_stmt(pArg, pExplain, xCallback);
2740 explain_data_delete(pArg);
2741 }
2742 sqlite3_finalize(pExplain);
2743 sqlite3_free(zEQP);
2744 }
2745 restore_debug_trace_modes();
drhefbf3b12014-02-28 20:47:24 +00002746 }
2747
drh700c2522016-02-09 18:39:25 +00002748 if( pArg ){
2749 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00002750 if( pArg->autoExplain
2751 && sqlite3_column_count(pStmt)==8
drheacd29d2016-04-15 15:03:27 +00002752 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
drh700c2522016-02-09 18:39:25 +00002753 ){
2754 pArg->cMode = MODE_Explain;
2755 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002756
drh700c2522016-02-09 18:39:25 +00002757 /* If the shell is currently in ".explain" mode, gather the extra
2758 ** data required to add indents to the output.*/
2759 if( pArg->cMode==MODE_Explain ){
2760 explain_data_prepare(pArg, pStmt);
2761 }
dana98bf362013-11-13 18:35:01 +00002762 }
2763
drheacd29d2016-04-15 15:03:27 +00002764 exec_prepared_stmt(pArg, pStmt, xCallback);
dana98bf362013-11-13 18:35:01 +00002765 explain_data_delete(pArg);
2766
shaneh642d8b82010-07-28 16:05:34 +00002767 /* print usage stats if stats on */
2768 if( pArg && pArg->statsOn ){
2769 display_stats(db, pArg, 0);
2770 }
2771
dan8d1edb92014-11-05 09:07:28 +00002772 /* print loop-counters if required */
2773 if( pArg && pArg->scanstatsOn ){
2774 display_scanstats(db, pArg);
2775 }
2776
mistachkin1fe36bb2016-04-04 02:16:44 +00002777 /* Finalize the statement just executed. If this fails, save a
dan4564ced2010-01-05 04:59:56 +00002778 ** copy of the error message. Otherwise, set zSql to point to the
2779 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00002780 rc2 = sqlite3_finalize(pStmt);
2781 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00002782 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00002783 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002784 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00002785 }else if( pzErrMsg ){
2786 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00002787 }
shaneh642d8b82010-07-28 16:05:34 +00002788
2789 /* clear saved stmt handle */
2790 if( pArg ){
2791 pArg->pStmt = NULL;
2792 }
shane626a6e42009-10-22 17:30:15 +00002793 }
shaneb9fc17d2009-10-22 21:23:35 +00002794 } /* end while */
shane626a6e42009-10-22 17:30:15 +00002795
2796 return rc;
2797}
2798
drhe611f142017-03-08 11:44:00 +00002799/*
2800** Release memory previously allocated by tableColumnList().
2801*/
2802static void freeColumnList(char **azCol){
2803 int i;
2804 for(i=1; azCol[i]; i++){
2805 sqlite3_free(azCol[i]);
2806 }
2807 /* azCol[0] is a static string */
2808 sqlite3_free(azCol);
2809}
2810
2811/*
2812** Return a list of pointers to strings which are the names of all
2813** columns in table zTab. The memory to hold the names is dynamically
2814** allocated and must be released by the caller using a subsequent call
2815** to freeColumnList().
2816**
2817** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
2818** value that needs to be preserved, then azCol[0] is filled in with the
2819** name of the rowid column.
2820**
2821** The first regular column in the table is azCol[1]. The list is terminated
2822** by an entry with azCol[i]==0.
2823*/
2824static char **tableColumnList(ShellState *p, const char *zTab){
2825 char **azCol = 0;
2826 sqlite3_stmt *pStmt;
2827 char *zSql;
2828 int nCol = 0;
2829 int nAlloc = 0;
2830 int nPK = 0; /* Number of PRIMARY KEY columns seen */
2831 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
drhe6e1d122017-03-09 13:50:49 +00002832 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00002833 int rc;
2834
2835 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
2836 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2837 sqlite3_free(zSql);
2838 if( rc ) return 0;
2839 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2840 if( nCol>=nAlloc-2 ){
2841 nAlloc = nAlloc*2 + nCol + 10;
2842 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
2843 if( azCol==0 ){
2844 raw_printf(stderr, "Error: out of memory\n");
2845 exit(1);
2846 }
2847 }
2848 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
2849 if( sqlite3_column_int(pStmt, 5) ){
2850 nPK++;
2851 if( nPK==1
2852 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
2853 "INTEGER")==0
2854 ){
2855 isIPK = 1;
2856 }else{
2857 isIPK = 0;
2858 }
2859 }
2860 }
2861 sqlite3_finalize(pStmt);
2862 azCol[0] = 0;
2863 azCol[nCol+1] = 0;
2864
2865 /* The decision of whether or not a rowid really needs to be preserved
2866 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
2867 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
2868 ** rowids on tables where the rowid is inaccessible because there are other
2869 ** columns in the table named "rowid", "_rowid_", and "oid".
2870 */
2871 if( preserveRowid && isIPK ){
2872 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
2873 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
2874 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
2875 ** ROWID aliases. To distinguish these cases, check to see if
2876 ** there is a "pk" entry in "PRAGMA index_list". There will be
2877 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
2878 */
2879 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
2880 " WHERE origin='pk'", zTab);
2881 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2882 sqlite3_free(zSql);
2883 if( rc ){
2884 freeColumnList(azCol);
2885 return 0;
2886 }
2887 rc = sqlite3_step(pStmt);
2888 sqlite3_finalize(pStmt);
2889 preserveRowid = rc==SQLITE_ROW;
2890 }
2891 if( preserveRowid ){
2892 /* Only preserve the rowid if we can find a name to use for the
2893 ** rowid */
2894 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
2895 int i, j;
2896 for(j=0; j<3; j++){
2897 for(i=1; i<=nCol; i++){
2898 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
2899 }
2900 if( i>nCol ){
2901 /* At this point, we know that azRowid[j] is not the name of any
2902 ** ordinary column in the table. Verify that azRowid[j] is a valid
2903 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
2904 ** tables will fail this last check */
2905 int rc;
2906 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
2907 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
2908 break;
2909 }
2910 }
2911 }
2912 return azCol;
2913}
2914
drh33048c02001-10-01 14:29:22 +00002915/*
drhf8563c02017-03-09 18:13:52 +00002916** Toggle the reverse_unordered_selects setting.
2917*/
2918static void toggleSelectOrder(sqlite3 *db){
2919 sqlite3_stmt *pStmt = 0;
2920 int iSetting = 0;
2921 char zStmt[100];
2922 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
2923 if( sqlite3_step(pStmt)==SQLITE_ROW ){
2924 iSetting = sqlite3_column_int(pStmt, 0);
2925 }
2926 sqlite3_finalize(pStmt);
2927 sqlite3_snprintf(sizeof(zStmt), zStmt,
2928 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
2929 sqlite3_exec(db, zStmt, 0, 0, 0);
2930}
2931
2932/*
drh4c653a02000-06-07 01:27:47 +00002933** This is a different callback routine used for dumping the database.
2934** Each row received by this callback consists of a table name,
2935** the table type ("index" or "table") and SQL to create the table.
2936** This routine should print text sufficient to recreate the table.
2937*/
2938static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00002939 int rc;
2940 const char *zTable;
2941 const char *zType;
2942 const char *zSql;
drhdcd87a92014-08-18 13:45:42 +00002943 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00002944
drh902b9ee2008-12-05 17:17:07 +00002945 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00002946 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00002947 zTable = azArg[0];
2948 zType = azArg[1];
2949 zSql = azArg[2];
mistachkin1fe36bb2016-04-04 02:16:44 +00002950
drh00b950d2005-09-11 02:03:03 +00002951 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhe611f142017-03-08 11:44:00 +00002952 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
drh7ed10322013-08-07 16:04:27 +00002953 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002954 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00002955 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2956 return 0;
drh45e29d82006-11-20 16:21:10 +00002957 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2958 char *zIns;
2959 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00002960 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00002961 p->writableSchema = 1;
2962 }
2963 zIns = sqlite3_mprintf(
2964 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2965 "VALUES('table','%q','%q',0,'%q');",
2966 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00002967 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00002968 sqlite3_free(zIns);
2969 return 0;
drh00b950d2005-09-11 02:03:03 +00002970 }else{
drh79f20e92016-12-13 23:22:39 +00002971 printSchemaLine(p->out, zSql, ";\n");
drhf8eb96a2005-02-03 00:42:34 +00002972 }
danielk19772a02e332004-06-05 08:04:36 +00002973
2974 if( strcmp(zType, "table")==0 ){
drhf42d3182017-03-08 12:25:18 +00002975 ShellText sSelect;
2976 ShellText sTable;
drhe611f142017-03-08 11:44:00 +00002977 char **azCol;
2978 int i;
2979 char *savedDestTable;
2980 int savedMode;
mistachkin1fe36bb2016-04-04 02:16:44 +00002981
drhe611f142017-03-08 11:44:00 +00002982 azCol = tableColumnList(p, zTable);
2983 if( azCol==0 ){
2984 p->nErr++;
2985 return 0;
danielk19772a02e332004-06-05 08:04:36 +00002986 }
2987
drhbf92ec02012-03-22 12:50:34 +00002988 /* Always quote the table name, even if it appears to be pure ascii,
2989 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
drhf42d3182017-03-08 12:25:18 +00002990 initText(&sTable);
2991 appendText(&sTable, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00002992 /* If preserving the rowid, add a column list after the table name.
2993 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
2994 ** instead of the usual "INSERT INTO tab VALUES(...)".
2995 */
2996 if( azCol[0] ){
2997 appendText(&sTable, "(", 0);
2998 appendText(&sTable, azCol[0], 0);
2999 for(i=1; azCol[i]; i++){
3000 appendText(&sTable, ",", 0);
drhf42d3182017-03-08 12:25:18 +00003001 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
danielk19772a02e332004-06-05 08:04:36 +00003002 }
drhe611f142017-03-08 11:44:00 +00003003 appendText(&sTable, ")", 0);
danielk19772a02e332004-06-05 08:04:36 +00003004 }
danielk19772a02e332004-06-05 08:04:36 +00003005
drhe611f142017-03-08 11:44:00 +00003006 /* Build an appropriate SELECT statement */
drhf42d3182017-03-08 12:25:18 +00003007 initText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003008 appendText(&sSelect, "SELECT ", 0);
3009 if( azCol[0] ){
3010 appendText(&sSelect, azCol[0], 0);
3011 appendText(&sSelect, ",", 0);
drhdd3d4592004-08-30 01:54:05 +00003012 }
drhe611f142017-03-08 11:44:00 +00003013 for(i=1; azCol[i]; i++){
drhf42d3182017-03-08 12:25:18 +00003014 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
drhe611f142017-03-08 11:44:00 +00003015 if( azCol[i+1] ){
3016 appendText(&sSelect, ",", 0);
3017 }
3018 }
3019 freeColumnList(azCol);
3020 appendText(&sSelect, " FROM ", 0);
drhf42d3182017-03-08 12:25:18 +00003021 appendText(&sSelect, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00003022
3023 savedDestTable = p->zDestTable;
3024 savedMode = p->mode;
3025 p->zDestTable = sTable.z;
3026 p->mode = p->cMode = MODE_Insert;
3027 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
drhf8563c02017-03-09 18:13:52 +00003028 if( (rc&0xff)==SQLITE_CORRUPT ){
3029 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3030 toggleSelectOrder(p->db);
3031 shell_exec(p->db, sSelect.z, shell_callback, p, 0);
3032 toggleSelectOrder(p->db);
3033 }
drhe611f142017-03-08 11:44:00 +00003034 p->zDestTable = savedDestTable;
3035 p->mode = savedMode;
drhf42d3182017-03-08 12:25:18 +00003036 freeText(&sTable);
3037 freeText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003038 if( rc ) p->nErr++;
drh4c653a02000-06-07 01:27:47 +00003039 }
drh4c653a02000-06-07 01:27:47 +00003040 return 0;
3041}
3042
3043/*
drh45e29d82006-11-20 16:21:10 +00003044** Run zQuery. Use dump_callback() as the callback routine so that
3045** the contents of the query are output as SQL statements.
3046**
drhdd3d4592004-08-30 01:54:05 +00003047** If we get a SQLITE_CORRUPT error, rerun the query after appending
3048** "ORDER BY rowid DESC" to the end.
3049*/
3050static int run_schema_dump_query(
mistachkin1fe36bb2016-04-04 02:16:44 +00003051 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00003052 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00003053){
3054 int rc;
drh2f464a02011-10-13 00:41:49 +00003055 char *zErr = 0;
3056 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00003057 if( rc==SQLITE_CORRUPT ){
3058 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00003059 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00003060 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00003061 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00003062 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00003063 sqlite3_free(zErr);
3064 zErr = 0;
3065 }
drhdd3d4592004-08-30 01:54:05 +00003066 zQ2 = malloc( len+100 );
3067 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00003068 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00003069 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3070 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003071 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00003072 }else{
3073 rc = SQLITE_CORRUPT;
3074 }
3075 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00003076 free(zQ2);
3077 }
3078 return rc;
3079}
3080
3081/*
drh75897232000-05-29 14:26:00 +00003082** Text of a help message
3083*/
persicom1d0b8722002-04-18 02:53:04 +00003084static char zHelp[] =
drha0daa752016-09-16 11:53:10 +00003085#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00003086 ".auth ON|OFF Show authorizer callbacks\n"
drha0daa752016-09-16 11:53:10 +00003087#endif
drh9ff849f2009-02-04 20:55:57 +00003088 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00003089 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00003090 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00003091 ".changes on|off Show number of rows changed by SQL\n"
drh2db82112016-09-15 21:35:24 +00003092 ".check GLOB Fail if output since .testcase does not match\n"
drh4bbcf102014-02-06 02:46:08 +00003093 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00003094 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00003095 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00003096 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00003097 " If TABLE specified, only dump tables matching\n"
3098 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00003099 ".echo on|off Turn command echo on or off\n"
drheacd29d2016-04-15 15:03:27 +00003100 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00003101 ".exit Exit this program\n"
drh700c2522016-02-09 18:39:25 +00003102 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
drh4926fec2016-04-13 15:33:42 +00003103 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00003104 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00003105 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00003106 ".import FILE TABLE Import data from FILE into TABLE\n"
drh16eb5942016-11-03 13:01:38 +00003107#ifndef SQLITE_OMIT_TEST_CONTROL
3108 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3109#endif
drh0e55db12015-02-06 14:51:13 +00003110 ".indexes ?TABLE? Show names of all indexes\n"
3111 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00003112 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00003113#ifdef SQLITE_ENABLE_IOTRACE
3114 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3115#endif
drh1a513372015-05-02 17:40:23 +00003116 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh3fd9f332016-12-16 18:41:11 +00003117 ".lint OPTIONS Report potential schema issues. Options:\n"
3118 " fkey-indexes Find missing foreign key indexes\n"
drh70df4fe2006-06-13 15:12:21 +00003119#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00003120 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00003121#endif
drh127f9d72010-02-23 01:47:00 +00003122 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00003123 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00003124 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00003125 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00003126 " column Left-aligned columns. (See .width)\n"
3127 " html HTML <table> code\n"
3128 " insert SQL insert statements for TABLE\n"
3129 " line One value per line\n"
drh0c5cd962017-02-14 21:47:46 +00003130 " list Values delimited by \"|\"\n"
drh41f5f6e2016-10-21 17:39:30 +00003131 " quote Escape answers as for SQL\n"
drhb860bc92004-08-04 15:16:55 +00003132 " tabs Tab-separated values\n"
3133 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00003134 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00003135 ".once FILENAME Output for the next SQL command only to FILENAME\n"
mistachkin8145fc62016-09-16 20:39:21 +00003136 ".open ?--new? ?FILE? Close existing database and reopen FILE\n"
drhcd0509e2016-09-16 00:26:08 +00003137 " The --new starts with an empty file\n"
drhc2ce0be2014-05-29 12:36:14 +00003138 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00003139 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003140 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003141 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00003142 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00003143 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00003144 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00003145 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh4926fec2016-04-13 15:33:42 +00003146 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3147 " Add --indent for pretty-printing\n"
mistachkine0d68852014-12-11 03:12:33 +00003148 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3149 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00003150#if defined(SQLITE_ENABLE_SESSION)
3151 ".session CMD ... Create or control sessions\n"
3152#endif
drh1554bc82017-03-08 16:10:34 +00003153 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh62cdde52014-05-28 20:22:28 +00003154 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00003155 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00003156 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00003157 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00003158 ".tables ?TABLE? List names of tables\n"
3159 " If TABLE specified, only list tables matching\n"
3160 " LIKE pattern TABLE.\n"
drh760c8162016-09-16 02:52:22 +00003161 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
drh2dfbbca2000-07-28 14:32:48 +00003162 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00003163 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00003164 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00003165 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00003166 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00003167 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00003168 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00003169 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00003170;
3171
drhe6229612014-08-18 15:08:26 +00003172#if defined(SQLITE_ENABLE_SESSION)
3173/*
3174** Print help information for the ".sessions" command
3175*/
3176void session_help(ShellState *p){
mistachkin899c5c92016-04-03 20:50:02 +00003177 raw_printf(p->out,
drhe6229612014-08-18 15:08:26 +00003178 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3179 "If ?NAME? is omitted, the first defined session is used.\n"
3180 "Subcommands:\n"
3181 " attach TABLE Attach TABLE\n"
3182 " changeset FILE Write a changeset into FILE\n"
3183 " close Close one session\n"
3184 " enable ?BOOLEAN? Set or query the enable bit\n"
mistachkin1fe36bb2016-04-04 02:16:44 +00003185 " filter GLOB... Reject tables matching GLOBs\n"
drhe6229612014-08-18 15:08:26 +00003186 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3187 " isempty Query whether the session is empty\n"
3188 " list List currently open session names\n"
3189 " open DB NAME Open a new session on DB\n"
3190 " patchset FILE Write a patchset into FILE\n"
3191 );
3192}
3193#endif
3194
3195
drhdaffd0e2001-04-11 14:28:42 +00003196/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00003197static int process_input(ShellState *p, FILE *in);
drh2db82112016-09-15 21:35:24 +00003198
drh2db82112016-09-15 21:35:24 +00003199/*
dan11da0022016-12-17 08:18:05 +00003200** Read the content of file zName into memory obtained from sqlite3_malloc64()
3201** and return a pointer to the buffer. The caller is responsible for freeing
3202** the memory.
drh2db82112016-09-15 21:35:24 +00003203**
dan11da0022016-12-17 08:18:05 +00003204** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3205** read.
3206**
3207** For convenience, a nul-terminator byte is always appended to the data read
3208** from the file before the buffer is returned. This byte is not included in
3209** the final value of (*pnByte), if applicable.
3210**
3211** NULL is returned if any error is encountered. The final value of *pnByte
3212** is undefined in this case.
drh2db82112016-09-15 21:35:24 +00003213*/
dan11da0022016-12-17 08:18:05 +00003214static char *readFile(const char *zName, int *pnByte){
drh2db82112016-09-15 21:35:24 +00003215 FILE *in = fopen(zName, "rb");
3216 long nIn;
drhd1459152016-09-16 19:11:03 +00003217 size_t nRead;
drh2db82112016-09-15 21:35:24 +00003218 char *pBuf;
3219 if( in==0 ) return 0;
3220 fseek(in, 0, SEEK_END);
3221 nIn = ftell(in);
3222 rewind(in);
drhd1459152016-09-16 19:11:03 +00003223 pBuf = sqlite3_malloc64( nIn+1 );
drh2db82112016-09-15 21:35:24 +00003224 if( pBuf==0 ) return 0;
drhd1459152016-09-16 19:11:03 +00003225 nRead = fread(pBuf, nIn, 1, in);
3226 fclose(in);
3227 if( nRead!=1 ){
drh2db82112016-09-15 21:35:24 +00003228 sqlite3_free(pBuf);
3229 return 0;
3230 }
drhd1459152016-09-16 19:11:03 +00003231 pBuf[nIn] = 0;
dan11da0022016-12-17 08:18:05 +00003232 if( pnByte ) *pnByte = nIn;
drh2db82112016-09-15 21:35:24 +00003233 return pBuf;
3234}
3235
drhba5b0932014-07-24 12:39:59 +00003236/*
3237** Implementation of the "readfile(X)" SQL function. The entire content
3238** of the file named X is read and returned as a BLOB. NULL is returned
3239** if the file does not exist or is unreadable.
3240*/
3241static void readfileFunc(
3242 sqlite3_context *context,
3243 int argc,
3244 sqlite3_value **argv
3245){
3246 const char *zName;
drhba5b0932014-07-24 12:39:59 +00003247 void *pBuf;
dan11da0022016-12-17 08:18:05 +00003248 int nBuf;
drhba5b0932014-07-24 12:39:59 +00003249
drhf5ed7ad2015-06-15 14:43:25 +00003250 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003251 zName = (const char*)sqlite3_value_text(argv[0]);
3252 if( zName==0 ) return;
dan11da0022016-12-17 08:18:05 +00003253 pBuf = readFile(zName, &nBuf);
3254 if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free);
drhba5b0932014-07-24 12:39:59 +00003255}
3256
3257/*
3258** Implementation of the "writefile(X,Y)" SQL function. The argument Y
3259** is written into file X. The number of bytes written is returned. Or
3260** NULL is returned if something goes wrong, such as being unable to open
3261** file X for writing.
3262*/
3263static void writefileFunc(
3264 sqlite3_context *context,
3265 int argc,
3266 sqlite3_value **argv
3267){
3268 FILE *out;
3269 const char *z;
drhba5b0932014-07-24 12:39:59 +00003270 sqlite3_int64 rc;
3271 const char *zFile;
3272
drhf5ed7ad2015-06-15 14:43:25 +00003273 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003274 zFile = (const char*)sqlite3_value_text(argv[0]);
3275 if( zFile==0 ) return;
3276 out = fopen(zFile, "wb");
3277 if( out==0 ) return;
3278 z = (const char*)sqlite3_value_blob(argv[1]);
3279 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00003280 rc = 0;
3281 }else{
drh490fe862014-08-11 14:21:32 +00003282 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00003283 }
3284 fclose(out);
3285 sqlite3_result_int64(context, rc);
3286}
drhdaffd0e2001-04-11 14:28:42 +00003287
drhe6229612014-08-18 15:08:26 +00003288#if defined(SQLITE_ENABLE_SESSION)
3289/*
3290** Close a single OpenSession object and release all of its associated
3291** resources.
3292*/
3293static void session_close(OpenSession *pSession){
3294 int i;
3295 sqlite3session_delete(pSession->p);
3296 sqlite3_free(pSession->zName);
3297 for(i=0; i<pSession->nFilter; i++){
3298 sqlite3_free(pSession->azFilter[i]);
3299 }
3300 sqlite3_free(pSession->azFilter);
3301 memset(pSession, 0, sizeof(OpenSession));
3302}
3303#endif
3304
3305/*
drh51b55a32016-04-04 12:38:05 +00003306** Close all OpenSession objects and release all associated resources.
drhe6229612014-08-18 15:08:26 +00003307*/
drhe6229612014-08-18 15:08:26 +00003308#if defined(SQLITE_ENABLE_SESSION)
drh51b55a32016-04-04 12:38:05 +00003309static void session_close_all(ShellState *p){
drhe6229612014-08-18 15:08:26 +00003310 int i;
3311 for(i=0; i<p->nSession; i++){
3312 session_close(&p->aSession[i]);
3313 }
3314 p->nSession = 0;
drhe6229612014-08-18 15:08:26 +00003315}
drh51b55a32016-04-04 12:38:05 +00003316#else
3317# define session_close_all(X)
3318#endif
drhe6229612014-08-18 15:08:26 +00003319
drh75897232000-05-29 14:26:00 +00003320/*
drh03168ca2014-08-18 20:01:31 +00003321** Implementation of the xFilter function for an open session. Omit
3322** any tables named by ".session filter" but let all other table through.
3323*/
3324#if defined(SQLITE_ENABLE_SESSION)
3325static int session_filter(void *pCtx, const char *zTab){
3326 OpenSession *pSession = (OpenSession*)pCtx;
3327 int i;
3328 for(i=0; i<pSession->nFilter; i++){
3329 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3330 }
3331 return 1;
3332}
3333#endif
3334
3335/*
drh44c2eb12003-04-30 11:38:26 +00003336** Make sure the database is open. If it is not, then open it. If
3337** the database fails to open, print an error message and exit.
3338*/
drhdcd87a92014-08-18 13:45:42 +00003339static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00003340 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00003341 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00003342 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00003343 globalDb = p->db;
mistachkin8e189222015-04-19 21:43:16 +00003344 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00003345 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00003346 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00003347 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00003348 exit(1);
drh44c2eb12003-04-30 11:38:26 +00003349 }
drhc2e87a32006-06-27 15:16:14 +00003350#ifndef SQLITE_OMIT_LOAD_EXTENSION
3351 sqlite3_enable_load_extension(p->db, 1);
3352#endif
mistachkin8e189222015-04-19 21:43:16 +00003353 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003354 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003355 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003356 writefileFunc, 0, 0);
drh1554bc82017-03-08 16:10:34 +00003357 sqlite3_create_function(p->db, "sha3", 1, SQLITE_UTF8, 0,
3358 sha3Func, 0, 0);
3359 sqlite3_create_function(p->db, "sha3", 2, SQLITE_UTF8, 0,
3360 sha3Func, 0, 0);
3361 sqlite3_create_function(p->db, "sha3_query", 1, SQLITE_UTF8, 0,
3362 sha3QueryFunc, 0, 0);
3363 sqlite3_create_function(p->db, "sha3_query", 2, SQLITE_UTF8, 0,
3364 sha3QueryFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00003365 }
3366}
3367
3368/*
drhfeac5f82004-08-01 00:10:45 +00003369** Do C-language style dequoting.
3370**
mistachkinf21979d2015-01-18 05:35:01 +00003371** \a -> alarm
3372** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00003373** \t -> tab
3374** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00003375** \v -> vertical tab
3376** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00003377** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00003378** \s -> space
drh4c56b992013-06-27 13:26:55 +00003379** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00003380** \' -> '
drhfeac5f82004-08-01 00:10:45 +00003381** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00003382** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00003383*/
3384static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00003385 int i, j;
3386 char c;
drhc2ce0be2014-05-29 12:36:14 +00003387 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00003388 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00003389 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00003390 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00003391 if( c=='a' ){
3392 c = '\a';
3393 }else if( c=='b' ){
3394 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00003395 }else if( c=='t' ){
3396 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00003397 }else if( c=='n' ){
3398 c = '\n';
3399 }else if( c=='v' ){
3400 c = '\v';
3401 }else if( c=='f' ){
3402 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00003403 }else if( c=='r' ){
3404 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00003405 }else if( c=='"' ){
3406 c = '"';
3407 }else if( c=='\'' ){
3408 c = '\'';
drh4c56b992013-06-27 13:26:55 +00003409 }else if( c=='\\' ){
3410 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00003411 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00003412 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00003413 if( z[i+1]>='0' && z[i+1]<='7' ){
3414 i++;
3415 c = (c<<3) + z[i] - '0';
3416 if( z[i+1]>='0' && z[i+1]<='7' ){
3417 i++;
3418 c = (c<<3) + z[i] - '0';
3419 }
3420 }
3421 }
3422 }
3423 z[j] = c;
3424 }
drhc2ce0be2014-05-29 12:36:14 +00003425 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00003426}
3427
3428/*
drh348d19c2013-06-03 12:47:43 +00003429** Return the value of a hexadecimal digit. Return -1 if the input
3430** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00003431*/
drh348d19c2013-06-03 12:47:43 +00003432static int hexDigitValue(char c){
3433 if( c>='0' && c<='9' ) return c - '0';
3434 if( c>='a' && c<='f' ) return c - 'a' + 10;
3435 if( c>='A' && c<='F' ) return c - 'A' + 10;
3436 return -1;
drhc28490c2006-10-26 14:25:58 +00003437}
3438
3439/*
drh7d9f3942013-04-03 01:26:54 +00003440** Interpret zArg as an integer value, possibly with suffixes.
3441*/
3442static sqlite3_int64 integerValue(const char *zArg){
3443 sqlite3_int64 v = 0;
3444 static const struct { char *zSuffix; int iMult; } aMult[] = {
3445 { "KiB", 1024 },
3446 { "MiB", 1024*1024 },
3447 { "GiB", 1024*1024*1024 },
3448 { "KB", 1000 },
3449 { "MB", 1000000 },
3450 { "GB", 1000000000 },
3451 { "K", 1000 },
3452 { "M", 1000000 },
3453 { "G", 1000000000 },
3454 };
3455 int i;
3456 int isNeg = 0;
3457 if( zArg[0]=='-' ){
3458 isNeg = 1;
3459 zArg++;
3460 }else if( zArg[0]=='+' ){
3461 zArg++;
3462 }
drh348d19c2013-06-03 12:47:43 +00003463 if( zArg[0]=='0' && zArg[1]=='x' ){
3464 int x;
3465 zArg += 2;
3466 while( (x = hexDigitValue(zArg[0]))>=0 ){
3467 v = (v<<4) + x;
3468 zArg++;
3469 }
3470 }else{
3471 while( IsDigit(zArg[0]) ){
3472 v = v*10 + zArg[0] - '0';
3473 zArg++;
3474 }
drh7d9f3942013-04-03 01:26:54 +00003475 }
drhc2bed0a2013-05-24 11:57:50 +00003476 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00003477 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
3478 v *= aMult[i].iMult;
3479 break;
3480 }
3481 }
3482 return isNeg? -v : v;
3483}
3484
3485/*
drh348d19c2013-06-03 12:47:43 +00003486** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3487** for TRUE and FALSE. Return the integer value if appropriate.
3488*/
drhe6e1d122017-03-09 13:50:49 +00003489static int booleanValue(const char *zArg){
drh348d19c2013-06-03 12:47:43 +00003490 int i;
3491 if( zArg[0]=='0' && zArg[1]=='x' ){
3492 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3493 }else{
3494 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3495 }
3496 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3497 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3498 return 1;
3499 }
3500 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3501 return 0;
3502 }
mistachkinaae280e2015-12-31 19:06:24 +00003503 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00003504 zArg);
3505 return 0;
3506}
3507
3508/*
drhe6e1d122017-03-09 13:50:49 +00003509** Set or clear a shell flag according to a boolean value.
3510*/
3511static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
3512 if( booleanValue(zArg) ){
3513 ShellSetFlag(p, mFlag);
3514 }else{
3515 ShellClearFlag(p, mFlag);
3516 }
3517}
3518
3519/*
drh42f64e52012-04-04 16:56:23 +00003520** Close an output file, assuming it is not stderr or stdout
3521*/
3522static void output_file_close(FILE *f){
3523 if( f && f!=stdout && f!=stderr ) fclose(f);
3524}
3525
3526/*
3527** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00003528** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00003529** filename is "off".
3530*/
3531static FILE *output_file_open(const char *zFile){
3532 FILE *f;
3533 if( strcmp(zFile,"stdout")==0 ){
3534 f = stdout;
3535 }else if( strcmp(zFile, "stderr")==0 ){
3536 f = stderr;
3537 }else if( strcmp(zFile, "off")==0 ){
3538 f = 0;
3539 }else{
3540 f = fopen(zFile, "wb");
3541 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003542 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003543 }
3544 }
3545 return f;
3546}
3547
drhd12602a2016-12-07 15:49:02 +00003548#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00003549#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003550/*
3551** A routine for handling output from sqlite3_trace().
3552*/
drh4b363a52016-07-23 20:27:41 +00003553static int sql_trace_callback(
3554 unsigned mType,
3555 void *pArg,
3556 void *pP,
3557 void *pX
3558){
drh42f64e52012-04-04 16:56:23 +00003559 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00003560 UNUSED_PARAMETER(mType);
3561 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00003562 if( f ){
drh4b363a52016-07-23 20:27:41 +00003563 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00003564 int i = (int)strlen(z);
3565 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00003566 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00003567 }
drh4b363a52016-07-23 20:27:41 +00003568 return 0;
drh42f64e52012-04-04 16:56:23 +00003569}
drhc10b9da2016-11-20 17:59:59 +00003570#endif
3571#endif
drh42f64e52012-04-04 16:56:23 +00003572
3573/*
drhd8621b92012-04-17 09:09:33 +00003574** A no-op routine that runs with the ".breakpoint" doc-command. This is
3575** a useful spot to set a debugger breakpoint.
3576*/
3577static void test_breakpoint(void){
3578 static int nCall = 0;
3579 nCall++;
3580}
3581
3582/*
mistachkin636bf9f2014-07-19 20:15:16 +00003583** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00003584*/
mistachkin636bf9f2014-07-19 20:15:16 +00003585typedef struct ImportCtx ImportCtx;
3586struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00003587 const char *zFile; /* Name of the input file */
3588 FILE *in; /* Read the CSV text from this input stream */
3589 char *z; /* Accumulated text for a field */
3590 int n; /* Number of bytes in z */
3591 int nAlloc; /* Space allocated for z[] */
3592 int nLine; /* Current line number */
3593 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00003594 int cColSep; /* The column separator character. (Usually ",") */
3595 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00003596};
3597
3598/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00003599static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00003600 if( p->n+1>=p->nAlloc ){
3601 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00003602 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00003603 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003604 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00003605 exit(1);
3606 }
3607 }
3608 p->z[p->n++] = (char)c;
3609}
3610
3611/* Read a single field of CSV text. Compatible with rfc4180 and extended
3612** with the option of having a separator other than ",".
3613**
3614** + Input comes from p->in.
3615** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003616** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003617** + Use p->cSep as the column separator. The default is ",".
3618** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00003619** + Keep track of the line number in p->nLine.
3620** + Store the character that terminates the field in p->cTerm. Store
3621** EOF on end-of-file.
3622** + Report syntax errors on stderr
3623*/
mistachkin44723ce2015-03-21 02:22:37 +00003624static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003625 int c;
3626 int cSep = p->cColSep;
3627 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00003628 p->n = 0;
3629 c = fgetc(p->in);
3630 if( c==EOF || seenInterrupt ){
3631 p->cTerm = EOF;
3632 return 0;
3633 }
3634 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00003635 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00003636 int startLine = p->nLine;
3637 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00003638 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00003639 while( 1 ){
3640 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00003641 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00003642 if( c==cQuote ){
3643 if( pc==cQuote ){
3644 pc = 0;
3645 continue;
3646 }
3647 }
3648 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00003649 || (c==rSep && pc==cQuote)
3650 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00003651 || (c==EOF && pc==cQuote)
3652 ){
3653 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00003654 p->cTerm = c;
3655 break;
3656 }
3657 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00003658 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00003659 p->zFile, p->nLine, cQuote);
3660 }
3661 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00003662 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00003663 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00003664 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00003665 break;
3666 }
mistachkin636bf9f2014-07-19 20:15:16 +00003667 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00003668 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00003669 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00003670 }
drhdb95f682013-06-26 22:46:00 +00003671 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003672 while( c!=EOF && c!=cSep && c!=rSep ){
3673 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00003674 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00003675 }
mistachkin636bf9f2014-07-19 20:15:16 +00003676 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00003677 p->nLine++;
drh3852b682014-02-26 13:53:34 +00003678 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00003679 }
drhdb95f682013-06-26 22:46:00 +00003680 p->cTerm = c;
3681 }
drh8dd675e2013-07-12 21:09:24 +00003682 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00003683 return p->z;
3684}
3685
mistachkin636bf9f2014-07-19 20:15:16 +00003686/* Read a single field of ASCII delimited text.
3687**
3688** + Input comes from p->in.
3689** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003690** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003691** + Use p->cSep as the column separator. The default is "\x1F".
3692** + Use p->rSep as the row separator. The default is "\x1E".
3693** + Keep track of the row number in p->nLine.
3694** + Store the character that terminates the field in p->cTerm. Store
3695** EOF on end-of-file.
3696** + Report syntax errors on stderr
3697*/
mistachkin44723ce2015-03-21 02:22:37 +00003698static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003699 int c;
3700 int cSep = p->cColSep;
3701 int rSep = p->cRowSep;
3702 p->n = 0;
3703 c = fgetc(p->in);
3704 if( c==EOF || seenInterrupt ){
3705 p->cTerm = EOF;
3706 return 0;
3707 }
3708 while( c!=EOF && c!=cSep && c!=rSep ){
3709 import_append_char(p, c);
3710 c = fgetc(p->in);
3711 }
3712 if( c==rSep ){
3713 p->nLine++;
3714 }
3715 p->cTerm = c;
3716 if( p->z ) p->z[p->n] = 0;
3717 return p->z;
3718}
3719
drhdb95f682013-06-26 22:46:00 +00003720/*
drh4bbcf102014-02-06 02:46:08 +00003721** Try to transfer data for table zTable. If an error is seen while
3722** moving forward, try to go backwards. The backwards movement won't
3723** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00003724*/
mistachkine31ae902014-02-06 01:15:29 +00003725static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00003726 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003727 sqlite3 *newDb,
3728 const char *zTable
3729){
mistachkin1fe36bb2016-04-04 02:16:44 +00003730 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00003731 sqlite3_stmt *pInsert = 0;
3732 char *zQuery = 0;
3733 char *zInsert = 0;
3734 int rc;
3735 int i, j, n;
3736 int nTable = (int)strlen(zTable);
3737 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00003738 int cnt = 0;
3739 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00003740
3741 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
3742 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3743 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003744 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003745 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3746 zQuery);
3747 goto end_data_xfer;
3748 }
3749 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00003750 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00003751 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003752 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00003753 goto end_data_xfer;
3754 }
3755 sqlite3_snprintf(200+nTable,zInsert,
3756 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
3757 i = (int)strlen(zInsert);
3758 for(j=1; j<n; j++){
3759 memcpy(zInsert+i, ",?", 2);
3760 i += 2;
3761 }
3762 memcpy(zInsert+i, ");", 3);
3763 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
3764 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003765 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003766 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
3767 zQuery);
3768 goto end_data_xfer;
3769 }
3770 for(k=0; k<2; k++){
3771 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3772 for(i=0; i<n; i++){
3773 switch( sqlite3_column_type(pQuery, i) ){
3774 case SQLITE_NULL: {
3775 sqlite3_bind_null(pInsert, i+1);
3776 break;
3777 }
3778 case SQLITE_INTEGER: {
3779 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
3780 break;
3781 }
3782 case SQLITE_FLOAT: {
3783 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
3784 break;
3785 }
3786 case SQLITE_TEXT: {
3787 sqlite3_bind_text(pInsert, i+1,
3788 (const char*)sqlite3_column_text(pQuery,i),
3789 -1, SQLITE_STATIC);
3790 break;
3791 }
3792 case SQLITE_BLOB: {
3793 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
3794 sqlite3_column_bytes(pQuery,i),
3795 SQLITE_STATIC);
3796 break;
3797 }
3798 }
3799 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00003800 rc = sqlite3_step(pInsert);
3801 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00003802 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00003803 sqlite3_errmsg(newDb));
3804 }
drh3350ce92014-02-06 00:49:12 +00003805 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00003806 cnt++;
3807 if( (cnt%spinRate)==0 ){
3808 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
3809 fflush(stdout);
3810 }
drh3350ce92014-02-06 00:49:12 +00003811 } /* End while */
3812 if( rc==SQLITE_DONE ) break;
3813 sqlite3_finalize(pQuery);
3814 sqlite3_free(zQuery);
3815 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
3816 zTable);
3817 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3818 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003819 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00003820 break;
drh3350ce92014-02-06 00:49:12 +00003821 }
3822 } /* End for(k=0...) */
3823
3824end_data_xfer:
3825 sqlite3_finalize(pQuery);
3826 sqlite3_finalize(pInsert);
3827 sqlite3_free(zQuery);
3828 sqlite3_free(zInsert);
3829}
3830
3831
3832/*
3833** Try to transfer all rows of the schema that match zWhere. For
3834** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00003835** If an error is encountered while moving forward through the
3836** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00003837*/
mistachkine31ae902014-02-06 01:15:29 +00003838static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00003839 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003840 sqlite3 *newDb,
3841 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00003842 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00003843){
3844 sqlite3_stmt *pQuery = 0;
3845 char *zQuery = 0;
3846 int rc;
3847 const unsigned char *zName;
3848 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00003849 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00003850
3851 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3852 " WHERE %s", zWhere);
3853 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3854 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003855 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003856 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3857 zQuery);
3858 goto end_schema_xfer;
3859 }
3860 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3861 zName = sqlite3_column_text(pQuery, 0);
3862 zSql = sqlite3_column_text(pQuery, 1);
3863 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003864 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3865 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003866 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003867 sqlite3_free(zErrMsg);
3868 zErrMsg = 0;
3869 }
drh3350ce92014-02-06 00:49:12 +00003870 if( xForEach ){
3871 xForEach(p, newDb, (const char*)zName);
3872 }
3873 printf("done\n");
3874 }
3875 if( rc!=SQLITE_DONE ){
3876 sqlite3_finalize(pQuery);
3877 sqlite3_free(zQuery);
3878 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3879 " WHERE %s ORDER BY rowid DESC", zWhere);
3880 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3881 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003882 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003883 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3884 zQuery);
3885 goto end_schema_xfer;
3886 }
3887 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3888 zName = sqlite3_column_text(pQuery, 0);
3889 zSql = sqlite3_column_text(pQuery, 1);
3890 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003891 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3892 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003893 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003894 sqlite3_free(zErrMsg);
3895 zErrMsg = 0;
3896 }
drh3350ce92014-02-06 00:49:12 +00003897 if( xForEach ){
3898 xForEach(p, newDb, (const char*)zName);
3899 }
3900 printf("done\n");
3901 }
3902 }
3903end_schema_xfer:
3904 sqlite3_finalize(pQuery);
3905 sqlite3_free(zQuery);
3906}
3907
3908/*
3909** Open a new database file named "zNewDb". Try to recover as much information
3910** as possible out of the main database (which might be corrupt) and write it
3911** into zNewDb.
3912*/
drhdcd87a92014-08-18 13:45:42 +00003913static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00003914 int rc;
3915 sqlite3 *newDb = 0;
3916 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003917 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00003918 return;
3919 }
3920 rc = sqlite3_open(zNewDb, &newDb);
3921 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003922 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00003923 sqlite3_errmsg(newDb));
3924 }else{
drh54d0d2d2014-04-03 00:32:13 +00003925 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003926 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00003927 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
3928 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00003929 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00003930 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003931 }
3932 sqlite3_close(newDb);
3933}
3934
3935/*
drhc2ce0be2014-05-29 12:36:14 +00003936** Change the output file back to stdout
3937*/
drhdcd87a92014-08-18 13:45:42 +00003938static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00003939 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003940#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00003941 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00003942#endif
drhc2ce0be2014-05-29 12:36:14 +00003943 }else{
3944 output_file_close(p->out);
3945 }
3946 p->outfile[0] = 0;
3947 p->out = stdout;
3948}
3949
3950/*
drhf7502f02015-02-06 14:19:44 +00003951** Run an SQL command and return the single integer result.
3952*/
3953static int db_int(ShellState *p, const char *zSql){
3954 sqlite3_stmt *pStmt;
3955 int res = 0;
3956 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3957 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
3958 res = sqlite3_column_int(pStmt,0);
3959 }
3960 sqlite3_finalize(pStmt);
3961 return res;
3962}
3963
3964/*
3965** Convert a 2-byte or 4-byte big-endian integer into a native integer
3966*/
drha0620ac2016-07-13 13:05:13 +00003967static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003968 return (a[0]<<8) + a[1];
3969}
drha0620ac2016-07-13 13:05:13 +00003970static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003971 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
3972}
3973
3974/*
3975** Implementation of the ".info" command.
3976**
3977** Return 1 on error, 2 to exit, and 0 otherwise.
3978*/
drh0e55db12015-02-06 14:51:13 +00003979static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00003980 static const struct { const char *zName; int ofst; } aField[] = {
3981 { "file change counter:", 24 },
3982 { "database page count:", 28 },
3983 { "freelist page count:", 36 },
3984 { "schema cookie:", 40 },
3985 { "schema format:", 44 },
3986 { "default cache size:", 48 },
3987 { "autovacuum top root:", 52 },
3988 { "incremental vacuum:", 64 },
3989 { "text encoding:", 56 },
3990 { "user version:", 60 },
3991 { "application id:", 68 },
3992 { "software version:", 96 },
3993 };
drh0e55db12015-02-06 14:51:13 +00003994 static const struct { const char *zName; const char *zSql; } aQuery[] = {
3995 { "number of tables:",
3996 "SELECT count(*) FROM %s WHERE type='table'" },
3997 { "number of indexes:",
3998 "SELECT count(*) FROM %s WHERE type='index'" },
3999 { "number of triggers:",
4000 "SELECT count(*) FROM %s WHERE type='trigger'" },
4001 { "number of views:",
4002 "SELECT count(*) FROM %s WHERE type='view'" },
4003 { "schema size:",
4004 "SELECT total(length(sql)) FROM %s" },
4005 };
mistachkinbfe8bd52015-11-17 19:17:14 +00004006 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00004007 int i;
4008 char *zSchemaTab;
4009 char *zDb = nArg>=2 ? azArg[1] : "main";
4010 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00004011 open_db(p, 0);
4012 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00004013 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00004014 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
4015 return 1;
4016 }
4017 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
4018 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004019 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00004020 return 1;
4021 }
4022 i = get2byteInt(aHdr+16);
4023 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00004024 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4025 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4026 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
4027 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00004028 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00004029 int ofst = aField[i].ofst;
4030 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00004031 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00004032 switch( ofst ){
4033 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00004034 if( val==1 ) raw_printf(p->out, " (utf8)");
4035 if( val==2 ) raw_printf(p->out, " (utf16le)");
4036 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00004037 }
4038 }
mistachkinaae280e2015-12-31 19:06:24 +00004039 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00004040 }
drh0e55db12015-02-06 14:51:13 +00004041 if( zDb==0 ){
4042 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
4043 }else if( strcmp(zDb,"temp")==0 ){
4044 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
4045 }else{
4046 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
4047 }
drhf5ed7ad2015-06-15 14:43:25 +00004048 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00004049 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
4050 int val = db_int(p, zSql);
4051 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00004052 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00004053 }
4054 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00004055 return 0;
4056}
4057
dand95bb392015-09-30 11:19:05 +00004058/*
4059** Print the current sqlite3_errmsg() value to stderr and return 1.
4060*/
4061static int shellDatabaseError(sqlite3 *db){
4062 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00004063 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00004064 return 1;
4065}
4066
4067/*
4068** Print an out-of-memory message to stderr and return 1.
4069*/
4070static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00004071 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00004072 return 1;
4073}
drhf7502f02015-02-06 14:19:44 +00004074
drh2db82112016-09-15 21:35:24 +00004075/*
4076** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
4077** if they match and FALSE (0) if they do not match.
4078**
4079** Globbing rules:
4080**
4081** '*' Matches any sequence of zero or more characters.
4082**
4083** '?' Matches exactly one character.
4084**
4085** [...] Matches one character from the enclosed list of
4086** characters.
4087**
4088** [^...] Matches one character not in the enclosed list.
4089**
4090** '#' Matches any sequence of one or more digits with an
4091** optional + or - sign in front
4092**
4093** ' ' Any span of whitespace matches any other span of
4094** whitespace.
4095**
4096** Extra whitespace at the end of z[] is ignored.
4097*/
4098static int testcase_glob(const char *zGlob, const char *z){
4099 int c, c2;
4100 int invert;
4101 int seen;
4102
4103 while( (c = (*(zGlob++)))!=0 ){
4104 if( IsSpace(c) ){
4105 if( !IsSpace(*z) ) return 0;
4106 while( IsSpace(*zGlob) ) zGlob++;
4107 while( IsSpace(*z) ) z++;
4108 }else if( c=='*' ){
4109 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4110 if( c=='?' && (*(z++))==0 ) return 0;
4111 }
4112 if( c==0 ){
4113 return 1;
4114 }else if( c=='[' ){
4115 while( *z && testcase_glob(zGlob-1,z)==0 ){
4116 z++;
4117 }
4118 return (*z)!=0;
4119 }
4120 while( (c2 = (*(z++)))!=0 ){
4121 while( c2!=c ){
4122 c2 = *(z++);
4123 if( c2==0 ) return 0;
4124 }
4125 if( testcase_glob(zGlob,z) ) return 1;
4126 }
4127 return 0;
4128 }else if( c=='?' ){
4129 if( (*(z++))==0 ) return 0;
4130 }else if( c=='[' ){
4131 int prior_c = 0;
4132 seen = 0;
4133 invert = 0;
4134 c = *(z++);
4135 if( c==0 ) return 0;
4136 c2 = *(zGlob++);
4137 if( c2=='^' ){
4138 invert = 1;
4139 c2 = *(zGlob++);
4140 }
4141 if( c2==']' ){
4142 if( c==']' ) seen = 1;
4143 c2 = *(zGlob++);
4144 }
4145 while( c2 && c2!=']' ){
4146 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4147 c2 = *(zGlob++);
4148 if( c>=prior_c && c<=c2 ) seen = 1;
4149 prior_c = 0;
4150 }else{
4151 if( c==c2 ){
4152 seen = 1;
4153 }
4154 prior_c = c2;
4155 }
4156 c2 = *(zGlob++);
4157 }
4158 if( c2==0 || (seen ^ invert)==0 ) return 0;
4159 }else if( c=='#' ){
4160 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4161 if( !IsDigit(z[0]) ) return 0;
4162 z++;
4163 while( IsDigit(z[0]) ){ z++; }
4164 }else{
4165 if( c!=(*(z++)) ) return 0;
4166 }
4167 }
4168 while( IsSpace(*z) ){ z++; }
4169 return *z==0;
4170}
drh2db82112016-09-15 21:35:24 +00004171
4172
drhf7502f02015-02-06 14:19:44 +00004173/*
drh4926fec2016-04-13 15:33:42 +00004174** Compare the string as a command-line option with either one or two
4175** initial "-" characters.
4176*/
4177static int optionMatch(const char *zStr, const char *zOpt){
4178 if( zStr[0]!='-' ) return 0;
4179 zStr++;
4180 if( zStr[0]=='-' ) zStr++;
4181 return strcmp(zStr, zOpt)==0;
4182}
4183
4184/*
drhcd0509e2016-09-16 00:26:08 +00004185** Delete a file.
4186*/
4187int shellDeleteFile(const char *zFilename){
4188 int rc;
4189#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00004190 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00004191 rc = _wunlink(z);
4192 sqlite3_free(z);
4193#else
4194 rc = unlink(zFilename);
4195#endif
4196 return rc;
4197}
4198
dan35ac58e2016-12-14 19:28:27 +00004199
dan35ac58e2016-12-14 19:28:27 +00004200/*
dandd9e0be2016-12-16 16:44:27 +00004201** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00004202** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00004203** called with four arguments - the parent table name, the parent column name,
4204** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00004205**
4206** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4207**
4208** If either of the named tables or columns do not exist, this function
4209** returns an empty string. An empty string is also returned if both tables
4210** and columns exist but have the same default collation sequence. Or,
4211** if both exist but the default collation sequences are different, this
4212** function returns the string " COLLATE <parent-collation>", where
4213** <parent-collation> is the default collation sequence of the parent column.
4214*/
4215static void shellFkeyCollateClause(
4216 sqlite3_context *pCtx,
4217 int nVal,
4218 sqlite3_value **apVal
4219){
4220 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4221 const char *zParent;
4222 const char *zParentCol;
4223 const char *zParentSeq;
4224 const char *zChild;
4225 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00004226 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00004227 int rc;
4228
4229 assert( nVal==4 );
4230 zParent = (const char*)sqlite3_value_text(apVal[0]);
4231 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4232 zChild = (const char*)sqlite3_value_text(apVal[2]);
4233 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4234
4235 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4236 rc = sqlite3_table_column_metadata(
4237 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4238 );
4239 if( rc==SQLITE_OK ){
4240 rc = sqlite3_table_column_metadata(
4241 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4242 );
4243 }
4244
4245 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4246 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4247 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4248 sqlite3_free(z);
4249 }
4250}
4251
4252
4253/*
dan3c7ebeb2016-12-16 17:28:56 +00004254** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00004255*/
dan3c7ebeb2016-12-16 17:28:56 +00004256static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00004257 ShellState *pState, /* Current shell tool state */
4258 char **azArg, /* Array of arguments passed to dot command */
4259 int nArg /* Number of entries in azArg[] */
4260){
dandd9e0be2016-12-16 16:44:27 +00004261 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4262 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00004263 int bVerbose = 0; /* If -verbose is present */
4264 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00004265 int i; /* To iterate through azArg[] */
4266 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4267 int rc; /* Return code */
4268 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00004269
dandd9e0be2016-12-16 16:44:27 +00004270 /*
4271 ** This SELECT statement returns one row for each foreign key constraint
4272 ** in the schema of the main database. The column values are:
4273 **
4274 ** 0. The text of an SQL statement similar to:
4275 **
4276 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
4277 **
4278 ** This is the same SELECT that the foreign keys implementation needs
4279 ** to run internally on child tables. If there is an index that can
4280 ** be used to optimize this query, then it can also be used by the FK
4281 ** implementation to optimize DELETE or UPDATE statements on the parent
4282 ** table.
4283 **
4284 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4285 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4286 ** contains an index that can be used to optimize the query.
4287 **
4288 ** 2. Human readable text that describes the child table and columns. e.g.
4289 **
4290 ** "child_table(child_key1, child_key2)"
4291 **
4292 ** 3. Human readable text that describes the parent table and columns. e.g.
4293 **
4294 ** "parent_table(parent_key1, parent_key2)"
4295 **
4296 ** 4. A full CREATE INDEX statement for an index that could be used to
4297 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4298 **
4299 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4300 **
4301 ** 5. The name of the parent table.
4302 **
4303 ** These six values are used by the C logic below to generate the report.
4304 */
dan35ac58e2016-12-14 19:28:27 +00004305 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00004306 "SELECT "
4307 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
4308 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4309 " || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00004310 ", "
dandd9e0be2016-12-16 16:44:27 +00004311 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00004312 " || group_concat('*=?', ' AND ') || ')'"
4313 ", "
dandd9e0be2016-12-16 16:44:27 +00004314 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00004315 ", "
dandd9e0be2016-12-16 16:44:27 +00004316 " f.[table] || '(' || group_concat(COALESCE(f.[to], "
4317 " (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)"
dan35ac58e2016-12-14 19:28:27 +00004318 " )) || ')'"
4319 ", "
dandd9e0be2016-12-16 16:44:27 +00004320 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4321 " || ' ON ' || quote(s.name) || '('"
4322 " || group_concat(quote(f.[from]) ||"
4323 " fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00004324 " || ');'"
danf9647b62016-12-15 06:01:40 +00004325 ", "
dandd9e0be2016-12-16 16:44:27 +00004326 " f.[table] "
dan35ac58e2016-12-14 19:28:27 +00004327
dandd9e0be2016-12-16 16:44:27 +00004328 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4329 "GROUP BY s.name, f.id "
4330 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00004331 ;
4332
dan3c7ebeb2016-12-16 17:28:56 +00004333 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00004334 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00004335 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4336 bVerbose = 1;
4337 }
4338 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4339 bGroupByParent = 1;
4340 zIndent = " ";
4341 }
4342 else{
dan3c7ebeb2016-12-16 17:28:56 +00004343 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4344 azArg[0], azArg[1]
4345 );
danf9647b62016-12-15 06:01:40 +00004346 return SQLITE_ERROR;
4347 }
dan35ac58e2016-12-14 19:28:27 +00004348 }
dan35ac58e2016-12-14 19:28:27 +00004349
4350 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00004351 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4352 0, shellFkeyCollateClause, 0, 0
4353 );
dan35ac58e2016-12-14 19:28:27 +00004354
4355
4356 if( rc==SQLITE_OK ){
4357 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4358 }
danf9647b62016-12-15 06:01:40 +00004359 if( rc==SQLITE_OK ){
4360 sqlite3_bind_int(pSql, 1, bGroupByParent);
4361 }
dan35ac58e2016-12-14 19:28:27 +00004362
4363 if( rc==SQLITE_OK ){
4364 int rc2;
danf9647b62016-12-15 06:01:40 +00004365 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00004366 while( SQLITE_ROW==sqlite3_step(pSql) ){
4367 int res = -1;
4368 sqlite3_stmt *pExplain = 0;
4369 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4370 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4371 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4372 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4373 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00004374 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00004375
4376 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4377 if( rc!=SQLITE_OK ) break;
4378 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4379 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4380 res = (0==sqlite3_strglob(zGlob, zPlan));
4381 }
4382 rc = sqlite3_finalize(pExplain);
4383 if( rc!=SQLITE_OK ) break;
4384
4385 if( res<0 ){
4386 raw_printf(stderr, "Error: internal error");
4387 break;
danf9647b62016-12-15 06:01:40 +00004388 }else{
4389 if( bGroupByParent
4390 && (bVerbose || res==0)
4391 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4392 ){
4393 raw_printf(out, "-- Parent table %s\n", zParent);
4394 sqlite3_free(zPrev);
4395 zPrev = sqlite3_mprintf("%s", zParent);
4396 }
4397
4398 if( res==0 ){
4399 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4400 }else if( bVerbose ){
4401 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4402 zIndent, zFrom, zTarget
4403 );
4404 }
dan35ac58e2016-12-14 19:28:27 +00004405 }
4406 }
danf9647b62016-12-15 06:01:40 +00004407 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00004408
4409 if( rc!=SQLITE_OK ){
4410 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4411 }
4412
4413 rc2 = sqlite3_finalize(pSql);
4414 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4415 rc = rc2;
4416 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4417 }
4418 }else{
4419 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4420 }
4421
4422 return rc;
4423}
dan3c7ebeb2016-12-16 17:28:56 +00004424
dan35ac58e2016-12-14 19:28:27 +00004425/*
dan3c7ebeb2016-12-16 17:28:56 +00004426** Implementation of ".lint" dot command.
4427*/
4428static int lintDotCommand(
4429 ShellState *pState, /* Current shell tool state */
4430 char **azArg, /* Array of arguments passed to dot command */
4431 int nArg /* Number of entries in azArg[] */
4432){
4433 int n;
drh96ada592016-12-29 19:48:46 +00004434 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00004435 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4436 return lintFkeyIndexes(pState, azArg, nArg);
4437
4438 usage:
4439 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4440 raw_printf(stderr, "Where sub-commands are:\n");
4441 raw_printf(stderr, " fkey-indexes\n");
4442 return SQLITE_ERROR;
4443}
4444
dan35ac58e2016-12-14 19:28:27 +00004445
drhcd0509e2016-09-16 00:26:08 +00004446/*
drh75897232000-05-29 14:26:00 +00004447** If an input line begins with "." then invoke this routine to
4448** process that line.
drh67505e72002-04-19 12:34:06 +00004449**
drh47ad6842006-11-08 12:25:42 +00004450** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00004451*/
drhdcd87a92014-08-18 13:45:42 +00004452static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00004453 int h = 1;
drh75897232000-05-29 14:26:00 +00004454 int nArg = 0;
4455 int n, c;
drh67505e72002-04-19 12:34:06 +00004456 int rc = 0;
drh75897232000-05-29 14:26:00 +00004457 char *azArg[50];
4458
4459 /* Parse the input line into tokens.
4460 */
mistachkin8e189222015-04-19 21:43:16 +00004461 while( zLine[h] && nArg<ArraySize(azArg) ){
4462 while( IsSpace(zLine[h]) ){ h++; }
4463 if( zLine[h]==0 ) break;
4464 if( zLine[h]=='\'' || zLine[h]=='"' ){
4465 int delim = zLine[h++];
4466 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00004467 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00004468 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00004469 h++;
drh4c56b992013-06-27 13:26:55 +00004470 }
mistachkin8e189222015-04-19 21:43:16 +00004471 if( zLine[h]==delim ){
4472 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00004473 }
drhfeac5f82004-08-01 00:10:45 +00004474 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004475 }else{
mistachkin8e189222015-04-19 21:43:16 +00004476 azArg[nArg++] = &zLine[h];
4477 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
4478 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00004479 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004480 }
4481 }
4482
4483 /* Process the input line.
4484 */
shane9bd1b442009-10-23 01:27:39 +00004485 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00004486 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00004487 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00004488
drha0daa752016-09-16 11:53:10 +00004489#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00004490 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
4491 if( nArg!=2 ){
4492 raw_printf(stderr, "Usage: .auth ON|OFF\n");
4493 rc = 1;
4494 goto meta_command_exit;
4495 }
4496 open_db(p, 0);
4497 if( booleanValue(azArg[1]) ){
4498 sqlite3_set_authorizer(p->db, shellAuth, p);
4499 }else{
4500 sqlite3_set_authorizer(p->db, 0, 0);
4501 }
4502 }else
drha0daa752016-09-16 11:53:10 +00004503#endif
drhde613c62016-04-04 17:23:10 +00004504
drh5c7976f2014-02-10 19:59:27 +00004505 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
4506 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
4507 ){
drhbc46f022013-01-23 18:53:23 +00004508 const char *zDestFile = 0;
4509 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00004510 sqlite3 *pDest;
4511 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00004512 int j;
4513 for(j=1; j<nArg; j++){
4514 const char *z = azArg[j];
4515 if( z[0]=='-' ){
4516 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00004517 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00004518 {
mistachkinaae280e2015-12-31 19:06:24 +00004519 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00004520 return 1;
4521 }
4522 }else if( zDestFile==0 ){
4523 zDestFile = azArg[j];
4524 }else if( zDb==0 ){
4525 zDb = zDestFile;
4526 zDestFile = azArg[j];
4527 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004528 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00004529 return 1;
4530 }
drh9ff849f2009-02-04 20:55:57 +00004531 }
drhbc46f022013-01-23 18:53:23 +00004532 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004533 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00004534 return 1;
4535 }
4536 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00004537 rc = sqlite3_open(zDestFile, &pDest);
4538 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004539 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00004540 sqlite3_close(pDest);
4541 return 1;
4542 }
drh05782482013-10-24 15:20:20 +00004543 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00004544 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
4545 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004546 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00004547 sqlite3_close(pDest);
4548 return 1;
4549 }
4550 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
4551 sqlite3_backup_finish(pBackup);
4552 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00004553 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00004554 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004555 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00004556 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00004557 }
4558 sqlite3_close(pDest);
4559 }else
4560
drhc2ce0be2014-05-29 12:36:14 +00004561 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
4562 if( nArg==2 ){
4563 bail_on_error = booleanValue(azArg[1]);
4564 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004565 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004566 rc = 1;
4567 }
drhc49f44e2006-10-26 18:15:42 +00004568 }else
4569
mistachkinf21979d2015-01-18 05:35:01 +00004570 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
4571 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00004572 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004573 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004574 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00004575 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004576 }
mistachkinf21979d2015-01-18 05:35:01 +00004577 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004578 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00004579 rc = 1;
4580 }
4581 }else
4582
drhd8621b92012-04-17 09:09:33 +00004583 /* The undocumented ".breakpoint" command causes a call to the no-op
4584 ** routine named test_breakpoint().
4585 */
4586 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
4587 test_breakpoint();
4588 }else
4589
drhdf12f1c2015-12-07 21:46:19 +00004590 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
4591 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00004592 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
drhdf12f1c2015-12-07 21:46:19 +00004593 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004594 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00004595 rc = 1;
4596 }
4597 }else
4598
drh2db82112016-09-15 21:35:24 +00004599 /* Cancel output redirection, if it is currently set (by .testcase)
4600 ** Then read the content of the testcase-out.txt file and compare against
4601 ** azArg[1]. If there are differences, report an error and exit.
4602 */
4603 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
4604 char *zRes = 0;
4605 output_reset(p);
4606 if( nArg!=2 ){
4607 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00004608 rc = 2;
dan11da0022016-12-17 08:18:05 +00004609 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00004610 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
4611 rc = 2;
4612 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00004613 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00004614 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
4615 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00004616 rc = 2;
drh760c8162016-09-16 02:52:22 +00004617 }else{
mistachkin8145fc62016-09-16 20:39:21 +00004618 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00004619 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00004620 }
4621 sqlite3_free(zRes);
4622 }else
drh2db82112016-09-15 21:35:24 +00004623
drhc2ce0be2014-05-29 12:36:14 +00004624 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
4625 if( nArg==2 ){
4626 tryToClone(p, azArg[1]);
4627 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004628 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00004629 rc = 1;
4630 }
mistachkine31ae902014-02-06 01:15:29 +00004631 }else
4632
drhc2ce0be2014-05-29 12:36:14 +00004633 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004634 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00004635 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00004636 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00004637 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00004638 data.showHeader = 0;
4639 data.cMode = data.mode = MODE_List;
4640 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00004641 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00004642 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
4643 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00004644 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004645 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004646 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00004647 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00004648 }
4649 }else
4650
drh0e55db12015-02-06 14:51:13 +00004651 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
4652 rc = shell_dbinfo_command(p, nArg, azArg);
4653 }else
4654
drhc2ce0be2014-05-29 12:36:14 +00004655 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00004656 const char *zLike = 0;
4657 int i;
drhe6e1d122017-03-09 13:50:49 +00004658 ShellClearFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00004659 for(i=1; i<nArg; i++){
4660 if( azArg[i][0]=='-' ){
4661 const char *z = azArg[i]+1;
4662 if( z[0]=='-' ) z++;
4663 if( strcmp(z,"preserve-rowids")==0 ){
drhe6e1d122017-03-09 13:50:49 +00004664 ShellSetFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00004665 }else
4666 {
4667 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
4668 rc = 1;
4669 goto meta_command_exit;
4670 }
4671 }else if( zLike ){
4672 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? ?LIKE-PATTERN?\n");
4673 rc = 1;
4674 goto meta_command_exit;
4675 }else{
4676 zLike = azArg[i];
4677 }
4678 }
drh05782482013-10-24 15:20:20 +00004679 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00004680 /* When playing back a "dump", the content might appear in an order
4681 ** which causes immediate foreign key constraints to be violated.
4682 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00004683 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
4684 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00004685 p->writableSchema = 0;
drhe611f142017-03-08 11:44:00 +00004686 /* Set writable_schema=ON since doing so forces SQLite to initialize
4687 ** as much of the schema as it can even if the sqlite_master table is
4688 ** corrupt. */
drh56197952011-10-13 16:30:13 +00004689 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00004690 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00004691 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004692 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00004693 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004694 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00004695 );
mistachkin1fe36bb2016-04-04 02:16:44 +00004696 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00004697 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004698 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00004699 );
drh2f464a02011-10-13 00:41:49 +00004700 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00004701 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00004702 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00004703 );
drh4c653a02000-06-07 01:27:47 +00004704 }else{
drhe611f142017-03-08 11:44:00 +00004705 char *zSql;
4706 zSql = sqlite3_mprintf(
4707 "SELECT name, type, sql FROM sqlite_master "
4708 "WHERE tbl_name LIKE %Q AND type=='table'"
4709 " AND sql NOT NULL", zLike);
4710 run_schema_dump_query(p,zSql);
4711 sqlite3_free(zSql);
4712 zSql = sqlite3_mprintf(
4713 "SELECT sql FROM sqlite_master "
4714 "WHERE sql NOT NULL"
4715 " AND type IN ('index','trigger','view')"
4716 " AND tbl_name LIKE %Q", zLike);
4717 run_table_dump_query(p, zSql, 0);
4718 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00004719 }
drh45e29d82006-11-20 16:21:10 +00004720 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00004721 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00004722 p->writableSchema = 0;
4723 }
drh56197952011-10-13 16:30:13 +00004724 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4725 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00004726 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00004727 }else
drh75897232000-05-29 14:26:00 +00004728
drhc2ce0be2014-05-29 12:36:14 +00004729 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
4730 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00004731 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00004732 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004733 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004734 rc = 1;
4735 }
drhdaffd0e2001-04-11 14:28:42 +00004736 }else
4737
drhc2ce0be2014-05-29 12:36:14 +00004738 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
4739 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00004740 if( strcmp(azArg[1],"full")==0 ){
4741 p->autoEQP = 2;
4742 }else{
4743 p->autoEQP = booleanValue(azArg[1]);
4744 }
drhc2ce0be2014-05-29 12:36:14 +00004745 }else{
drheacd29d2016-04-15 15:03:27 +00004746 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00004747 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00004748 }
drhefbf3b12014-02-28 20:47:24 +00004749 }else
4750
drhd3ac7d92013-01-25 18:33:43 +00004751 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00004752 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00004753 rc = 2;
drh75897232000-05-29 14:26:00 +00004754 }else
4755
drhc2ce0be2014-05-29 12:36:14 +00004756 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00004757 int val = 1;
4758 if( nArg>=2 ){
4759 if( strcmp(azArg[1],"auto")==0 ){
4760 val = 99;
4761 }else{
4762 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00004763 }
drh700c2522016-02-09 18:39:25 +00004764 }
4765 if( val==1 && p->mode!=MODE_Explain ){
4766 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00004767 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00004768 p->autoExplain = 0;
4769 }else if( val==0 ){
4770 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4771 p->autoExplain = 0;
4772 }else if( val==99 ){
4773 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4774 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00004775 }
drh75897232000-05-29 14:26:00 +00004776 }else
4777
drhc1971542014-06-23 23:28:13 +00004778 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004779 ShellState data;
drhc1971542014-06-23 23:28:13 +00004780 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00004781 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00004782 memcpy(&data, p, sizeof(data));
4783 data.showHeader = 0;
4784 data.cMode = data.mode = MODE_Semi;
4785 if( nArg==2 && optionMatch(azArg[1], "indent") ){
4786 data.cMode = data.mode = MODE_Pretty;
4787 nArg = 1;
4788 }
drhc1971542014-06-23 23:28:13 +00004789 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00004790 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00004791 rc = 1;
4792 goto meta_command_exit;
4793 }
4794 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00004795 rc = sqlite3_exec(p->db,
4796 "SELECT sql FROM"
4797 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4798 " FROM sqlite_master UNION ALL"
4799 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00004800 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00004801 "ORDER BY rowid",
4802 callback, &data, &zErrMsg
4803 );
drh56f674c2014-07-18 14:43:29 +00004804 if( rc==SQLITE_OK ){
4805 sqlite3_stmt *pStmt;
4806 rc = sqlite3_prepare_v2(p->db,
4807 "SELECT rowid FROM sqlite_master"
4808 " WHERE name GLOB 'sqlite_stat[134]'",
4809 -1, &pStmt, 0);
4810 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
4811 sqlite3_finalize(pStmt);
4812 }
4813 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004814 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00004815 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004816 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004817 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
4818 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00004819 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00004820 data.zDestTable = "sqlite_stat1";
4821 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
4822 shell_callback, &data,&zErrMsg);
4823 data.zDestTable = "sqlite_stat3";
4824 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
4825 shell_callback, &data,&zErrMsg);
4826 data.zDestTable = "sqlite_stat4";
4827 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
4828 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00004829 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004830 }
drhc1971542014-06-23 23:28:13 +00004831 }else
4832
drhc2ce0be2014-05-29 12:36:14 +00004833 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
4834 if( nArg==2 ){
4835 p->showHeader = booleanValue(azArg[1]);
4836 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004837 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004838 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00004839 }
drh75897232000-05-29 14:26:00 +00004840 }else
4841
drhc2ce0be2014-05-29 12:36:14 +00004842 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004843 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00004844 }else
4845
4846 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00004847 char *zTable; /* Insert data into this table */
4848 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00004849 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00004850 int nCol; /* Number of columns in the table */
4851 int nByte; /* Number of bytes in an SQL string */
4852 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00004853 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00004854 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00004855 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00004856 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00004857 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
4858 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00004859
drhc2ce0be2014-05-29 12:36:14 +00004860 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004861 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00004862 goto meta_command_exit;
4863 }
drh01f37542014-05-31 15:43:33 +00004864 zFile = azArg[1];
4865 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00004866 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00004867 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00004868 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004869 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00004870 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004871 raw_printf(stderr,
4872 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00004873 return 1;
drhfeac5f82004-08-01 00:10:45 +00004874 }
drhdb95f682013-06-26 22:46:00 +00004875 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004876 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00004877 " for import\n");
4878 return 1;
4879 }
mistachkin636bf9f2014-07-19 20:15:16 +00004880 nSep = strlen30(p->rowSeparator);
4881 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004882 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004883 return 1;
4884 }
mistachkine0d68852014-12-11 03:12:33 +00004885 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
4886 /* When importing CSV (only), if the row separator is set to the
4887 ** default output row separator, change it to the default input
4888 ** row separator. This avoids having to maintain different input
4889 ** and output row separators. */
4890 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4891 nSep = strlen30(p->rowSeparator);
4892 }
mistachkin636bf9f2014-07-19 20:15:16 +00004893 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004894 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00004895 " for import\n");
4896 return 1;
4897 }
4898 sCtx.zFile = zFile;
4899 sCtx.nLine = 1;
4900 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004901#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00004902 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00004903 return 1;
4904#else
mistachkin636bf9f2014-07-19 20:15:16 +00004905 sCtx.in = popen(sCtx.zFile+1, "r");
4906 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00004907 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00004908#endif
drh5bde8162013-06-27 14:07:53 +00004909 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00004910 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00004911 xCloser = fclose;
4912 }
mistachkin636bf9f2014-07-19 20:15:16 +00004913 if( p->mode==MODE_Ascii ){
4914 xRead = ascii_read_one_field;
4915 }else{
4916 xRead = csv_read_one_field;
4917 }
4918 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004919 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00004920 return 1;
4921 }
mistachkin636bf9f2014-07-19 20:15:16 +00004922 sCtx.cColSep = p->colSeparator[0];
4923 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00004924 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00004925 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004926 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004927 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004928 return 1;
4929 }
drh4f21c4a2008-12-10 22:15:00 +00004930 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00004931 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004932 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00004933 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00004934 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
4935 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00004936 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00004937 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00004938 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00004939 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00004940 }
drh5bde8162013-06-27 14:07:53 +00004941 if( cSep=='(' ){
4942 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00004943 sqlite3_free(sCtx.z);
4944 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00004945 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00004946 return 1;
4947 }
drhdb95f682013-06-26 22:46:00 +00004948 zCreate = sqlite3_mprintf("%z\n)", zCreate);
4949 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
4950 sqlite3_free(zCreate);
4951 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004952 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00004953 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004954 sqlite3_free(sCtx.z);
4955 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00004956 return 1;
4957 }
drhc7181902014-02-27 15:04:13 +00004958 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004959 }
drhfeac5f82004-08-01 00:10:45 +00004960 sqlite3_free(zSql);
4961 if( rc ){
shane916f9612009-10-23 00:37:15 +00004962 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00004963 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004964 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004965 return 1;
drhfeac5f82004-08-01 00:10:45 +00004966 }
shane916f9612009-10-23 00:37:15 +00004967 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00004968 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00004969 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00004970 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00004971 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00004972 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004973 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004974 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004975 return 1;
4976 }
drhdb95f682013-06-26 22:46:00 +00004977 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00004978 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00004979 for(i=1; i<nCol; i++){
4980 zSql[j++] = ',';
4981 zSql[j++] = '?';
4982 }
4983 zSql[j++] = ')';
4984 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00004985 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004986 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00004987 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004988 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00004989 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00004990 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00004991 return 1;
drhfeac5f82004-08-01 00:10:45 +00004992 }
mistachkin8e189222015-04-19 21:43:16 +00004993 needCommit = sqlite3_get_autocommit(p->db);
4994 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00004995 do{
mistachkin636bf9f2014-07-19 20:15:16 +00004996 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00004997 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00004998 char *z = xRead(&sCtx);
4999 /*
5000 ** Did we reach end-of-file before finding any columns?
5001 ** If so, stop instead of NULL filling the remaining columns.
5002 */
drhdb95f682013-06-26 22:46:00 +00005003 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00005004 /*
5005 ** Did we reach end-of-file OR end-of-line before finding any
5006 ** columns in ASCII mode? If so, stop instead of NULL filling
5007 ** the remaining columns.
5008 */
5009 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00005010 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00005011 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00005012 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00005013 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00005014 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00005015 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00005016 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00005017 }
drhfeac5f82004-08-01 00:10:45 +00005018 }
mistachkin636bf9f2014-07-19 20:15:16 +00005019 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00005020 do{
mistachkin636bf9f2014-07-19 20:15:16 +00005021 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00005022 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00005023 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00005024 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00005025 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00005026 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00005027 }
drhdb95f682013-06-26 22:46:00 +00005028 if( i>=nCol ){
5029 sqlite3_step(pStmt);
5030 rc = sqlite3_reset(pStmt);
5031 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005032 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
5033 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00005034 }
5035 }
mistachkin636bf9f2014-07-19 20:15:16 +00005036 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00005037
mistachkin636bf9f2014-07-19 20:15:16 +00005038 xCloser(sCtx.in);
5039 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00005040 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00005041 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00005042 }else
5043
drhd12602a2016-12-07 15:49:02 +00005044#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00005045 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
5046 char *zSql;
5047 char *zCollist = 0;
5048 sqlite3_stmt *pStmt;
5049 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00005050 int i;
drh16eb5942016-11-03 13:01:38 +00005051 if( nArg!=3 ){
5052 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
5053 rc = 1;
5054 goto meta_command_exit;
5055 }
5056 open_db(p, 0);
5057 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
5058 " WHERE name='%q' AND type='index'", azArg[1]);
5059 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5060 sqlite3_free(zSql);
5061 if( sqlite3_step(pStmt)==SQLITE_ROW ){
5062 tnum = sqlite3_column_int(pStmt, 0);
5063 }
5064 sqlite3_finalize(pStmt);
5065 if( tnum==0 ){
5066 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
5067 rc = 1;
5068 goto meta_command_exit;
5069 }
5070 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
5071 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5072 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00005073 i = 0;
drh16eb5942016-11-03 13:01:38 +00005074 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00005075 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00005076 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00005077 i++;
5078 if( zCol==0 ){
5079 if( sqlite3_column_int(pStmt,1)==-1 ){
5080 zCol = "_ROWID_";
5081 }else{
5082 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
5083 zCol = zLabel;
5084 }
5085 }
drh16eb5942016-11-03 13:01:38 +00005086 if( zCollist==0 ){
5087 zCollist = sqlite3_mprintf("\"%w\"", zCol);
5088 }else{
5089 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
5090 }
5091 }
5092 sqlite3_finalize(pStmt);
5093 zSql = sqlite3_mprintf(
5094 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
5095 azArg[2], zCollist, zCollist);
5096 sqlite3_free(zCollist);
5097 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
5098 if( rc==SQLITE_OK ){
5099 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
5100 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
5101 if( rc ){
5102 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
5103 }else{
5104 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00005105 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00005106 "WARNING: writing to an imposter table will corrupt the index!\n"
5107 );
5108 }
5109 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00005110 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00005111 rc = 1;
5112 }
5113 sqlite3_free(zSql);
5114 }else
5115#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
5116
drhae5e4452007-05-03 17:18:36 +00005117#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00005118 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00005119 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00005120 if( iotrace && iotrace!=stdout ) fclose(iotrace);
5121 iotrace = 0;
5122 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00005123 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00005124 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00005125 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005126 iotrace = stdout;
5127 }else{
5128 iotrace = fopen(azArg[1], "w");
5129 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005130 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00005131 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00005132 rc = 1;
drhb0603412007-02-28 04:47:26 +00005133 }else{
mlcreech3a00f902008-03-04 17:45:01 +00005134 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005135 }
5136 }
5137 }else
drhae5e4452007-05-03 17:18:36 +00005138#endif
drh16eb5942016-11-03 13:01:38 +00005139
drh1a513372015-05-02 17:40:23 +00005140 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
5141 static const struct {
5142 const char *zLimitName; /* Name of a limit */
5143 int limitCode; /* Integer code for that limit */
5144 } aLimit[] = {
5145 { "length", SQLITE_LIMIT_LENGTH },
5146 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
5147 { "column", SQLITE_LIMIT_COLUMN },
5148 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
5149 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
5150 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
5151 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
5152 { "attached", SQLITE_LIMIT_ATTACHED },
5153 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
5154 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
5155 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
5156 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
5157 };
5158 int i, n2;
5159 open_db(p, 0);
5160 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00005161 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005162 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00005163 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
5164 }
5165 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005166 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00005167 rc = 1;
5168 goto meta_command_exit;
5169 }else{
5170 int iLimit = -1;
5171 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00005172 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00005173 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
5174 if( iLimit<0 ){
5175 iLimit = i;
5176 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005177 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00005178 rc = 1;
5179 goto meta_command_exit;
5180 }
5181 }
5182 }
5183 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005184 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00005185 "enter \".limits\" with no arguments for a list.\n",
5186 azArg[1]);
5187 rc = 1;
5188 goto meta_command_exit;
5189 }
5190 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00005191 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
5192 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00005193 }
5194 printf("%20s %d\n", aLimit[iLimit].zLimitName,
5195 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
5196 }
5197 }else
drhb0603412007-02-28 04:47:26 +00005198
dan3c7ebeb2016-12-16 17:28:56 +00005199 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00005200 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00005201 lintDotCommand(p, azArg, nArg);
5202 }else
5203
drh70df4fe2006-06-13 15:12:21 +00005204#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00005205 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00005206 const char *zFile, *zProc;
5207 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00005208 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005209 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00005210 rc = 1;
5211 goto meta_command_exit;
5212 }
drh1e397f82006-06-08 15:28:43 +00005213 zFile = azArg[1];
5214 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00005215 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00005216 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
5217 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005218 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00005219 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00005220 rc = 1;
drh1e397f82006-06-08 15:28:43 +00005221 }
5222 }else
drh70df4fe2006-06-13 15:12:21 +00005223#endif
drh1e397f82006-06-08 15:28:43 +00005224
drhc2ce0be2014-05-29 12:36:14 +00005225 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
5226 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005227 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005228 rc = 1;
5229 }else{
5230 const char *zFile = azArg[1];
5231 output_file_close(p->pLog);
5232 p->pLog = output_file_open(zFile);
5233 }
drh127f9d72010-02-23 01:47:00 +00005234 }else
5235
drhc2ce0be2014-05-29 12:36:14 +00005236 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
5237 const char *zMode = nArg>=2 ? azArg[1] : "";
5238 int n2 = (int)strlen(zMode);
5239 int c2 = zMode[0];
5240 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005241 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00005242 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005243 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005244 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00005245 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005246 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005247 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00005248 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
5249 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005250 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005251 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00005252 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005253 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00005254 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00005255 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005256 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00005257 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00005258 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00005259 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00005260 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005261 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00005262 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00005263 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00005264 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00005265 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00005266 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
5267 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00005268 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
5269 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00005270 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
5271 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00005272 }else {
mistachkinaae280e2015-12-31 19:06:24 +00005273 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00005274 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00005275 rc = 1;
drh75897232000-05-29 14:26:00 +00005276 }
drh700c2522016-02-09 18:39:25 +00005277 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00005278 }else
5279
drhc2ce0be2014-05-29 12:36:14 +00005280 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
5281 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00005282 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
5283 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005284 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005285 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00005286 rc = 1;
5287 }
5288 }else
5289
drh05782482013-10-24 15:20:20 +00005290 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00005291 char *zNewFilename; /* Name of the database file to open */
5292 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00005293 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00005294 /* Close the existing database */
5295 session_close_all(p);
5296 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00005297 p->db = 0;
dan21472212017-03-01 11:30:27 +00005298 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00005299 sqlite3_free(p->zFreeOnClose);
5300 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00005301 /* Check for command-line arguments */
5302 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
5303 const char *z = azArg[iName];
5304 if( optionMatch(z,"new") ){
5305 newFlag = 1;
5306 }else if( z[0]=='-' ){
5307 utf8_printf(stderr, "unknown option: %s\n", z);
5308 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00005309 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00005310 }
drhcd0509e2016-09-16 00:26:08 +00005311 }
5312 /* If a filename is specified, try to open it first */
5313 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
5314 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00005315 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00005316 p->zDbFilename = zNewFilename;
5317 open_db(p, 1);
5318 if( p->db==0 ){
5319 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
5320 sqlite3_free(zNewFilename);
5321 }else{
5322 p->zFreeOnClose = zNewFilename;
5323 }
5324 }
5325 if( p->db==0 ){
5326 /* As a fall-back open a TEMP database */
5327 p->zDbFilename = 0;
5328 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00005329 }
5330 }else
5331
drhc2ce0be2014-05-29 12:36:14 +00005332 if( c=='o'
5333 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
5334 ){
5335 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
5336 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005337 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00005338 rc = 1;
5339 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005340 }
drhc2ce0be2014-05-29 12:36:14 +00005341 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
5342 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005343 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005344 rc = 1;
5345 goto meta_command_exit;
5346 }
5347 p->outCount = 2;
5348 }else{
5349 p->outCount = 0;
5350 }
5351 output_reset(p);
5352 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005353#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005354 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005355 rc = 1;
5356 p->out = stdout;
5357#else
drhc2ce0be2014-05-29 12:36:14 +00005358 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00005359 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005360 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00005361 p->out = stdout;
5362 rc = 1;
5363 }else{
drhc2ce0be2014-05-29 12:36:14 +00005364 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00005365 }
drh8cd5b252015-03-02 22:06:43 +00005366#endif
drh75897232000-05-29 14:26:00 +00005367 }else{
drhc2ce0be2014-05-29 12:36:14 +00005368 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00005369 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00005370 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005371 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00005372 }
drh75897232000-05-29 14:26:00 +00005373 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00005374 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005375 } else {
drhc2ce0be2014-05-29 12:36:14 +00005376 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00005377 }
5378 }
5379 }else
5380
drh078b1fd2012-09-21 13:40:02 +00005381 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
5382 int i;
5383 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00005384 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00005385 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00005386 }
mistachkinaae280e2015-12-31 19:06:24 +00005387 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00005388 }else
5389
drhc2ce0be2014-05-29 12:36:14 +00005390 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00005391 if( nArg >= 2) {
5392 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
5393 }
5394 if( nArg >= 3) {
5395 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
5396 }
5397 }else
5398
drhc2ce0be2014-05-29 12:36:14 +00005399 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00005400 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00005401 }else
5402
drhc2ce0be2014-05-29 12:36:14 +00005403 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
5404 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00005405 if( nArg!=2 ){
5406 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005407 rc = 1;
5408 goto meta_command_exit;
5409 }
drh4e8142c2016-11-11 14:54:22 +00005410 alt = fopen(azArg[1], "rb");
5411 if( alt==0 ){
5412 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
5413 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00005414 }else{
drh4e8142c2016-11-11 14:54:22 +00005415 rc = process_input(p, alt);
5416 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00005417 }
5418 }else
5419
drhc2ce0be2014-05-29 12:36:14 +00005420 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00005421 const char *zSrcFile;
5422 const char *zDb;
5423 sqlite3 *pSrc;
5424 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00005425 int nTimeout = 0;
5426
drh9ff849f2009-02-04 20:55:57 +00005427 if( nArg==2 ){
5428 zSrcFile = azArg[1];
5429 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00005430 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00005431 zSrcFile = azArg[2];
5432 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00005433 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005434 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005435 rc = 1;
5436 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00005437 }
5438 rc = sqlite3_open(zSrcFile, &pSrc);
5439 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005440 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00005441 sqlite3_close(pSrc);
5442 return 1;
5443 }
drh05782482013-10-24 15:20:20 +00005444 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005445 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
5446 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005447 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00005448 sqlite3_close(pSrc);
5449 return 1;
5450 }
drhdc2c4912009-02-04 22:46:47 +00005451 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
5452 || rc==SQLITE_BUSY ){
5453 if( rc==SQLITE_BUSY ){
5454 if( nTimeout++ >= 3 ) break;
5455 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00005456 }
5457 }
5458 sqlite3_backup_finish(pBackup);
5459 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005460 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00005461 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00005462 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00005463 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005464 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005465 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00005466 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005467 }
5468 sqlite3_close(pSrc);
5469 }else
5470
dan8d1edb92014-11-05 09:07:28 +00005471
5472 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
5473 if( nArg==2 ){
5474 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00005475#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00005476 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00005477#endif
dan8d1edb92014-11-05 09:07:28 +00005478 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005479 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00005480 rc = 1;
5481 }
5482 }else
5483
drhc2ce0be2014-05-29 12:36:14 +00005484 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005485 ShellState data;
drh75897232000-05-29 14:26:00 +00005486 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005487 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00005488 memcpy(&data, p, sizeof(data));
5489 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00005490 data.cMode = data.mode = MODE_Semi;
drh4926fec2016-04-13 15:33:42 +00005491 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
5492 data.cMode = data.mode = MODE_Pretty;
5493 nArg--;
5494 if( nArg==2 ) azArg[1] = azArg[2];
5495 }
5496 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00005497 int i;
drhf0693c82011-10-11 20:41:54 +00005498 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00005499 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00005500 char *new_argv[2], *new_colv[2];
5501 new_argv[0] = "CREATE TABLE sqlite_master (\n"
5502 " type text,\n"
5503 " name text,\n"
5504 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00005505 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00005506 " sql text\n"
5507 ")";
5508 new_argv[1] = 0;
5509 new_colv[0] = "sql";
5510 new_colv[1] = 0;
5511 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005512 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00005513 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00005514 char *new_argv[2], *new_colv[2];
5515 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
5516 " type text,\n"
5517 " name text,\n"
5518 " tbl_name text,\n"
5519 " rootpage integer,\n"
5520 " sql text\n"
5521 ")";
5522 new_argv[1] = 0;
5523 new_colv[0] = "sql";
5524 new_colv[1] = 0;
5525 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005526 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00005527 }else{
drhe611f142017-03-08 11:44:00 +00005528 char *zSql;
5529 zSql = sqlite3_mprintf(
drhe0bc4042002-06-25 01:09:11 +00005530 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005531 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005532 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005533 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drhe611f142017-03-08 11:44:00 +00005534 "WHERE lower(tbl_name) LIKE %Q"
drh6ac7a582011-11-04 00:35:56 +00005535 " AND type!='meta' AND sql NOTNULL "
drhe611f142017-03-08 11:44:00 +00005536 "ORDER BY rowid", azArg[1]);
5537 rc = sqlite3_exec(p->db, zSql, callback, &data, &zErrMsg);
5538 sqlite3_free(zSql);
drha18c5682000-10-08 22:20:57 +00005539 }
drhc2ce0be2014-05-29 12:36:14 +00005540 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00005541 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00005542 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005543 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005544 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005545 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005546 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00005547 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00005548 callback, &data, &zErrMsg
5549 );
drhc2ce0be2014-05-29 12:36:14 +00005550 }else{
drh4926fec2016-04-13 15:33:42 +00005551 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00005552 rc = 1;
5553 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005554 }
drh75897232000-05-29 14:26:00 +00005555 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005556 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005557 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005558 rc = 1;
5559 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005560 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00005561 rc = 1;
5562 }else{
5563 rc = 0;
drh75897232000-05-29 14:26:00 +00005564 }
5565 }else
5566
drhabd4c722014-09-20 18:18:33 +00005567#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
5568 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00005569 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00005570 }else
5571#endif
5572
drhe6229612014-08-18 15:08:26 +00005573#if defined(SQLITE_ENABLE_SESSION)
5574 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
5575 OpenSession *pSession = &p->aSession[0];
5576 char **azCmd = &azArg[1];
5577 int iSes = 0;
5578 int nCmd = nArg - 1;
5579 int i;
5580 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00005581 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00005582 if( nArg>=3 ){
5583 for(iSes=0; iSes<p->nSession; iSes++){
5584 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
5585 }
5586 if( iSes<p->nSession ){
5587 pSession = &p->aSession[iSes];
5588 azCmd++;
5589 nCmd--;
5590 }else{
5591 pSession = &p->aSession[0];
5592 iSes = 0;
5593 }
5594 }
5595
drh3a67b042014-08-18 17:56:31 +00005596 /* .session attach TABLE
5597 ** Invoke the sqlite3session_attach() interface to attach a particular
5598 ** table so that it is never filtered.
5599 */
5600 if( strcmp(azCmd[0],"attach")==0 ){
5601 if( nCmd!=2 ) goto session_syntax_error;
5602 if( pSession->p==0 ){
5603 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00005604 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00005605 }else{
5606 rc = sqlite3session_attach(pSession->p, azCmd[1]);
5607 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005608 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005609 rc = 0;
5610 }
5611 }
5612 }else
5613
5614 /* .session changeset FILE
5615 ** .session patchset FILE
5616 ** Write a changeset or patchset into a file. The file is overwritten.
5617 */
5618 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
5619 FILE *out = 0;
5620 if( nCmd!=2 ) goto session_syntax_error;
5621 if( pSession->p==0 ) goto session_not_open;
5622 out = fopen(azCmd[1], "wb");
5623 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005624 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00005625 }else{
5626 int szChng;
5627 void *pChng;
5628 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00005629 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00005630 }else{
drh2967e0c2014-08-19 00:26:17 +00005631 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
5632 }
5633 if( rc ){
5634 printf("Error: error code %d\n", rc);
5635 rc = 0;
drh3a67b042014-08-18 17:56:31 +00005636 }
mistachkin1fe36bb2016-04-04 02:16:44 +00005637 if( pChng
drh3a67b042014-08-18 17:56:31 +00005638 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00005639 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00005640 szChng);
5641 }
5642 sqlite3_free(pChng);
5643 fclose(out);
5644 }
5645 }else
5646
drhe6229612014-08-18 15:08:26 +00005647 /* .session close
5648 ** Close the identified session
5649 */
5650 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00005651 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00005652 if( p->nSession ){
5653 session_close(pSession);
5654 p->aSession[iSes] = p->aSession[--p->nSession];
5655 }
5656 }else
5657
drh03168ca2014-08-18 20:01:31 +00005658 /* .session enable ?BOOLEAN?
5659 ** Query or set the enable flag
5660 */
5661 if( strcmp(azCmd[0], "enable")==0 ){
5662 int ii;
5663 if( nCmd>2 ) goto session_syntax_error;
5664 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5665 if( p->nSession ){
5666 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005667 utf8_printf(p->out, "session %s enable flag = %d\n",
5668 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005669 }
5670 }else
5671
5672 /* .session filter GLOB ....
5673 ** Set a list of GLOB patterns of table names to be excluded.
5674 */
5675 if( strcmp(azCmd[0], "filter")==0 ){
5676 int ii, nByte;
5677 if( nCmd<2 ) goto session_syntax_error;
5678 if( p->nSession ){
5679 for(ii=0; ii<pSession->nFilter; ii++){
5680 sqlite3_free(pSession->azFilter[ii]);
5681 }
5682 sqlite3_free(pSession->azFilter);
5683 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
5684 pSession->azFilter = sqlite3_malloc( nByte );
5685 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005686 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00005687 exit(1);
5688 }
5689 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005690 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00005691 }
5692 pSession->nFilter = ii-1;
5693 }
5694 }else
5695
5696 /* .session indirect ?BOOLEAN?
5697 ** Query or set the indirect flag
5698 */
5699 if( strcmp(azCmd[0], "indirect")==0 ){
5700 int ii;
5701 if( nCmd>2 ) goto session_syntax_error;
5702 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5703 if( p->nSession ){
5704 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005705 utf8_printf(p->out, "session %s indirect flag = %d\n",
5706 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005707 }
5708 }else
5709
5710 /* .session isempty
5711 ** Determine if the session is empty
5712 */
5713 if( strcmp(azCmd[0], "isempty")==0 ){
5714 int ii;
5715 if( nCmd!=1 ) goto session_syntax_error;
5716 if( p->nSession ){
5717 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00005718 utf8_printf(p->out, "session %s isempty flag = %d\n",
5719 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005720 }
5721 }else
5722
drhe6229612014-08-18 15:08:26 +00005723 /* .session list
5724 ** List all currently open sessions
5725 */
5726 if( strcmp(azCmd[0],"list")==0 ){
5727 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00005728 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00005729 }
5730 }else
5731
5732 /* .session open DB NAME
5733 ** Open a new session called NAME on the attached database DB.
5734 ** DB is normally "main".
5735 */
5736 if( strcmp(azCmd[0],"open")==0 ){
5737 char *zName;
5738 if( nCmd!=3 ) goto session_syntax_error;
5739 zName = azCmd[2];
5740 if( zName[0]==0 ) goto session_syntax_error;
5741 for(i=0; i<p->nSession; i++){
5742 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005743 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00005744 goto meta_command_exit;
5745 }
5746 }
5747 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00005748 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00005749 goto meta_command_exit;
5750 }
5751 pSession = &p->aSession[p->nSession];
5752 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
5753 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005754 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005755 rc = 0;
drhe6229612014-08-18 15:08:26 +00005756 goto meta_command_exit;
5757 }
drh03168ca2014-08-18 20:01:31 +00005758 pSession->nFilter = 0;
5759 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00005760 p->nSession++;
5761 pSession->zName = sqlite3_mprintf("%s", zName);
5762 }else
5763 /* If no command name matches, show a syntax error */
5764 session_syntax_error:
5765 session_help(p);
5766 }else
5767#endif
5768
drh340f5822013-06-27 13:01:21 +00005769#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00005770 /* Undocumented commands for internal testing. Subject to change
5771 ** without notice. */
5772 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
5773 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
5774 int i, v;
5775 for(i=1; i<nArg; i++){
5776 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00005777 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00005778 }
5779 }
5780 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
5781 int i; sqlite3_int64 v;
5782 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00005783 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00005784 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00005785 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00005786 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00005787 }
5788 }
5789 }else
drh340f5822013-06-27 13:01:21 +00005790#endif
drh348d19c2013-06-03 12:47:43 +00005791
drhfb546af2017-03-09 22:00:33 +00005792 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
5793 int bIsInit = 0; /* True to initialize the SELFTEST table */
5794 int bVerbose = 0; /* Verbose output */
5795 int bSelftestExists; /* True if SELFTEST already exists */
5796 char **azTest = 0; /* Content of the SELFTEST table */
5797 int nRow = 0; /* Number of rows in the SELFTEST table */
5798 int nCol = 4; /* Number of columns in the SELFTEST table */
5799 int i; /* Loop counter */
5800 int nTest = 0; /* Number of tests runs */
5801 int nErr = 0; /* Number of errors seen */
5802 ShellText str; /* Answer for a query */
5803 static char *azDefaultTest[] = {
5804 0, 0, 0, 0,
5805 "0", "memo", "Missing SELFTEST table - default checks only", "",
5806 "1", "run", "PRAGMA integrity_check", "ok"
5807 };
5808 static const int nDefaultRow = 2;
5809
5810 open_db(p,0);
5811 for(i=1; i<nArg; i++){
5812 const char *z = azArg[i];
5813 if( z[0]=='-' && z[1]=='-' ) z++;
5814 if( strcmp(z,"-init")==0 ){
5815 bIsInit = 1;
5816 }else
5817 if( strcmp(z,"-v")==0 ){
5818 bVerbose++;
5819 }else
5820 {
5821 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
5822 azArg[i], azArg[0]);
5823 raw_printf(stderr, "Should be one of: --init -v\n");
5824 rc = 1;
5825 goto meta_command_exit;
5826 }
5827 }
5828 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
5829 != SQLITE_OK ){
5830 bSelftestExists = 0;
5831 }else{
5832 bSelftestExists = 1;
5833 }
5834 if( bIsInit ){
drhfb546af2017-03-09 22:00:33 +00005835 createSelftestTable(p);
5836 bSelftestExists = 1;
5837 }
5838 if( bSelftestExists ){
5839 rc = sqlite3_get_table(p->db,
5840 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
5841 &azTest, &nRow, &nCol, 0);
5842 if( rc ){
5843 raw_printf(stderr, "Error querying the selftest table\n");
5844 rc = 1;
5845 sqlite3_free_table(azTest);
5846 goto meta_command_exit;
5847 }else if( nRow==0 ){
5848 sqlite3_free_table(azTest);
5849 azTest = azDefaultTest;
5850 nRow = nDefaultRow;
5851 }
5852 }else{
5853 azTest = azDefaultTest;
5854 nRow = nDefaultRow;
5855 }
5856 initText(&str);
5857 appendText(&str, "x", 0);
5858 for(i=1; i<=nRow; i++){
5859 int tno = atoi(azTest[i*nCol]);
5860 const char *zOp = azTest[i*nCol+1];
5861 const char *zSql = azTest[i*nCol+2];
5862 const char *zAns = azTest[i*nCol+3];
5863
5864 if( bVerbose>0 ){
5865 char *zQuote = sqlite3_mprintf("%q", zSql);
5866 printf("%d: %s %s\n", tno, zOp, zSql);
5867 sqlite3_free(zQuote);
5868 }
5869 if( strcmp(zOp,"memo")==0 ){
5870 utf8_printf(p->out, "%s\n", zSql);
5871 }else
5872 if( strcmp(zOp,"run")==0 ){
5873 char *zErrMsg = 0;
5874 str.n = 0;
5875 str.z[0] = 0;
5876 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
5877 nTest++;
5878 if( bVerbose ){
5879 utf8_printf(p->out, "Result: %s\n", str.z);
5880 }
5881 if( rc || zErrMsg ){
5882 nErr++;
5883 rc = 1;
5884 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
5885 sqlite3_free(zErrMsg);
5886 }else if( strcmp(zAns,str.z)!=0 ){
5887 nErr++;
5888 rc = 1;
5889 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
5890 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
5891 }
5892 }else
5893 {
5894 utf8_printf(stderr,
5895 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
5896 rc = 1;
5897 break;
5898 }
5899 }
5900 freeText(&str);
5901 if( azTest!=azDefaultTest ) sqlite3_free_table(azTest);
5902 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
5903 }else
5904
drhc2ce0be2014-05-29 12:36:14 +00005905 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00005906 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005907 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00005908 rc = 1;
5909 }
drh6976c212014-07-24 12:09:47 +00005910 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00005911 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00005912 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00005913 }
5914 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00005915 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
5916 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00005917 }
drh75897232000-05-29 14:26:00 +00005918 }else
5919
drh1554bc82017-03-08 16:10:34 +00005920 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
5921 const char *zLike = 0; /* Which table to checksum. 0 means everything */
5922 int i; /* Loop counter */
5923 int bSchema = 0; /* Also hash the schema */
drh3ee83ef2017-03-08 17:56:54 +00005924 int bSeparate = 0; /* Hash each table separately */
drh1554bc82017-03-08 16:10:34 +00005925 int iSize = 224; /* Hash algorithm to use */
5926 int bDebug = 0; /* Only show the query that would have run */
5927 sqlite3_stmt *pStmt; /* For querying tables names */
5928 char *zSql; /* SQL to be run */
drh3ee83ef2017-03-08 17:56:54 +00005929 char *zSep; /* Separator */
5930 ShellText sSql; /* Complete SQL for the query to run the hash */
drh1554bc82017-03-08 16:10:34 +00005931 ShellText sQuery; /* Set of queries used to read all content */
drhf80d4ff2017-03-08 18:06:20 +00005932 open_db(p, 0);
drh1554bc82017-03-08 16:10:34 +00005933 for(i=1; i<nArg; i++){
5934 const char *z = azArg[i];
5935 if( z[0]=='-' ){
5936 z++;
5937 if( z[0]=='-' ) z++;
5938 if( strcmp(z,"schema")==0 ){
5939 bSchema = 1;
5940 }else
5941 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
5942 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
5943 ){
5944 iSize = atoi(&z[5]);
5945 }else
5946 if( strcmp(z,"debug")==0 ){
5947 bDebug = 1;
5948 }else
5949 {
5950 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
drh3ee83ef2017-03-08 17:56:54 +00005951 azArg[i], azArg[0]);
drh1554bc82017-03-08 16:10:34 +00005952 raw_printf(stderr, "Should be one of: --schema"
5953 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
5954 rc = 1;
5955 goto meta_command_exit;
5956 }
5957 }else if( zLike ){
5958 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
5959 rc = 1;
5960 goto meta_command_exit;
5961 }else{
5962 zLike = z;
drh3ee83ef2017-03-08 17:56:54 +00005963 bSeparate = 1;
5964 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
drh1554bc82017-03-08 16:10:34 +00005965 }
5966 }
5967 if( bSchema ){
5968 zSql = "SELECT lower(name) FROM sqlite_master"
5969 " WHERE type='table' AND coalesce(rootpage,0)>1"
5970 " UNION ALL SELECT 'sqlite_master'"
5971 " ORDER BY 1 collate nocase";
5972 }else{
5973 zSql = "SELECT lower(name) FROM sqlite_master"
5974 " WHERE type='table' AND coalesce(rootpage,0)>1"
5975 " AND name NOT LIKE 'sqlite_%'"
5976 " ORDER BY 1 collate nocase";
5977 }
5978 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5979 initText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00005980 initText(&sSql);
5981 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
5982 zSep = "VALUES(";
drh1554bc82017-03-08 16:10:34 +00005983 while( SQLITE_ROW==sqlite3_step(pStmt) ){
5984 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
5985 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
5986 if( strncmp(zTab, "sqlite_",7)!=0 ){
5987 appendText(&sQuery,"SELECT * FROM ", 0);
5988 appendText(&sQuery,zTab,'"');
5989 appendText(&sQuery," NOT INDEXED;", 0);
5990 }else if( strcmp(zTab, "sqlite_master")==0 ){
5991 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
5992 " ORDER BY name;", 0);
5993 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
5994 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
5995 " ORDER BY name;", 0);
5996 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
5997 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
5998 " ORDER BY tbl,idx;", 0);
5999 }else if( strcmp(zTab, "sqlite_stat3")==0
6000 || strcmp(zTab, "sqlite_stat4")==0 ){
6001 appendText(&sQuery, "SELECT * FROM ", 0);
6002 appendText(&sQuery, zTab, 0);
6003 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
6004 }
drh3ee83ef2017-03-08 17:56:54 +00006005 appendText(&sSql, zSep, 0);
6006 appendText(&sSql, sQuery.z, '\'');
6007 sQuery.n = 0;
6008 appendText(&sSql, ",", 0);
6009 appendText(&sSql, zTab, '\'');
6010 zSep = "),(";
drh1554bc82017-03-08 16:10:34 +00006011 }
6012 sqlite3_finalize(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00006013 if( bSeparate ){
6014 zSql = sqlite3_mprintf(
6015 "%s))"
6016 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
6017 " FROM [sha3sum$query]",
6018 sSql.z, iSize);
6019 }else{
6020 zSql = sqlite3_mprintf(
6021 "%s))"
6022 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
6023 " FROM [sha3sum$query]",
6024 sSql.z, iSize);
6025 }
drh1554bc82017-03-08 16:10:34 +00006026 freeText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00006027 freeText(&sSql);
drh1554bc82017-03-08 16:10:34 +00006028 if( bDebug ){
6029 utf8_printf(p->out, "%s\n", zSql);
6030 }else{
6031 shell_exec(p->db, zSql, shell_callback, p, 0);
6032 }
6033 sqlite3_free(zSql);
6034 }else
6035
drh62cdde52014-05-28 20:22:28 +00006036 if( c=='s'
6037 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00006038 ){
6039 char *zCmd;
drh54027102014-08-06 14:36:53 +00006040 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00006041 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006042 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00006043 rc = 1;
6044 goto meta_command_exit;
6045 }
drhdcb3e3d2014-05-29 03:17:29 +00006046 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00006047 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00006048 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
6049 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00006050 }
drh54027102014-08-06 14:36:53 +00006051 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00006052 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00006053 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00006054 }else
6055
drhc2ce0be2014-05-29 12:36:14 +00006056 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00006057 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00006058 int i;
drhc2ce0be2014-05-29 12:36:14 +00006059 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00006060 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00006061 rc = 1;
6062 goto meta_command_exit;
6063 }
drhe6e1d122017-03-09 13:50:49 +00006064 utf8_printf(p->out, "%12.12s: %s\n","echo",
6065 azBool[ShellHasFlag(p, SHFLG_Echo)]);
drheacd29d2016-04-15 15:03:27 +00006066 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00006067 utf8_printf(p->out, "%12.12s: %s\n","explain",
6068 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00006069 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00006070 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
6071 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00006072 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00006073 raw_printf(p->out, "\n");
6074 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00006075 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00006076 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00006077 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00006078 raw_printf(p->out, "\n");
6079 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00006080 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00006081 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00006082 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00006083 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00006084 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00006085 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00006086 }
mistachkinaae280e2015-12-31 19:06:24 +00006087 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00006088 utf8_printf(p->out, "%12.12s: %s\n", "filename",
6089 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00006090 }else
6091
drhc2ce0be2014-05-29 12:36:14 +00006092 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
6093 if( nArg==2 ){
6094 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00006095 }else if( nArg==1 ){
6096 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006097 }else{
drh34784902016-02-27 17:12:36 +00006098 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00006099 rc = 1;
6100 }
shaneh642d8b82010-07-28 16:05:34 +00006101 }else
6102
drh6a5a4202016-12-24 21:32:40 +00006103 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
6104 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
6105 || strncmp(azArg[0], "indexes", n)==0) )
6106 ){
drh98781232012-04-23 12:38:05 +00006107 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00006108 char **azResult;
drh98781232012-04-23 12:38:05 +00006109 int nRow, nAlloc;
6110 char *zSql = 0;
6111 int ii;
drh05782482013-10-24 15:20:20 +00006112 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00006113 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00006114 if( rc ) return shellDatabaseError(p->db);
6115
6116 /* Create an SQL statement to query for the list of tables in the
6117 ** main and all attached databases where the table name matches the
6118 ** LIKE pattern bound to variable "?1". */
drh6a5a4202016-12-24 21:32:40 +00006119 if( c=='t' ){
6120 zSql = sqlite3_mprintf(
6121 "SELECT name FROM sqlite_master"
6122 " WHERE type IN ('table','view')"
6123 " AND name NOT LIKE 'sqlite_%%'"
6124 " AND name LIKE ?1");
6125 }else if( nArg>2 ){
6126 /* It is an historical accident that the .indexes command shows an error
6127 ** when called with the wrong number of arguments whereas the .tables
6128 ** command does not. */
6129 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
6130 rc = 1;
6131 goto meta_command_exit;
6132 }else{
6133 zSql = sqlite3_mprintf(
6134 "SELECT name FROM sqlite_master"
6135 " WHERE type='index'"
6136 " AND tbl_name LIKE ?1");
6137 }
drha4b81d22016-12-24 18:04:28 +00006138 for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00006139 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drha4b81d22016-12-24 18:04:28 +00006140 if( zDbName==0 || ii==0 ) continue;
drh6a5a4202016-12-24 21:32:40 +00006141 if( c=='t' ){
drh98781232012-04-23 12:38:05 +00006142 zSql = sqlite3_mprintf(
6143 "%z UNION ALL "
6144 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
6145 " WHERE type IN ('table','view')"
6146 " AND name NOT LIKE 'sqlite_%%'"
6147 " AND name LIKE ?1", zSql, zDbName, zDbName);
drh6a5a4202016-12-24 21:32:40 +00006148 }else{
6149 zSql = sqlite3_mprintf(
6150 "%z UNION ALL "
6151 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
6152 " WHERE type='index'"
6153 " AND tbl_name LIKE ?1", zSql, zDbName, zDbName);
drh98781232012-04-23 12:38:05 +00006154 }
drha50da102000-08-08 20:19:09 +00006155 }
dand95bb392015-09-30 11:19:05 +00006156 rc = sqlite3_finalize(pStmt);
6157 if( zSql && rc==SQLITE_OK ){
6158 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
6159 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6160 }
drh98781232012-04-23 12:38:05 +00006161 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00006162 if( !zSql ) return shellNomemError();
6163 if( rc ) return shellDatabaseError(p->db);
6164
6165 /* Run the SQL statement prepared by the above block. Store the results
6166 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00006167 nRow = nAlloc = 0;
6168 azResult = 0;
6169 if( nArg>1 ){
6170 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00006171 }else{
drh98781232012-04-23 12:38:05 +00006172 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
6173 }
6174 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6175 if( nRow>=nAlloc ){
6176 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00006177 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00006178 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00006179 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00006180 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00006181 break;
6182 }
mistachkin8e189222015-04-19 21:43:16 +00006183 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00006184 azResult = azNew;
6185 }
6186 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00006187 if( 0==azResult[nRow] ){
6188 rc = shellNomemError();
6189 break;
6190 }
6191 nRow++;
drh98781232012-04-23 12:38:05 +00006192 }
dand95bb392015-09-30 11:19:05 +00006193 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
6194 rc = shellDatabaseError(p->db);
6195 }
6196
6197 /* Pretty-print the contents of array azResult[] to the output */
6198 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00006199 int len, maxlen = 0;
6200 int i, j;
6201 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00006202 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00006203 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00006204 if( len>maxlen ) maxlen = len;
6205 }
6206 nPrintCol = 80/(maxlen+2);
6207 if( nPrintCol<1 ) nPrintCol = 1;
6208 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
6209 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00006210 for(j=i; j<nRow; j+=nPrintRow){
6211 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00006212 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
6213 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00006214 }
mistachkinaae280e2015-12-31 19:06:24 +00006215 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00006216 }
6217 }
dand95bb392015-09-30 11:19:05 +00006218
drh98781232012-04-23 12:38:05 +00006219 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
6220 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00006221 }else
6222
drh2db82112016-09-15 21:35:24 +00006223 /* Begin redirecting output to the file "testcase-out.txt" */
6224 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
6225 output_reset(p);
6226 p->out = output_file_open("testcase-out.txt");
6227 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00006228 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00006229 }
drh760c8162016-09-16 02:52:22 +00006230 if( nArg>=2 ){
6231 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
6232 }else{
6233 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
6234 }
drh2db82112016-09-15 21:35:24 +00006235 }else
drh2db82112016-09-15 21:35:24 +00006236
drhd12602a2016-12-07 15:49:02 +00006237#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00006238 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00006239 static const struct {
6240 const char *zCtrlName; /* Name of a test-control option */
6241 int ctrlCode; /* Integer code for that option */
6242 } aCtrl[] = {
6243 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
6244 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
6245 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
6246 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
6247 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
6248 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
6249 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
6250 { "assert", SQLITE_TESTCTRL_ASSERT },
6251 { "always", SQLITE_TESTCTRL_ALWAYS },
6252 { "reserve", SQLITE_TESTCTRL_RESERVE },
6253 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
6254 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00006255 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00006256 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00006257 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00006258 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00006259 };
shaneh96887e12011-02-10 21:08:58 +00006260 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00006261 int rc2 = 0;
6262 int i, n2;
drh05782482013-10-24 15:20:20 +00006263 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00006264
drhd416fe72011-03-17 16:45:50 +00006265 /* convert testctrl text option to value. allow any unique prefix
6266 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00006267 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006268 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00006269 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00006270 if( testctrl<0 ){
6271 testctrl = aCtrl[i].ctrlCode;
6272 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006273 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00006274 testctrl = -1;
6275 break;
6276 }
6277 }
6278 }
drh348d19c2013-06-03 12:47:43 +00006279 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006280 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00006281 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006282 }else{
6283 switch(testctrl){
6284
6285 /* sqlite3_test_control(int, db, int) */
6286 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00006287 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00006288 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006289 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00006290 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006291 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006292 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006293 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006294 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006295 }
6296 break;
6297
6298 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00006299 case SQLITE_TESTCTRL_PRNG_SAVE:
6300 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00006301 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00006302 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00006303 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00006304 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00006305 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006306 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006307 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
6308 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006309 }
6310 break;
6311
6312 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006313 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00006314 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00006315 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006316 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006317 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006318 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006319 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00006320 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006321 }
6322 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00006323
shaneh96887e12011-02-10 21:08:58 +00006324 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006325 case SQLITE_TESTCTRL_ASSERT:
6326 case SQLITE_TESTCTRL_ALWAYS:
6327 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00006328 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006329 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006330 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006331 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006332 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006333 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006334 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006335 }
6336 break;
6337
6338 /* sqlite3_test_control(int, char *) */
6339#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00006340 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00006341 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006342 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00006343 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006344 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006345 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006346 utf8_printf(stderr,
6347 "Error: testctrl %s takes a single char * option\n",
6348 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006349 }
6350 break;
6351#endif
6352
drh1ffede82015-01-30 20:59:27 +00006353 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00006354 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006355 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00006356 azArg[2],
drh8964b342015-01-29 17:54:52 +00006357 integerValue(azArg[3]),
6358 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00006359 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00006360 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006361 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00006362 }
6363 break;
6364
mistachkin1fe36bb2016-04-04 02:16:44 +00006365 case SQLITE_TESTCTRL_BITVEC_TEST:
6366 case SQLITE_TESTCTRL_FAULT_INSTALL:
6367 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
6368 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00006369 default:
mistachkinaae280e2015-12-31 19:06:24 +00006370 utf8_printf(stderr,
6371 "Error: CLI support for testctrl %s not implemented\n",
6372 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006373 break;
6374 }
6375 }
6376 }else
drhf1969722017-02-17 23:52:00 +00006377#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00006378
drhc2ce0be2014-05-29 12:36:14 +00006379 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00006380 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006381 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00006382 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006383
drhc2ce0be2014-05-29 12:36:14 +00006384 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
6385 if( nArg==2 ){
6386 enableTimer = booleanValue(azArg[1]);
6387 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00006388 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00006389 enableTimer = 0;
6390 }
6391 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006392 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006393 rc = 1;
6394 }
shanehe2aa9d72009-11-06 17:20:17 +00006395 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006396
drhc2ce0be2014-05-29 12:36:14 +00006397 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00006398 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006399 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006400 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006401 rc = 1;
6402 goto meta_command_exit;
6403 }
drh657b4a82015-03-19 13:30:41 +00006404 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006405 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00006406#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00006407 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00006408 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00006409 }else{
drh4b363a52016-07-23 20:27:41 +00006410 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006411 }
6412#endif
6413 }else
6414
drhf442e332014-09-10 19:01:14 +00006415#if SQLITE_USER_AUTHENTICATION
6416 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
6417 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006418 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00006419 rc = 1;
6420 goto meta_command_exit;
6421 }
drh7883ecf2014-09-11 16:19:31 +00006422 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00006423 if( strcmp(azArg[1],"login")==0 ){
6424 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00006425 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00006426 rc = 1;
6427 goto meta_command_exit;
6428 }
drhd39c40f2014-09-11 00:27:53 +00006429 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
6430 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00006431 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006432 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00006433 rc = 1;
6434 }
6435 }else if( strcmp(azArg[1],"add")==0 ){
6436 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006437 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006438 rc = 1;
6439 goto meta_command_exit;
6440 }
drhd39c40f2014-09-11 00:27:53 +00006441 rc = sqlite3_user_add(p->db, azArg[2],
6442 azArg[3], (int)strlen(azArg[3]),
6443 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006444 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006445 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006446 rc = 1;
6447 }
6448 }else if( strcmp(azArg[1],"edit")==0 ){
6449 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006450 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006451 rc = 1;
6452 goto meta_command_exit;
6453 }
drhd39c40f2014-09-11 00:27:53 +00006454 rc = sqlite3_user_change(p->db, azArg[2],
6455 azArg[3], (int)strlen(azArg[3]),
6456 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006457 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006458 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006459 rc = 1;
6460 }
6461 }else if( strcmp(azArg[1],"delete")==0 ){
6462 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006463 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00006464 rc = 1;
6465 goto meta_command_exit;
6466 }
6467 rc = sqlite3_user_delete(p->db, azArg[2]);
6468 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006469 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006470 rc = 1;
6471 }
6472 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006473 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00006474 rc = 1;
6475 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00006476 }
drhf442e332014-09-10 19:01:14 +00006477 }else
6478#endif /* SQLITE_USER_AUTHENTICATION */
6479
drh9fd301b2011-06-03 13:28:22 +00006480 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006481 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00006482 sqlite3_libversion(), sqlite3_sourceid());
6483 }else
6484
drh790f2872015-11-28 18:06:36 +00006485 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
6486 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00006487 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00006488 if( p->db ){
6489 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
6490 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00006491 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
6492 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6493 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6494 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00006495 }
6496 }
6497 }else
6498
drhb19e7352016-01-12 19:37:20 +00006499 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
6500 sqlite3_vfs *pVfs;
6501 sqlite3_vfs *pCurrent = 0;
6502 if( p->db ){
6503 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
6504 }
6505 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
6506 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
6507 pVfs==pCurrent ? " <--- CURRENT" : "");
6508 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6509 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6510 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6511 if( pVfs->pNext ){
6512 raw_printf(p->out, "-----------------------------------\n");
6513 }
6514 }
6515 }else
6516
drhde60fc22011-12-14 17:53:36 +00006517 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
6518 const char *zDbName = nArg==2 ? azArg[1] : "main";
6519 char *zVfsName = 0;
6520 if( p->db ){
6521 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
6522 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00006523 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00006524 sqlite3_free(zVfsName);
6525 }
6526 }
6527 }else
6528
drhcef4fc82012-09-21 22:50:45 +00006529#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
6530 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006531 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00006532 }else
6533#endif
6534
drhc2ce0be2014-05-29 12:36:14 +00006535 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00006536 int j;
drh43617e92006-03-06 20:55:46 +00006537 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00006538 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00006539 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00006540 }
6541 }else
6542
6543 {
mistachkinaae280e2015-12-31 19:06:24 +00006544 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00006545 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00006546 rc = 1;
drh75897232000-05-29 14:26:00 +00006547 }
drh67505e72002-04-19 12:34:06 +00006548
drhc2ce0be2014-05-29 12:36:14 +00006549meta_command_exit:
6550 if( p->outCount ){
6551 p->outCount--;
6552 if( p->outCount==0 ) output_reset(p);
6553 }
drh67505e72002-04-19 12:34:06 +00006554 return rc;
drh75897232000-05-29 14:26:00 +00006555}
6556
drh67505e72002-04-19 12:34:06 +00006557/*
drh91a66392007-09-07 01:12:32 +00006558** Return TRUE if a semicolon occurs anywhere in the first N characters
6559** of string z[].
drh324ccef2003-02-05 14:06:20 +00006560*/
drh9f099fd2013-08-06 14:01:46 +00006561static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00006562 int i;
6563 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
6564 return 0;
drh324ccef2003-02-05 14:06:20 +00006565}
6566
6567/*
drh70c7a4b2003-04-26 03:03:06 +00006568** Test to see if a line consists entirely of whitespace.
6569*/
6570static int _all_whitespace(const char *z){
6571 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00006572 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00006573 if( *z=='/' && z[1]=='*' ){
6574 z += 2;
6575 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
6576 if( *z==0 ) return 0;
6577 z++;
6578 continue;
6579 }
6580 if( *z=='-' && z[1]=='-' ){
6581 z += 2;
6582 while( *z && *z!='\n' ){ z++; }
6583 if( *z==0 ) return 1;
6584 continue;
6585 }
6586 return 0;
6587 }
6588 return 1;
6589}
6590
6591/*
drha9b17162003-04-29 18:01:28 +00006592** Return TRUE if the line typed in is an SQL command terminator other
6593** than a semi-colon. The SQL Server style "go" command is understood
6594** as is the Oracle "/".
6595*/
drh9f099fd2013-08-06 14:01:46 +00006596static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00006597 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00006598 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
6599 return 1; /* Oracle */
6600 }
drhf0693c82011-10-11 20:41:54 +00006601 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00006602 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00006603 return 1; /* SQL Server */
6604 }
6605 return 0;
6606}
6607
6608/*
drh233a5312008-12-18 22:25:13 +00006609** Return true if zSql is a complete SQL statement. Return false if it
6610** ends in the middle of a string literal or C-style comment.
6611*/
drh9f099fd2013-08-06 14:01:46 +00006612static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00006613 int rc;
6614 if( zSql==0 ) return 1;
6615 zSql[nSql] = ';';
6616 zSql[nSql+1] = 0;
6617 rc = sqlite3_complete(zSql);
6618 zSql[nSql] = 0;
6619 return rc;
6620}
6621
6622/*
drh4e8142c2016-11-11 14:54:22 +00006623** Run a single line of SQL
6624*/
6625static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
6626 int rc;
6627 char *zErrMsg = 0;
6628
6629 open_db(p, 0);
drhe6e1d122017-03-09 13:50:49 +00006630 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
drh4e8142c2016-11-11 14:54:22 +00006631 BEGIN_TIMER;
6632 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
6633 END_TIMER;
6634 if( rc || zErrMsg ){
6635 char zPrefix[100];
6636 if( in!=0 || !stdin_is_interactive ){
6637 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
6638 "Error: near line %d:", startline);
6639 }else{
6640 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
6641 }
6642 if( zErrMsg!=0 ){
6643 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
6644 sqlite3_free(zErrMsg);
6645 zErrMsg = 0;
6646 }else{
6647 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
6648 }
6649 return 1;
drhe6e1d122017-03-09 13:50:49 +00006650 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
drh4e8142c2016-11-11 14:54:22 +00006651 raw_printf(p->out, "changes: %3d total_changes: %d\n",
6652 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
6653 }
6654 return 0;
6655}
6656
6657
6658/*
drh67505e72002-04-19 12:34:06 +00006659** Read input from *in and process it. If *in==0 then input
6660** is interactive - the user is typing it it. Otherwise, input
6661** is coming from a file or device. A prompt is issued and history
6662** is saved only if input is interactive. An interrupt signal will
6663** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00006664**
6665** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00006666*/
drhdcd87a92014-08-18 13:45:42 +00006667static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00006668 char *zLine = 0; /* A single input line */
6669 char *zSql = 0; /* Accumulated SQL text */
6670 int nLine; /* Length of current line */
6671 int nSql = 0; /* Bytes of zSql[] used */
6672 int nAlloc = 0; /* Allocated zSql[] space */
6673 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00006674 int rc; /* Error code */
6675 int errCnt = 0; /* Number of errors seen */
6676 int lineno = 0; /* Current line number */
6677 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00006678
6679 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
6680 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00006681 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00006682 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00006683 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00006684 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00006685 break;
drhc49f44e2006-10-26 18:15:42 +00006686 }
drh67505e72002-04-19 12:34:06 +00006687 if( seenInterrupt ){
6688 if( in!=0 ) break;
6689 seenInterrupt = 0;
6690 }
drhc28490c2006-10-26 14:25:58 +00006691 lineno++;
drh849a9d92013-12-21 15:46:06 +00006692 if( nSql==0 && _all_whitespace(zLine) ){
drhe6e1d122017-03-09 13:50:49 +00006693 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drh849a9d92013-12-21 15:46:06 +00006694 continue;
6695 }
drh2af0b2d2002-02-21 02:25:02 +00006696 if( zLine && zLine[0]=='.' && nSql==0 ){
drhe6e1d122017-03-09 13:50:49 +00006697 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00006698 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00006699 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00006700 break;
6701 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00006702 errCnt++;
6703 }
drhdaffd0e2001-04-11 14:28:42 +00006704 continue;
6705 }
drh9f099fd2013-08-06 14:01:46 +00006706 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00006707 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00006708 }
drh9f099fd2013-08-06 14:01:46 +00006709 nLine = strlen30(zLine);
6710 if( nSql+nLine+2>=nAlloc ){
6711 nAlloc = nSql+nLine+100;
6712 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00006713 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006714 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00006715 exit(1);
6716 }
drhdaffd0e2001-04-11 14:28:42 +00006717 }
drh9f099fd2013-08-06 14:01:46 +00006718 nSqlPrior = nSql;
6719 if( nSql==0 ){
6720 int i;
6721 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00006722 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00006723 memcpy(zSql, zLine+i, nLine+1-i);
6724 startline = lineno;
6725 nSql = nLine-i;
6726 }else{
6727 zSql[nSql++] = '\n';
6728 memcpy(zSql+nSql, zLine, nLine+1);
6729 nSql += nLine;
6730 }
6731 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00006732 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00006733 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006734 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00006735 if( p->outCount ){
6736 output_reset(p);
6737 p->outCount = 0;
6738 }
drh9f099fd2013-08-06 14:01:46 +00006739 }else if( nSql && _all_whitespace(zSql) ){
drhe6e1d122017-03-09 13:50:49 +00006740 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00006741 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00006742 }
6743 }
drh4e8142c2016-11-11 14:54:22 +00006744 if( nSql && !_all_whitespace(zSql) ){
6745 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006746 }
drh1f9ca2c2015-08-25 16:57:52 +00006747 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00006748 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00006749 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00006750}
6751
drh67505e72002-04-19 12:34:06 +00006752/*
6753** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00006754** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00006755*/
drhd1459152016-09-16 19:11:03 +00006756static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00006757 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00006758 if( clearFlag ){
6759 free(home_dir);
6760 home_dir = 0;
6761 return 0;
6762 }
drh85e72432012-04-11 11:38:53 +00006763 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00006764
drh4ace5362014-11-10 14:42:28 +00006765#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
6766 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00006767 {
6768 struct passwd *pwent;
6769 uid_t uid = getuid();
6770 if( (pwent=getpwuid(uid)) != NULL) {
6771 home_dir = pwent->pw_dir;
6772 }
drh67505e72002-04-19 12:34:06 +00006773 }
6774#endif
6775
chw65d3c132007-11-12 21:09:10 +00006776#if defined(_WIN32_WCE)
6777 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
6778 */
drh85e72432012-04-11 11:38:53 +00006779 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00006780#else
6781
drh83905c92012-06-21 13:00:37 +00006782#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00006783 if (!home_dir) {
6784 home_dir = getenv("USERPROFILE");
6785 }
6786#endif
6787
drh67505e72002-04-19 12:34:06 +00006788 if (!home_dir) {
6789 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00006790 }
6791
drh83905c92012-06-21 13:00:37 +00006792#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00006793 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00006794 char *zDrive, *zPath;
6795 int n;
6796 zDrive = getenv("HOMEDRIVE");
6797 zPath = getenv("HOMEPATH");
6798 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00006799 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00006800 home_dir = malloc( n );
6801 if( home_dir==0 ) return 0;
6802 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
6803 return home_dir;
6804 }
6805 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00006806 }
6807#endif
6808
chw65d3c132007-11-12 21:09:10 +00006809#endif /* !_WIN32_WCE */
6810
drh67505e72002-04-19 12:34:06 +00006811 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00006812 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00006813 char *z = malloc( n );
6814 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00006815 home_dir = z;
6816 }
drhe98d4fa2002-04-21 19:06:22 +00006817
drh67505e72002-04-19 12:34:06 +00006818 return home_dir;
6819}
6820
6821/*
6822** Read input from the file given by sqliterc_override. Or if that
6823** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00006824**
6825** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00006826*/
drh534f4df2015-02-28 14:03:35 +00006827static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00006828 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00006829 const char *sqliterc_override /* Name of config file. NULL to use default */
6830){
persicom7e2dfdd2002-04-18 02:46:52 +00006831 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00006832 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00006833 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00006834 FILE *in = NULL;
6835
6836 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00006837 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00006838 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006839 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00006840 " cannot read ~/.sqliterc\n");
6841 return;
drhe98d4fa2002-04-21 19:06:22 +00006842 }
drh2f3de322012-06-27 16:41:31 +00006843 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00006844 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
6845 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00006846 }
drha1f9b5e2004-02-14 16:31:02 +00006847 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00006848 if( in ){
drhc28490c2006-10-26 14:25:58 +00006849 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00006850 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00006851 }
drh534f4df2015-02-28 14:03:35 +00006852 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00006853 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00006854 }
drh85e72432012-04-11 11:38:53 +00006855 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00006856}
6857
drh67505e72002-04-19 12:34:06 +00006858/*
drhe1e38c42003-05-04 18:30:59 +00006859** Show available command line options
6860*/
mistachkin1fe36bb2016-04-04 02:16:44 +00006861static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00006862 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00006863 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00006864 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006865 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00006866 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00006867 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00006868 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00006869 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00006870 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00006871#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6872 " -heap SIZE Size of heap for memsys3 or memsys5\n"
6873#endif
drhcc3b4f82012-02-07 14:13:50 +00006874 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00006875 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00006876 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006877 " -line set output mode to 'line'\n"
6878 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00006879 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00006880 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00006881#ifdef SQLITE_ENABLE_MULTIPLEX
6882 " -multiplex enable the multiplexor VFS\n"
6883#endif
mistachkine0d68852014-12-11 03:12:33 +00006884 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00006885 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00006886 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
6887 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00006888 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00006889 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00006890 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00006891 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00006892#ifdef SQLITE_ENABLE_VFSTRACE
6893 " -vfstrace enable tracing of all VFS calls\n"
6894#endif
drhe1e38c42003-05-04 18:30:59 +00006895;
6896static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00006897 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00006898 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00006899 "FILENAME is the name of an SQLite database. A new database is created\n"
6900 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00006901 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00006902 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00006903 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006904 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00006905 }
6906 exit(1);
6907}
6908
6909/*
drh67505e72002-04-19 12:34:06 +00006910** Initialize the state information in data
6911*/
drhdcd87a92014-08-18 13:45:42 +00006912static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00006913 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00006914 data->normalMode = data->cMode = data->mode = MODE_List;
6915 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00006916 memcpy(data->colSeparator,SEP_Column, 2);
6917 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00006918 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00006919 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00006920 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00006921 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00006922 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00006923 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
6924 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00006925}
6926
drh98d312f2012-10-25 15:23:14 +00006927/*
drh5c7976f2014-02-10 19:59:27 +00006928** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00006929*/
6930#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00006931static void printBold(const char *zText){
6932 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
6933 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
6934 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
6935 SetConsoleTextAttribute(out,
6936 FOREGROUND_RED|FOREGROUND_INTENSITY
6937 );
6938 printf("%s", zText);
6939 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00006940}
6941#else
drh5c7976f2014-02-10 19:59:27 +00006942static void printBold(const char *zText){
6943 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00006944}
6945#endif
6946
6947/*
drh98d312f2012-10-25 15:23:14 +00006948** Get the argument to an --option. Throw an error and die if no argument
6949** is available.
6950*/
6951static char *cmdline_option_value(int argc, char **argv, int i){
6952 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00006953 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00006954 argv[0], argv[argc-1]);
6955 exit(1);
6956 }
6957 return argv[i];
6958}
6959
mistachkin1fe36bb2016-04-04 02:16:44 +00006960#ifndef SQLITE_SHELL_IS_UTF8
6961# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
6962# define SQLITE_SHELL_IS_UTF8 (0)
6963# else
6964# define SQLITE_SHELL_IS_UTF8 (1)
6965# endif
6966#endif
6967
6968#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00006969int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00006970#else
6971int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00006972 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00006973#endif
drh75897232000-05-29 14:26:00 +00006974 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00006975 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00006976 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00006977 int i;
drhc28490c2006-10-26 14:25:58 +00006978 int rc = 0;
drhb3735912014-02-10 16:13:42 +00006979 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00006980 int readStdin = 1;
6981 int nCmd = 0;
6982 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00006983
mistachkin1fe36bb2016-04-04 02:16:44 +00006984 setBinaryMode(stdin, 0);
6985 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00006986 stdin_is_interactive = isatty(0);
6987 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00006988
drh69b30ab2014-02-27 15:11:52 +00006989#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00006990 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006991 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00006992 sqlite3_sourceid(), SQLITE_SOURCE_ID);
6993 exit(1);
6994 }
drhc7181902014-02-27 15:04:13 +00006995#endif
persicom7e2dfdd2002-04-18 02:46:52 +00006996 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00006997#if !SQLITE_SHELL_IS_UTF8
6998 sqlite3_initialize();
6999 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
7000 if( argv==0 ){
7001 raw_printf(stderr, "out of memory\n");
7002 exit(1);
7003 }
7004 for(i=0; i<argc; i++){
7005 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
7006 if( argv[i]==0 ){
7007 raw_printf(stderr, "out of memory\n");
7008 exit(1);
7009 }
7010 }
7011#endif
mistachkin1810f222016-04-04 02:33:34 +00007012 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00007013 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00007014
drh44c2eb12003-04-30 11:38:26 +00007015 /* Make sure we have a valid signal handler early, before anything
7016 ** else is done.
7017 */
drh4c504392000-10-16 22:06:40 +00007018#ifdef SIGINT
7019 signal(SIGINT, interrupt_handler);
7020#endif
drh44c2eb12003-04-30 11:38:26 +00007021
drhac5649a2014-11-28 13:35:03 +00007022#ifdef SQLITE_SHELL_DBNAME_PROC
7023 {
7024 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
7025 ** of a C-function that will provide the name of the database file. Use
7026 ** this compile-time option to embed this shell program in larger
7027 ** applications. */
7028 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
7029 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
7030 warnInmemoryDb = 0;
7031 }
7032#endif
7033
drh22fbcb82004-02-01 01:22:50 +00007034 /* Do an initial pass through the command-line argument to locate
7035 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00007036 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00007037 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00007038 */
drh98d312f2012-10-25 15:23:14 +00007039 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00007040 char *z;
drhc28490c2006-10-26 14:25:58 +00007041 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00007042 if( z[0]!='-' ){
7043 if( data.zDbFilename==0 ){
7044 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00007045 }else{
7046 /* Excesss arguments are interpreted as SQL (or dot-commands) and
7047 ** mean that nothing is read from stdin */
7048 readStdin = 0;
7049 nCmd++;
7050 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
7051 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007052 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00007053 exit(1);
7054 }
7055 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00007056 }
drh98d312f2012-10-25 15:23:14 +00007057 }
drhcc3b4f82012-02-07 14:13:50 +00007058 if( z[1]=='-' ) z++;
7059 if( strcmp(z,"-separator")==0
7060 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00007061 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00007062 || strcmp(z,"-cmd")==0
7063 ){
drh98d312f2012-10-25 15:23:14 +00007064 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00007065 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00007066 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00007067 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00007068 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00007069 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00007070 ** we do the actual processing of arguments later in a second pass.
7071 */
shanef69573d2009-10-24 02:06:14 +00007072 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00007073 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00007074#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00007075 const char *zSize;
7076 sqlite3_int64 szHeap;
7077
drh98d312f2012-10-25 15:23:14 +00007078 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00007079 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00007080 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00007081 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00007082#else
7083 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00007084#endif
drh44dec872014-08-30 15:49:25 +00007085 }else if( strcmp(z,"-scratch")==0 ){
7086 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007087 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007088 if( sz>400000 ) sz = 400000;
7089 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00007090 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007091 if( n>10 ) n = 10;
7092 if( n<1 ) n = 1;
7093 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
7094 data.shellFlgs |= SHFLG_Scratch;
7095 }else if( strcmp(z,"-pagecache")==0 ){
7096 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007097 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007098 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00007099 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00007100 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00007101 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
7102 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00007103 data.shellFlgs |= SHFLG_Pagecache;
7104 }else if( strcmp(z,"-lookaside")==0 ){
7105 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007106 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007107 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00007108 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007109 if( n<0 ) n = 0;
7110 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
7111 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00007112#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00007113 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00007114 extern int vfstrace_register(
7115 const char *zTraceName,
7116 const char *zOldVfsName,
7117 int (*xOut)(const char*,void*),
7118 void *pOutArg,
7119 int makeDefault
7120 );
drh2b625e22011-03-16 17:05:28 +00007121 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00007122#endif
drh6f25e892011-07-08 17:02:57 +00007123#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00007124 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00007125 extern int sqlite3_multiple_initialize(const char*,int);
7126 sqlite3_multiplex_initialize(0, 1);
7127#endif
drh7d9f3942013-04-03 01:26:54 +00007128 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00007129 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
7130 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00007131 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00007132 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00007133 if( pVfs ){
7134 sqlite3_vfs_register(pVfs, 1);
7135 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007136 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00007137 exit(1);
7138 }
drh44c2eb12003-04-30 11:38:26 +00007139 }
7140 }
drh98d312f2012-10-25 15:23:14 +00007141 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00007142#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00007143 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00007144 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00007145#else
mistachkinaae280e2015-12-31 19:06:24 +00007146 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00007147 return 1;
drh01b41712005-08-29 23:06:23 +00007148#endif
drh98d312f2012-10-25 15:23:14 +00007149 }
7150 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00007151
drh44c2eb12003-04-30 11:38:26 +00007152 /* Go ahead and open the database file if it already exists. If the
7153 ** file does not exist, delay opening it. This prevents empty database
7154 ** files from being created if a user mistypes the database name argument
7155 ** to the sqlite command-line tool.
7156 */
drhc8d74412004-08-31 23:41:26 +00007157 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00007158 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00007159 }
7160
drh22fbcb82004-02-01 01:22:50 +00007161 /* Process the initialization file if there is one. If no -init option
7162 ** is given on the command line, look for a file named ~/.sqliterc and
7163 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00007164 */
drh534f4df2015-02-28 14:03:35 +00007165 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00007166
drh22fbcb82004-02-01 01:22:50 +00007167 /* Make a second pass through the command-line argument and set
7168 ** options. This second pass is delayed until after the initialization
7169 ** file is processed so that the command-line arguments will override
7170 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00007171 */
drh98d312f2012-10-25 15:23:14 +00007172 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00007173 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00007174 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00007175 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00007176 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00007177 i++;
7178 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007179 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00007180 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007181 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00007182 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007183 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00007184 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00007185 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00007186 }else if( strcmp(z,"-csv")==0 ){
7187 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00007188 memcpy(data.colSeparator,",",2);
7189 }else if( strcmp(z,"-ascii")==0 ){
7190 data.mode = MODE_Ascii;
7191 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00007192 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00007193 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00007194 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00007195 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00007196 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00007197 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00007198 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00007199 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00007200 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00007201 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00007202 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00007203 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00007204 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007205 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00007206 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007207 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00007208 }else if( strcmp(z,"-echo")==0 ){
drhe6e1d122017-03-09 13:50:49 +00007209 ShellSetFlag(&data, SHFLG_Echo);
drhefbf3b12014-02-28 20:47:24 +00007210 }else if( strcmp(z,"-eqp")==0 ){
7211 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00007212 }else if( strcmp(z,"-eqpfull")==0 ){
7213 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00007214 }else if( strcmp(z,"-stats")==0 ){
7215 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00007216 }else if( strcmp(z,"-scanstats")==0 ){
7217 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00007218 }else if( strcmp(z,"-backslash")==0 ){
7219 /* Undocumented command-line option: -backslash
7220 ** Causes C-style backslash escapes to be evaluated in SQL statements
7221 ** prior to sending the SQL into SQLite. Useful for injecting
7222 ** crazy bytes in the middle of SQL statements for testing and debugging.
7223 */
drhe6e1d122017-03-09 13:50:49 +00007224 ShellSetFlag(&data, SHFLG_Backslash);
drhc49f44e2006-10-26 18:15:42 +00007225 }else if( strcmp(z,"-bail")==0 ){
7226 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00007227 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00007228 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00007229 return 0;
drhc28490c2006-10-26 14:25:58 +00007230 }else if( strcmp(z,"-interactive")==0 ){
7231 stdin_is_interactive = 1;
7232 }else if( strcmp(z,"-batch")==0 ){
7233 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00007234 }else if( strcmp(z,"-heap")==0 ){
7235 i++;
drh44dec872014-08-30 15:49:25 +00007236 }else if( strcmp(z,"-scratch")==0 ){
7237 i+=2;
7238 }else if( strcmp(z,"-pagecache")==0 ){
7239 i+=2;
7240 }else if( strcmp(z,"-lookaside")==0 ){
7241 i+=2;
drh7d9f3942013-04-03 01:26:54 +00007242 }else if( strcmp(z,"-mmap")==0 ){
7243 i++;
drha7e61d82011-03-12 17:02:57 +00007244 }else if( strcmp(z,"-vfs")==0 ){
7245 i++;
drh6f25e892011-07-08 17:02:57 +00007246#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00007247 }else if( strcmp(z,"-vfstrace")==0 ){
7248 i++;
drh6f25e892011-07-08 17:02:57 +00007249#endif
7250#ifdef SQLITE_ENABLE_MULTIPLEX
7251 }else if( strcmp(z,"-multiplex")==0 ){
7252 i++;
7253#endif
drhcc3b4f82012-02-07 14:13:50 +00007254 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00007255 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00007256 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00007257 /* Run commands that follow -cmd first and separately from commands
7258 ** that simply appear on the command-line. This seems goofy. It would
7259 ** be better if all commands ran in the order that they appear. But
7260 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00007261 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00007262 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00007263 if( z[0]=='.' ){
7264 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00007265 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00007266 }else{
drh05782482013-10-24 15:20:20 +00007267 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00007268 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
7269 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007270 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00007271 if( bail_on_error ) return rc!=0 ? rc : 1;
7272 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007273 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00007274 if( bail_on_error ) return rc;
7275 }
7276 }
drh1e5d0e92000-05-31 23:33:17 +00007277 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007278 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
7279 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00007280 return 1;
7281 }
drh700c2522016-02-09 18:39:25 +00007282 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00007283 }
drh44c2eb12003-04-30 11:38:26 +00007284
drhac5649a2014-11-28 13:35:03 +00007285 if( !readStdin ){
7286 /* Run all arguments that do not begin with '-' as if they were separate
7287 ** command-line inputs, except for the argToSkip argument which contains
7288 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00007289 */
drhac5649a2014-11-28 13:35:03 +00007290 for(i=0; i<nCmd; i++){
7291 if( azCmd[i][0]=='.' ){
7292 rc = do_meta_command(azCmd[i], &data);
7293 if( rc ) return rc==2 ? 0 : rc;
7294 }else{
7295 open_db(&data, 0);
7296 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
7297 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007298 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00007299 return rc!=0 ? rc : 1;
7300 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007301 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00007302 return rc;
7303 }
drh6ff13852001-11-25 13:18:23 +00007304 }
drh75897232000-05-29 14:26:00 +00007305 }
drhac5649a2014-11-28 13:35:03 +00007306 free(azCmd);
drh75897232000-05-29 14:26:00 +00007307 }else{
drh44c2eb12003-04-30 11:38:26 +00007308 /* Run commands received from standard input
7309 */
drhc28490c2006-10-26 14:25:58 +00007310 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00007311 char *zHome;
7312 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00007313 int nHistory;
drh75897232000-05-29 14:26:00 +00007314 printf(
drh743e0032011-12-12 16:51:50 +00007315 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00007316 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00007317 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00007318 );
drhb3735912014-02-10 16:13:42 +00007319 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00007320 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00007321 printBold("transient in-memory database");
7322 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00007323 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00007324 }
drhd1459152016-09-16 19:11:03 +00007325 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00007326 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00007327 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00007328 if( (zHistory = malloc(nHistory))!=0 ){
7329 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
7330 }
drh67505e72002-04-19 12:34:06 +00007331 }
drhf5ed7ad2015-06-15 14:43:25 +00007332 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00007333 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00007334 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00007335 shell_stifle_history(100);
7336 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00007337 free(zHistory);
drh67505e72002-04-19 12:34:06 +00007338 }
drhdaffd0e2001-04-11 14:28:42 +00007339 }else{
drhc28490c2006-10-26 14:25:58 +00007340 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00007341 }
7342 }
drh33048c02001-10-01 14:29:22 +00007343 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00007344 if( data.db ){
drhe6229612014-08-18 15:08:26 +00007345 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00007346 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00007347 }
mistachkin1fe36bb2016-04-04 02:16:44 +00007348 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00007349 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00007350#if !SQLITE_SHELL_IS_UTF8
7351 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
7352 sqlite3_free(argv);
7353#endif
drhc28490c2006-10-26 14:25:58 +00007354 return rc;
drh75897232000-05-29 14:26:00 +00007355}