blob: 0be869b8fc465d47955b68f3cae3962b68b9bbc2 [file] [log] [blame]
drh2ce15c32017-07-11 13:34:40 +00001/* DO NOT EDIT!
2** This file is automatically generated by the script in the canonical
3** SQLite source tree at tool/mkshellc.tcl. That script combines source
4** code from various constituent source files of SQLite into this single
5** "shell.c" file used to implement the SQLite command-line shell.
6**
7** Most of the code found below comes from the "src/shell.c.in" file in
8** the canonical SQLite source tree. That main file contains "INCLUDE"
9** lines that specify other files in the canonical source tree that are
10** inserted to getnerate this complete program source file.
11**
12** The code from multiple files is combined into this single "shell.c"
13** source file to help make the command-line program easier to compile.
14**
15** To modify this program, get a copy of the canonical SQLite source tree,
16** edit the src/shell.c.in" and/or some of the other files that are included
17** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
18*/
drh75897232000-05-29 14:26:00 +000019/*
drhb19a2bc2001-09-16 00:13:26 +000020** 2001 September 15
drh75897232000-05-29 14:26:00 +000021**
drhb19a2bc2001-09-16 00:13:26 +000022** The author disclaims copyright to this source code. In place of
23** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +000024**
drhb19a2bc2001-09-16 00:13:26 +000025** May you do good and not evil.
26** May you find forgiveness for yourself and forgive others.
27** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000028**
29*************************************************************************
30** This file contains code to implement the "sqlite" command line
31** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000032*/
mistachkina3b2ff52011-09-16 20:16:36 +000033#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000034/* This needs to come before any includes for MSVC compiler */
35#define _CRT_SECURE_NO_WARNINGS
36#endif
37
drh36f7dd32011-10-13 16:02:17 +000038/*
drhce13b992017-05-23 20:00:00 +000039** Warning pragmas copied from msvc.h in the core.
mistachkin2318d332015-01-12 18:02:52 +000040*/
drhce13b992017-05-23 20:00:00 +000041#if defined(_MSC_VER)
42#pragma warning(disable : 4054)
43#pragma warning(disable : 4055)
44#pragma warning(disable : 4100)
45#pragma warning(disable : 4127)
46#pragma warning(disable : 4130)
47#pragma warning(disable : 4152)
48#pragma warning(disable : 4189)
49#pragma warning(disable : 4206)
50#pragma warning(disable : 4210)
51#pragma warning(disable : 4232)
52#pragma warning(disable : 4244)
53#pragma warning(disable : 4305)
54#pragma warning(disable : 4306)
55#pragma warning(disable : 4702)
56#pragma warning(disable : 4706)
57#endif /* defined(_MSC_VER) */
mistachkin2318d332015-01-12 18:02:52 +000058
59/*
drh8cd5b252015-03-02 22:06:43 +000060** No support for loadable extensions in VxWorks.
61*/
drhada3f2b2015-03-23 21:32:50 +000062#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
drh8cd5b252015-03-02 22:06:43 +000063# define SQLITE_OMIT_LOAD_EXTENSION 1
64#endif
65
66/*
drh36f7dd32011-10-13 16:02:17 +000067** Enable large-file support for fopen() and friends on unix.
68*/
69#ifndef SQLITE_DISABLE_LFS
70# define _LARGE_FILE 1
71# ifndef _FILE_OFFSET_BITS
72# define _FILE_OFFSET_BITS 64
73# endif
74# define _LARGEFILE_SOURCE 1
75#endif
76
drh75897232000-05-29 14:26:00 +000077#include <stdlib.h>
78#include <string.h>
79#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000080#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000081#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000082#if SQLITE_USER_AUTHENTICATION
83# include "sqlite3userauth.h"
84#endif
drh75897232000-05-29 14:26:00 +000085#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000086#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000087
drh83905c92012-06-21 13:00:37 +000088#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000089# include <signal.h>
chw97185482008-11-17 08:05:31 +000090# if !defined(__RTP__) && !defined(_WRS_KERNEL)
91# include <pwd.h>
92# endif
drhdd45df82002-04-18 12:39:03 +000093# include <unistd.h>
94# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000095#endif
drh75897232000-05-29 14:26:00 +000096
drh0ede9eb2015-01-10 16:49:23 +000097#if HAVE_READLINE
drh8e7e7a22000-05-30 18:45:23 +000098# include <readline/readline.h>
99# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +0000100#endif
danfd34d6d2015-02-25 10:54:53 +0000101
drh0ede9eb2015-01-10 16:49:23 +0000102#if HAVE_EDITLINE
drhaaa21b42014-02-11 14:37:51 +0000103# include <editline/readline.h>
104#endif
danfd34d6d2015-02-25 10:54:53 +0000105
106#if HAVE_EDITLINE || HAVE_READLINE
107
108# define shell_add_history(X) add_history(X)
109# define shell_read_history(X) read_history(X)
110# define shell_write_history(X) write_history(X)
111# define shell_stifle_history(X) stifle_history(X)
112# define shell_readline(X) readline(X)
113
114#elif HAVE_LINENOISE
115
116# include "linenoise.h"
117# define shell_add_history(X) linenoiseHistoryAdd(X)
118# define shell_read_history(X) linenoiseHistoryLoad(X)
119# define shell_write_history(X) linenoiseHistorySave(X)
120# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
121# define shell_readline(X) linenoise(X)
122
123#else
124
mistachkin1fe36bb2016-04-04 02:16:44 +0000125# define shell_read_history(X)
danfd34d6d2015-02-25 10:54:53 +0000126# define shell_write_history(X)
127# define shell_stifle_history(X)
128
129# define SHELL_USE_LOCAL_GETLINE 1
drh75897232000-05-29 14:26:00 +0000130#endif
131
danfd34d6d2015-02-25 10:54:53 +0000132
adamd2e8464a2006-09-06 21:39:40 +0000133#if defined(_WIN32) || defined(WIN32)
134# include <io.h>
drh6976c212014-07-24 12:09:47 +0000135# include <fcntl.h>
mistachkin073664d2015-06-17 18:57:37 +0000136# define isatty(h) _isatty(h)
137# ifndef access
138# define access(f,m) _access((f),(m))
139# endif
140# undef popen
141# define popen _popen
142# undef pclose
143# define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000144#else
mistachkin073664d2015-06-17 18:57:37 +0000145 /* Make sure isatty() has a prototype. */
146 extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000147
mistachkin073664d2015-06-17 18:57:37 +0000148# if !defined(__RTP__) && !defined(_WRS_KERNEL)
149 /* popen and pclose are not C89 functions and so are
150 ** sometimes omitted from the <stdio.h> header */
151 extern FILE *popen(const char*,const char*);
152 extern int pclose(FILE*);
153# else
154# define SQLITE_OMIT_POPEN 1
155# endif
mistachkinf6418892013-08-28 01:54:12 +0000156#endif
drh53371f92013-07-25 17:07:03 +0000157
chw65d3c132007-11-12 21:09:10 +0000158#if defined(_WIN32_WCE)
159/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
160 * thus we always assume that we have a console. That can be
161 * overridden with the -batch command line option.
162 */
163#define isatty(x) 1
164#endif
165
drhf0693c82011-10-11 20:41:54 +0000166/* ctype macros that work with signed characters */
167#define IsSpace(X) isspace((unsigned char)X)
168#define IsDigit(X) isdigit((unsigned char)X)
169#define ToLower(X) (char)tolower((unsigned char)X)
170
mistachkin1fe36bb2016-04-04 02:16:44 +0000171#if defined(_WIN32) || defined(WIN32)
172#include <windows.h>
173
174/* string conversion routines only needed on Win32 */
175extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
176extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
177extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
mistachkin8145fc62016-09-16 20:39:21 +0000178extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
mistachkin1fe36bb2016-04-04 02:16:44 +0000179#endif
180
drh047d4532015-01-18 20:30:23 +0000181/* On Windows, we normally run with output mode of TEXT so that \n characters
182** are automatically translated into \r\n. However, this behavior needs
183** to be disabled in some cases (ex: when generating CSV output and when
184** rendering quoted strings that contain \n characters). The following
185** routines take care of that.
186*/
187#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000188static void setBinaryMode(FILE *file, int isOutput){
189 if( isOutput ) fflush(file);
190 _setmode(_fileno(file), _O_BINARY);
drh047d4532015-01-18 20:30:23 +0000191}
mistachkin1fe36bb2016-04-04 02:16:44 +0000192static void setTextMode(FILE *file, int isOutput){
193 if( isOutput ) fflush(file);
194 _setmode(_fileno(file), _O_TEXT);
drh047d4532015-01-18 20:30:23 +0000195}
196#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000197# define setBinaryMode(X,Y)
198# define setTextMode(X,Y)
drh047d4532015-01-18 20:30:23 +0000199#endif
200
drh43408312013-10-30 12:43:36 +0000201
202/* True if the timer is enabled */
203static int enableTimer = 0;
204
205/* Return the current wall-clock time */
206static sqlite3_int64 timeOfDay(void){
207 static sqlite3_vfs *clockVfs = 0;
208 sqlite3_int64 t;
209 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000210 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000211 clockVfs->xCurrentTimeInt64(clockVfs, &t);
212 }else{
213 double r;
214 clockVfs->xCurrentTime(clockVfs, &r);
215 t = (sqlite3_int64)(r*86400000.0);
216 }
217 return t;
218}
219
drh91eb93c2015-03-03 19:56:20 +0000220#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000221#include <sys/time.h>
222#include <sys/resource.h>
223
drh91eb93c2015-03-03 19:56:20 +0000224/* VxWorks does not support getrusage() as far as we can determine */
225#if defined(_WRS_KERNEL) || defined(__RTP__)
226struct rusage {
227 struct timeval ru_utime; /* user CPU time used */
228 struct timeval ru_stime; /* system CPU time used */
229};
230#define getrusage(A,B) memset(B,0,sizeof(*B))
231#endif
232
drhda108222009-02-25 19:07:24 +0000233/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000234static struct rusage sBegin; /* CPU time at start */
235static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000236
drhda108222009-02-25 19:07:24 +0000237/*
238** Begin timing an operation
239*/
240static void beginTimer(void){
241 if( enableTimer ){
242 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000243 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000244 }
245}
246
247/* Return the difference of two time_structs in seconds */
248static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
mistachkin1fe36bb2016-04-04 02:16:44 +0000249 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
drhda108222009-02-25 19:07:24 +0000250 (double)(pEnd->tv_sec - pStart->tv_sec);
251}
252
253/*
254** Print the timing results.
255*/
256static void endTimer(void){
257 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000258 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000259 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000260 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000261 printf("Run Time: real %.3f user %f sys %f\n",
262 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000263 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
264 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
265 }
266}
shaneb320ccd2009-10-21 03:42:58 +0000267
drhda108222009-02-25 19:07:24 +0000268#define BEGIN_TIMER beginTimer()
269#define END_TIMER endTimer()
270#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000271
272#elif (defined(_WIN32) || defined(WIN32))
273
shaneb320ccd2009-10-21 03:42:58 +0000274/* Saved resource information for the beginning of an operation */
275static HANDLE hProcess;
276static FILETIME ftKernelBegin;
277static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000278static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000279typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
280 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000281static GETPROCTIMES getProcessTimesAddr = NULL;
282
shaneb320ccd2009-10-21 03:42:58 +0000283/*
284** Check to see if we have timer support. Return 1 if necessary
285** support found (or found previously).
286*/
287static int hasTimer(void){
288 if( getProcessTimesAddr ){
289 return 1;
290 } else {
drh4ace5362014-11-10 14:42:28 +0000291 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
292 ** versions. See if the version we are running on has it, and if it
293 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000294 */
295 hProcess = GetCurrentProcess();
296 if( hProcess ){
297 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
298 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000299 getProcessTimesAddr =
300 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000301 if( NULL != getProcessTimesAddr ){
302 return 1;
303 }
mistachkin1fe36bb2016-04-04 02:16:44 +0000304 FreeLibrary(hinstLib);
shaneb320ccd2009-10-21 03:42:58 +0000305 }
306 }
307 }
308 return 0;
309}
310
311/*
312** Begin timing an operation
313*/
314static void beginTimer(void){
315 if( enableTimer && getProcessTimesAddr ){
316 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000317 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
318 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000319 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000320 }
321}
322
323/* Return the difference of two FILETIME structs in seconds */
324static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
325 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
326 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
327 return (double) ((i64End - i64Start) / 10000000.0);
328}
329
330/*
331** Print the timing results.
332*/
333static void endTimer(void){
334 if( enableTimer && getProcessTimesAddr){
335 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000336 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000337 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000338 printf("Run Time: real %.3f user %f sys %f\n",
339 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000340 timeDiff(&ftUserBegin, &ftUserEnd),
341 timeDiff(&ftKernelBegin, &ftKernelEnd));
342 }
343}
344
345#define BEGIN_TIMER beginTimer()
346#define END_TIMER endTimer()
347#define HAS_TIMER hasTimer()
348
drhda108222009-02-25 19:07:24 +0000349#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000350#define BEGIN_TIMER
drhda108222009-02-25 19:07:24 +0000351#define END_TIMER
352#define HAS_TIMER 0
353#endif
354
shanec0688ea2009-03-05 03:48:06 +0000355/*
356** Used to prevent warnings about unused parameters
357*/
358#define UNUSED_PARAMETER(x) (void)(x)
359
drhe91d16b2008-12-08 18:27:31 +0000360/*
drhc49f44e2006-10-26 18:15:42 +0000361** If the following flag is set, then command execution stops
362** at an error if we are not interactive.
363*/
364static int bail_on_error = 0;
365
366/*
drhc28490c2006-10-26 14:25:58 +0000367** Threat stdin as an interactive input if the following variable
368** is true. Otherwise, assume stdin is connected to a file or pipe.
369*/
370static int stdin_is_interactive = 1;
371
372/*
drhe05461c2015-12-30 13:36:57 +0000373** On Windows systems we have to know if standard output is a console
374** in order to translate UTF-8 into MBCS. The following variable is
375** true if translation is required.
376*/
377static int stdout_is_console = 1;
378
379/*
drh4c504392000-10-16 22:06:40 +0000380** The following is the open SQLite database. We make a pointer
381** to this database a static variable so that it can be accessed
382** by the SIGINT handler to interrupt database processing.
383*/
mistachkin8e189222015-04-19 21:43:16 +0000384static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000385
386/*
drh67505e72002-04-19 12:34:06 +0000387** True if an interrupt (Control-C) has been received.
388*/
drh43617e92006-03-06 20:55:46 +0000389static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000390
391/*
persicom7e2dfdd2002-04-18 02:46:52 +0000392** This is the name of our program. It is set in main(), used
393** in a number of other places, mostly for error messages.
394*/
395static char *Argv0;
396
397/*
398** Prompt strings. Initialized in main. Settable with
399** .prompt main continue
400*/
401static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
402static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
403
drhb0603412007-02-28 04:47:26 +0000404/*
mistachkin710b33b2016-01-03 18:59:28 +0000405** Render output like fprintf(). Except, if the output is going to the
406** console and if this is running on a Windows machine, translate the
407** output from UTF-8 into MBCS.
408*/
409#if defined(_WIN32) || defined(WIN32)
410void utf8_printf(FILE *out, const char *zFormat, ...){
411 va_list ap;
412 va_start(ap, zFormat);
413 if( stdout_is_console && (out==stdout || out==stderr) ){
mistachkin710b33b2016-01-03 18:59:28 +0000414 char *z1 = sqlite3_vmprintf(zFormat, ap);
mistachkin1fe36bb2016-04-04 02:16:44 +0000415 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
mistachkin710b33b2016-01-03 18:59:28 +0000416 sqlite3_free(z1);
417 fputs(z2, out);
418 sqlite3_free(z2);
419 }else{
420 vfprintf(out, zFormat, ap);
421 }
422 va_end(ap);
423}
424#elif !defined(utf8_printf)
425# define utf8_printf fprintf
426#endif
427
428/*
429** Render output like fprintf(). This should not be used on anything that
430** includes string formatting (e.g. "%s").
431*/
432#if !defined(raw_printf)
433# define raw_printf fprintf
434#endif
435
436/*
drhb0603412007-02-28 04:47:26 +0000437** Write I/O traces to the following stream.
438*/
rsebe0a9092007-07-30 18:24:38 +0000439#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000440static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000441#endif
drhb0603412007-02-28 04:47:26 +0000442
443/*
444** This routine works like printf in that its first argument is a
445** format string and subsequent arguments are values to be substituted
446** in place of % fields. The result of formatting this string
447** is written to iotrace.
448*/
rsebe0a9092007-07-30 18:24:38 +0000449#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000450static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000451 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000452 char *z;
drhb0603412007-02-28 04:47:26 +0000453 if( iotrace==0 ) return;
454 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000455 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000456 va_end(ap);
mistachkin710b33b2016-01-03 18:59:28 +0000457 utf8_printf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000458 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000459}
rsebe0a9092007-07-30 18:24:38 +0000460#endif
drhb0603412007-02-28 04:47:26 +0000461
drh6887e8f2017-04-17 13:18:42 +0000462/*
463** Output string zUtf to stream pOut as w characters. If w is negative,
464** then right-justify the text. W is the width in UTF-8 characters, not
465** in bytes. This is different from the %*.*s specification in printf
466** since with %*.*s the width is measured in bytes, not characters.
467*/
468static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
469 int i;
470 int n;
471 int aw = w<0 ? -w : w;
472 char zBuf[1000];
drhf8a2e8c2017-05-06 17:12:52 +0000473 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
drh6887e8f2017-04-17 13:18:42 +0000474 for(i=n=0; zUtf[i]; i++){
475 if( (zUtf[i]&0xc0)!=0x80 ){
476 n++;
477 if( n==aw ){
478 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
479 break;
480 }
481 }
482 }
483 if( n>=aw ){
484 utf8_printf(pOut, "%.*s", i, zUtf);
485 }else if( w<0 ){
486 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
487 }else{
488 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
489 }
490}
491
drh44c2eb12003-04-30 11:38:26 +0000492
persicom7e2dfdd2002-04-18 02:46:52 +0000493/*
drh83965662003-04-17 02:54:13 +0000494** Determines if a string is a number of not.
495*/
danielk19772e588c72005-12-09 14:25:08 +0000496static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000497 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000498 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000499 return 0;
500 }
501 z++;
502 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000503 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000504 if( *z=='.' ){
505 z++;
drhf0693c82011-10-11 20:41:54 +0000506 if( !IsDigit(*z) ) return 0;
507 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000508 if( realnum ) *realnum = 1;
509 }
510 if( *z=='e' || *z=='E' ){
511 z++;
512 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000513 if( !IsDigit(*z) ) return 0;
514 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000515 if( realnum ) *realnum = 1;
516 }
517 return *z==0;
518}
drh83965662003-04-17 02:54:13 +0000519
520/*
drhe05461c2015-12-30 13:36:57 +0000521** Compute a string length that is limited to what can be stored in
522** lower 30 bits of a 32-bit signed integer.
523*/
524static int strlen30(const char *z){
525 const char *z2 = z;
526 while( *z2 ){ z2++; }
527 return 0x3fffffff & (int)(z2 - z);
528}
529
530/*
drh64bf76d2017-06-05 12:29:26 +0000531** Return the length of a string in characters. Multibyte UTF8 characters
532** count as a single character.
533*/
534static int strlenChar(const char *z){
535 int n = 0;
536 while( *z ){
537 if( (0xc0&*(z++))!=0x80 ) n++;
538 }
539 return n;
540}
541
542/*
drhfeac5f82004-08-01 00:10:45 +0000543** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000544** the text in memory obtained from malloc() and returns a pointer
545** to the text. NULL is returned at end of file, or if malloc()
546** fails.
547**
drh9f099fd2013-08-06 14:01:46 +0000548** If zLine is not NULL then it is a malloced buffer returned from
549** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000550*/
drh9f099fd2013-08-06 14:01:46 +0000551static char *local_getline(char *zLine, FILE *in){
552 int nLine = zLine==0 ? 0 : 100;
553 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000554
drhb07028f2011-10-14 21:49:18 +0000555 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000556 if( n+100>nLine ){
557 nLine = nLine*2 + 100;
558 zLine = realloc(zLine, nLine);
559 if( zLine==0 ) return 0;
560 }
drhdaffd0e2001-04-11 14:28:42 +0000561 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000562 if( n==0 ){
563 free(zLine);
564 return 0;
565 }
566 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000567 break;
568 }
drh9f099fd2013-08-06 14:01:46 +0000569 while( zLine[n] ) n++;
570 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000571 n--;
shaneh13b36022009-12-17 21:07:15 +0000572 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000573 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000574 break;
drh8e7e7a22000-05-30 18:45:23 +0000575 }
576 }
drhe05461c2015-12-30 13:36:57 +0000577#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000578 /* For interactive input on Windows systems, translate the
drhe05461c2015-12-30 13:36:57 +0000579 ** multi-byte characterset characters into UTF-8. */
drhfc8b40f2016-09-07 10:10:18 +0000580 if( stdin_is_interactive && in==stdin ){
mistachkin1fe36bb2016-04-04 02:16:44 +0000581 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
drhe05461c2015-12-30 13:36:57 +0000582 if( zTrans ){
583 int nTrans = strlen30(zTrans)+1;
584 if( nTrans>nLine ){
585 zLine = realloc(zLine, nTrans);
586 if( zLine==0 ){
587 sqlite3_free(zTrans);
588 return 0;
589 }
590 }
591 memcpy(zLine, zTrans, nTrans);
592 sqlite3_free(zTrans);
593 }
594 }
595#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000596 return zLine;
597}
598
599/*
drhc28490c2006-10-26 14:25:58 +0000600** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000601**
drh9f099fd2013-08-06 14:01:46 +0000602** If in==0 then read from standard input and prompt before each line.
603** If isContinuation is true, then a continuation prompt is appropriate.
604** If isContinuation is zero, then the main prompt should be used.
605**
606** If zPrior is not NULL then it is a buffer from a prior call to this
607** routine that can be reused.
608**
609** The result is stored in space obtained from malloc() and must either
610** be freed by the caller or else passed back into this routine via the
611** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000612*/
drh9f099fd2013-08-06 14:01:46 +0000613static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000614 char *zPrompt;
615 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000616 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000617 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000618 }else{
drh9f099fd2013-08-06 14:01:46 +0000619 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000620#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000621 printf("%s", zPrompt);
622 fflush(stdout);
623 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000624#else
625 free(zPrior);
626 zResult = shell_readline(zPrompt);
627 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000628#endif
drh9f099fd2013-08-06 14:01:46 +0000629 }
drh8e7e7a22000-05-30 18:45:23 +0000630 return zResult;
631}
drhf42d3182017-03-08 12:25:18 +0000632/*
633** A variable length string to which one can append text.
634*/
635typedef struct ShellText ShellText;
636struct ShellText {
637 char *z;
638 int n;
639 int nAlloc;
640};
641
642/*
643** Initialize and destroy a ShellText object
644*/
645static void initText(ShellText *p){
646 memset(p, 0, sizeof(*p));
647}
648static void freeText(ShellText *p){
649 free(p->z);
650 initText(p);
651}
652
653/* zIn is either a pointer to a NULL-terminated string in memory obtained
654** from malloc(), or a NULL pointer. The string pointed to by zAppend is
655** added to zIn, and the result returned in memory obtained from malloc().
656** zIn, if it was not NULL, is freed.
657**
658** If the third argument, quote, is not '\0', then it is used as a
659** quote character for zAppend.
660*/
661static void appendText(ShellText *p, char const *zAppend, char quote){
662 int len;
663 int i;
664 int nAppend = strlen30(zAppend);
665
666 len = nAppend+p->n+1;
667 if( quote ){
668 len += 2;
669 for(i=0; i<nAppend; i++){
670 if( zAppend[i]==quote ) len++;
671 }
672 }
673
674 if( p->n+len>=p->nAlloc ){
675 p->nAlloc = p->nAlloc*2 + len + 20;
676 p->z = realloc(p->z, p->nAlloc);
677 if( p->z==0 ){
678 memset(p, 0, sizeof(*p));
679 return;
680 }
681 }
682
683 if( quote ){
684 char *zCsr = p->z+p->n;
685 *zCsr++ = quote;
686 for(i=0; i<nAppend; i++){
687 *zCsr++ = zAppend[i];
688 if( zAppend[i]==quote ) *zCsr++ = quote;
689 }
690 *zCsr++ = quote;
691 p->n = (int)(zCsr - p->z);
692 *zCsr = '\0';
693 }else{
694 memcpy(p->z+p->n, zAppend, nAppend);
695 p->n += nAppend;
696 p->z[p->n] = '\0';
697 }
698}
699
700/*
701** Attempt to determine if identifier zName needs to be quoted, either
702** because it contains non-alphanumeric characters, or because it is an
703** SQLite keyword. Be conservative in this estimate: When in doubt assume
704** that quoting is required.
705**
706** Return '"' if quoting is required. Return 0 if no quoting is required.
707*/
708static char quoteChar(const char *zName){
709 /* All SQLite keywords, in alphabetical order */
710 static const char *azKeywords[] = {
711 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
712 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
713 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
714 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
715 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
716 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
717 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
718 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
719 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
720 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
721 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
722 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
723 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
724 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
725 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
726 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
727 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
728 "WITH", "WITHOUT",
729 };
730 int i, lwr, upr, mid, c;
731 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
732 for(i=0; zName[i]; i++){
733 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
734 }
735 lwr = 0;
736 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
737 while( lwr<=upr ){
738 mid = (lwr+upr)/2;
739 c = sqlite3_stricmp(azKeywords[mid], zName);
740 if( c==0 ) return '"';
741 if( c<0 ){
742 lwr = mid+1;
743 }else{
744 upr = mid-1;
745 }
746 }
747 return 0;
748}
drh8e7e7a22000-05-30 18:45:23 +0000749
drh09425592017-06-15 16:56:05 +0000750/*
751** SQL function: shell_add_schema(S,X)
752**
753** Add the schema name X to the CREATE statement in S and return the result.
754** Examples:
755**
756** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
757**
758** Also works on
759**
760** CREATE INDEX
761** CREATE UNIQUE INDEX
762** CREATE VIEW
763** CREATE TRIGGER
764** CREATE VIRTUAL TABLE
765**
766** This UDF is used by the .schema command to insert the schema name of
767** attached databases into the middle of the sqlite_master.sql field.
768*/
769static void shellAddSchemaName(
770 sqlite3_context *pCtx,
771 int nVal,
772 sqlite3_value **apVal
773){
774 static const char *aPrefix[] = {
775 "TABLE",
776 "INDEX",
777 "UNIQUE INDEX",
778 "VIEW",
779 "TRIGGER",
780 "VIRTUAL TABLE"
781 };
782 int i = 0;
783 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
784 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
785 assert( nVal==2 );
786 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
drh89997982017-07-11 18:11:33 +0000787 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
drh09425592017-06-15 16:56:05 +0000788 int n = strlen30(aPrefix[i]);
789 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
790 char cQuote = quoteChar(zSchema);
791 char *z;
792 if( cQuote ){
793 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
794 }else{
795 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
796 }
797 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
798 return;
799 }
800 }
801 }
802 sqlite3_result_value(pCtx, apVal[0]);
803}
804
drh2ce15c32017-07-11 13:34:40 +0000805/*
806** The source code for several run-time loadable extensions is inserted
807** below by the ../tool/mkshellc.tcl script. Before processing that included
808** code, we need to override some macros to make the included program code
809** work here in the middle of this regular program.
drh1554bc82017-03-08 16:10:34 +0000810*/
drh2ce15c32017-07-11 13:34:40 +0000811#define SQLITE_EXTENSION_INIT1
drh89997982017-07-11 18:11:33 +0000812#define SQLITE_EXTENSION_INIT2(X) (void)(X)
drh2ce15c32017-07-11 13:34:40 +0000813
814/************************* Begin ../ext/misc/shathree.c ******************/
815/*
816** 2017-03-08
817**
818** The author disclaims copyright to this source code. In place of
819** a legal notice, here is a blessing:
820**
821** May you do good and not evil.
822** May you find forgiveness for yourself and forgive others.
823** May you share freely, never taking more than you give.
824**
825******************************************************************************
826**
827** This SQLite extension implements a functions that compute SHA1 hashes.
828** Two SQL functions are implemented:
829**
830** sha3(X,SIZE)
831** sha3_query(Y,SIZE)
832**
833** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
834** X is NULL.
835**
836** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
837** and returns a hash of their results.
838**
839** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm
840** is used. If SIZE is included it must be one of the integers 224, 256,
841** 384, or 512, to determine SHA3 hash variant that is computed.
842*/
843SQLITE_EXTENSION_INIT1
844#include <assert.h>
845#include <string.h>
846#include <stdarg.h>
drh1554bc82017-03-08 16:10:34 +0000847typedef sqlite3_uint64 u64;
drh2ce15c32017-07-11 13:34:40 +0000848
849/******************************************************************************
850** The Hash Engine
851*/
drh1554bc82017-03-08 16:10:34 +0000852/*
853** Macros to determine whether the machine is big or little endian,
854** and whether or not that determination is run-time or compile-time.
855**
856** For best performance, an attempt is made to guess at the byte-order
857** using C-preprocessor macros. If that is unsuccessful, or if
858** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
859** at run-time.
860*/
861#ifndef SHA3_BYTEORDER
862# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
863 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
864 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
865 defined(__arm__)
866# define SHA3_BYTEORDER 1234
867# elif defined(sparc) || defined(__ppc__)
868# define SHA3_BYTEORDER 4321
869# else
870# define SHA3_BYTEORDER 0
871# endif
872#endif
873
874
875/*
876** State structure for a SHA3 hash in progress
877*/
878typedef struct SHA3Context SHA3Context;
879struct SHA3Context {
880 union {
881 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
882 unsigned char x[1600]; /* ... or 1600 bytes */
883 } u;
884 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
885 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
886 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
887};
888
889/*
890** A single step of the Keccak mixing function for a 1600-bit state
891*/
892static void KeccakF1600Step(SHA3Context *p){
893 int i;
894 u64 B0, B1, B2, B3, B4;
895 u64 C0, C1, C2, C3, C4;
896 u64 D0, D1, D2, D3, D4;
897 static const u64 RC[] = {
898 0x0000000000000001ULL, 0x0000000000008082ULL,
899 0x800000000000808aULL, 0x8000000080008000ULL,
900 0x000000000000808bULL, 0x0000000080000001ULL,
901 0x8000000080008081ULL, 0x8000000000008009ULL,
902 0x000000000000008aULL, 0x0000000000000088ULL,
903 0x0000000080008009ULL, 0x000000008000000aULL,
904 0x000000008000808bULL, 0x800000000000008bULL,
905 0x8000000000008089ULL, 0x8000000000008003ULL,
906 0x8000000000008002ULL, 0x8000000000000080ULL,
907 0x000000000000800aULL, 0x800000008000000aULL,
908 0x8000000080008081ULL, 0x8000000000008080ULL,
909 0x0000000080000001ULL, 0x8000000080008008ULL
910 };
911# define A00 (p->u.s[0])
912# define A01 (p->u.s[1])
913# define A02 (p->u.s[2])
914# define A03 (p->u.s[3])
915# define A04 (p->u.s[4])
916# define A10 (p->u.s[5])
917# define A11 (p->u.s[6])
918# define A12 (p->u.s[7])
919# define A13 (p->u.s[8])
920# define A14 (p->u.s[9])
921# define A20 (p->u.s[10])
922# define A21 (p->u.s[11])
923# define A22 (p->u.s[12])
924# define A23 (p->u.s[13])
925# define A24 (p->u.s[14])
926# define A30 (p->u.s[15])
927# define A31 (p->u.s[16])
928# define A32 (p->u.s[17])
929# define A33 (p->u.s[18])
930# define A34 (p->u.s[19])
931# define A40 (p->u.s[20])
932# define A41 (p->u.s[21])
933# define A42 (p->u.s[22])
934# define A43 (p->u.s[23])
935# define A44 (p->u.s[24])
936# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
937
938 for(i=0; i<24; i+=4){
939 C0 = A00^A10^A20^A30^A40;
940 C1 = A01^A11^A21^A31^A41;
941 C2 = A02^A12^A22^A32^A42;
942 C3 = A03^A13^A23^A33^A43;
943 C4 = A04^A14^A24^A34^A44;
944 D0 = C4^ROL64(C1, 1);
945 D1 = C0^ROL64(C2, 1);
946 D2 = C1^ROL64(C3, 1);
947 D3 = C2^ROL64(C4, 1);
948 D4 = C3^ROL64(C0, 1);
949
950 B0 = (A00^D0);
951 B1 = ROL64((A11^D1), 44);
952 B2 = ROL64((A22^D2), 43);
953 B3 = ROL64((A33^D3), 21);
954 B4 = ROL64((A44^D4), 14);
955 A00 = B0 ^((~B1)& B2 );
956 A00 ^= RC[i];
957 A11 = B1 ^((~B2)& B3 );
958 A22 = B2 ^((~B3)& B4 );
959 A33 = B3 ^((~B4)& B0 );
960 A44 = B4 ^((~B0)& B1 );
961
962 B2 = ROL64((A20^D0), 3);
963 B3 = ROL64((A31^D1), 45);
964 B4 = ROL64((A42^D2), 61);
965 B0 = ROL64((A03^D3), 28);
966 B1 = ROL64((A14^D4), 20);
967 A20 = B0 ^((~B1)& B2 );
968 A31 = B1 ^((~B2)& B3 );
969 A42 = B2 ^((~B3)& B4 );
970 A03 = B3 ^((~B4)& B0 );
971 A14 = B4 ^((~B0)& B1 );
972
973 B4 = ROL64((A40^D0), 18);
974 B0 = ROL64((A01^D1), 1);
975 B1 = ROL64((A12^D2), 6);
976 B2 = ROL64((A23^D3), 25);
977 B3 = ROL64((A34^D4), 8);
978 A40 = B0 ^((~B1)& B2 );
979 A01 = B1 ^((~B2)& B3 );
980 A12 = B2 ^((~B3)& B4 );
981 A23 = B3 ^((~B4)& B0 );
982 A34 = B4 ^((~B0)& B1 );
983
984 B1 = ROL64((A10^D0), 36);
985 B2 = ROL64((A21^D1), 10);
986 B3 = ROL64((A32^D2), 15);
987 B4 = ROL64((A43^D3), 56);
988 B0 = ROL64((A04^D4), 27);
989 A10 = B0 ^((~B1)& B2 );
990 A21 = B1 ^((~B2)& B3 );
991 A32 = B2 ^((~B3)& B4 );
992 A43 = B3 ^((~B4)& B0 );
993 A04 = B4 ^((~B0)& B1 );
994
995 B3 = ROL64((A30^D0), 41);
996 B4 = ROL64((A41^D1), 2);
997 B0 = ROL64((A02^D2), 62);
998 B1 = ROL64((A13^D3), 55);
999 B2 = ROL64((A24^D4), 39);
1000 A30 = B0 ^((~B1)& B2 );
1001 A41 = B1 ^((~B2)& B3 );
1002 A02 = B2 ^((~B3)& B4 );
1003 A13 = B3 ^((~B4)& B0 );
1004 A24 = B4 ^((~B0)& B1 );
1005
1006 C0 = A00^A20^A40^A10^A30;
1007 C1 = A11^A31^A01^A21^A41;
1008 C2 = A22^A42^A12^A32^A02;
1009 C3 = A33^A03^A23^A43^A13;
1010 C4 = A44^A14^A34^A04^A24;
1011 D0 = C4^ROL64(C1, 1);
1012 D1 = C0^ROL64(C2, 1);
1013 D2 = C1^ROL64(C3, 1);
1014 D3 = C2^ROL64(C4, 1);
1015 D4 = C3^ROL64(C0, 1);
1016
1017 B0 = (A00^D0);
1018 B1 = ROL64((A31^D1), 44);
1019 B2 = ROL64((A12^D2), 43);
1020 B3 = ROL64((A43^D3), 21);
1021 B4 = ROL64((A24^D4), 14);
1022 A00 = B0 ^((~B1)& B2 );
1023 A00 ^= RC[i+1];
1024 A31 = B1 ^((~B2)& B3 );
1025 A12 = B2 ^((~B3)& B4 );
1026 A43 = B3 ^((~B4)& B0 );
1027 A24 = B4 ^((~B0)& B1 );
1028
1029 B2 = ROL64((A40^D0), 3);
1030 B3 = ROL64((A21^D1), 45);
1031 B4 = ROL64((A02^D2), 61);
1032 B0 = ROL64((A33^D3), 28);
1033 B1 = ROL64((A14^D4), 20);
1034 A40 = B0 ^((~B1)& B2 );
1035 A21 = B1 ^((~B2)& B3 );
1036 A02 = B2 ^((~B3)& B4 );
1037 A33 = B3 ^((~B4)& B0 );
1038 A14 = B4 ^((~B0)& B1 );
1039
1040 B4 = ROL64((A30^D0), 18);
1041 B0 = ROL64((A11^D1), 1);
1042 B1 = ROL64((A42^D2), 6);
1043 B2 = ROL64((A23^D3), 25);
1044 B3 = ROL64((A04^D4), 8);
1045 A30 = B0 ^((~B1)& B2 );
1046 A11 = B1 ^((~B2)& B3 );
1047 A42 = B2 ^((~B3)& B4 );
1048 A23 = B3 ^((~B4)& B0 );
1049 A04 = B4 ^((~B0)& B1 );
1050
1051 B1 = ROL64((A20^D0), 36);
1052 B2 = ROL64((A01^D1), 10);
1053 B3 = ROL64((A32^D2), 15);
1054 B4 = ROL64((A13^D3), 56);
1055 B0 = ROL64((A44^D4), 27);
1056 A20 = B0 ^((~B1)& B2 );
1057 A01 = B1 ^((~B2)& B3 );
1058 A32 = B2 ^((~B3)& B4 );
1059 A13 = B3 ^((~B4)& B0 );
1060 A44 = B4 ^((~B0)& B1 );
1061
1062 B3 = ROL64((A10^D0), 41);
1063 B4 = ROL64((A41^D1), 2);
1064 B0 = ROL64((A22^D2), 62);
1065 B1 = ROL64((A03^D3), 55);
1066 B2 = ROL64((A34^D4), 39);
1067 A10 = B0 ^((~B1)& B2 );
1068 A41 = B1 ^((~B2)& B3 );
1069 A22 = B2 ^((~B3)& B4 );
1070 A03 = B3 ^((~B4)& B0 );
1071 A34 = B4 ^((~B0)& B1 );
1072
1073 C0 = A00^A40^A30^A20^A10;
1074 C1 = A31^A21^A11^A01^A41;
1075 C2 = A12^A02^A42^A32^A22;
1076 C3 = A43^A33^A23^A13^A03;
1077 C4 = A24^A14^A04^A44^A34;
1078 D0 = C4^ROL64(C1, 1);
1079 D1 = C0^ROL64(C2, 1);
1080 D2 = C1^ROL64(C3, 1);
1081 D3 = C2^ROL64(C4, 1);
1082 D4 = C3^ROL64(C0, 1);
1083
1084 B0 = (A00^D0);
1085 B1 = ROL64((A21^D1), 44);
1086 B2 = ROL64((A42^D2), 43);
1087 B3 = ROL64((A13^D3), 21);
1088 B4 = ROL64((A34^D4), 14);
1089 A00 = B0 ^((~B1)& B2 );
1090 A00 ^= RC[i+2];
1091 A21 = B1 ^((~B2)& B3 );
1092 A42 = B2 ^((~B3)& B4 );
1093 A13 = B3 ^((~B4)& B0 );
1094 A34 = B4 ^((~B0)& B1 );
1095
1096 B2 = ROL64((A30^D0), 3);
1097 B3 = ROL64((A01^D1), 45);
1098 B4 = ROL64((A22^D2), 61);
1099 B0 = ROL64((A43^D3), 28);
1100 B1 = ROL64((A14^D4), 20);
1101 A30 = B0 ^((~B1)& B2 );
1102 A01 = B1 ^((~B2)& B3 );
1103 A22 = B2 ^((~B3)& B4 );
1104 A43 = B3 ^((~B4)& B0 );
1105 A14 = B4 ^((~B0)& B1 );
1106
1107 B4 = ROL64((A10^D0), 18);
1108 B0 = ROL64((A31^D1), 1);
1109 B1 = ROL64((A02^D2), 6);
1110 B2 = ROL64((A23^D3), 25);
1111 B3 = ROL64((A44^D4), 8);
1112 A10 = B0 ^((~B1)& B2 );
1113 A31 = B1 ^((~B2)& B3 );
1114 A02 = B2 ^((~B3)& B4 );
1115 A23 = B3 ^((~B4)& B0 );
1116 A44 = B4 ^((~B0)& B1 );
1117
1118 B1 = ROL64((A40^D0), 36);
1119 B2 = ROL64((A11^D1), 10);
1120 B3 = ROL64((A32^D2), 15);
1121 B4 = ROL64((A03^D3), 56);
1122 B0 = ROL64((A24^D4), 27);
1123 A40 = B0 ^((~B1)& B2 );
1124 A11 = B1 ^((~B2)& B3 );
1125 A32 = B2 ^((~B3)& B4 );
1126 A03 = B3 ^((~B4)& B0 );
1127 A24 = B4 ^((~B0)& B1 );
1128
1129 B3 = ROL64((A20^D0), 41);
1130 B4 = ROL64((A41^D1), 2);
1131 B0 = ROL64((A12^D2), 62);
1132 B1 = ROL64((A33^D3), 55);
1133 B2 = ROL64((A04^D4), 39);
1134 A20 = B0 ^((~B1)& B2 );
1135 A41 = B1 ^((~B2)& B3 );
1136 A12 = B2 ^((~B3)& B4 );
1137 A33 = B3 ^((~B4)& B0 );
1138 A04 = B4 ^((~B0)& B1 );
1139
1140 C0 = A00^A30^A10^A40^A20;
1141 C1 = A21^A01^A31^A11^A41;
1142 C2 = A42^A22^A02^A32^A12;
1143 C3 = A13^A43^A23^A03^A33;
1144 C4 = A34^A14^A44^A24^A04;
1145 D0 = C4^ROL64(C1, 1);
1146 D1 = C0^ROL64(C2, 1);
1147 D2 = C1^ROL64(C3, 1);
1148 D3 = C2^ROL64(C4, 1);
1149 D4 = C3^ROL64(C0, 1);
1150
1151 B0 = (A00^D0);
1152 B1 = ROL64((A01^D1), 44);
1153 B2 = ROL64((A02^D2), 43);
1154 B3 = ROL64((A03^D3), 21);
1155 B4 = ROL64((A04^D4), 14);
1156 A00 = B0 ^((~B1)& B2 );
1157 A00 ^= RC[i+3];
1158 A01 = B1 ^((~B2)& B3 );
1159 A02 = B2 ^((~B3)& B4 );
1160 A03 = B3 ^((~B4)& B0 );
1161 A04 = B4 ^((~B0)& B1 );
1162
1163 B2 = ROL64((A10^D0), 3);
1164 B3 = ROL64((A11^D1), 45);
1165 B4 = ROL64((A12^D2), 61);
1166 B0 = ROL64((A13^D3), 28);
1167 B1 = ROL64((A14^D4), 20);
1168 A10 = B0 ^((~B1)& B2 );
1169 A11 = B1 ^((~B2)& B3 );
1170 A12 = B2 ^((~B3)& B4 );
1171 A13 = B3 ^((~B4)& B0 );
1172 A14 = B4 ^((~B0)& B1 );
1173
1174 B4 = ROL64((A20^D0), 18);
1175 B0 = ROL64((A21^D1), 1);
1176 B1 = ROL64((A22^D2), 6);
1177 B2 = ROL64((A23^D3), 25);
1178 B3 = ROL64((A24^D4), 8);
1179 A20 = B0 ^((~B1)& B2 );
1180 A21 = B1 ^((~B2)& B3 );
1181 A22 = B2 ^((~B3)& B4 );
1182 A23 = B3 ^((~B4)& B0 );
1183 A24 = B4 ^((~B0)& B1 );
1184
1185 B1 = ROL64((A30^D0), 36);
1186 B2 = ROL64((A31^D1), 10);
1187 B3 = ROL64((A32^D2), 15);
1188 B4 = ROL64((A33^D3), 56);
1189 B0 = ROL64((A34^D4), 27);
1190 A30 = B0 ^((~B1)& B2 );
1191 A31 = B1 ^((~B2)& B3 );
1192 A32 = B2 ^((~B3)& B4 );
1193 A33 = B3 ^((~B4)& B0 );
1194 A34 = B4 ^((~B0)& B1 );
1195
1196 B3 = ROL64((A40^D0), 41);
1197 B4 = ROL64((A41^D1), 2);
1198 B0 = ROL64((A42^D2), 62);
1199 B1 = ROL64((A43^D3), 55);
1200 B2 = ROL64((A44^D4), 39);
1201 A40 = B0 ^((~B1)& B2 );
1202 A41 = B1 ^((~B2)& B3 );
1203 A42 = B2 ^((~B3)& B4 );
1204 A43 = B3 ^((~B4)& B0 );
1205 A44 = B4 ^((~B0)& B1 );
1206 }
1207}
1208
1209/*
1210** Initialize a new hash. iSize determines the size of the hash
1211** in bits and should be one of 224, 256, 384, or 512. Or iSize
1212** can be zero to use the default hash size of 256 bits.
1213*/
1214static void SHA3Init(SHA3Context *p, int iSize){
1215 memset(p, 0, sizeof(*p));
1216 if( iSize>=128 && iSize<=512 ){
1217 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1218 }else{
1219 p->nRate = (1600 - 2*256)/8;
1220 }
1221#if SHA3_BYTEORDER==1234
1222 /* Known to be little-endian at compile-time. No-op */
1223#elif SHA3_BYTEORDER==4321
1224 p->ixMask = 7; /* Big-endian */
1225#else
1226 {
1227 static unsigned int one = 1;
1228 if( 1==*(unsigned char*)&one ){
1229 /* Little endian. No byte swapping. */
1230 p->ixMask = 0;
1231 }else{
1232 /* Big endian. Byte swap. */
1233 p->ixMask = 7;
1234 }
1235 }
1236#endif
1237}
1238
1239/*
1240** Make consecutive calls to the SHA3Update function to add new content
1241** to the hash
1242*/
1243static void SHA3Update(
1244 SHA3Context *p,
1245 const unsigned char *aData,
1246 unsigned int nData
1247){
1248 unsigned int i = 0;
1249#if SHA3_BYTEORDER==1234
1250 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1251 for(; i+7<nData; i+=8){
1252 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1253 p->nLoaded += 8;
1254 if( p->nLoaded>=p->nRate ){
1255 KeccakF1600Step(p);
1256 p->nLoaded = 0;
1257 }
1258 }
1259 }
1260#endif
1261 for(; i<nData; i++){
1262#if SHA3_BYTEORDER==1234
1263 p->u.x[p->nLoaded] ^= aData[i];
1264#elif SHA3_BYTEORDER==4321
1265 p->u.x[p->nLoaded^0x07] ^= aData[i];
1266#else
1267 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1268#endif
1269 p->nLoaded++;
1270 if( p->nLoaded==p->nRate ){
1271 KeccakF1600Step(p);
1272 p->nLoaded = 0;
1273 }
1274 }
1275}
1276
1277/*
1278** After all content has been added, invoke SHA3Final() to compute
1279** the final hash. The function returns a pointer to the binary
1280** hash value.
1281*/
1282static unsigned char *SHA3Final(SHA3Context *p){
1283 unsigned int i;
1284 if( p->nLoaded==p->nRate-1 ){
1285 const unsigned char c1 = 0x86;
1286 SHA3Update(p, &c1, 1);
1287 }else{
1288 const unsigned char c2 = 0x06;
1289 const unsigned char c3 = 0x80;
1290 SHA3Update(p, &c2, 1);
1291 p->nLoaded = p->nRate - 1;
1292 SHA3Update(p, &c3, 1);
1293 }
1294 for(i=0; i<p->nRate; i++){
1295 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1296 }
1297 return &p->u.x[p->nRate];
1298}
drh2ce15c32017-07-11 13:34:40 +00001299/* End of the hashing logic
1300*****************************************************************************/
drh1554bc82017-03-08 16:10:34 +00001301
1302/*
1303** Implementation of the sha3(X,SIZE) function.
1304**
1305** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
drh2ce15c32017-07-11 13:34:40 +00001306** size is 256. If X is a BLOB, it is hashed as is.
drh1554bc82017-03-08 16:10:34 +00001307** For all other non-NULL types of input, X is converted into a UTF-8 string
1308** and the string is hashed without the trailing 0x00 terminator. The hash
1309** of a NULL value is NULL.
1310*/
1311static void sha3Func(
1312 sqlite3_context *context,
1313 int argc,
1314 sqlite3_value **argv
1315){
1316 SHA3Context cx;
1317 int eType = sqlite3_value_type(argv[0]);
1318 int nByte = sqlite3_value_bytes(argv[0]);
1319 int iSize;
1320 if( argc==1 ){
1321 iSize = 256;
1322 }else{
1323 iSize = sqlite3_value_int(argv[1]);
1324 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1325 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1326 "384 512", -1);
1327 return;
1328 }
1329 }
1330 if( eType==SQLITE_NULL ) return;
1331 SHA3Init(&cx, iSize);
1332 if( eType==SQLITE_BLOB ){
1333 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1334 }else{
1335 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1336 }
1337 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1338}
1339
1340/* Compute a string using sqlite3_vsnprintf() with a maximum length
1341** of 50 bytes and add it to the hash.
1342*/
1343static void hash_step_vformat(
1344 SHA3Context *p, /* Add content to this context */
1345 const char *zFormat,
1346 ...
1347){
1348 va_list ap;
1349 int n;
1350 char zBuf[50];
1351 va_start(ap, zFormat);
1352 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1353 va_end(ap);
1354 n = (int)strlen(zBuf);
1355 SHA3Update(p, (unsigned char*)zBuf, n);
1356}
1357
1358/*
1359** Implementation of the sha3_query(SQL,SIZE) function.
1360**
1361** This function compiles and runs the SQL statement(s) given in the
1362** argument. The results are hashed using a SIZE-bit SHA3. The default
1363** size is 256.
1364**
1365** The format of the byte stream that is hashed is summarized as follows:
1366**
1367** S<n>:<sql>
1368** R
1369** N
1370** I<int>
1371** F<ieee-float>
1372** B<size>:<bytes>
1373** T<size>:<text>
1374**
1375** <sql> is the original SQL text for each statement run and <n> is
1376** the size of that text. The SQL text is UTF-8. A single R character
1377** occurs before the start of each row. N means a NULL value.
1378** I mean an 8-byte little-endian integer <int>. F is a floating point
1379** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1380** B means blobs of <size> bytes. T means text rendered as <size>
1381** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
1382** text integers.
1383**
1384** For each SQL statement in the X input, there is one S segment. Each
1385** S segment is followed by zero or more R segments, one for each row in the
1386** result set. After each R, there are one or more N, I, F, B, or T segments,
1387** one for each column in the result set. Segments are concatentated directly
1388** with no delimiters of any kind.
1389*/
1390static void sha3QueryFunc(
1391 sqlite3_context *context,
1392 int argc,
1393 sqlite3_value **argv
1394){
1395 sqlite3 *db = sqlite3_context_db_handle(context);
1396 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1397 sqlite3_stmt *pStmt = 0;
1398 int nCol; /* Number of columns in the result set */
1399 int i; /* Loop counter */
1400 int rc;
1401 int n;
1402 const char *z;
1403 SHA3Context cx;
1404 int iSize;
1405
1406 if( argc==1 ){
1407 iSize = 256;
1408 }else{
1409 iSize = sqlite3_value_int(argv[1]);
1410 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1411 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1412 "384 512", -1);
1413 return;
1414 }
1415 }
1416 if( zSql==0 ) return;
1417 SHA3Init(&cx, iSize);
1418 while( zSql[0] ){
1419 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1420 if( rc ){
1421 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1422 zSql, sqlite3_errmsg(db));
1423 sqlite3_finalize(pStmt);
1424 sqlite3_result_error(context, zMsg, -1);
1425 sqlite3_free(zMsg);
1426 return;
1427 }
1428 if( !sqlite3_stmt_readonly(pStmt) ){
1429 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1430 sqlite3_finalize(pStmt);
1431 sqlite3_result_error(context, zMsg, -1);
1432 sqlite3_free(zMsg);
1433 return;
1434 }
1435 nCol = sqlite3_column_count(pStmt);
1436 z = sqlite3_sql(pStmt);
1437 n = (int)strlen(z);
1438 hash_step_vformat(&cx,"S%d:",n);
1439 SHA3Update(&cx,(unsigned char*)z,n);
1440
1441 /* Compute a hash over the result of the query */
1442 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1443 SHA3Update(&cx,(const unsigned char*)"R",1);
1444 for(i=0; i<nCol; i++){
1445 switch( sqlite3_column_type(pStmt,i) ){
1446 case SQLITE_NULL: {
1447 SHA3Update(&cx, (const unsigned char*)"N",1);
1448 break;
1449 }
1450 case SQLITE_INTEGER: {
1451 sqlite3_uint64 u;
1452 int j;
1453 unsigned char x[9];
1454 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1455 memcpy(&u, &v, 8);
1456 for(j=8; j>=1; j--){
1457 x[j] = u & 0xff;
1458 u >>= 8;
1459 }
1460 x[0] = 'I';
1461 SHA3Update(&cx, x, 9);
1462 break;
1463 }
1464 case SQLITE_FLOAT: {
1465 sqlite3_uint64 u;
1466 int j;
1467 unsigned char x[9];
1468 double r = sqlite3_column_double(pStmt,i);
1469 memcpy(&u, &r, 8);
1470 for(j=8; j>=1; j--){
1471 x[j] = u & 0xff;
1472 u >>= 8;
1473 }
1474 x[0] = 'F';
1475 SHA3Update(&cx,x,9);
1476 break;
1477 }
1478 case SQLITE_TEXT: {
1479 int n2 = sqlite3_column_bytes(pStmt, i);
1480 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1481 hash_step_vformat(&cx,"T%d:",n2);
1482 SHA3Update(&cx, z2, n2);
1483 break;
1484 }
1485 case SQLITE_BLOB: {
1486 int n2 = sqlite3_column_bytes(pStmt, i);
1487 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1488 hash_step_vformat(&cx,"B%d:",n2);
1489 SHA3Update(&cx, z2, n2);
1490 break;
1491 }
1492 }
1493 }
1494 }
1495 sqlite3_finalize(pStmt);
1496 }
1497 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1498}
drh2ce15c32017-07-11 13:34:40 +00001499
1500
1501#ifdef _WIN32
1502__declspec(dllexport)
1503#endif
1504int sqlite3_shathree_init(
1505 sqlite3 *db,
1506 char **pzErrMsg,
1507 const sqlite3_api_routines *pApi
1508){
1509 int rc = SQLITE_OK;
1510 SQLITE_EXTENSION_INIT2(pApi);
1511 (void)pzErrMsg; /* Unused parameter */
1512 rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0,
1513 sha3Func, 0, 0);
1514 if( rc==SQLITE_OK ){
1515 rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0,
1516 sha3Func, 0, 0);
1517 }
1518 if( rc==SQLITE_OK ){
1519 rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0,
1520 sha3QueryFunc, 0, 0);
1521 }
1522 if( rc==SQLITE_OK ){
1523 rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0,
1524 sha3QueryFunc, 0, 0);
1525 }
1526 return rc;
1527}
1528
1529/************************* End ../ext/misc/shathree.c ********************/
1530/************************* Begin ../ext/misc/fileio.c ******************/
1531/*
1532** 2014-06-13
1533**
1534** The author disclaims copyright to this source code. In place of
1535** a legal notice, here is a blessing:
1536**
1537** May you do good and not evil.
1538** May you find forgiveness for yourself and forgive others.
1539** May you share freely, never taking more than you give.
1540**
1541******************************************************************************
1542**
1543** This SQLite extension implements SQL functions readfile() and
1544** writefile().
1545*/
1546SQLITE_EXTENSION_INIT1
1547#include <stdio.h>
1548
1549/*
1550** Implementation of the "readfile(X)" SQL function. The entire content
1551** of the file named X is read and returned as a BLOB. NULL is returned
1552** if the file does not exist or is unreadable.
1553*/
1554static void readfileFunc(
1555 sqlite3_context *context,
1556 int argc,
1557 sqlite3_value **argv
1558){
1559 const char *zName;
1560 FILE *in;
1561 long nIn;
1562 void *pBuf;
1563
drh89997982017-07-11 18:11:33 +00001564 (void)(argc); /* Unused parameter */
drh2ce15c32017-07-11 13:34:40 +00001565 zName = (const char*)sqlite3_value_text(argv[0]);
1566 if( zName==0 ) return;
1567 in = fopen(zName, "rb");
1568 if( in==0 ) return;
1569 fseek(in, 0, SEEK_END);
1570 nIn = ftell(in);
1571 rewind(in);
1572 pBuf = sqlite3_malloc( nIn );
1573 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1574 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1575 }else{
1576 sqlite3_free(pBuf);
1577 }
1578 fclose(in);
1579}
1580
1581/*
1582** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1583** is written into file X. The number of bytes written is returned. Or
1584** NULL is returned if something goes wrong, such as being unable to open
1585** file X for writing.
1586*/
1587static void writefileFunc(
1588 sqlite3_context *context,
1589 int argc,
1590 sqlite3_value **argv
1591){
1592 FILE *out;
1593 const char *z;
1594 sqlite3_int64 rc;
1595 const char *zFile;
1596
drh89997982017-07-11 18:11:33 +00001597 (void)(argc); /* Unused parameter */
drh2ce15c32017-07-11 13:34:40 +00001598 zFile = (const char*)sqlite3_value_text(argv[0]);
1599 if( zFile==0 ) return;
1600 out = fopen(zFile, "wb");
1601 if( out==0 ) return;
1602 z = (const char*)sqlite3_value_blob(argv[1]);
1603 if( z==0 ){
1604 rc = 0;
1605 }else{
1606 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
1607 }
1608 fclose(out);
1609 sqlite3_result_int64(context, rc);
1610}
1611
1612
1613#ifdef _WIN32
1614__declspec(dllexport)
1615#endif
1616int sqlite3_fileio_init(
1617 sqlite3 *db,
1618 char **pzErrMsg,
1619 const sqlite3_api_routines *pApi
1620){
1621 int rc = SQLITE_OK;
1622 SQLITE_EXTENSION_INIT2(pApi);
1623 (void)pzErrMsg; /* Unused parameter */
1624 rc = sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1625 readfileFunc, 0, 0);
1626 if( rc==SQLITE_OK ){
1627 rc = sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1628 writefileFunc, 0, 0);
1629 }
1630 return rc;
1631}
1632
1633/************************* End ../ext/misc/fileio.c ********************/
drh56eb09b2017-07-11 13:59:07 +00001634/************************* Begin ../ext/misc/completion.c ******************/
1635/*
1636** 2017-07-10
1637**
1638** The author disclaims copyright to this source code. In place of
1639** a legal notice, here is a blessing:
1640**
1641** May you do good and not evil.
1642** May you find forgiveness for yourself and forgive others.
1643** May you share freely, never taking more than you give.
1644**
1645*************************************************************************
1646**
1647** This file implements an eponymous virtual table that returns suggested
1648** completions for a partial SQL input.
1649**
1650** Suggested usage:
1651**
1652** SELECT DISTINCT candidate COLLATE nocase
1653** FROM completion($prefix,$wholeline)
1654** ORDER BY 1;
1655**
1656** The two query parameters are optional. $prefix is the text of the
1657** current word being typed and that is to be completed. $wholeline is
1658** the complete input line, used for context.
1659**
1660** The raw completion() table might return the same candidate multiple
1661** times, for example if the same column name is used to two or more
1662** tables. And the candidates are returned in an arbitrary order. Hence,
1663** the DISTINCT and ORDER BY are recommended.
1664**
1665** This virtual table operates at the speed of human typing, and so there
1666** is no attempt to make it fast. Even a slow implementation will be much
1667** faster than any human can type.
1668**
1669*/
1670SQLITE_EXTENSION_INIT1
1671#include <assert.h>
1672#include <string.h>
1673#include <ctype.h>
1674
1675#ifndef SQLITE_OMIT_VIRTUALTABLE
1676
1677/* completion_vtab is a subclass of sqlite3_vtab which will
1678** serve as the underlying representation of a completion virtual table
1679*/
1680typedef struct completion_vtab completion_vtab;
1681struct completion_vtab {
1682 sqlite3_vtab base; /* Base class - must be first */
1683 sqlite3 *db; /* Database connection for this completion vtab */
1684};
1685
1686/* completion_cursor is a subclass of sqlite3_vtab_cursor which will
1687** serve as the underlying representation of a cursor that scans
1688** over rows of the result
1689*/
1690typedef struct completion_cursor completion_cursor;
1691struct completion_cursor {
1692 sqlite3_vtab_cursor base; /* Base class - must be first */
1693 sqlite3 *db; /* Database connection for this cursor */
1694 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */
1695 char *zPrefix; /* The prefix for the word we want to complete */
1696 char *zLine; /* The whole that we want to complete */
1697 const char *zCurrentRow; /* Current output row */
1698 sqlite3_stmt *pStmt; /* Current statement */
1699 sqlite3_int64 iRowid; /* The rowid */
1700 int ePhase; /* Current phase */
1701 int j; /* inter-phase counter */
1702};
1703
1704/* Values for ePhase:
1705*/
1706#define COMPLETION_FIRST_PHASE 1
1707#define COMPLETION_KEYWORDS 1
1708#define COMPLETION_PRAGMAS 2
1709#define COMPLETION_FUNCTIONS 3
1710#define COMPLETION_COLLATIONS 4
1711#define COMPLETION_INDEXES 5
1712#define COMPLETION_TRIGGERS 6
1713#define COMPLETION_DATABASES 7
1714#define COMPLETION_TABLES 8
1715#define COMPLETION_COLUMNS 9
1716#define COMPLETION_MODULES 10
1717#define COMPLETION_EOF 11
1718
1719/*
1720** The completionConnect() method is invoked to create a new
1721** completion_vtab that describes the completion virtual table.
1722**
1723** Think of this routine as the constructor for completion_vtab objects.
1724**
1725** All this routine needs to do is:
1726**
1727** (1) Allocate the completion_vtab object and initialize all fields.
1728**
1729** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
1730** result set of queries against completion will look like.
1731*/
1732static int completionConnect(
1733 sqlite3 *db,
1734 void *pAux,
1735 int argc, const char *const*argv,
1736 sqlite3_vtab **ppVtab,
1737 char **pzErr
1738){
1739 completion_vtab *pNew;
1740 int rc;
1741
drh89997982017-07-11 18:11:33 +00001742 (void)(pAux); /* Unused parameter */
1743 (void)(argc); /* Unused parameter */
1744 (void)(argv); /* Unused parameter */
1745 (void)(pzErr); /* Unused parameter */
1746
drh56eb09b2017-07-11 13:59:07 +00001747/* Column numbers */
1748#define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */
1749#define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */
1750#define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
1751#define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
1752
1753 rc = sqlite3_declare_vtab(db,
1754 "CREATE TABLE x("
1755 " candidate TEXT,"
1756 " prefix TEXT HIDDEN,"
1757 " wholeline TEXT HIDDEN,"
1758 " phase INT HIDDEN" /* Used for debugging only */
1759 ")");
1760 if( rc==SQLITE_OK ){
1761 pNew = sqlite3_malloc( sizeof(*pNew) );
1762 *ppVtab = (sqlite3_vtab*)pNew;
1763 if( pNew==0 ) return SQLITE_NOMEM;
1764 memset(pNew, 0, sizeof(*pNew));
1765 pNew->db = db;
1766 }
1767 return rc;
1768}
1769
1770/*
1771** This method is the destructor for completion_cursor objects.
1772*/
1773static int completionDisconnect(sqlite3_vtab *pVtab){
1774 sqlite3_free(pVtab);
1775 return SQLITE_OK;
1776}
1777
1778/*
1779** Constructor for a new completion_cursor object.
1780*/
1781static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
1782 completion_cursor *pCur;
1783 pCur = sqlite3_malloc( sizeof(*pCur) );
1784 if( pCur==0 ) return SQLITE_NOMEM;
1785 memset(pCur, 0, sizeof(*pCur));
1786 pCur->db = ((completion_vtab*)p)->db;
1787 *ppCursor = &pCur->base;
1788 return SQLITE_OK;
1789}
1790
1791/*
1792** Reset the completion_cursor.
1793*/
1794static void completionCursorReset(completion_cursor *pCur){
1795 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0;
1796 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0;
1797 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
1798 pCur->j = 0;
1799}
1800
1801/*
1802** Destructor for a completion_cursor.
1803*/
1804static int completionClose(sqlite3_vtab_cursor *cur){
1805 completionCursorReset((completion_cursor*)cur);
1806 sqlite3_free(cur);
1807 return SQLITE_OK;
1808}
1809
1810/*
1811** All SQL keywords understood by SQLite
1812*/
1813static const char *completionKwrds[] = {
1814 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
1815 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
1816 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
1817 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
1818 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
1819 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
1820 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
1821 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
1822 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
1823 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
1824 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
1825 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
1826 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
1827 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
1828 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
1829 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
1830 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
1831 "WITH", "WITHOUT",
1832};
drh89997982017-07-11 18:11:33 +00001833#define completionKwCount \
1834 (int)(sizeof(completionKwrds)/sizeof(completionKwrds[0]))
drh56eb09b2017-07-11 13:59:07 +00001835
1836/*
1837** Advance a completion_cursor to its next row of output.
1838**
1839** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
1840** record the current state of the scan. This routine sets ->zCurrentRow
1841** to the current row of output and then returns. If no more rows remain,
1842** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
1843** table that has reached the end of its scan.
1844**
1845** The current implementation just lists potential identifiers and
1846** keywords and filters them by zPrefix. Future enhancements should
1847** take zLine into account to try to restrict the set of identifiers and
1848** keywords based on what would be legal at the current point of input.
1849*/
1850static int completionNext(sqlite3_vtab_cursor *cur){
1851 completion_cursor *pCur = (completion_cursor*)cur;
1852 int eNextPhase = 0; /* Next phase to try if current phase reaches end */
1853 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */
1854 pCur->iRowid++;
1855 while( pCur->ePhase!=COMPLETION_EOF ){
1856 switch( pCur->ePhase ){
1857 case COMPLETION_KEYWORDS: {
drh89997982017-07-11 18:11:33 +00001858 if( pCur->j >= completionKwCount ){
drh56eb09b2017-07-11 13:59:07 +00001859 pCur->zCurrentRow = 0;
1860 pCur->ePhase = COMPLETION_DATABASES;
1861 }else{
1862 pCur->zCurrentRow = completionKwrds[pCur->j++];
1863 }
1864 iCol = -1;
1865 break;
1866 }
1867 case COMPLETION_DATABASES: {
1868 if( pCur->pStmt==0 ){
1869 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
1870 &pCur->pStmt, 0);
1871 }
1872 iCol = 1;
1873 eNextPhase = COMPLETION_TABLES;
1874 break;
1875 }
1876 case COMPLETION_TABLES: {
1877 if( pCur->pStmt==0 ){
1878 sqlite3_stmt *pS2;
1879 char *zSql = 0;
1880 const char *zSep = "";
1881 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
1882 while( sqlite3_step(pS2)==SQLITE_ROW ){
1883 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
1884 zSql = sqlite3_mprintf(
1885 "%z%s"
1886 "SELECT name FROM \"%w\".sqlite_master"
1887 " WHERE type='table'",
1888 zSql, zSep, zDb
1889 );
1890 if( zSql==0 ) return SQLITE_NOMEM;
1891 zSep = " UNION ";
1892 }
1893 sqlite3_finalize(pS2);
1894 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
1895 sqlite3_free(zSql);
1896 }
1897 iCol = 0;
1898 eNextPhase = COMPLETION_COLUMNS;
1899 break;
1900 }
1901 case COMPLETION_COLUMNS: {
1902 if( pCur->pStmt==0 ){
1903 sqlite3_stmt *pS2;
1904 char *zSql = 0;
1905 const char *zSep = "";
1906 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
1907 while( sqlite3_step(pS2)==SQLITE_ROW ){
1908 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
1909 zSql = sqlite3_mprintf(
1910 "%z%s"
1911 "SELECT pti.name FROM \"%w\".sqlite_master AS sm"
1912 " JOIN pragma_table_info(sm.name,%Q) AS pti"
1913 " WHERE sm.type='table'",
1914 zSql, zSep, zDb, zDb
1915 );
1916 if( zSql==0 ) return SQLITE_NOMEM;
1917 zSep = " UNION ";
1918 }
1919 sqlite3_finalize(pS2);
1920 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
1921 sqlite3_free(zSql);
1922 }
1923 iCol = 0;
1924 eNextPhase = COMPLETION_EOF;
1925 break;
1926 }
1927 }
1928 if( iCol<0 ){
1929 /* This case is when the phase presets zCurrentRow */
1930 if( pCur->zCurrentRow==0 ) continue;
1931 }else{
1932 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
1933 /* Extract the next row of content */
1934 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
1935 }else{
1936 /* When all rows are finished, advance to the next phase */
1937 sqlite3_finalize(pCur->pStmt);
1938 pCur->pStmt = 0;
1939 pCur->ePhase = eNextPhase;
1940 continue;
1941 }
1942 }
1943 if( pCur->nPrefix==0 ) break;
1944 if( sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 ){
1945 break;
1946 }
1947 }
1948
1949 return SQLITE_OK;
1950}
1951
1952/*
1953** Return values of columns for the row at which the completion_cursor
1954** is currently pointing.
1955*/
1956static int completionColumn(
1957 sqlite3_vtab_cursor *cur, /* The cursor */
1958 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
1959 int i /* Which column to return */
1960){
1961 completion_cursor *pCur = (completion_cursor*)cur;
1962 switch( i ){
1963 case COMPLETION_COLUMN_CANDIDATE: {
1964 sqlite3_result_text(ctx, pCur->zCurrentRow, -1, SQLITE_TRANSIENT);
1965 break;
1966 }
1967 case COMPLETION_COLUMN_PREFIX: {
1968 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
1969 break;
1970 }
1971 case COMPLETION_COLUMN_WHOLELINE: {
1972 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
1973 break;
1974 }
1975 case COMPLETION_COLUMN_PHASE: {
1976 sqlite3_result_int(ctx, pCur->ePhase);
1977 break;
1978 }
1979 }
1980 return SQLITE_OK;
1981}
1982
1983/*
1984** Return the rowid for the current row. In this implementation, the
1985** rowid is the same as the output value.
1986*/
1987static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
1988 completion_cursor *pCur = (completion_cursor*)cur;
1989 *pRowid = pCur->iRowid;
1990 return SQLITE_OK;
1991}
1992
1993/*
1994** Return TRUE if the cursor has been moved off of the last
1995** row of output.
1996*/
1997static int completionEof(sqlite3_vtab_cursor *cur){
1998 completion_cursor *pCur = (completion_cursor*)cur;
1999 return pCur->ePhase >= COMPLETION_EOF;
2000}
2001
2002/*
2003** This method is called to "rewind" the completion_cursor object back
2004** to the first row of output. This method is always called at least
2005** once prior to any call to completionColumn() or completionRowid() or
2006** completionEof().
2007*/
2008static int completionFilter(
2009 sqlite3_vtab_cursor *pVtabCursor,
2010 int idxNum, const char *idxStr,
2011 int argc, sqlite3_value **argv
2012){
2013 completion_cursor *pCur = (completion_cursor *)pVtabCursor;
2014 int iArg = 0;
drh89997982017-07-11 18:11:33 +00002015 (void)(idxStr); /* Unused parameter */
2016 (void)(argc); /* Unused parameter */
drh56eb09b2017-07-11 13:59:07 +00002017 completionCursorReset(pCur);
2018 if( idxNum & 1 ){
2019 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
2020 if( pCur->nPrefix>0 ){
2021 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
2022 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
2023 }
2024 iArg++;
2025 }
2026 if( idxNum & 2 ){
2027 pCur->nLine = sqlite3_value_bytes(argv[iArg]);
2028 if( pCur->nLine>0 ){
2029 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
2030 if( pCur->zLine==0 ) return SQLITE_NOMEM;
2031 }
2032 iArg++;
2033 }
2034 if( pCur->zLine!=0 && pCur->zPrefix==0 ){
2035 int i = pCur->nLine;
2036 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
2037 i--;
2038 }
2039 pCur->nPrefix = pCur->nLine - i;
2040 if( pCur->nPrefix>0 ){
2041 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
2042 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
2043 }
2044 }
2045 pCur->iRowid = 0;
2046 pCur->ePhase = COMPLETION_FIRST_PHASE;
2047 return completionNext(pVtabCursor);
2048}
2049
2050/*
2051** SQLite will invoke this method one or more times while planning a query
2052** that uses the completion virtual table. This routine needs to create
2053** a query plan for each invocation and compute an estimated cost for that
2054** plan.
2055**
2056** There are two hidden parameters that act as arguments to the table-valued
2057** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix"
2058** is available and bit 1 is set if "wholeline" is available.
2059*/
2060static int completionBestIndex(
2061 sqlite3_vtab *tab,
2062 sqlite3_index_info *pIdxInfo
2063){
2064 int i; /* Loop over constraints */
2065 int idxNum = 0; /* The query plan bitmask */
2066 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */
2067 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
2068 int nArg = 0; /* Number of arguments that completeFilter() expects */
2069 const struct sqlite3_index_constraint *pConstraint;
2070
drh89997982017-07-11 18:11:33 +00002071 (void)(tab); /* Unused parameter */
drh56eb09b2017-07-11 13:59:07 +00002072 pConstraint = pIdxInfo->aConstraint;
2073 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2074 if( pConstraint->usable==0 ) continue;
2075 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
2076 switch( pConstraint->iColumn ){
2077 case COMPLETION_COLUMN_PREFIX:
2078 prefixIdx = i;
2079 idxNum |= 1;
2080 break;
2081 case COMPLETION_COLUMN_WHOLELINE:
2082 wholelineIdx = i;
2083 idxNum |= 2;
2084 break;
2085 }
2086 }
2087 if( prefixIdx>=0 ){
2088 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
2089 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
2090 }
2091 if( wholelineIdx>=0 ){
2092 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
2093 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
2094 }
2095 pIdxInfo->idxNum = idxNum;
2096 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
2097 pIdxInfo->estimatedRows = 500 - 100*nArg;
2098 return SQLITE_OK;
2099}
2100
2101/*
2102** This following structure defines all the methods for the
2103** completion virtual table.
2104*/
2105static sqlite3_module completionModule = {
2106 0, /* iVersion */
2107 0, /* xCreate */
2108 completionConnect, /* xConnect */
2109 completionBestIndex, /* xBestIndex */
2110 completionDisconnect, /* xDisconnect */
2111 0, /* xDestroy */
2112 completionOpen, /* xOpen - open a cursor */
2113 completionClose, /* xClose - close a cursor */
2114 completionFilter, /* xFilter - configure scan constraints */
2115 completionNext, /* xNext - advance a cursor */
2116 completionEof, /* xEof - check for end of scan */
2117 completionColumn, /* xColumn - read data */
2118 completionRowid, /* xRowid - read data */
2119 0, /* xUpdate */
2120 0, /* xBegin */
2121 0, /* xSync */
2122 0, /* xCommit */
2123 0, /* xRollback */
2124 0, /* xFindMethod */
2125 0, /* xRename */
drh89997982017-07-11 18:11:33 +00002126 0, /* xSavepoint */
2127 0, /* xRelease */
2128 0 /* xRollbackTo */
drh56eb09b2017-07-11 13:59:07 +00002129};
2130
2131#endif /* SQLITE_OMIT_VIRTUALTABLE */
2132
2133int sqlite3CompletionVtabInit(sqlite3 *db){
2134 int rc = SQLITE_OK;
2135#ifndef SQLITE_OMIT_VIRTUALTABLE
2136 rc = sqlite3_create_module(db, "completion", &completionModule, 0);
2137#endif
2138 return rc;
2139}
2140
2141#ifdef _WIN32
2142__declspec(dllexport)
2143#endif
2144int sqlite3_completion_init(
2145 sqlite3 *db,
2146 char **pzErrMsg,
2147 const sqlite3_api_routines *pApi
2148){
2149 int rc = SQLITE_OK;
2150 SQLITE_EXTENSION_INIT2(pApi);
drh89997982017-07-11 18:11:33 +00002151 (void)(pzErrMsg); /* Unused parameter */
drh56eb09b2017-07-11 13:59:07 +00002152#ifndef SQLITE_OMIT_VIRTUALTABLE
2153 rc = sqlite3CompletionVtabInit(db);
2154#endif
2155 return rc;
2156}
2157
2158/************************* End ../ext/misc/completion.c ********************/
drh1554bc82017-03-08 16:10:34 +00002159
drhe6229612014-08-18 15:08:26 +00002160#if defined(SQLITE_ENABLE_SESSION)
2161/*
2162** State information for a single open session
2163*/
2164typedef struct OpenSession OpenSession;
2165struct OpenSession {
2166 char *zName; /* Symbolic name for this session */
2167 int nFilter; /* Number of xFilter rejection GLOB patterns */
2168 char **azFilter; /* Array of xFilter rejection GLOB patterns */
2169 sqlite3_session *p; /* The open session */
2170};
2171#endif
2172
drhdcd87a92014-08-18 13:45:42 +00002173/*
mistachkin1fe36bb2016-04-04 02:16:44 +00002174** Shell output mode information from before ".explain on",
drhdcd87a92014-08-18 13:45:42 +00002175** saved so that it can be restored by ".explain off"
2176*/
2177typedef struct SavedModeInfo SavedModeInfo;
2178struct SavedModeInfo {
2179 int valid; /* Is there legit data in here? */
2180 int mode; /* Mode prior to ".explain on" */
2181 int showHeader; /* The ".header" setting prior to ".explain on" */
2182 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +00002183};
drh45e29d82006-11-20 16:21:10 +00002184
drh8e7e7a22000-05-30 18:45:23 +00002185/*
drhdcd87a92014-08-18 13:45:42 +00002186** State information about the database connection is contained in an
2187** instance of the following structure.
drh75897232000-05-29 14:26:00 +00002188*/
drhdcd87a92014-08-18 13:45:42 +00002189typedef struct ShellState ShellState;
2190struct ShellState {
shane626a6e42009-10-22 17:30:15 +00002191 sqlite3 *db; /* The database */
drh700c2522016-02-09 18:39:25 +00002192 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +00002193 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +00002194 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +00002195 int scanstatsOn; /* True to display scan stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +00002196 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +00002197 int cnt; /* Number of records displayed so far */
2198 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +00002199 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +00002200 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +00002201 int mode; /* An output mode setting */
drh700c2522016-02-09 18:39:25 +00002202 int cMode; /* temporary output mode for the current query */
2203 int normalMode; /* Output mode before ".explain on" */
drh45e29d82006-11-20 16:21:10 +00002204 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +00002205 int showHeader; /* True to show column names in List or Column mode */
drh760c8162016-09-16 02:52:22 +00002206 int nCheck; /* Number of ".check" commands run */
drh44dec872014-08-30 15:49:25 +00002207 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +00002208 char *zDestTable; /* Name of destination table when MODE_Insert */
drh760c8162016-09-16 02:52:22 +00002209 char zTestcase[30]; /* Name of current test case */
mistachkin636bf9f2014-07-19 20:15:16 +00002210 char colSeparator[20]; /* Column separator character for several modes */
2211 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +00002212 int colWidth[100]; /* Requested width of each column when in column mode*/
2213 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +00002214 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +00002215 ** the database */
drh44c2eb12003-04-30 11:38:26 +00002216 char outfile[FILENAME_MAX]; /* Filename for *out */
2217 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +00002218 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +00002219 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +00002220 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +00002221 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +00002222 int *aiIndent; /* Array of indents used in MODE_Explain */
2223 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +00002224 int iIndent; /* Index of current op in aiIndent[] */
drhe6229612014-08-18 15:08:26 +00002225#if defined(SQLITE_ENABLE_SESSION)
2226 int nSession; /* Number of active sessions */
2227 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
2228#endif
drh75897232000-05-29 14:26:00 +00002229};
2230
2231/*
drh44dec872014-08-30 15:49:25 +00002232** These are the allowed shellFlgs values
2233*/
drhe6e1d122017-03-09 13:50:49 +00002234#define SHFLG_Scratch 0x00000001 /* The --scratch option is used */
2235#define SHFLG_Pagecache 0x00000002 /* The --pagecache option is used */
2236#define SHFLG_Lookaside 0x00000004 /* Lookaside memory is used */
2237#define SHFLG_Backslash 0x00000008 /* The --backslash option is used */
2238#define SHFLG_PreserveRowid 0x00000010 /* .dump preserves rowid values */
drhdbc26722017-07-10 18:04:41 +00002239#define SHFLG_Newlines 0x00000020 /* .dump --newline flag */
2240#define SHFLG_CountChanges 0x00000040 /* .changes setting */
2241#define SHFLG_Echo 0x00000080 /* .echo or --echo setting */
drhe6e1d122017-03-09 13:50:49 +00002242
2243/*
2244** Macros for testing and setting shellFlgs
2245*/
2246#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
2247#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
2248#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
drh44dec872014-08-30 15:49:25 +00002249
2250/*
drh75897232000-05-29 14:26:00 +00002251** These are the allowed modes.
2252*/
drh967e8b72000-06-21 13:59:10 +00002253#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00002254#define MODE_Column 1 /* One record per line in neat columns */
2255#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00002256#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
2257#define MODE_Html 4 /* Generate an XHTML table */
2258#define MODE_Insert 5 /* Generate SQL "insert" statements */
drh41f5f6e2016-10-21 17:39:30 +00002259#define MODE_Quote 6 /* Quote values as for SQL */
2260#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
2261#define MODE_Csv 8 /* Quote strings, numbers are plain */
2262#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
2263#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
2264#define MODE_Pretty 11 /* Pretty-print schemas */
persicom7e2dfdd2002-04-18 02:46:52 +00002265
drh66ce4d02008-02-15 17:38:06 +00002266static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00002267 "line",
2268 "column",
2269 "list",
2270 "semi",
2271 "html",
drhfeac5f82004-08-01 00:10:45 +00002272 "insert",
drh41f5f6e2016-10-21 17:39:30 +00002273 "quote",
drhfeac5f82004-08-01 00:10:45 +00002274 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00002275 "csv",
drh66ce4d02008-02-15 17:38:06 +00002276 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +00002277 "ascii",
drh4926fec2016-04-13 15:33:42 +00002278 "prettyprint",
persicom7e2dfdd2002-04-18 02:46:52 +00002279};
drh75897232000-05-29 14:26:00 +00002280
2281/*
mistachkinfad42082014-07-24 22:13:12 +00002282** These are the column/row/line separators used by the various
2283** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +00002284*/
mistachkinfad42082014-07-24 22:13:12 +00002285#define SEP_Column "|"
2286#define SEP_Row "\n"
2287#define SEP_Tab "\t"
2288#define SEP_Space " "
2289#define SEP_Comma ","
2290#define SEP_CrLf "\r\n"
2291#define SEP_Unit "\x1F"
2292#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +00002293
2294/*
drh75897232000-05-29 14:26:00 +00002295** Number of elements in an array
2296*/
drh902b9ee2008-12-05 17:17:07 +00002297#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00002298
2299/*
drh127f9d72010-02-23 01:47:00 +00002300** A callback for the sqlite3_log() interface.
2301*/
2302static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +00002303 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +00002304 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +00002305 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +00002306 fflush(p->pLog);
2307}
2308
2309/*
shane626a6e42009-10-22 17:30:15 +00002310** Output the given string as a hex-encoded blob (eg. X'1234' )
2311*/
2312static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
2313 int i;
2314 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +00002315 raw_printf(out,"X'");
2316 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
2317 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +00002318}
2319
2320/*
drh6193d492017-04-07 11:45:58 +00002321** Find a string that is not found anywhere in z[]. Return a pointer
2322** to that string.
2323**
2324** Try to use zA and zB first. If both of those are already found in z[]
2325** then make up some string and store it in the buffer zBuf.
2326*/
2327static const char *unused_string(
2328 const char *z, /* Result must not appear anywhere in z */
2329 const char *zA, const char *zB, /* Try these first */
2330 char *zBuf /* Space to store a generated string */
2331){
2332 unsigned i = 0;
2333 if( strstr(z, zA)==0 ) return zA;
2334 if( strstr(z, zB)==0 ) return zB;
2335 do{
2336 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
2337 }while( strstr(z,zBuf)!=0 );
2338 return zBuf;
2339}
2340
2341/*
drh28bd4bc2000-06-15 15:57:22 +00002342** Output the given string as a quoted string using SQL quoting conventions.
drh708b22b2017-03-11 01:56:41 +00002343**
drh13fe1382017-04-08 13:42:55 +00002344** See also: output_quoted_escaped_string()
drh28bd4bc2000-06-15 15:57:22 +00002345*/
2346static void output_quoted_string(FILE *out, const char *z){
2347 int i;
drh708b22b2017-03-11 01:56:41 +00002348 char c;
mistachkin1fe36bb2016-04-04 02:16:44 +00002349 setBinaryMode(out, 1);
drh13fe1382017-04-08 13:42:55 +00002350 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
2351 if( c==0 ){
2352 utf8_printf(out,"'%s'",z);
2353 }else{
2354 raw_printf(out, "'");
2355 while( *z ){
2356 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
2357 if( c=='\'' ) i++;
2358 if( i ){
2359 utf8_printf(out, "%.*s", i, z);
2360 z += i;
2361 }
2362 if( c=='\'' ){
2363 raw_printf(out, "'");
2364 continue;
2365 }
2366 if( c==0 ){
2367 break;
2368 }
2369 z++;
2370 }
2371 raw_printf(out, "'");
2372 }
2373 setTextMode(out, 1);
2374}
2375
2376/*
2377** Output the given string as a quoted string using SQL quoting conventions.
2378** Additionallly , escape the "\n" and "\r" characters so that they do not
2379** get corrupted by end-of-line translation facilities in some operating
2380** systems.
2381**
2382** This is like output_quoted_string() but with the addition of the \r\n
2383** escape mechanism.
2384*/
2385static void output_quoted_escaped_string(FILE *out, const char *z){
2386 int i;
2387 char c;
2388 setBinaryMode(out, 1);
drh708b22b2017-03-11 01:56:41 +00002389 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
2390 if( c==0 ){
drhe05461c2015-12-30 13:36:57 +00002391 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00002392 }else{
drh6193d492017-04-07 11:45:58 +00002393 const char *zNL = 0;
2394 const char *zCR = 0;
2395 int nNL = 0;
2396 int nCR = 0;
2397 char zBuf1[20], zBuf2[20];
2398 for(i=0; z[i]; i++){
2399 if( z[i]=='\n' ) nNL++;
2400 if( z[i]=='\r' ) nCR++;
2401 }
2402 if( nNL ){
2403 raw_printf(out, "replace(");
2404 zNL = unused_string(z, "\\n", "\\012", zBuf1);
2405 }
2406 if( nCR ){
2407 raw_printf(out, "replace(");
2408 zCR = unused_string(z, "\\r", "\\015", zBuf2);
2409 }
2410 raw_printf(out, "'");
drh28bd4bc2000-06-15 15:57:22 +00002411 while( *z ){
drh708b22b2017-03-11 01:56:41 +00002412 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
2413 if( c=='\'' ) i++;
2414 if( i ){
drh708b22b2017-03-11 01:56:41 +00002415 utf8_printf(out, "%.*s", i, z);
2416 z += i;
drh708b22b2017-03-11 01:56:41 +00002417 }
2418 if( c=='\'' ){
2419 raw_printf(out, "'");
2420 continue;
2421 }
drh708b22b2017-03-11 01:56:41 +00002422 if( c==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002423 break;
2424 }
drh6193d492017-04-07 11:45:58 +00002425 z++;
2426 if( c=='\n' ){
2427 raw_printf(out, "%s", zNL);
2428 continue;
drh708b22b2017-03-11 01:56:41 +00002429 }
drh6193d492017-04-07 11:45:58 +00002430 raw_printf(out, "%s", zCR);
drh28bd4bc2000-06-15 15:57:22 +00002431 }
drh6193d492017-04-07 11:45:58 +00002432 raw_printf(out, "'");
2433 if( nCR ){
2434 raw_printf(out, ",'%s',char(13))", zCR);
2435 }
2436 if( nNL ){
2437 raw_printf(out, ",'%s',char(10))", zNL);
2438 }
drh28bd4bc2000-06-15 15:57:22 +00002439 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002440 setTextMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00002441}
2442
2443/*
drhfeac5f82004-08-01 00:10:45 +00002444** Output the given string as a quoted according to C or TCL quoting rules.
2445*/
2446static void output_c_string(FILE *out, const char *z){
2447 unsigned int c;
2448 fputc('"', out);
2449 while( (c = *(z++))!=0 ){
2450 if( c=='\\' ){
2451 fputc(c, out);
2452 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +00002453 }else if( c=='"' ){
2454 fputc('\\', out);
2455 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +00002456 }else if( c=='\t' ){
2457 fputc('\\', out);
2458 fputc('t', out);
2459 }else if( c=='\n' ){
2460 fputc('\\', out);
2461 fputc('n', out);
2462 }else if( c=='\r' ){
2463 fputc('\\', out);
2464 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +00002465 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +00002466 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00002467 }else{
2468 fputc(c, out);
2469 }
2470 }
2471 fputc('"', out);
2472}
2473
2474/*
drhc08a4f12000-06-15 16:49:48 +00002475** Output the given string with characters that are special to
2476** HTML escaped.
2477*/
2478static void output_html_string(FILE *out, const char *z){
2479 int i;
drhc3d6ba42014-01-13 20:38:35 +00002480 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +00002481 while( *z ){
mistachkin1fe36bb2016-04-04 02:16:44 +00002482 for(i=0; z[i]
2483 && z[i]!='<'
2484 && z[i]!='&'
2485 && z[i]!='>'
2486 && z[i]!='\"'
shane43d9cb22009-10-21 14:11:48 +00002487 && z[i]!='\'';
2488 i++){}
drhc08a4f12000-06-15 16:49:48 +00002489 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +00002490 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +00002491 }
2492 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +00002493 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +00002494 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +00002495 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +00002496 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +00002497 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +00002498 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +00002499 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +00002500 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +00002501 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +00002502 }else{
2503 break;
2504 }
2505 z += i + 1;
2506 }
2507}
2508
2509/*
drhc49f44e2006-10-26 18:15:42 +00002510** If a field contains any character identified by a 1 in the following
2511** array, then the string must be quoted for CSV.
2512*/
2513static const char needCsvQuote[] = {
mistachkin1fe36bb2016-04-04 02:16:44 +00002514 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2515 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2516 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
2517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2518 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2519 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2520 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2521 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
2522 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2523 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2524 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2525 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2526 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2527 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2528 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2529 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
drhc49f44e2006-10-26 18:15:42 +00002530};
2531
2532/*
mistachkindd11f2d2014-12-11 04:49:46 +00002533** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +00002534** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +00002535** the null value. Strings are quoted if necessary. The separator
2536** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +00002537*/
drhdcd87a92014-08-18 13:45:42 +00002538static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00002539 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00002540 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +00002541 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +00002542 }else{
drhc49f44e2006-10-26 18:15:42 +00002543 int i;
mistachkin636bf9f2014-07-19 20:15:16 +00002544 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +00002545 for(i=0; z[i]; i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00002546 if( needCsvQuote[((unsigned char*)z)[i]]
2547 || (z[i]==p->colSeparator[0] &&
mistachkin636bf9f2014-07-19 20:15:16 +00002548 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00002549 i = 0;
2550 break;
2551 }
2552 }
2553 if( i==0 ){
2554 putc('"', out);
2555 for(i=0; z[i]; i++){
2556 if( z[i]=='"' ) putc('"', out);
2557 putc(z[i], out);
2558 }
2559 putc('"', out);
2560 }else{
drhe05461c2015-12-30 13:36:57 +00002561 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +00002562 }
drh8e64d1c2004-10-07 00:32:39 +00002563 }
2564 if( bSep ){
drhe05461c2015-12-30 13:36:57 +00002565 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +00002566 }
2567}
2568
danielk19774af00c62005-01-23 23:43:21 +00002569#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00002570/*
drh4c504392000-10-16 22:06:40 +00002571** This routine runs when the user presses Ctrl-C
2572*/
2573static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00002574 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +00002575 seenInterrupt++;
2576 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +00002577 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +00002578}
danielk19774af00c62005-01-23 23:43:21 +00002579#endif
drh4c504392000-10-16 22:06:40 +00002580
drha0daa752016-09-16 11:53:10 +00002581#ifndef SQLITE_OMIT_AUTHORIZATION
drh4c504392000-10-16 22:06:40 +00002582/*
drhde613c62016-04-04 17:23:10 +00002583** When the ".auth ON" is set, the following authorizer callback is
2584** invoked. It always returns SQLITE_OK.
2585*/
2586static int shellAuth(
2587 void *pClientData,
2588 int op,
2589 const char *zA1,
2590 const char *zA2,
2591 const char *zA3,
2592 const char *zA4
2593){
2594 ShellState *p = (ShellState*)pClientData;
2595 static const char *azAction[] = { 0,
2596 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
2597 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
2598 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
2599 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
2600 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
2601 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
2602 "PRAGMA", "READ", "SELECT",
2603 "TRANSACTION", "UPDATE", "ATTACH",
2604 "DETACH", "ALTER_TABLE", "REINDEX",
2605 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
2606 "FUNCTION", "SAVEPOINT", "RECURSIVE"
2607 };
2608 int i;
2609 const char *az[4];
2610 az[0] = zA1;
2611 az[1] = zA2;
2612 az[2] = zA3;
2613 az[3] = zA4;
mistachkin8145fc62016-09-16 20:39:21 +00002614 utf8_printf(p->out, "authorizer: %s", azAction[op]);
drhde613c62016-04-04 17:23:10 +00002615 for(i=0; i<4; i++){
2616 raw_printf(p->out, " ");
2617 if( az[i] ){
2618 output_c_string(p->out, az[i]);
2619 }else{
2620 raw_printf(p->out, "NULL");
2621 }
2622 }
2623 raw_printf(p->out, "\n");
2624 return SQLITE_OK;
2625}
drha0daa752016-09-16 11:53:10 +00002626#endif
mistachkin8145fc62016-09-16 20:39:21 +00002627
drh79f20e92016-12-13 23:22:39 +00002628/*
2629** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
2630**
2631** This routine converts some CREATE TABLE statements for shadow tables
2632** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
2633*/
2634static void printSchemaLine(FILE *out, const char *z, const char *zTail){
2635 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
2636 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
2637 }else{
2638 utf8_printf(out, "%s%s", z, zTail);
2639 }
2640}
2641static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
2642 char c = z[n];
2643 z[n] = 0;
2644 printSchemaLine(out, z, zTail);
2645 z[n] = c;
2646}
drhde613c62016-04-04 17:23:10 +00002647
2648/*
shane626a6e42009-10-22 17:30:15 +00002649** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +00002650** invokes for each row of a query result.
2651*/
drh4ace5362014-11-10 14:42:28 +00002652static int shell_callback(
2653 void *pArg,
2654 int nArg, /* Number of result columns */
2655 char **azArg, /* Text of each result column */
2656 char **azCol, /* Column names */
2657 int *aiType /* Column types */
2658){
drh75897232000-05-29 14:26:00 +00002659 int i;
drhdcd87a92014-08-18 13:45:42 +00002660 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +00002661
drh700c2522016-02-09 18:39:25 +00002662 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +00002663 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00002664 int w = 5;
drh6a535342001-10-19 16:44:56 +00002665 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00002666 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00002667 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00002668 if( len>w ) w = len;
2669 }
drhe05461c2015-12-30 13:36:57 +00002670 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +00002671 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002672 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +00002673 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +00002674 }
2675 break;
2676 }
danielk19770d78bae2008-01-03 07:09:48 +00002677 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00002678 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +00002679 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
2680 const int *colWidth;
2681 int showHdr;
2682 char *rowSep;
2683 if( p->cMode==MODE_Column ){
2684 colWidth = p->colWidth;
2685 showHdr = p->showHeader;
2686 rowSep = p->rowSeparator;
2687 }else{
2688 colWidth = aExplainWidths;
2689 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +00002690 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +00002691 }
drha0c66f52000-07-29 13:20:21 +00002692 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00002693 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00002694 int w, n;
2695 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +00002696 w = colWidth[i];
drh75897232000-05-29 14:26:00 +00002697 }else{
danielk19770d78bae2008-01-03 07:09:48 +00002698 w = 0;
drh75897232000-05-29 14:26:00 +00002699 }
drh078b1fd2012-09-21 13:40:02 +00002700 if( w==0 ){
drh64bf76d2017-06-05 12:29:26 +00002701 w = strlenChar(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00002702 if( w<10 ) w = 10;
drh64bf76d2017-06-05 12:29:26 +00002703 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +00002704 if( w<n ) w = n;
2705 }
2706 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00002707 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00002708 }
drh700c2522016-02-09 18:39:25 +00002709 if( showHdr ){
drh6887e8f2017-04-17 13:18:42 +00002710 utf8_width_print(p->out, w, azCol[i]);
2711 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00002712 }
2713 }
drh700c2522016-02-09 18:39:25 +00002714 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +00002715 for(i=0; i<nArg; i++){
2716 int w;
2717 if( i<ArraySize(p->actualWidth) ){
2718 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +00002719 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +00002720 }else{
2721 w = 10;
2722 }
mistachkinaae280e2015-12-31 19:06:24 +00002723 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +00002724 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +00002725 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +00002726 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00002727 }
drh75897232000-05-29 14:26:00 +00002728 }
2729 }
drh6a535342001-10-19 16:44:56 +00002730 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00002731 for(i=0; i<nArg; i++){
2732 int w;
drha0c66f52000-07-29 13:20:21 +00002733 if( i<ArraySize(p->actualWidth) ){
2734 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00002735 }else{
2736 w = 10;
2737 }
drh64bf76d2017-06-05 12:29:26 +00002738 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
2739 w = strlenChar(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00002740 }
dana98bf362013-11-13 18:35:01 +00002741 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +00002742 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +00002743 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +00002744 }
danc4650bb2013-11-18 08:41:06 +00002745 p->iIndent++;
dana98bf362013-11-13 18:35:01 +00002746 }
drh6887e8f2017-04-17 13:18:42 +00002747 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2748 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
drh75897232000-05-29 14:26:00 +00002749 }
2750 break;
2751 }
drh4926fec2016-04-13 15:33:42 +00002752 case MODE_Semi: { /* .schema and .fullschema output */
drh79f20e92016-12-13 23:22:39 +00002753 printSchemaLine(p->out, azArg[0], ";\n");
drh4926fec2016-04-13 15:33:42 +00002754 break;
2755 }
2756 case MODE_Pretty: { /* .schema and .fullschema with --indent */
2757 char *z;
drh07d683f2016-04-13 21:00:36 +00002758 int j;
drh4926fec2016-04-13 15:33:42 +00002759 int nParen = 0;
2760 char cEnd = 0;
2761 char c;
2762 int nLine = 0;
2763 assert( nArg==1 );
2764 if( azArg[0]==0 ) break;
2765 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2766 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2767 ){
2768 utf8_printf(p->out, "%s;\n", azArg[0]);
2769 break;
2770 }
2771 z = sqlite3_mprintf("%s", azArg[0]);
2772 j = 0;
2773 for(i=0; IsSpace(z[i]); i++){}
2774 for(; (c = z[i])!=0; i++){
2775 if( IsSpace(c) ){
2776 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2777 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2778 j--;
2779 }
2780 z[j++] = c;
2781 }
2782 while( j>0 && IsSpace(z[j-1]) ){ j--; }
2783 z[j] = 0;
2784 if( strlen30(z)>=79 ){
drh07d683f2016-04-13 21:00:36 +00002785 for(i=j=0; (c = z[i])!=0; i++){
drh4926fec2016-04-13 15:33:42 +00002786 if( c==cEnd ){
2787 cEnd = 0;
2788 }else if( c=='"' || c=='\'' || c=='`' ){
2789 cEnd = c;
2790 }else if( c=='[' ){
2791 cEnd = ']';
2792 }else if( c=='(' ){
2793 nParen++;
2794 }else if( c==')' ){
2795 nParen--;
2796 if( nLine>0 && nParen==0 && j>0 ){
drh79f20e92016-12-13 23:22:39 +00002797 printSchemaLineN(p->out, z, j, "\n");
drh4926fec2016-04-13 15:33:42 +00002798 j = 0;
2799 }
2800 }
2801 z[j++] = c;
2802 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
2803 if( c=='\n' ) j--;
drh79f20e92016-12-13 23:22:39 +00002804 printSchemaLineN(p->out, z, j, "\n ");
drh4926fec2016-04-13 15:33:42 +00002805 j = 0;
2806 nLine++;
2807 while( IsSpace(z[i+1]) ){ i++; }
2808 }
2809 }
2810 z[j] = 0;
2811 }
drh79f20e92016-12-13 23:22:39 +00002812 printSchemaLine(p->out, z, ";\n");
drh4926fec2016-04-13 15:33:42 +00002813 sqlite3_free(z);
2814 break;
2815 }
drh75897232000-05-29 14:26:00 +00002816 case MODE_List: {
2817 if( p->cnt++==0 && p->showHeader ){
2818 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002819 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00002820 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00002821 }
2822 }
drh6a535342001-10-19 16:44:56 +00002823 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00002824 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00002825 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00002826 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00002827 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00002828 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00002829 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +00002830 }else{
drhe05461c2015-12-30 13:36:57 +00002831 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00002832 }
drh75897232000-05-29 14:26:00 +00002833 }
2834 break;
2835 }
drh1e5d0e92000-05-31 23:33:17 +00002836 case MODE_Html: {
2837 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00002838 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00002839 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00002840 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00002841 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00002842 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00002843 }
mistachkinaae280e2015-12-31 19:06:24 +00002844 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00002845 }
drh6a535342001-10-19 16:44:56 +00002846 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00002847 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00002848 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00002849 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00002850 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00002851 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00002852 }
mistachkinaae280e2015-12-31 19:06:24 +00002853 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00002854 break;
2855 }
drhfeac5f82004-08-01 00:10:45 +00002856 case MODE_Tcl: {
2857 if( p->cnt++==0 && p->showHeader ){
2858 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00002859 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00002860 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002861 }
drhe05461c2015-12-30 13:36:57 +00002862 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00002863 }
2864 if( azArg==0 ) break;
2865 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00002866 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00002867 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002868 }
drhe05461c2015-12-30 13:36:57 +00002869 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00002870 break;
2871 }
drh8e64d1c2004-10-07 00:32:39 +00002872 case MODE_Csv: {
mistachkin1fe36bb2016-04-04 02:16:44 +00002873 setBinaryMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00002874 if( p->cnt++==0 && p->showHeader ){
2875 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00002876 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00002877 }
drhe05461c2015-12-30 13:36:57 +00002878 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00002879 }
drh40253262014-10-17 21:35:05 +00002880 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00002881 for(i=0; i<nArg; i++){
2882 output_csv(p, azArg[i], i<nArg-1);
2883 }
drhe05461c2015-12-30 13:36:57 +00002884 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00002885 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002886 setTextMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00002887 break;
2888 }
drh28bd4bc2000-06-15 15:57:22 +00002889 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00002890 if( azArg==0 ) break;
drh13fe1382017-04-08 13:42:55 +00002891 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2892 if( p->showHeader ){
2893 raw_printf(p->out,"(");
2894 for(i=0; i<nArg; i++){
2895 if( i>0 ) raw_printf(p->out, ",");
2896 if( quoteChar(azCol[i]) ){
2897 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2898 utf8_printf(p->out, "%s", z);
2899 sqlite3_free(z);
2900 }else{
2901 raw_printf(p->out, "%s", azCol[i]);
drh41f5f6e2016-10-21 17:39:30 +00002902 }
mistachkin151c75a2015-04-07 21:16:40 +00002903 }
drh13fe1382017-04-08 13:42:55 +00002904 raw_printf(p->out,")");
2905 }
2906 p->cnt++;
2907 for(i=0; i<nArg; i++){
2908 raw_printf(p->out, i>0 ? "," : " VALUES(");
2909 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2910 utf8_printf(p->out,"NULL");
2911 }else if( aiType && aiType[i]==SQLITE_TEXT ){
drhdbc26722017-07-10 18:04:41 +00002912 if( ShellHasFlag(p, SHFLG_Newlines) ){
2913 output_quoted_string(p->out, azArg[i]);
2914 }else{
2915 output_quoted_escaped_string(p->out, azArg[i]);
2916 }
drh13fe1382017-04-08 13:42:55 +00002917 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2918 utf8_printf(p->out,"%s", azArg[i]);
2919 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2920 char z[50];
2921 double r = sqlite3_column_double(p->pStmt, i);
2922 sqlite3_snprintf(50,z,"%!.20g", r);
2923 raw_printf(p->out, "%s", z);
2924 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2925 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2926 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2927 output_hex_blob(p->out, pBlob, nBlob);
2928 }else if( isNumber(azArg[i], 0) ){
2929 utf8_printf(p->out,"%s", azArg[i]);
drhdbc26722017-07-10 18:04:41 +00002930 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2931 output_quoted_string(p->out, azArg[i]);
drh13fe1382017-04-08 13:42:55 +00002932 }else{
2933 output_quoted_escaped_string(p->out, azArg[i]);
2934 }
2935 }
2936 raw_printf(p->out,");\n");
2937 break;
2938 }
2939 case MODE_Quote: {
2940 if( azArg==0 ) break;
2941 if( p->cnt==0 && p->showHeader ){
drh59ce2c42016-11-03 13:12:28 +00002942 for(i=0; i<nArg; i++){
mistachkin2f9a6132016-11-11 05:19:45 +00002943 if( i>0 ) raw_printf(p->out, ",");
drh59ce2c42016-11-03 13:12:28 +00002944 output_quoted_string(p->out, azCol[i]);
2945 }
mistachkin2f9a6132016-11-11 05:19:45 +00002946 raw_printf(p->out,"\n");
mistachkin151c75a2015-04-07 21:16:40 +00002947 }
drh59ce2c42016-11-03 13:12:28 +00002948 p->cnt++;
drh28bd4bc2000-06-15 15:57:22 +00002949 for(i=0; i<nArg; i++){
drh13fe1382017-04-08 13:42:55 +00002950 if( i>0 ) raw_printf(p->out, ",");
shanead6b8d02009-10-22 18:12:58 +00002951 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh13fe1382017-04-08 13:42:55 +00002952 utf8_printf(p->out,"NULL");
shanead6b8d02009-10-22 18:12:58 +00002953 }else if( aiType && aiType[i]==SQLITE_TEXT ){
shanead6b8d02009-10-22 18:12:58 +00002954 output_quoted_string(p->out, azArg[i]);
drh891d6b42017-03-11 00:46:57 +00002955 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
drh13fe1382017-04-08 13:42:55 +00002956 utf8_printf(p->out,"%s", azArg[i]);
drh891d6b42017-03-11 00:46:57 +00002957 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2958 char z[50];
2959 double r = sqlite3_column_double(p->pStmt, i);
2960 sqlite3_snprintf(50,z,"%!.20g", r);
drh13fe1382017-04-08 13:42:55 +00002961 raw_printf(p->out, "%s", z);
shane626a6e42009-10-22 17:30:15 +00002962 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2963 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2964 int nBlob = sqlite3_column_bytes(p->pStmt, i);
shane626a6e42009-10-22 17:30:15 +00002965 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00002966 }else if( isNumber(azArg[i], 0) ){
drh13fe1382017-04-08 13:42:55 +00002967 utf8_printf(p->out,"%s", azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00002968 }else{
drh28bd4bc2000-06-15 15:57:22 +00002969 output_quoted_string(p->out, azArg[i]);
2970 }
2971 }
drh13fe1382017-04-08 13:42:55 +00002972 raw_printf(p->out,"\n");
drh6a535342001-10-19 16:44:56 +00002973 break;
drh28bd4bc2000-06-15 15:57:22 +00002974 }
mistachkin636bf9f2014-07-19 20:15:16 +00002975 case MODE_Ascii: {
2976 if( p->cnt++==0 && p->showHeader ){
2977 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002978 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2979 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00002980 }
drhe05461c2015-12-30 13:36:57 +00002981 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002982 }
2983 if( azArg==0 ) break;
2984 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002985 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2986 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00002987 }
drhe05461c2015-12-30 13:36:57 +00002988 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002989 break;
2990 }
persicom1d0b8722002-04-18 02:53:04 +00002991 }
drh75897232000-05-29 14:26:00 +00002992 return 0;
2993}
2994
2995/*
shane626a6e42009-10-22 17:30:15 +00002996** This is the callback routine that the SQLite library
2997** invokes for each row of a query result.
2998*/
2999static int callback(void *pArg, int nArg, char **azArg, char **azCol){
3000 /* since we don't have type info, call the shell_callback with a NULL value */
3001 return shell_callback(pArg, nArg, azArg, azCol, NULL);
3002}
3003
drhfb546af2017-03-09 22:00:33 +00003004/*
3005** This is the callback routine from sqlite3_exec() that appends all
3006** output onto the end of a ShellText object.
3007*/
3008static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
3009 ShellText *p = (ShellText*)pArg;
3010 int i;
drh2fb79e92017-03-25 12:08:11 +00003011 UNUSED_PARAMETER(az);
drhfb546af2017-03-09 22:00:33 +00003012 if( p->n ) appendText(p, "|", 0);
3013 for(i=0; i<nArg; i++){
3014 if( i ) appendText(p, ",", 0);
3015 if( azArg[i] ) appendText(p, azArg[i], 0);
3016 }
3017 return 0;
3018}
3019
3020/*
3021** Generate an appropriate SELFTEST table in the main database.
3022*/
3023static void createSelftestTable(ShellState *p){
drhf157d102017-03-10 01:05:38 +00003024 char *zErrMsg = 0;
drhfb546af2017-03-09 22:00:33 +00003025 sqlite3_exec(p->db,
drhf157d102017-03-10 01:05:38 +00003026 "SAVEPOINT selftest_init;\n"
3027 "CREATE TABLE IF NOT EXISTS selftest(\n"
drhfb546af2017-03-09 22:00:33 +00003028 " tno INTEGER PRIMARY KEY,\n" /* Test number */
3029 " op TEXT,\n" /* Operator: memo run */
3030 " cmd TEXT,\n" /* Command text */
3031 " ans TEXT\n" /* Desired answer */
3032 ");"
drhf157d102017-03-10 01:05:38 +00003033 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
3034 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
3035 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
3036 " 'memo','Tests generated by --init');\n"
3037 "INSERT INTO [_shell$self]\n"
3038 " SELECT 'run',\n"
3039 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
3040 "FROM sqlite_master ORDER BY 2'',224))',\n"
3041 " hex(sha3_query('SELECT type,name,tbl_name,sql "
3042 "FROM sqlite_master ORDER BY 2',224));\n"
3043 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00003044 " SELECT 'run',"
3045 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
3046 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
3047 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
3048 " FROM (\n"
3049 " SELECT name FROM sqlite_master\n"
3050 " WHERE type='table'\n"
3051 " AND name<>'selftest'\n"
3052 " AND coalesce(rootpage,0)>0\n"
3053 " )\n"
3054 " ORDER BY name;\n"
drhf157d102017-03-10 01:05:38 +00003055 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00003056 " VALUES('run','PRAGMA integrity_check','ok');\n"
drhf157d102017-03-10 01:05:38 +00003057 "INSERT INTO selftest(tno,op,cmd,ans)"
3058 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
3059 "DROP TABLE [_shell$self];"
3060 ,0,0,&zErrMsg);
3061 if( zErrMsg ){
3062 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
3063 sqlite3_free(zErrMsg);
3064 }
3065 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
drhfb546af2017-03-09 22:00:33 +00003066}
3067
drhf42d3182017-03-08 12:25:18 +00003068
shane626a6e42009-10-22 17:30:15 +00003069/*
drhdcd87a92014-08-18 13:45:42 +00003070** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00003071** the name of the table given. Escape any quote characters in the
3072** table name.
3073*/
drhdcd87a92014-08-18 13:45:42 +00003074static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00003075 int i, n;
drhf42d3182017-03-08 12:25:18 +00003076 int cQuote;
drh33048c02001-10-01 14:29:22 +00003077 char *z;
3078
3079 if( p->zDestTable ){
3080 free(p->zDestTable);
3081 p->zDestTable = 0;
3082 }
3083 if( zName==0 ) return;
drhf42d3182017-03-08 12:25:18 +00003084 cQuote = quoteChar(zName);
3085 n = strlen30(zName);
drh45e7d7d2017-06-24 13:31:40 +00003086 if( cQuote ) n += n+2;
drh33048c02001-10-01 14:29:22 +00003087 z = p->zDestTable = malloc( n+1 );
3088 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003089 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00003090 exit(1);
3091 }
3092 n = 0;
drhf42d3182017-03-08 12:25:18 +00003093 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00003094 for(i=0; zName[i]; i++){
3095 z[n++] = zName[i];
drhf42d3182017-03-08 12:25:18 +00003096 if( zName[i]==cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00003097 }
drhf42d3182017-03-08 12:25:18 +00003098 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00003099 z[n] = 0;
3100}
3101
drhdd3d4592004-08-30 01:54:05 +00003102
3103/*
drhb21a8e42012-01-28 21:08:51 +00003104** Execute a query statement that will generate SQL output. Print
3105** the result columns, comma-separated, on a line and then add a
3106** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00003107**
drhb21a8e42012-01-28 21:08:51 +00003108** If the number of columns is 1 and that column contains text "--"
mistachkin1fe36bb2016-04-04 02:16:44 +00003109** then write the semicolon on a separate line. That way, if a
drhb21a8e42012-01-28 21:08:51 +00003110** "--" comment occurs at the end of the statement, the comment
3111** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00003112*/
drh157e29a2009-05-21 15:15:00 +00003113static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00003114 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00003115 const char *zSelect, /* SELECT statement to extract content */
3116 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00003117){
drhdd3d4592004-08-30 01:54:05 +00003118 sqlite3_stmt *pSelect;
3119 int rc;
drhb21a8e42012-01-28 21:08:51 +00003120 int nResult;
3121 int i;
3122 const char *z;
drhc7181902014-02-27 15:04:13 +00003123 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00003124 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00003125 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
3126 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00003127 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00003128 return rc;
3129 }
3130 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00003131 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00003132 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00003133 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00003134 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00003135 zFirstRow = 0;
3136 }
drhb21a8e42012-01-28 21:08:51 +00003137 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00003138 utf8_printf(p->out, "%s", z);
mistachkin1fe36bb2016-04-04 02:16:44 +00003139 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00003140 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00003141 }
3142 if( z==0 ) z = "";
3143 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
3144 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00003145 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00003146 }else{
mistachkinaae280e2015-12-31 19:06:24 +00003147 raw_printf(p->out, ";\n");
mistachkin1fe36bb2016-04-04 02:16:44 +00003148 }
drhdd3d4592004-08-30 01:54:05 +00003149 rc = sqlite3_step(pSelect);
3150 }
drh2f464a02011-10-13 00:41:49 +00003151 rc = sqlite3_finalize(pSelect);
3152 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003153 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
3154 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00003155 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00003156 }
3157 return rc;
drhdd3d4592004-08-30 01:54:05 +00003158}
3159
shane626a6e42009-10-22 17:30:15 +00003160/*
3161** Allocate space and save off current error string.
3162*/
3163static char *save_err_msg(
3164 sqlite3 *db /* Database to query */
3165){
3166 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00003167 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00003168 if( zErrMsg ){
3169 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
3170 }
3171 return zErrMsg;
3172}
3173
drh34784902016-02-27 17:12:36 +00003174#ifdef __linux__
3175/*
3176** Attempt to display I/O stats on Linux using /proc/PID/io
3177*/
3178static void displayLinuxIoStats(FILE *out){
3179 FILE *in;
3180 char z[200];
3181 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
3182 in = fopen(z, "rb");
3183 if( in==0 ) return;
3184 while( fgets(z, sizeof(z), in)!=0 ){
3185 static const struct {
3186 const char *zPattern;
3187 const char *zDesc;
3188 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00003189 { "rchar: ", "Bytes received by read():" },
3190 { "wchar: ", "Bytes sent to write():" },
3191 { "syscr: ", "Read() system calls:" },
3192 { "syscw: ", "Write() system calls:" },
3193 { "read_bytes: ", "Bytes read from storage:" },
3194 { "write_bytes: ", "Bytes written to storage:" },
3195 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00003196 };
3197 int i;
3198 for(i=0; i<ArraySize(aTrans); i++){
3199 int n = (int)strlen(aTrans[i].zPattern);
3200 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00003201 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
drh34784902016-02-27 17:12:36 +00003202 break;
3203 }
3204 }
3205 }
3206 fclose(in);
mistachkin1fe36bb2016-04-04 02:16:44 +00003207}
drh34784902016-02-27 17:12:36 +00003208#endif
3209
drha2df53b2017-03-10 14:36:10 +00003210/*
3211** Display a single line of status using 64-bit values.
3212*/
3213static void displayStatLine(
3214 ShellState *p, /* The shell context */
3215 char *zLabel, /* Label for this one line */
3216 char *zFormat, /* Format for the result */
3217 int iStatusCtrl, /* Which status to display */
3218 int bReset /* True to reset the stats */
3219){
3220 sqlite3_int64 iCur = -1;
3221 sqlite3_int64 iHiwtr = -1;
3222 int i, nPercent;
3223 char zLine[200];
3224 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
3225 for(i=0, nPercent=0; zFormat[i]; i++){
3226 if( zFormat[i]=='%' ) nPercent++;
3227 }
3228 if( nPercent>1 ){
3229 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
3230 }else{
3231 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
3232 }
3233 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
3234}
drh34784902016-02-27 17:12:36 +00003235
shane626a6e42009-10-22 17:30:15 +00003236/*
shaneh642d8b82010-07-28 16:05:34 +00003237** Display memory stats.
3238*/
3239static int display_stats(
3240 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00003241 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00003242 int bReset /* True to reset the stats */
3243){
3244 int iCur;
3245 int iHiwtr;
3246
3247 if( pArg && pArg->out ){
drha2df53b2017-03-10 14:36:10 +00003248 displayStatLine(pArg, "Memory Used:",
3249 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
3250 displayStatLine(pArg, "Number of Outstanding Allocations:",
3251 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
drh44dec872014-08-30 15:49:25 +00003252 if( pArg->shellFlgs & SHFLG_Pagecache ){
drha2df53b2017-03-10 14:36:10 +00003253 displayStatLine(pArg, "Number of Pcache Pages Used:",
3254 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
drh44dec872014-08-30 15:49:25 +00003255 }
drha2df53b2017-03-10 14:36:10 +00003256 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
3257 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
drh44dec872014-08-30 15:49:25 +00003258 if( pArg->shellFlgs & SHFLG_Scratch ){
drha2df53b2017-03-10 14:36:10 +00003259 displayStatLine(pArg, "Number of Scratch Allocations Used:",
3260 "%lld (max %lld)", SQLITE_STATUS_SCRATCH_USED, bReset);
drh44dec872014-08-30 15:49:25 +00003261 }
drha2df53b2017-03-10 14:36:10 +00003262 displayStatLine(pArg, "Number of Scratch Overflow Bytes:",
3263 "%lld (max %lld) bytes", SQLITE_STATUS_SCRATCH_OVERFLOW, bReset);
3264 displayStatLine(pArg, "Largest Allocation:",
3265 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
3266 displayStatLine(pArg, "Largest Pcache Allocation:",
3267 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
3268 displayStatLine(pArg, "Largest Scratch Allocation:",
3269 "%lld bytes", SQLITE_STATUS_SCRATCH_SIZE, bReset);
shaneh642d8b82010-07-28 16:05:34 +00003270#ifdef YYTRACKMAXSTACKDEPTH
drha2df53b2017-03-10 14:36:10 +00003271 displayStatLine(pArg, "Deepest Parser Stack:",
3272 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
shaneh642d8b82010-07-28 16:05:34 +00003273#endif
3274 }
3275
3276 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00003277 if( pArg->shellFlgs & SHFLG_Lookaside ){
3278 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00003279 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
3280 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003281 raw_printf(pArg->out,
3282 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00003283 iCur, iHiwtr);
3284 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
3285 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003286 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
3287 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00003288 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
3289 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003290 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
3291 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00003292 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
3293 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003294 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
3295 iHiwtr);
drh44dec872014-08-30 15:49:25 +00003296 }
shaneh642d8b82010-07-28 16:05:34 +00003297 iHiwtr = iCur = -1;
3298 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003299 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
3300 iCur);
drh4ace5362014-11-10 14:42:28 +00003301 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00003302 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00003303 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00003304 iHiwtr = iCur = -1;
3305 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00003306 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00003307 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00003308 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00003309 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00003310 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00003311 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003312 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00003313 iCur);
shaneh642d8b82010-07-28 16:05:34 +00003314 iHiwtr = iCur = -1;
3315 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003316 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00003317 iCur);
shaneh642d8b82010-07-28 16:05:34 +00003318 }
3319
3320 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00003321 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
3322 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003323 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00003324 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003325 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00003326 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003327 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00003328 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00003329 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00003330 }
3331
drh34784902016-02-27 17:12:36 +00003332#ifdef __linux__
3333 displayLinuxIoStats(pArg->out);
3334#endif
3335
dan5a790282015-08-07 20:06:14 +00003336 /* Do not remove this machine readable comment: extra-stats-output-here */
3337
shaneh642d8b82010-07-28 16:05:34 +00003338 return 0;
3339}
3340
3341/*
dan8d1edb92014-11-05 09:07:28 +00003342** Display scan stats.
3343*/
3344static void display_scanstats(
3345 sqlite3 *db, /* Database to query */
3346 ShellState *pArg /* Pointer to ShellState */
3347){
drhf5ed7ad2015-06-15 14:43:25 +00003348#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3349 UNUSED_PARAMETER(db);
3350 UNUSED_PARAMETER(pArg);
3351#else
drh15f23c22014-11-06 12:46:16 +00003352 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00003353 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00003354 mx = 0;
3355 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00003356 double rEstLoop = 1.0;
3357 for(i=n=0; 1; i++){
3358 sqlite3_stmt *p = pArg->pStmt;
3359 sqlite3_int64 nLoop, nVisit;
3360 double rEst;
3361 int iSid;
3362 const char *zExplain;
3363 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
3364 break;
3365 }
3366 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00003367 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00003368 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00003369 if( n==0 ){
3370 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00003371 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00003372 }
drh42f30bc2014-11-06 12:08:21 +00003373 n++;
3374 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
3375 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
3376 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00003377 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00003378 rEstLoop *= rEst;
mistachkin1fe36bb2016-04-04 02:16:44 +00003379 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00003380 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00003381 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00003382 );
dan8d1edb92014-11-05 09:07:28 +00003383 }
dan8d1edb92014-11-05 09:07:28 +00003384 }
mistachkinaae280e2015-12-31 19:06:24 +00003385 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00003386#endif
dan8d1edb92014-11-05 09:07:28 +00003387}
3388
3389/*
dana98bf362013-11-13 18:35:01 +00003390** Parameter azArray points to a zero-terminated array of strings. zStr
3391** points to a single nul-terminated string. Return non-zero if zStr
3392** is equal, according to strcmp(), to any of the strings in the array.
3393** Otherwise, return zero.
3394*/
3395static int str_in_array(const char *zStr, const char **azArray){
3396 int i;
3397 for(i=0; azArray[i]; i++){
3398 if( 0==strcmp(zStr, azArray[i]) ) return 1;
3399 }
3400 return 0;
3401}
3402
3403/*
3404** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00003405** and populate the ShellState.aiIndent[] array with the number of
mistachkin1fe36bb2016-04-04 02:16:44 +00003406** spaces each opcode should be indented before it is output.
dana98bf362013-11-13 18:35:01 +00003407**
3408** The indenting rules are:
3409**
3410** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
3411** all opcodes that occur between the p2 jump destination and the opcode
3412** itself by 2 spaces.
3413**
drh01752bc2013-11-14 23:59:33 +00003414** * For each "Goto", if the jump destination is earlier in the program
3415** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00003416** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00003417** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00003418** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00003419** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00003420*/
drhdcd87a92014-08-18 13:45:42 +00003421static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00003422 const char *zSql; /* The text of the SQL statement */
3423 const char *z; /* Used to check if this is an EXPLAIN */
3424 int *abYield = 0; /* True if op is an OP_Yield */
3425 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00003426 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00003427
drh8ad0de32014-03-20 18:45:27 +00003428 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
3429 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00003430 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
3431 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00003432 const char *azGoto[] = { "Goto", 0 };
3433
3434 /* Try to figure out if this is really an EXPLAIN statement. If this
3435 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00003436 if( sqlite3_column_count(pSql)!=8 ){
3437 p->cMode = p->mode;
3438 return;
3439 }
dana98bf362013-11-13 18:35:01 +00003440 zSql = sqlite3_sql(pSql);
3441 if( zSql==0 ) return;
3442 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00003443 if( sqlite3_strnicmp(z, "explain", 7) ){
3444 p->cMode = p->mode;
3445 return;
3446 }
dana98bf362013-11-13 18:35:01 +00003447
3448 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
3449 int i;
danc4650bb2013-11-18 08:41:06 +00003450 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00003451 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00003452
3453 /* Set p2 to the P2 field of the current opcode. Then, assuming that
3454 ** p2 is an instruction address, set variable p2op to the index of that
3455 ** instruction in the aiIndent[] array. p2 and p2op may be different if
3456 ** the current instruction is part of a sub-program generated by an
3457 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00003458 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00003459 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00003460
3461 /* Grow the p->aiIndent array as required */
3462 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00003463 if( iOp==0 ){
3464 /* Do further verfication that this is explain output. Abort if
3465 ** it is not */
3466 static const char *explainCols[] = {
3467 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3468 int jj;
3469 for(jj=0; jj<ArraySize(explainCols); jj++){
3470 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3471 p->cMode = p->mode;
3472 sqlite3_reset(pSql);
3473 return;
3474 }
3475 }
3476 }
dana98bf362013-11-13 18:35:01 +00003477 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00003478 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3479 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00003480 }
3481 abYield[iOp] = str_in_array(zOp, azYield);
3482 p->aiIndent[iOp] = 0;
3483 p->nIndent = iOp+1;
3484
3485 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00003486 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00003487 }
drhfe705102014-03-06 13:38:37 +00003488 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3489 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3490 ){
drheacd29d2016-04-15 15:03:27 +00003491 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00003492 }
3493 }
3494
danc4650bb2013-11-18 08:41:06 +00003495 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00003496 sqlite3_free(abYield);
3497 sqlite3_reset(pSql);
3498}
3499
3500/*
3501** Free the array allocated by explain_data_prepare().
3502*/
drhdcd87a92014-08-18 13:45:42 +00003503static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00003504 sqlite3_free(p->aiIndent);
3505 p->aiIndent = 0;
3506 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00003507 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00003508}
3509
3510/*
drheacd29d2016-04-15 15:03:27 +00003511** Disable and restore .wheretrace and .selecttrace settings.
3512*/
3513#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3514extern int sqlite3SelectTrace;
3515static int savedSelectTrace;
3516#endif
3517#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3518extern int sqlite3WhereTrace;
3519static int savedWhereTrace;
3520#endif
3521static void disable_debug_trace_modes(void){
3522#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3523 savedSelectTrace = sqlite3SelectTrace;
3524 sqlite3SelectTrace = 0;
3525#endif
3526#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3527 savedWhereTrace = sqlite3WhereTrace;
3528 sqlite3WhereTrace = 0;
3529#endif
3530}
3531static void restore_debug_trace_modes(void){
3532#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3533 sqlite3SelectTrace = savedSelectTrace;
3534#endif
3535#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3536 sqlite3WhereTrace = savedWhereTrace;
3537#endif
3538}
3539
3540/*
3541** Run a prepared statement
3542*/
3543static void exec_prepared_stmt(
3544 ShellState *pArg, /* Pointer to ShellState */
3545 sqlite3_stmt *pStmt, /* Statment to run */
3546 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
3547){
3548 int rc;
3549
3550 /* perform the first step. this will tell us if we
3551 ** have a result set or not and how wide it is.
3552 */
3553 rc = sqlite3_step(pStmt);
3554 /* if we have a result set... */
3555 if( SQLITE_ROW == rc ){
3556 /* if we have a callback... */
3557 if( xCallback ){
3558 /* allocate space for col name ptr, value ptr, and type */
3559 int nCol = sqlite3_column_count(pStmt);
3560 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3561 if( !pData ){
3562 rc = SQLITE_NOMEM;
3563 }else{
3564 char **azCols = (char **)pData; /* Names of result columns */
3565 char **azVals = &azCols[nCol]; /* Results */
3566 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3567 int i, x;
3568 assert(sizeof(int) <= sizeof(char *));
3569 /* save off ptrs to column names */
3570 for(i=0; i<nCol; i++){
3571 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3572 }
3573 do{
3574 /* extract the data and data types */
3575 for(i=0; i<nCol; i++){
3576 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3577 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
3578 azVals[i] = "";
3579 }else{
3580 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3581 }
3582 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3583 rc = SQLITE_NOMEM;
3584 break; /* from for */
3585 }
3586 } /* end for */
3587
3588 /* if data and types extracted successfully... */
3589 if( SQLITE_ROW == rc ){
3590 /* call the supplied callback with the result row data */
3591 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
3592 rc = SQLITE_ABORT;
3593 }else{
3594 rc = sqlite3_step(pStmt);
3595 }
3596 }
3597 } while( SQLITE_ROW == rc );
3598 sqlite3_free(pData);
3599 }
3600 }else{
3601 do{
3602 rc = sqlite3_step(pStmt);
3603 } while( rc == SQLITE_ROW );
3604 }
3605 }
3606}
3607
3608/*
mistachkin1fe36bb2016-04-04 02:16:44 +00003609** Execute a statement or set of statements. Print
3610** any result rows/columns depending on the current mode
shane626a6e42009-10-22 17:30:15 +00003611** set via the supplied callback.
3612**
mistachkin1fe36bb2016-04-04 02:16:44 +00003613** This is very similar to SQLite's built-in sqlite3_exec()
3614** function except it takes a slightly different callback
shane626a6e42009-10-22 17:30:15 +00003615** and callback data argument.
3616*/
3617static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00003618 sqlite3 *db, /* An open database */
3619 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00003620 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00003621 /* (not the same as sqlite3_exec) */
3622 ShellState *pArg, /* Pointer to ShellState */
3623 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00003624){
dan4564ced2010-01-05 04:59:56 +00003625 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
3626 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00003627 int rc2;
dan4564ced2010-01-05 04:59:56 +00003628 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00003629
3630 if( pzErrMsg ){
3631 *pzErrMsg = NULL;
3632 }
3633
shaneb9fc17d2009-10-22 21:23:35 +00003634 while( zSql[0] && (SQLITE_OK == rc) ){
drheacd29d2016-04-15 15:03:27 +00003635 static const char *zStmtSql;
shaneb9fc17d2009-10-22 21:23:35 +00003636 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3637 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00003638 if( pzErrMsg ){
3639 *pzErrMsg = save_err_msg(db);
3640 }
3641 }else{
shaneb9fc17d2009-10-22 21:23:35 +00003642 if( !pStmt ){
3643 /* this happens for a comment or white-space */
3644 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00003645 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00003646 continue;
3647 }
drheacd29d2016-04-15 15:03:27 +00003648 zStmtSql = sqlite3_sql(pStmt);
drh60275612016-11-03 02:25:30 +00003649 if( zStmtSql==0 ) zStmtSql = "";
drheacd29d2016-04-15 15:03:27 +00003650 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
shane626a6e42009-10-22 17:30:15 +00003651
shaneh642d8b82010-07-28 16:05:34 +00003652 /* save off the prepared statment handle and reset row count */
3653 if( pArg ){
3654 pArg->pStmt = pStmt;
3655 pArg->cnt = 0;
3656 }
3657
shanehb7977c52010-01-18 18:17:10 +00003658 /* echo the sql statement if echo on */
drhe6e1d122017-03-09 13:50:49 +00003659 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
drhe05461c2015-12-30 13:36:57 +00003660 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00003661 }
shanehb7977c52010-01-18 18:17:10 +00003662
drhefbf3b12014-02-28 20:47:24 +00003663 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
drheacd29d2016-04-15 15:03:27 +00003664 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
drhefbf3b12014-02-28 20:47:24 +00003665 sqlite3_stmt *pExplain;
drheacd29d2016-04-15 15:03:27 +00003666 char *zEQP;
3667 disable_debug_trace_modes();
3668 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
drhefbf3b12014-02-28 20:47:24 +00003669 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3670 if( rc==SQLITE_OK ){
3671 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00003672 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
3673 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
3674 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00003675 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00003676 }
3677 }
3678 sqlite3_finalize(pExplain);
3679 sqlite3_free(zEQP);
drheacd29d2016-04-15 15:03:27 +00003680 if( pArg->autoEQP>=2 ){
3681 /* Also do an EXPLAIN for ".eqp full" mode */
3682 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3683 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3684 if( rc==SQLITE_OK ){
3685 pArg->cMode = MODE_Explain;
3686 explain_data_prepare(pArg, pExplain);
3687 exec_prepared_stmt(pArg, pExplain, xCallback);
3688 explain_data_delete(pArg);
3689 }
3690 sqlite3_finalize(pExplain);
3691 sqlite3_free(zEQP);
3692 }
3693 restore_debug_trace_modes();
drhefbf3b12014-02-28 20:47:24 +00003694 }
3695
drh700c2522016-02-09 18:39:25 +00003696 if( pArg ){
3697 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00003698 if( pArg->autoExplain
3699 && sqlite3_column_count(pStmt)==8
drheacd29d2016-04-15 15:03:27 +00003700 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
drh700c2522016-02-09 18:39:25 +00003701 ){
3702 pArg->cMode = MODE_Explain;
3703 }
mistachkin1fe36bb2016-04-04 02:16:44 +00003704
drh700c2522016-02-09 18:39:25 +00003705 /* If the shell is currently in ".explain" mode, gather the extra
3706 ** data required to add indents to the output.*/
3707 if( pArg->cMode==MODE_Explain ){
3708 explain_data_prepare(pArg, pStmt);
3709 }
dana98bf362013-11-13 18:35:01 +00003710 }
3711
drheacd29d2016-04-15 15:03:27 +00003712 exec_prepared_stmt(pArg, pStmt, xCallback);
dana98bf362013-11-13 18:35:01 +00003713 explain_data_delete(pArg);
3714
shaneh642d8b82010-07-28 16:05:34 +00003715 /* print usage stats if stats on */
3716 if( pArg && pArg->statsOn ){
3717 display_stats(db, pArg, 0);
3718 }
3719
dan8d1edb92014-11-05 09:07:28 +00003720 /* print loop-counters if required */
3721 if( pArg && pArg->scanstatsOn ){
3722 display_scanstats(db, pArg);
3723 }
3724
mistachkin1fe36bb2016-04-04 02:16:44 +00003725 /* Finalize the statement just executed. If this fails, save a
dan4564ced2010-01-05 04:59:56 +00003726 ** copy of the error message. Otherwise, set zSql to point to the
3727 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00003728 rc2 = sqlite3_finalize(pStmt);
3729 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00003730 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00003731 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00003732 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00003733 }else if( pzErrMsg ){
3734 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00003735 }
shaneh642d8b82010-07-28 16:05:34 +00003736
3737 /* clear saved stmt handle */
3738 if( pArg ){
3739 pArg->pStmt = NULL;
3740 }
shane626a6e42009-10-22 17:30:15 +00003741 }
shaneb9fc17d2009-10-22 21:23:35 +00003742 } /* end while */
shane626a6e42009-10-22 17:30:15 +00003743
3744 return rc;
3745}
3746
drhe611f142017-03-08 11:44:00 +00003747/*
3748** Release memory previously allocated by tableColumnList().
3749*/
3750static void freeColumnList(char **azCol){
3751 int i;
3752 for(i=1; azCol[i]; i++){
3753 sqlite3_free(azCol[i]);
3754 }
3755 /* azCol[0] is a static string */
3756 sqlite3_free(azCol);
3757}
3758
3759/*
3760** Return a list of pointers to strings which are the names of all
3761** columns in table zTab. The memory to hold the names is dynamically
3762** allocated and must be released by the caller using a subsequent call
3763** to freeColumnList().
3764**
3765** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
3766** value that needs to be preserved, then azCol[0] is filled in with the
3767** name of the rowid column.
3768**
3769** The first regular column in the table is azCol[1]. The list is terminated
3770** by an entry with azCol[i]==0.
3771*/
3772static char **tableColumnList(ShellState *p, const char *zTab){
3773 char **azCol = 0;
3774 sqlite3_stmt *pStmt;
3775 char *zSql;
3776 int nCol = 0;
3777 int nAlloc = 0;
3778 int nPK = 0; /* Number of PRIMARY KEY columns seen */
3779 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
drhe6e1d122017-03-09 13:50:49 +00003780 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00003781 int rc;
3782
3783 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3784 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3785 sqlite3_free(zSql);
3786 if( rc ) return 0;
3787 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3788 if( nCol>=nAlloc-2 ){
3789 nAlloc = nAlloc*2 + nCol + 10;
3790 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3791 if( azCol==0 ){
3792 raw_printf(stderr, "Error: out of memory\n");
3793 exit(1);
3794 }
3795 }
3796 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3797 if( sqlite3_column_int(pStmt, 5) ){
3798 nPK++;
3799 if( nPK==1
3800 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
mistachkine16a3502017-05-29 03:48:13 +00003801 "INTEGER")==0
drhe611f142017-03-08 11:44:00 +00003802 ){
3803 isIPK = 1;
3804 }else{
3805 isIPK = 0;
3806 }
3807 }
3808 }
3809 sqlite3_finalize(pStmt);
3810 azCol[0] = 0;
3811 azCol[nCol+1] = 0;
3812
3813 /* The decision of whether or not a rowid really needs to be preserved
3814 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
3815 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
3816 ** rowids on tables where the rowid is inaccessible because there are other
3817 ** columns in the table named "rowid", "_rowid_", and "oid".
3818 */
3819 if( preserveRowid && isIPK ){
3820 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3821 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
3822 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3823 ** ROWID aliases. To distinguish these cases, check to see if
3824 ** there is a "pk" entry in "PRAGMA index_list". There will be
3825 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3826 */
3827 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3828 " WHERE origin='pk'", zTab);
3829 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3830 sqlite3_free(zSql);
3831 if( rc ){
3832 freeColumnList(azCol);
3833 return 0;
3834 }
3835 rc = sqlite3_step(pStmt);
3836 sqlite3_finalize(pStmt);
3837 preserveRowid = rc==SQLITE_ROW;
3838 }
3839 if( preserveRowid ){
3840 /* Only preserve the rowid if we can find a name to use for the
3841 ** rowid */
3842 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3843 int i, j;
3844 for(j=0; j<3; j++){
3845 for(i=1; i<=nCol; i++){
3846 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3847 }
3848 if( i>nCol ){
3849 /* At this point, we know that azRowid[j] is not the name of any
3850 ** ordinary column in the table. Verify that azRowid[j] is a valid
3851 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
3852 ** tables will fail this last check */
drhe611f142017-03-08 11:44:00 +00003853 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3854 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3855 break;
3856 }
3857 }
3858 }
3859 return azCol;
3860}
3861
drh33048c02001-10-01 14:29:22 +00003862/*
drhf8563c02017-03-09 18:13:52 +00003863** Toggle the reverse_unordered_selects setting.
3864*/
3865static void toggleSelectOrder(sqlite3 *db){
3866 sqlite3_stmt *pStmt = 0;
3867 int iSetting = 0;
3868 char zStmt[100];
3869 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3870 if( sqlite3_step(pStmt)==SQLITE_ROW ){
3871 iSetting = sqlite3_column_int(pStmt, 0);
3872 }
3873 sqlite3_finalize(pStmt);
3874 sqlite3_snprintf(sizeof(zStmt), zStmt,
3875 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3876 sqlite3_exec(db, zStmt, 0, 0, 0);
3877}
3878
3879/*
drh4c653a02000-06-07 01:27:47 +00003880** This is a different callback routine used for dumping the database.
3881** Each row received by this callback consists of a table name,
3882** the table type ("index" or "table") and SQL to create the table.
3883** This routine should print text sufficient to recreate the table.
3884*/
drh701ff6a2017-03-22 12:51:34 +00003885static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
danielk19772a02e332004-06-05 08:04:36 +00003886 int rc;
3887 const char *zTable;
3888 const char *zType;
3889 const char *zSql;
drhdcd87a92014-08-18 13:45:42 +00003890 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00003891
drh701ff6a2017-03-22 12:51:34 +00003892 UNUSED_PARAMETER(azNotUsed);
drh4c653a02000-06-07 01:27:47 +00003893 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00003894 zTable = azArg[0];
3895 zType = azArg[1];
3896 zSql = azArg[2];
mistachkin1fe36bb2016-04-04 02:16:44 +00003897
drh00b950d2005-09-11 02:03:03 +00003898 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhe611f142017-03-08 11:44:00 +00003899 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
drh7ed10322013-08-07 16:04:27 +00003900 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003901 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00003902 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3903 return 0;
drh45e29d82006-11-20 16:21:10 +00003904 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3905 char *zIns;
3906 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00003907 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00003908 p->writableSchema = 1;
3909 }
3910 zIns = sqlite3_mprintf(
3911 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
3912 "VALUES('table','%q','%q',0,'%q');",
3913 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00003914 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00003915 sqlite3_free(zIns);
3916 return 0;
drh00b950d2005-09-11 02:03:03 +00003917 }else{
drh79f20e92016-12-13 23:22:39 +00003918 printSchemaLine(p->out, zSql, ";\n");
drhf8eb96a2005-02-03 00:42:34 +00003919 }
danielk19772a02e332004-06-05 08:04:36 +00003920
3921 if( strcmp(zType, "table")==0 ){
drhf42d3182017-03-08 12:25:18 +00003922 ShellText sSelect;
3923 ShellText sTable;
drhe611f142017-03-08 11:44:00 +00003924 char **azCol;
3925 int i;
3926 char *savedDestTable;
3927 int savedMode;
mistachkin1fe36bb2016-04-04 02:16:44 +00003928
drhe611f142017-03-08 11:44:00 +00003929 azCol = tableColumnList(p, zTable);
3930 if( azCol==0 ){
3931 p->nErr++;
3932 return 0;
danielk19772a02e332004-06-05 08:04:36 +00003933 }
3934
drhbf92ec02012-03-22 12:50:34 +00003935 /* Always quote the table name, even if it appears to be pure ascii,
3936 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
drhf42d3182017-03-08 12:25:18 +00003937 initText(&sTable);
3938 appendText(&sTable, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00003939 /* If preserving the rowid, add a column list after the table name.
3940 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3941 ** instead of the usual "INSERT INTO tab VALUES(...)".
3942 */
3943 if( azCol[0] ){
3944 appendText(&sTable, "(", 0);
3945 appendText(&sTable, azCol[0], 0);
3946 for(i=1; azCol[i]; i++){
3947 appendText(&sTable, ",", 0);
drhf42d3182017-03-08 12:25:18 +00003948 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
danielk19772a02e332004-06-05 08:04:36 +00003949 }
drhe611f142017-03-08 11:44:00 +00003950 appendText(&sTable, ")", 0);
danielk19772a02e332004-06-05 08:04:36 +00003951 }
danielk19772a02e332004-06-05 08:04:36 +00003952
drhe611f142017-03-08 11:44:00 +00003953 /* Build an appropriate SELECT statement */
drhf42d3182017-03-08 12:25:18 +00003954 initText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003955 appendText(&sSelect, "SELECT ", 0);
3956 if( azCol[0] ){
3957 appendText(&sSelect, azCol[0], 0);
3958 appendText(&sSelect, ",", 0);
drhdd3d4592004-08-30 01:54:05 +00003959 }
drhe611f142017-03-08 11:44:00 +00003960 for(i=1; azCol[i]; i++){
drhf42d3182017-03-08 12:25:18 +00003961 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
drhe611f142017-03-08 11:44:00 +00003962 if( azCol[i+1] ){
3963 appendText(&sSelect, ",", 0);
3964 }
3965 }
3966 freeColumnList(azCol);
3967 appendText(&sSelect, " FROM ", 0);
drhf42d3182017-03-08 12:25:18 +00003968 appendText(&sSelect, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00003969
3970 savedDestTable = p->zDestTable;
3971 savedMode = p->mode;
3972 p->zDestTable = sTable.z;
3973 p->mode = p->cMode = MODE_Insert;
3974 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
drhf8563c02017-03-09 18:13:52 +00003975 if( (rc&0xff)==SQLITE_CORRUPT ){
3976 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3977 toggleSelectOrder(p->db);
3978 shell_exec(p->db, sSelect.z, shell_callback, p, 0);
3979 toggleSelectOrder(p->db);
3980 }
drhe611f142017-03-08 11:44:00 +00003981 p->zDestTable = savedDestTable;
3982 p->mode = savedMode;
drhf42d3182017-03-08 12:25:18 +00003983 freeText(&sTable);
3984 freeText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003985 if( rc ) p->nErr++;
drh4c653a02000-06-07 01:27:47 +00003986 }
drh4c653a02000-06-07 01:27:47 +00003987 return 0;
3988}
3989
3990/*
drh45e29d82006-11-20 16:21:10 +00003991** Run zQuery. Use dump_callback() as the callback routine so that
3992** the contents of the query are output as SQL statements.
3993**
drhdd3d4592004-08-30 01:54:05 +00003994** If we get a SQLITE_CORRUPT error, rerun the query after appending
3995** "ORDER BY rowid DESC" to the end.
3996*/
3997static int run_schema_dump_query(
mistachkin1fe36bb2016-04-04 02:16:44 +00003998 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00003999 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00004000){
4001 int rc;
drh2f464a02011-10-13 00:41:49 +00004002 char *zErr = 0;
4003 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00004004 if( rc==SQLITE_CORRUPT ){
4005 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00004006 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00004007 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00004008 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00004009 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00004010 sqlite3_free(zErr);
4011 zErr = 0;
4012 }
drhdd3d4592004-08-30 01:54:05 +00004013 zQ2 = malloc( len+100 );
4014 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00004015 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00004016 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4017 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004018 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00004019 }else{
4020 rc = SQLITE_CORRUPT;
4021 }
4022 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00004023 free(zQ2);
4024 }
4025 return rc;
4026}
4027
4028/*
drh75897232000-05-29 14:26:00 +00004029** Text of a help message
4030*/
persicom1d0b8722002-04-18 02:53:04 +00004031static char zHelp[] =
drha0daa752016-09-16 11:53:10 +00004032#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00004033 ".auth ON|OFF Show authorizer callbacks\n"
drha0daa752016-09-16 11:53:10 +00004034#endif
drh9ff849f2009-02-04 20:55:57 +00004035 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00004036 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00004037 ".binary on|off Turn binary output on or off. Default OFF\n"
drh453ca042017-05-22 18:00:34 +00004038 ".cd DIRECTORY Change the working directory to DIRECTORY\n"
drhdf12f1c2015-12-07 21:46:19 +00004039 ".changes on|off Show number of rows changed by SQL\n"
drh2db82112016-09-15 21:35:24 +00004040 ".check GLOB Fail if output since .testcase does not match\n"
drh4bbcf102014-02-06 02:46:08 +00004041 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00004042 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00004043 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00004044 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00004045 " If TABLE specified, only dump tables matching\n"
4046 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00004047 ".echo on|off Turn command echo on or off\n"
drheacd29d2016-04-15 15:03:27 +00004048 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00004049 ".exit Exit this program\n"
drhc31b79d2017-06-29 21:11:27 +00004050/* Because explain mode comes on automatically now, the ".explain" mode
4051** is removed from the help screen. It is still supported for legacy, however */
4052/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/
drh4926fec2016-04-13 15:33:42 +00004053 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00004054 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00004055 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00004056 ".import FILE TABLE Import data from FILE into TABLE\n"
drh16eb5942016-11-03 13:01:38 +00004057#ifndef SQLITE_OMIT_TEST_CONTROL
4058 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
4059#endif
drh0e55db12015-02-06 14:51:13 +00004060 ".indexes ?TABLE? Show names of all indexes\n"
4061 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00004062 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00004063#ifdef SQLITE_ENABLE_IOTRACE
4064 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
4065#endif
drh1a513372015-05-02 17:40:23 +00004066 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh3fd9f332016-12-16 18:41:11 +00004067 ".lint OPTIONS Report potential schema issues. Options:\n"
4068 " fkey-indexes Find missing foreign key indexes\n"
drh70df4fe2006-06-13 15:12:21 +00004069#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00004070 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00004071#endif
drh127f9d72010-02-23 01:47:00 +00004072 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00004073 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00004074 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00004075 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00004076 " column Left-aligned columns. (See .width)\n"
4077 " html HTML <table> code\n"
4078 " insert SQL insert statements for TABLE\n"
4079 " line One value per line\n"
drh0c5cd962017-02-14 21:47:46 +00004080 " list Values delimited by \"|\"\n"
drh41f5f6e2016-10-21 17:39:30 +00004081 " quote Escape answers as for SQL\n"
drhb860bc92004-08-04 15:16:55 +00004082 " tabs Tab-separated values\n"
4083 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00004084 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00004085 ".once FILENAME Output for the next SQL command only to FILENAME\n"
mistachkine16a3502017-05-29 03:48:13 +00004086 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n"
4087 " The --new option starts with an empty file\n"
drhc2ce0be2014-05-29 12:36:14 +00004088 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00004089 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00004090 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00004091 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00004092 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00004093 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00004094 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00004095 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh4926fec2016-04-13 15:33:42 +00004096 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
4097 " Add --indent for pretty-printing\n"
drha5d75ba2017-03-15 14:20:34 +00004098 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
mistachkine0d68852014-12-11 03:12:33 +00004099 ".separator COL ?ROW? Change the column separator and optionally the row\n"
4100 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00004101#if defined(SQLITE_ENABLE_SESSION)
4102 ".session CMD ... Create or control sessions\n"
4103#endif
drh1554bc82017-03-08 16:10:34 +00004104 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh62cdde52014-05-28 20:22:28 +00004105 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00004106 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00004107 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00004108 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00004109 ".tables ?TABLE? List names of tables\n"
4110 " If TABLE specified, only list tables matching\n"
4111 " LIKE pattern TABLE.\n"
drh760c8162016-09-16 02:52:22 +00004112 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
drh2dfbbca2000-07-28 14:32:48 +00004113 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00004114 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00004115 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00004116 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00004117 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00004118 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00004119 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00004120 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00004121;
4122
drhe6229612014-08-18 15:08:26 +00004123#if defined(SQLITE_ENABLE_SESSION)
4124/*
4125** Print help information for the ".sessions" command
4126*/
4127void session_help(ShellState *p){
mistachkin899c5c92016-04-03 20:50:02 +00004128 raw_printf(p->out,
drhe6229612014-08-18 15:08:26 +00004129 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
4130 "If ?NAME? is omitted, the first defined session is used.\n"
4131 "Subcommands:\n"
4132 " attach TABLE Attach TABLE\n"
4133 " changeset FILE Write a changeset into FILE\n"
4134 " close Close one session\n"
4135 " enable ?BOOLEAN? Set or query the enable bit\n"
mistachkin1fe36bb2016-04-04 02:16:44 +00004136 " filter GLOB... Reject tables matching GLOBs\n"
drhe6229612014-08-18 15:08:26 +00004137 " indirect ?BOOLEAN? Mark or query the indirect status\n"
4138 " isempty Query whether the session is empty\n"
4139 " list List currently open session names\n"
4140 " open DB NAME Open a new session on DB\n"
4141 " patchset FILE Write a patchset into FILE\n"
4142 );
4143}
4144#endif
4145
4146
drhdaffd0e2001-04-11 14:28:42 +00004147/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00004148static int process_input(ShellState *p, FILE *in);
drh2db82112016-09-15 21:35:24 +00004149
drh2db82112016-09-15 21:35:24 +00004150/*
dan11da0022016-12-17 08:18:05 +00004151** Read the content of file zName into memory obtained from sqlite3_malloc64()
mistachkine16a3502017-05-29 03:48:13 +00004152** and return a pointer to the buffer. The caller is responsible for freeing
4153** the memory.
drh2db82112016-09-15 21:35:24 +00004154**
dan11da0022016-12-17 08:18:05 +00004155** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4156** read.
4157**
4158** For convenience, a nul-terminator byte is always appended to the data read
4159** from the file before the buffer is returned. This byte is not included in
4160** the final value of (*pnByte), if applicable.
4161**
4162** NULL is returned if any error is encountered. The final value of *pnByte
4163** is undefined in this case.
drh2db82112016-09-15 21:35:24 +00004164*/
dan11da0022016-12-17 08:18:05 +00004165static char *readFile(const char *zName, int *pnByte){
drh2db82112016-09-15 21:35:24 +00004166 FILE *in = fopen(zName, "rb");
4167 long nIn;
drhd1459152016-09-16 19:11:03 +00004168 size_t nRead;
drh2db82112016-09-15 21:35:24 +00004169 char *pBuf;
4170 if( in==0 ) return 0;
4171 fseek(in, 0, SEEK_END);
4172 nIn = ftell(in);
4173 rewind(in);
drhd1459152016-09-16 19:11:03 +00004174 pBuf = sqlite3_malloc64( nIn+1 );
drh2db82112016-09-15 21:35:24 +00004175 if( pBuf==0 ) return 0;
drhd1459152016-09-16 19:11:03 +00004176 nRead = fread(pBuf, nIn, 1, in);
4177 fclose(in);
4178 if( nRead!=1 ){
drh2db82112016-09-15 21:35:24 +00004179 sqlite3_free(pBuf);
4180 return 0;
4181 }
drhd1459152016-09-16 19:11:03 +00004182 pBuf[nIn] = 0;
dan11da0022016-12-17 08:18:05 +00004183 if( pnByte ) *pnByte = nIn;
drh2db82112016-09-15 21:35:24 +00004184 return pBuf;
4185}
4186
drhe6229612014-08-18 15:08:26 +00004187#if defined(SQLITE_ENABLE_SESSION)
4188/*
4189** Close a single OpenSession object and release all of its associated
4190** resources.
4191*/
4192static void session_close(OpenSession *pSession){
4193 int i;
4194 sqlite3session_delete(pSession->p);
4195 sqlite3_free(pSession->zName);
4196 for(i=0; i<pSession->nFilter; i++){
4197 sqlite3_free(pSession->azFilter[i]);
4198 }
4199 sqlite3_free(pSession->azFilter);
4200 memset(pSession, 0, sizeof(OpenSession));
4201}
4202#endif
4203
4204/*
drh51b55a32016-04-04 12:38:05 +00004205** Close all OpenSession objects and release all associated resources.
drhe6229612014-08-18 15:08:26 +00004206*/
drhe6229612014-08-18 15:08:26 +00004207#if defined(SQLITE_ENABLE_SESSION)
drh51b55a32016-04-04 12:38:05 +00004208static void session_close_all(ShellState *p){
drhe6229612014-08-18 15:08:26 +00004209 int i;
4210 for(i=0; i<p->nSession; i++){
4211 session_close(&p->aSession[i]);
4212 }
4213 p->nSession = 0;
drhe6229612014-08-18 15:08:26 +00004214}
drh51b55a32016-04-04 12:38:05 +00004215#else
4216# define session_close_all(X)
4217#endif
drhe6229612014-08-18 15:08:26 +00004218
drh75897232000-05-29 14:26:00 +00004219/*
drh03168ca2014-08-18 20:01:31 +00004220** Implementation of the xFilter function for an open session. Omit
4221** any tables named by ".session filter" but let all other table through.
4222*/
4223#if defined(SQLITE_ENABLE_SESSION)
4224static int session_filter(void *pCtx, const char *zTab){
4225 OpenSession *pSession = (OpenSession*)pCtx;
4226 int i;
4227 for(i=0; i<pSession->nFilter; i++){
4228 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4229 }
4230 return 1;
4231}
4232#endif
4233
4234/*
drh44c2eb12003-04-30 11:38:26 +00004235** Make sure the database is open. If it is not, then open it. If
4236** the database fails to open, print an error message and exit.
4237*/
drhdcd87a92014-08-18 13:45:42 +00004238static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00004239 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00004240 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00004241 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00004242 globalDb = p->db;
mistachkin8e189222015-04-19 21:43:16 +00004243 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004244 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00004245 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00004246 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00004247 exit(1);
drh44c2eb12003-04-30 11:38:26 +00004248 }
drhc2e87a32006-06-27 15:16:14 +00004249#ifndef SQLITE_OMIT_LOAD_EXTENSION
4250 sqlite3_enable_load_extension(p->db, 1);
4251#endif
drh2ce15c32017-07-11 13:34:40 +00004252 sqlite3_fileio_init(p->db, 0, 0);
4253 sqlite3_shathree_init(p->db, 0, 0);
drh56eb09b2017-07-11 13:59:07 +00004254 sqlite3_completion_init(p->db, 0, 0);
drh20c9c3f2017-06-15 12:21:09 +00004255 sqlite3_create_function(p->db, "shell_add_schema", 2, SQLITE_UTF8, 0,
4256 shellAddSchemaName, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00004257 }
4258}
4259
drh56eb09b2017-07-11 13:59:07 +00004260#if HAVE_READLINE || HAVE_EDITLINE
4261/*
4262** Readline completion callbacks
4263*/
4264static char *readline_completion_generator(const char *text, int state){
4265 static sqlite3_stmt *pStmt = 0;
4266 char *zRet;
4267 if( state==0 ){
4268 char *zSql;
drh56eb09b2017-07-11 13:59:07 +00004269 sqlite3_finalize(pStmt);
4270 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4271 " FROM completion(%Q) ORDER BY 1", text);
4272 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4273 sqlite3_free(zSql);
4274 }
4275 if( sqlite3_step(pStmt)==SQLITE_ROW ){
drh968d8712017-07-14 00:28:28 +00004276 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
drh56eb09b2017-07-11 13:59:07 +00004277 }else{
4278 sqlite3_finalize(pStmt);
4279 pStmt = 0;
4280 zRet = 0;
4281 }
4282 return zRet;
4283}
4284static char **readline_completion(const char *zText, int iStart, int iEnd){
4285 rl_attempted_completion_over = 1;
4286 return rl_completion_matches(zText, readline_completion_generator);
4287}
4288
4289#elif HAVE_LINENOISE
4290/*
4291** Linenoise completion callback
4292*/
4293static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
4294 int nLine = (int)strlen(zLine);
4295 int i, iStart;
4296 sqlite3_stmt *pStmt = 0;
4297 char *zSql;
4298 char zBuf[1000];
4299
4300 if( nLine>sizeof(zBuf)-30 ) return;
4301 if( zLine[0]=='.' ) return;
4302 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
4303 if( i==nLine-1 ) return;
4304 iStart = i+1;
4305 memcpy(zBuf, zLine, iStart);
4306 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4307 " FROM completion(%Q,%Q) ORDER BY 1",
4308 &zLine[iStart], zLine);
4309 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4310 sqlite3_free(zSql);
4311 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
4312 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4313 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
4314 int nCompletion = sqlite3_column_bytes(pStmt, 0);
4315 if( iStart+nCompletion < sizeof(zBuf)-1 ){
4316 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
4317 linenoiseAddCompletion(lc, zBuf);
4318 }
4319 }
4320 sqlite3_finalize(pStmt);
4321}
4322#endif
4323
drh44c2eb12003-04-30 11:38:26 +00004324/*
drhfeac5f82004-08-01 00:10:45 +00004325** Do C-language style dequoting.
4326**
mistachkinf21979d2015-01-18 05:35:01 +00004327** \a -> alarm
4328** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00004329** \t -> tab
4330** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00004331** \v -> vertical tab
4332** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00004333** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00004334** \s -> space
drh4c56b992013-06-27 13:26:55 +00004335** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00004336** \' -> '
drhfeac5f82004-08-01 00:10:45 +00004337** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00004338** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00004339*/
4340static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00004341 int i, j;
4342 char c;
drhc2ce0be2014-05-29 12:36:14 +00004343 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00004344 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00004345 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00004346 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00004347 if( c=='a' ){
4348 c = '\a';
4349 }else if( c=='b' ){
4350 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00004351 }else if( c=='t' ){
4352 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00004353 }else if( c=='n' ){
4354 c = '\n';
4355 }else if( c=='v' ){
4356 c = '\v';
4357 }else if( c=='f' ){
4358 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00004359 }else if( c=='r' ){
4360 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00004361 }else if( c=='"' ){
4362 c = '"';
4363 }else if( c=='\'' ){
4364 c = '\'';
drh4c56b992013-06-27 13:26:55 +00004365 }else if( c=='\\' ){
4366 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00004367 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00004368 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00004369 if( z[i+1]>='0' && z[i+1]<='7' ){
4370 i++;
4371 c = (c<<3) + z[i] - '0';
4372 if( z[i+1]>='0' && z[i+1]<='7' ){
4373 i++;
4374 c = (c<<3) + z[i] - '0';
4375 }
4376 }
4377 }
4378 }
4379 z[j] = c;
4380 }
drhc2ce0be2014-05-29 12:36:14 +00004381 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00004382}
4383
4384/*
drh348d19c2013-06-03 12:47:43 +00004385** Return the value of a hexadecimal digit. Return -1 if the input
4386** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00004387*/
drh348d19c2013-06-03 12:47:43 +00004388static int hexDigitValue(char c){
4389 if( c>='0' && c<='9' ) return c - '0';
4390 if( c>='a' && c<='f' ) return c - 'a' + 10;
4391 if( c>='A' && c<='F' ) return c - 'A' + 10;
4392 return -1;
drhc28490c2006-10-26 14:25:58 +00004393}
4394
4395/*
drh7d9f3942013-04-03 01:26:54 +00004396** Interpret zArg as an integer value, possibly with suffixes.
4397*/
4398static sqlite3_int64 integerValue(const char *zArg){
4399 sqlite3_int64 v = 0;
4400 static const struct { char *zSuffix; int iMult; } aMult[] = {
4401 { "KiB", 1024 },
4402 { "MiB", 1024*1024 },
4403 { "GiB", 1024*1024*1024 },
4404 { "KB", 1000 },
4405 { "MB", 1000000 },
4406 { "GB", 1000000000 },
4407 { "K", 1000 },
4408 { "M", 1000000 },
4409 { "G", 1000000000 },
4410 };
4411 int i;
4412 int isNeg = 0;
4413 if( zArg[0]=='-' ){
4414 isNeg = 1;
4415 zArg++;
4416 }else if( zArg[0]=='+' ){
4417 zArg++;
4418 }
drh348d19c2013-06-03 12:47:43 +00004419 if( zArg[0]=='0' && zArg[1]=='x' ){
4420 int x;
4421 zArg += 2;
4422 while( (x = hexDigitValue(zArg[0]))>=0 ){
4423 v = (v<<4) + x;
4424 zArg++;
4425 }
4426 }else{
4427 while( IsDigit(zArg[0]) ){
4428 v = v*10 + zArg[0] - '0';
4429 zArg++;
4430 }
drh7d9f3942013-04-03 01:26:54 +00004431 }
drhc2bed0a2013-05-24 11:57:50 +00004432 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00004433 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
4434 v *= aMult[i].iMult;
4435 break;
4436 }
4437 }
4438 return isNeg? -v : v;
4439}
4440
4441/*
drh348d19c2013-06-03 12:47:43 +00004442** Interpret zArg as either an integer or a boolean value. Return 1 or 0
4443** for TRUE and FALSE. Return the integer value if appropriate.
4444*/
drhe6e1d122017-03-09 13:50:49 +00004445static int booleanValue(const char *zArg){
drh348d19c2013-06-03 12:47:43 +00004446 int i;
4447 if( zArg[0]=='0' && zArg[1]=='x' ){
4448 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
4449 }else{
4450 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
4451 }
4452 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
4453 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
4454 return 1;
4455 }
4456 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
4457 return 0;
4458 }
mistachkinaae280e2015-12-31 19:06:24 +00004459 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00004460 zArg);
4461 return 0;
4462}
4463
4464/*
drhe6e1d122017-03-09 13:50:49 +00004465** Set or clear a shell flag according to a boolean value.
4466*/
4467static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
4468 if( booleanValue(zArg) ){
4469 ShellSetFlag(p, mFlag);
4470 }else{
4471 ShellClearFlag(p, mFlag);
4472 }
4473}
4474
4475/*
drh42f64e52012-04-04 16:56:23 +00004476** Close an output file, assuming it is not stderr or stdout
4477*/
4478static void output_file_close(FILE *f){
4479 if( f && f!=stdout && f!=stderr ) fclose(f);
4480}
4481
4482/*
4483** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00004484** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00004485** filename is "off".
4486*/
4487static FILE *output_file_open(const char *zFile){
4488 FILE *f;
4489 if( strcmp(zFile,"stdout")==0 ){
4490 f = stdout;
4491 }else if( strcmp(zFile, "stderr")==0 ){
4492 f = stderr;
4493 }else if( strcmp(zFile, "off")==0 ){
4494 f = 0;
4495 }else{
4496 f = fopen(zFile, "wb");
4497 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004498 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00004499 }
4500 }
4501 return f;
4502}
4503
drhd12602a2016-12-07 15:49:02 +00004504#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00004505#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00004506/*
4507** A routine for handling output from sqlite3_trace().
4508*/
drh4b363a52016-07-23 20:27:41 +00004509static int sql_trace_callback(
4510 unsigned mType,
4511 void *pArg,
4512 void *pP,
4513 void *pX
4514){
drh42f64e52012-04-04 16:56:23 +00004515 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00004516 UNUSED_PARAMETER(mType);
4517 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00004518 if( f ){
drh4b363a52016-07-23 20:27:41 +00004519 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00004520 int i = (int)strlen(z);
4521 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00004522 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00004523 }
drh4b363a52016-07-23 20:27:41 +00004524 return 0;
drh42f64e52012-04-04 16:56:23 +00004525}
drhc10b9da2016-11-20 17:59:59 +00004526#endif
4527#endif
drh42f64e52012-04-04 16:56:23 +00004528
4529/*
drhd8621b92012-04-17 09:09:33 +00004530** A no-op routine that runs with the ".breakpoint" doc-command. This is
4531** a useful spot to set a debugger breakpoint.
4532*/
4533static void test_breakpoint(void){
4534 static int nCall = 0;
4535 nCall++;
4536}
4537
4538/*
mistachkin636bf9f2014-07-19 20:15:16 +00004539** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00004540*/
mistachkin636bf9f2014-07-19 20:15:16 +00004541typedef struct ImportCtx ImportCtx;
4542struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00004543 const char *zFile; /* Name of the input file */
4544 FILE *in; /* Read the CSV text from this input stream */
4545 char *z; /* Accumulated text for a field */
4546 int n; /* Number of bytes in z */
4547 int nAlloc; /* Space allocated for z[] */
4548 int nLine; /* Current line number */
drhd5fbde82017-06-26 18:42:23 +00004549 int bNotFirst; /* True if one or more bytes already read */
drhdb95f682013-06-26 22:46:00 +00004550 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00004551 int cColSep; /* The column separator character. (Usually ",") */
4552 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00004553};
4554
4555/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00004556static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00004557 if( p->n+1>=p->nAlloc ){
4558 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00004559 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00004560 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004561 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00004562 exit(1);
4563 }
4564 }
4565 p->z[p->n++] = (char)c;
4566}
4567
4568/* Read a single field of CSV text. Compatible with rfc4180 and extended
4569** with the option of having a separator other than ",".
4570**
4571** + Input comes from p->in.
4572** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00004573** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00004574** + Use p->cSep as the column separator. The default is ",".
4575** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00004576** + Keep track of the line number in p->nLine.
4577** + Store the character that terminates the field in p->cTerm. Store
4578** EOF on end-of-file.
4579** + Report syntax errors on stderr
4580*/
mistachkin44723ce2015-03-21 02:22:37 +00004581static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00004582 int c;
4583 int cSep = p->cColSep;
4584 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00004585 p->n = 0;
4586 c = fgetc(p->in);
4587 if( c==EOF || seenInterrupt ){
4588 p->cTerm = EOF;
4589 return 0;
4590 }
4591 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00004592 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00004593 int startLine = p->nLine;
4594 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00004595 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00004596 while( 1 ){
4597 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00004598 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00004599 if( c==cQuote ){
4600 if( pc==cQuote ){
4601 pc = 0;
4602 continue;
4603 }
4604 }
4605 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00004606 || (c==rSep && pc==cQuote)
4607 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00004608 || (c==EOF && pc==cQuote)
4609 ){
4610 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00004611 p->cTerm = c;
4612 break;
4613 }
4614 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00004615 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00004616 p->zFile, p->nLine, cQuote);
4617 }
4618 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00004619 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00004620 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00004621 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00004622 break;
4623 }
mistachkin636bf9f2014-07-19 20:15:16 +00004624 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00004625 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00004626 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00004627 }
drhdb95f682013-06-26 22:46:00 +00004628 }else{
drhd5fbde82017-06-26 18:42:23 +00004629 /* If this is the first field being parsed and it begins with the
4630 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
4631 if( (c&0xff)==0xef && p->bNotFirst==0 ){
4632 import_append_char(p, c);
4633 c = fgetc(p->in);
4634 if( (c&0xff)==0xbb ){
4635 import_append_char(p, c);
4636 c = fgetc(p->in);
4637 if( (c&0xff)==0xbf ){
4638 p->bNotFirst = 1;
4639 p->n = 0;
4640 return csv_read_one_field(p);
4641 }
4642 }
4643 }
mistachkin636bf9f2014-07-19 20:15:16 +00004644 while( c!=EOF && c!=cSep && c!=rSep ){
4645 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00004646 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00004647 }
mistachkin636bf9f2014-07-19 20:15:16 +00004648 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00004649 p->nLine++;
drh3852b682014-02-26 13:53:34 +00004650 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00004651 }
drhdb95f682013-06-26 22:46:00 +00004652 p->cTerm = c;
4653 }
drh8dd675e2013-07-12 21:09:24 +00004654 if( p->z ) p->z[p->n] = 0;
drhd5fbde82017-06-26 18:42:23 +00004655 p->bNotFirst = 1;
drhdb95f682013-06-26 22:46:00 +00004656 return p->z;
4657}
4658
mistachkin636bf9f2014-07-19 20:15:16 +00004659/* Read a single field of ASCII delimited text.
4660**
4661** + Input comes from p->in.
4662** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00004663** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00004664** + Use p->cSep as the column separator. The default is "\x1F".
4665** + Use p->rSep as the row separator. The default is "\x1E".
4666** + Keep track of the row number in p->nLine.
4667** + Store the character that terminates the field in p->cTerm. Store
4668** EOF on end-of-file.
4669** + Report syntax errors on stderr
4670*/
mistachkin44723ce2015-03-21 02:22:37 +00004671static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00004672 int c;
4673 int cSep = p->cColSep;
4674 int rSep = p->cRowSep;
4675 p->n = 0;
4676 c = fgetc(p->in);
4677 if( c==EOF || seenInterrupt ){
4678 p->cTerm = EOF;
4679 return 0;
4680 }
4681 while( c!=EOF && c!=cSep && c!=rSep ){
4682 import_append_char(p, c);
4683 c = fgetc(p->in);
4684 }
4685 if( c==rSep ){
4686 p->nLine++;
4687 }
4688 p->cTerm = c;
4689 if( p->z ) p->z[p->n] = 0;
4690 return p->z;
4691}
4692
drhdb95f682013-06-26 22:46:00 +00004693/*
drh4bbcf102014-02-06 02:46:08 +00004694** Try to transfer data for table zTable. If an error is seen while
4695** moving forward, try to go backwards. The backwards movement won't
4696** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00004697*/
mistachkine31ae902014-02-06 01:15:29 +00004698static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00004699 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00004700 sqlite3 *newDb,
4701 const char *zTable
4702){
mistachkin1fe36bb2016-04-04 02:16:44 +00004703 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00004704 sqlite3_stmt *pInsert = 0;
4705 char *zQuery = 0;
4706 char *zInsert = 0;
4707 int rc;
4708 int i, j, n;
4709 int nTable = (int)strlen(zTable);
4710 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00004711 int cnt = 0;
4712 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00004713
4714 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
4715 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4716 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004717 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004718 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4719 zQuery);
4720 goto end_data_xfer;
4721 }
4722 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00004723 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00004724 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004725 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00004726 goto end_data_xfer;
4727 }
4728 sqlite3_snprintf(200+nTable,zInsert,
4729 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
4730 i = (int)strlen(zInsert);
4731 for(j=1; j<n; j++){
4732 memcpy(zInsert+i, ",?", 2);
4733 i += 2;
4734 }
4735 memcpy(zInsert+i, ");", 3);
4736 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
4737 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004738 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004739 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
4740 zQuery);
4741 goto end_data_xfer;
4742 }
4743 for(k=0; k<2; k++){
4744 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4745 for(i=0; i<n; i++){
4746 switch( sqlite3_column_type(pQuery, i) ){
4747 case SQLITE_NULL: {
4748 sqlite3_bind_null(pInsert, i+1);
4749 break;
4750 }
4751 case SQLITE_INTEGER: {
4752 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
4753 break;
4754 }
4755 case SQLITE_FLOAT: {
4756 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
4757 break;
4758 }
4759 case SQLITE_TEXT: {
4760 sqlite3_bind_text(pInsert, i+1,
4761 (const char*)sqlite3_column_text(pQuery,i),
4762 -1, SQLITE_STATIC);
4763 break;
4764 }
4765 case SQLITE_BLOB: {
4766 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
4767 sqlite3_column_bytes(pQuery,i),
4768 SQLITE_STATIC);
4769 break;
4770 }
4771 }
4772 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00004773 rc = sqlite3_step(pInsert);
4774 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00004775 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00004776 sqlite3_errmsg(newDb));
4777 }
drh3350ce92014-02-06 00:49:12 +00004778 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00004779 cnt++;
4780 if( (cnt%spinRate)==0 ){
4781 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
4782 fflush(stdout);
4783 }
drh3350ce92014-02-06 00:49:12 +00004784 } /* End while */
4785 if( rc==SQLITE_DONE ) break;
4786 sqlite3_finalize(pQuery);
4787 sqlite3_free(zQuery);
4788 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
4789 zTable);
4790 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4791 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004792 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00004793 break;
drh3350ce92014-02-06 00:49:12 +00004794 }
4795 } /* End for(k=0...) */
4796
4797end_data_xfer:
4798 sqlite3_finalize(pQuery);
4799 sqlite3_finalize(pInsert);
4800 sqlite3_free(zQuery);
4801 sqlite3_free(zInsert);
4802}
4803
4804
4805/*
4806** Try to transfer all rows of the schema that match zWhere. For
4807** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00004808** If an error is encountered while moving forward through the
4809** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00004810*/
mistachkine31ae902014-02-06 01:15:29 +00004811static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00004812 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00004813 sqlite3 *newDb,
4814 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00004815 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00004816){
4817 sqlite3_stmt *pQuery = 0;
4818 char *zQuery = 0;
4819 int rc;
4820 const unsigned char *zName;
4821 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00004822 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00004823
4824 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4825 " WHERE %s", zWhere);
4826 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4827 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004828 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004829 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4830 zQuery);
4831 goto end_schema_xfer;
4832 }
4833 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4834 zName = sqlite3_column_text(pQuery, 0);
4835 zSql = sqlite3_column_text(pQuery, 1);
4836 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00004837 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4838 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004839 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00004840 sqlite3_free(zErrMsg);
4841 zErrMsg = 0;
4842 }
drh3350ce92014-02-06 00:49:12 +00004843 if( xForEach ){
4844 xForEach(p, newDb, (const char*)zName);
4845 }
4846 printf("done\n");
4847 }
4848 if( rc!=SQLITE_DONE ){
4849 sqlite3_finalize(pQuery);
4850 sqlite3_free(zQuery);
4851 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4852 " WHERE %s ORDER BY rowid DESC", zWhere);
4853 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4854 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004855 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004856 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4857 zQuery);
4858 goto end_schema_xfer;
4859 }
4860 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4861 zName = sqlite3_column_text(pQuery, 0);
4862 zSql = sqlite3_column_text(pQuery, 1);
4863 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00004864 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4865 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004866 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00004867 sqlite3_free(zErrMsg);
4868 zErrMsg = 0;
4869 }
drh3350ce92014-02-06 00:49:12 +00004870 if( xForEach ){
4871 xForEach(p, newDb, (const char*)zName);
4872 }
4873 printf("done\n");
4874 }
4875 }
4876end_schema_xfer:
4877 sqlite3_finalize(pQuery);
4878 sqlite3_free(zQuery);
4879}
4880
4881/*
4882** Open a new database file named "zNewDb". Try to recover as much information
4883** as possible out of the main database (which might be corrupt) and write it
4884** into zNewDb.
4885*/
drhdcd87a92014-08-18 13:45:42 +00004886static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00004887 int rc;
4888 sqlite3 *newDb = 0;
4889 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004890 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00004891 return;
4892 }
4893 rc = sqlite3_open(zNewDb, &newDb);
4894 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004895 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00004896 sqlite3_errmsg(newDb));
4897 }else{
drh54d0d2d2014-04-03 00:32:13 +00004898 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00004899 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00004900 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
4901 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00004902 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00004903 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00004904 }
4905 sqlite3_close(newDb);
4906}
4907
4908/*
drhc2ce0be2014-05-29 12:36:14 +00004909** Change the output file back to stdout
4910*/
drhdcd87a92014-08-18 13:45:42 +00004911static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00004912 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004913#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00004914 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00004915#endif
drhc2ce0be2014-05-29 12:36:14 +00004916 }else{
4917 output_file_close(p->out);
4918 }
4919 p->outfile[0] = 0;
4920 p->out = stdout;
4921}
4922
4923/*
drhf7502f02015-02-06 14:19:44 +00004924** Run an SQL command and return the single integer result.
4925*/
4926static int db_int(ShellState *p, const char *zSql){
4927 sqlite3_stmt *pStmt;
4928 int res = 0;
4929 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4930 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
4931 res = sqlite3_column_int(pStmt,0);
4932 }
4933 sqlite3_finalize(pStmt);
4934 return res;
4935}
4936
4937/*
4938** Convert a 2-byte or 4-byte big-endian integer into a native integer
4939*/
drha0620ac2016-07-13 13:05:13 +00004940static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00004941 return (a[0]<<8) + a[1];
4942}
drha0620ac2016-07-13 13:05:13 +00004943static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00004944 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
4945}
4946
4947/*
4948** Implementation of the ".info" command.
4949**
4950** Return 1 on error, 2 to exit, and 0 otherwise.
4951*/
drh0e55db12015-02-06 14:51:13 +00004952static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00004953 static const struct { const char *zName; int ofst; } aField[] = {
4954 { "file change counter:", 24 },
4955 { "database page count:", 28 },
4956 { "freelist page count:", 36 },
4957 { "schema cookie:", 40 },
4958 { "schema format:", 44 },
4959 { "default cache size:", 48 },
4960 { "autovacuum top root:", 52 },
4961 { "incremental vacuum:", 64 },
4962 { "text encoding:", 56 },
4963 { "user version:", 60 },
4964 { "application id:", 68 },
4965 { "software version:", 96 },
4966 };
drh0e55db12015-02-06 14:51:13 +00004967 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4968 { "number of tables:",
4969 "SELECT count(*) FROM %s WHERE type='table'" },
4970 { "number of indexes:",
4971 "SELECT count(*) FROM %s WHERE type='index'" },
4972 { "number of triggers:",
4973 "SELECT count(*) FROM %s WHERE type='trigger'" },
4974 { "number of views:",
4975 "SELECT count(*) FROM %s WHERE type='view'" },
4976 { "schema size:",
4977 "SELECT total(length(sql)) FROM %s" },
4978 };
mistachkinbfe8bd52015-11-17 19:17:14 +00004979 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00004980 int i;
4981 char *zSchemaTab;
4982 char *zDb = nArg>=2 ? azArg[1] : "main";
4983 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00004984 open_db(p, 0);
4985 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00004986 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00004987 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
4988 return 1;
4989 }
4990 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
4991 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004992 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00004993 return 1;
4994 }
4995 i = get2byteInt(aHdr+16);
4996 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00004997 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4998 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4999 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5000 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00005001 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00005002 int ofst = aField[i].ofst;
5003 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00005004 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00005005 switch( ofst ){
5006 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00005007 if( val==1 ) raw_printf(p->out, " (utf8)");
5008 if( val==2 ) raw_printf(p->out, " (utf16le)");
5009 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00005010 }
5011 }
mistachkinaae280e2015-12-31 19:06:24 +00005012 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00005013 }
drh0e55db12015-02-06 14:51:13 +00005014 if( zDb==0 ){
5015 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
5016 }else if( strcmp(zDb,"temp")==0 ){
5017 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
5018 }else{
5019 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
5020 }
drhf5ed7ad2015-06-15 14:43:25 +00005021 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00005022 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5023 int val = db_int(p, zSql);
5024 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00005025 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00005026 }
5027 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00005028 return 0;
5029}
5030
dand95bb392015-09-30 11:19:05 +00005031/*
5032** Print the current sqlite3_errmsg() value to stderr and return 1.
5033*/
5034static int shellDatabaseError(sqlite3 *db){
5035 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00005036 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00005037 return 1;
5038}
5039
5040/*
5041** Print an out-of-memory message to stderr and return 1.
5042*/
5043static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00005044 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00005045 return 1;
5046}
drhf7502f02015-02-06 14:19:44 +00005047
drh2db82112016-09-15 21:35:24 +00005048/*
5049** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
5050** if they match and FALSE (0) if they do not match.
5051**
5052** Globbing rules:
5053**
5054** '*' Matches any sequence of zero or more characters.
5055**
5056** '?' Matches exactly one character.
5057**
5058** [...] Matches one character from the enclosed list of
5059** characters.
5060**
5061** [^...] Matches one character not in the enclosed list.
5062**
5063** '#' Matches any sequence of one or more digits with an
5064** optional + or - sign in front
5065**
5066** ' ' Any span of whitespace matches any other span of
5067** whitespace.
5068**
5069** Extra whitespace at the end of z[] is ignored.
5070*/
5071static int testcase_glob(const char *zGlob, const char *z){
5072 int c, c2;
5073 int invert;
5074 int seen;
5075
5076 while( (c = (*(zGlob++)))!=0 ){
5077 if( IsSpace(c) ){
5078 if( !IsSpace(*z) ) return 0;
5079 while( IsSpace(*zGlob) ) zGlob++;
5080 while( IsSpace(*z) ) z++;
5081 }else if( c=='*' ){
5082 while( (c=(*(zGlob++))) == '*' || c=='?' ){
5083 if( c=='?' && (*(z++))==0 ) return 0;
5084 }
5085 if( c==0 ){
5086 return 1;
5087 }else if( c=='[' ){
5088 while( *z && testcase_glob(zGlob-1,z)==0 ){
5089 z++;
5090 }
5091 return (*z)!=0;
5092 }
5093 while( (c2 = (*(z++)))!=0 ){
5094 while( c2!=c ){
5095 c2 = *(z++);
5096 if( c2==0 ) return 0;
5097 }
5098 if( testcase_glob(zGlob,z) ) return 1;
5099 }
5100 return 0;
5101 }else if( c=='?' ){
5102 if( (*(z++))==0 ) return 0;
5103 }else if( c=='[' ){
5104 int prior_c = 0;
5105 seen = 0;
5106 invert = 0;
5107 c = *(z++);
5108 if( c==0 ) return 0;
5109 c2 = *(zGlob++);
5110 if( c2=='^' ){
5111 invert = 1;
5112 c2 = *(zGlob++);
5113 }
5114 if( c2==']' ){
5115 if( c==']' ) seen = 1;
5116 c2 = *(zGlob++);
5117 }
5118 while( c2 && c2!=']' ){
5119 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5120 c2 = *(zGlob++);
5121 if( c>=prior_c && c<=c2 ) seen = 1;
5122 prior_c = 0;
5123 }else{
5124 if( c==c2 ){
5125 seen = 1;
5126 }
5127 prior_c = c2;
5128 }
5129 c2 = *(zGlob++);
5130 }
5131 if( c2==0 || (seen ^ invert)==0 ) return 0;
5132 }else if( c=='#' ){
5133 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5134 if( !IsDigit(z[0]) ) return 0;
5135 z++;
5136 while( IsDigit(z[0]) ){ z++; }
5137 }else{
5138 if( c!=(*(z++)) ) return 0;
5139 }
5140 }
5141 while( IsSpace(*z) ){ z++; }
5142 return *z==0;
5143}
drh2db82112016-09-15 21:35:24 +00005144
5145
drhf7502f02015-02-06 14:19:44 +00005146/*
drh4926fec2016-04-13 15:33:42 +00005147** Compare the string as a command-line option with either one or two
5148** initial "-" characters.
5149*/
5150static int optionMatch(const char *zStr, const char *zOpt){
5151 if( zStr[0]!='-' ) return 0;
5152 zStr++;
5153 if( zStr[0]=='-' ) zStr++;
5154 return strcmp(zStr, zOpt)==0;
5155}
5156
5157/*
drhcd0509e2016-09-16 00:26:08 +00005158** Delete a file.
5159*/
5160int shellDeleteFile(const char *zFilename){
5161 int rc;
5162#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00005163 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00005164 rc = _wunlink(z);
5165 sqlite3_free(z);
5166#else
5167 rc = unlink(zFilename);
5168#endif
5169 return rc;
5170}
5171
dan35ac58e2016-12-14 19:28:27 +00005172
dan35ac58e2016-12-14 19:28:27 +00005173/*
dandd9e0be2016-12-16 16:44:27 +00005174** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00005175** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00005176** called with four arguments - the parent table name, the parent column name,
5177** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00005178**
5179** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
5180**
5181** If either of the named tables or columns do not exist, this function
mistachkine16a3502017-05-29 03:48:13 +00005182** returns an empty string. An empty string is also returned if both tables
dan35ac58e2016-12-14 19:28:27 +00005183** and columns exist but have the same default collation sequence. Or,
5184** if both exist but the default collation sequences are different, this
5185** function returns the string " COLLATE <parent-collation>", where
5186** <parent-collation> is the default collation sequence of the parent column.
5187*/
5188static void shellFkeyCollateClause(
mistachkine16a3502017-05-29 03:48:13 +00005189 sqlite3_context *pCtx,
5190 int nVal,
dan35ac58e2016-12-14 19:28:27 +00005191 sqlite3_value **apVal
5192){
5193 sqlite3 *db = sqlite3_context_db_handle(pCtx);
5194 const char *zParent;
5195 const char *zParentCol;
5196 const char *zParentSeq;
5197 const char *zChild;
5198 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00005199 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00005200 int rc;
mistachkine16a3502017-05-29 03:48:13 +00005201
dan35ac58e2016-12-14 19:28:27 +00005202 assert( nVal==4 );
5203 zParent = (const char*)sqlite3_value_text(apVal[0]);
5204 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
5205 zChild = (const char*)sqlite3_value_text(apVal[2]);
5206 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
5207
5208 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
5209 rc = sqlite3_table_column_metadata(
5210 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
5211 );
5212 if( rc==SQLITE_OK ){
5213 rc = sqlite3_table_column_metadata(
5214 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
5215 );
5216 }
5217
5218 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
5219 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
5220 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
5221 sqlite3_free(z);
5222 }
5223}
5224
5225
5226/*
dan3c7ebeb2016-12-16 17:28:56 +00005227** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00005228*/
dan3c7ebeb2016-12-16 17:28:56 +00005229static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00005230 ShellState *pState, /* Current shell tool state */
5231 char **azArg, /* Array of arguments passed to dot command */
5232 int nArg /* Number of entries in azArg[] */
5233){
dandd9e0be2016-12-16 16:44:27 +00005234 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
5235 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00005236 int bVerbose = 0; /* If -verbose is present */
5237 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00005238 int i; /* To iterate through azArg[] */
5239 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
5240 int rc; /* Return code */
5241 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00005242
dandd9e0be2016-12-16 16:44:27 +00005243 /*
5244 ** This SELECT statement returns one row for each foreign key constraint
5245 ** in the schema of the main database. The column values are:
5246 **
5247 ** 0. The text of an SQL statement similar to:
5248 **
5249 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
5250 **
5251 ** This is the same SELECT that the foreign keys implementation needs
5252 ** to run internally on child tables. If there is an index that can
5253 ** be used to optimize this query, then it can also be used by the FK
5254 ** implementation to optimize DELETE or UPDATE statements on the parent
5255 ** table.
5256 **
5257 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
5258 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
5259 ** contains an index that can be used to optimize the query.
5260 **
5261 ** 2. Human readable text that describes the child table and columns. e.g.
5262 **
5263 ** "child_table(child_key1, child_key2)"
5264 **
5265 ** 3. Human readable text that describes the parent table and columns. e.g.
5266 **
5267 ** "parent_table(parent_key1, parent_key2)"
5268 **
5269 ** 4. A full CREATE INDEX statement for an index that could be used to
5270 ** optimize DELETE or UPDATE statements on the parent table. e.g.
5271 **
5272 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
5273 **
5274 ** 5. The name of the parent table.
5275 **
5276 ** These six values are used by the C logic below to generate the report.
5277 */
dan35ac58e2016-12-14 19:28:27 +00005278 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00005279 "SELECT "
5280 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
5281 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
dan50da9382017-04-06 12:06:56 +00005282 " || fkey_collate_clause("
5283 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00005284 ", "
dandd9e0be2016-12-16 16:44:27 +00005285 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00005286 " || group_concat('*=?', ' AND ') || ')'"
5287 ", "
dandd9e0be2016-12-16 16:44:27 +00005288 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00005289 ", "
dan50da9382017-04-06 12:06:56 +00005290 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
dan35ac58e2016-12-14 19:28:27 +00005291 ", "
dandd9e0be2016-12-16 16:44:27 +00005292 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
5293 " || ' ON ' || quote(s.name) || '('"
5294 " || group_concat(quote(f.[from]) ||"
dan50da9382017-04-06 12:06:56 +00005295 " fkey_collate_clause("
5296 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00005297 " || ');'"
danf9647b62016-12-15 06:01:40 +00005298 ", "
dandd9e0be2016-12-16 16:44:27 +00005299 " f.[table] "
dandd9e0be2016-12-16 16:44:27 +00005300 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
dan50da9382017-04-06 12:06:56 +00005301 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
dandd9e0be2016-12-16 16:44:27 +00005302 "GROUP BY s.name, f.id "
5303 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00005304 ;
dan54e2efc2017-04-06 14:56:26 +00005305 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
dan35ac58e2016-12-14 19:28:27 +00005306
dan3c7ebeb2016-12-16 17:28:56 +00005307 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00005308 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00005309 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
5310 bVerbose = 1;
5311 }
5312 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
5313 bGroupByParent = 1;
5314 zIndent = " ";
5315 }
5316 else{
dan3c7ebeb2016-12-16 17:28:56 +00005317 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
5318 azArg[0], azArg[1]
5319 );
danf9647b62016-12-15 06:01:40 +00005320 return SQLITE_ERROR;
5321 }
dan35ac58e2016-12-14 19:28:27 +00005322 }
mistachkine16a3502017-05-29 03:48:13 +00005323
dan35ac58e2016-12-14 19:28:27 +00005324 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00005325 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
5326 0, shellFkeyCollateClause, 0, 0
5327 );
dan35ac58e2016-12-14 19:28:27 +00005328
5329
5330 if( rc==SQLITE_OK ){
5331 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
5332 }
danf9647b62016-12-15 06:01:40 +00005333 if( rc==SQLITE_OK ){
5334 sqlite3_bind_int(pSql, 1, bGroupByParent);
5335 }
dan35ac58e2016-12-14 19:28:27 +00005336
5337 if( rc==SQLITE_OK ){
5338 int rc2;
danf9647b62016-12-15 06:01:40 +00005339 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00005340 while( SQLITE_ROW==sqlite3_step(pSql) ){
5341 int res = -1;
5342 sqlite3_stmt *pExplain = 0;
5343 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
5344 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
5345 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
5346 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
5347 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00005348 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00005349
5350 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
5351 if( rc!=SQLITE_OK ) break;
5352 if( SQLITE_ROW==sqlite3_step(pExplain) ){
5353 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
dan54e2efc2017-04-06 14:56:26 +00005354 res = (
5355 0==sqlite3_strglob(zGlob, zPlan)
5356 || 0==sqlite3_strglob(zGlobIPK, zPlan)
5357 );
dan35ac58e2016-12-14 19:28:27 +00005358 }
5359 rc = sqlite3_finalize(pExplain);
5360 if( rc!=SQLITE_OK ) break;
5361
5362 if( res<0 ){
5363 raw_printf(stderr, "Error: internal error");
5364 break;
danf9647b62016-12-15 06:01:40 +00005365 }else{
mistachkine16a3502017-05-29 03:48:13 +00005366 if( bGroupByParent
danf9647b62016-12-15 06:01:40 +00005367 && (bVerbose || res==0)
mistachkine16a3502017-05-29 03:48:13 +00005368 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
danf9647b62016-12-15 06:01:40 +00005369 ){
5370 raw_printf(out, "-- Parent table %s\n", zParent);
5371 sqlite3_free(zPrev);
5372 zPrev = sqlite3_mprintf("%s", zParent);
5373 }
5374
5375 if( res==0 ){
5376 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
5377 }else if( bVerbose ){
mistachkine16a3502017-05-29 03:48:13 +00005378 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
danf9647b62016-12-15 06:01:40 +00005379 zIndent, zFrom, zTarget
5380 );
5381 }
dan35ac58e2016-12-14 19:28:27 +00005382 }
5383 }
danf9647b62016-12-15 06:01:40 +00005384 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00005385
5386 if( rc!=SQLITE_OK ){
5387 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5388 }
5389
5390 rc2 = sqlite3_finalize(pSql);
5391 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
5392 rc = rc2;
5393 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5394 }
5395 }else{
5396 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5397 }
5398
5399 return rc;
5400}
dan3c7ebeb2016-12-16 17:28:56 +00005401
dan35ac58e2016-12-14 19:28:27 +00005402/*
dan3c7ebeb2016-12-16 17:28:56 +00005403** Implementation of ".lint" dot command.
5404*/
5405static int lintDotCommand(
5406 ShellState *pState, /* Current shell tool state */
5407 char **azArg, /* Array of arguments passed to dot command */
5408 int nArg /* Number of entries in azArg[] */
5409){
5410 int n;
drh96ada592016-12-29 19:48:46 +00005411 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00005412 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
5413 return lintFkeyIndexes(pState, azArg, nArg);
5414
5415 usage:
5416 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
5417 raw_printf(stderr, "Where sub-commands are:\n");
5418 raw_printf(stderr, " fkey-indexes\n");
5419 return SQLITE_ERROR;
5420}
5421
dan35ac58e2016-12-14 19:28:27 +00005422
drhcd0509e2016-09-16 00:26:08 +00005423/*
drh75897232000-05-29 14:26:00 +00005424** If an input line begins with "." then invoke this routine to
5425** process that line.
drh67505e72002-04-19 12:34:06 +00005426**
drh47ad6842006-11-08 12:25:42 +00005427** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00005428*/
drhdcd87a92014-08-18 13:45:42 +00005429static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00005430 int h = 1;
drh75897232000-05-29 14:26:00 +00005431 int nArg = 0;
5432 int n, c;
drh67505e72002-04-19 12:34:06 +00005433 int rc = 0;
drh75897232000-05-29 14:26:00 +00005434 char *azArg[50];
5435
5436 /* Parse the input line into tokens.
5437 */
mistachkin8e189222015-04-19 21:43:16 +00005438 while( zLine[h] && nArg<ArraySize(azArg) ){
5439 while( IsSpace(zLine[h]) ){ h++; }
5440 if( zLine[h]==0 ) break;
5441 if( zLine[h]=='\'' || zLine[h]=='"' ){
5442 int delim = zLine[h++];
5443 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00005444 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00005445 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00005446 h++;
drh4c56b992013-06-27 13:26:55 +00005447 }
mistachkin8e189222015-04-19 21:43:16 +00005448 if( zLine[h]==delim ){
5449 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00005450 }
drhfeac5f82004-08-01 00:10:45 +00005451 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00005452 }else{
mistachkin8e189222015-04-19 21:43:16 +00005453 azArg[nArg++] = &zLine[h];
5454 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
5455 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00005456 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00005457 }
5458 }
5459
5460 /* Process the input line.
5461 */
shane9bd1b442009-10-23 01:27:39 +00005462 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00005463 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00005464 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00005465
drha0daa752016-09-16 11:53:10 +00005466#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00005467 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
5468 if( nArg!=2 ){
5469 raw_printf(stderr, "Usage: .auth ON|OFF\n");
5470 rc = 1;
5471 goto meta_command_exit;
5472 }
5473 open_db(p, 0);
5474 if( booleanValue(azArg[1]) ){
5475 sqlite3_set_authorizer(p->db, shellAuth, p);
5476 }else{
5477 sqlite3_set_authorizer(p->db, 0, 0);
5478 }
5479 }else
drha0daa752016-09-16 11:53:10 +00005480#endif
drhde613c62016-04-04 17:23:10 +00005481
drh5c7976f2014-02-10 19:59:27 +00005482 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
5483 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
5484 ){
drhbc46f022013-01-23 18:53:23 +00005485 const char *zDestFile = 0;
5486 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00005487 sqlite3 *pDest;
5488 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00005489 int j;
5490 for(j=1; j<nArg; j++){
5491 const char *z = azArg[j];
5492 if( z[0]=='-' ){
5493 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00005494 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00005495 {
mistachkinaae280e2015-12-31 19:06:24 +00005496 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00005497 return 1;
5498 }
5499 }else if( zDestFile==0 ){
5500 zDestFile = azArg[j];
5501 }else if( zDb==0 ){
5502 zDb = zDestFile;
5503 zDestFile = azArg[j];
5504 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005505 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00005506 return 1;
5507 }
drh9ff849f2009-02-04 20:55:57 +00005508 }
drhbc46f022013-01-23 18:53:23 +00005509 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005510 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00005511 return 1;
5512 }
5513 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00005514 rc = sqlite3_open(zDestFile, &pDest);
5515 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005516 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00005517 sqlite3_close(pDest);
5518 return 1;
5519 }
drh05782482013-10-24 15:20:20 +00005520 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005521 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
5522 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005523 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00005524 sqlite3_close(pDest);
5525 return 1;
5526 }
5527 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
5528 sqlite3_backup_finish(pBackup);
5529 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005530 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00005531 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005532 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00005533 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005534 }
5535 sqlite3_close(pDest);
5536 }else
5537
drhc2ce0be2014-05-29 12:36:14 +00005538 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
5539 if( nArg==2 ){
5540 bail_on_error = booleanValue(azArg[1]);
5541 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005542 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005543 rc = 1;
5544 }
drhc49f44e2006-10-26 18:15:42 +00005545 }else
5546
mistachkinf21979d2015-01-18 05:35:01 +00005547 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
5548 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00005549 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00005550 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00005551 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00005552 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00005553 }
mistachkinf21979d2015-01-18 05:35:01 +00005554 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005555 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00005556 rc = 1;
5557 }
5558 }else
5559
drh453ca042017-05-22 18:00:34 +00005560 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
5561 if( nArg==2 ){
5562#if defined(_WIN32) || defined(WIN32)
5563 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
5564 rc = !SetCurrentDirectoryW(z);
5565 sqlite3_free(z);
5566#else
5567 rc = chdir(azArg[1]);
5568#endif
5569 if( rc ){
5570 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
5571 rc = 1;
5572 }
5573 }else{
5574 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
5575 rc = 1;
5576 }
5577 }else
5578
drhd8621b92012-04-17 09:09:33 +00005579 /* The undocumented ".breakpoint" command causes a call to the no-op
5580 ** routine named test_breakpoint().
5581 */
5582 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
5583 test_breakpoint();
5584 }else
5585
drhdf12f1c2015-12-07 21:46:19 +00005586 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
5587 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00005588 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
drhdf12f1c2015-12-07 21:46:19 +00005589 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005590 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00005591 rc = 1;
5592 }
5593 }else
5594
drh2db82112016-09-15 21:35:24 +00005595 /* Cancel output redirection, if it is currently set (by .testcase)
5596 ** Then read the content of the testcase-out.txt file and compare against
5597 ** azArg[1]. If there are differences, report an error and exit.
5598 */
5599 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
5600 char *zRes = 0;
5601 output_reset(p);
5602 if( nArg!=2 ){
5603 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00005604 rc = 2;
dan11da0022016-12-17 08:18:05 +00005605 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00005606 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
5607 rc = 2;
5608 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00005609 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00005610 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
5611 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00005612 rc = 2;
drh760c8162016-09-16 02:52:22 +00005613 }else{
mistachkin8145fc62016-09-16 20:39:21 +00005614 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00005615 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00005616 }
5617 sqlite3_free(zRes);
5618 }else
drh2db82112016-09-15 21:35:24 +00005619
drhc2ce0be2014-05-29 12:36:14 +00005620 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
5621 if( nArg==2 ){
5622 tryToClone(p, azArg[1]);
5623 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005624 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005625 rc = 1;
5626 }
mistachkine31ae902014-02-06 01:15:29 +00005627 }else
5628
drhc2ce0be2014-05-29 12:36:14 +00005629 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005630 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00005631 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005632 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00005633 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00005634 data.showHeader = 0;
5635 data.cMode = data.mode = MODE_List;
5636 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00005637 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00005638 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
5639 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00005640 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005641 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005642 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005643 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00005644 }
5645 }else
5646
drh0e55db12015-02-06 14:51:13 +00005647 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
5648 rc = shell_dbinfo_command(p, nArg, azArg);
5649 }else
5650
drhc2ce0be2014-05-29 12:36:14 +00005651 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00005652 const char *zLike = 0;
5653 int i;
drh72507d42017-04-08 00:55:13 +00005654 int savedShowHeader = p->showHeader;
drhdbc26722017-07-10 18:04:41 +00005655 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
drhe611f142017-03-08 11:44:00 +00005656 for(i=1; i<nArg; i++){
5657 if( azArg[i][0]=='-' ){
5658 const char *z = azArg[i]+1;
5659 if( z[0]=='-' ) z++;
5660 if( strcmp(z,"preserve-rowids")==0 ){
drh34ad36b2017-03-25 18:15:05 +00005661#ifdef SQLITE_OMIT_VIRTUALTABLE
5662 raw_printf(stderr, "The --preserve-rowids option is not compatible"
5663 " with SQLITE_OMIT_VIRTUALTABLE\n");
5664 rc = 1;
5665 goto meta_command_exit;
5666#else
drhe6e1d122017-03-09 13:50:49 +00005667 ShellSetFlag(p, SHFLG_PreserveRowid);
drh34ad36b2017-03-25 18:15:05 +00005668#endif
drhe611f142017-03-08 11:44:00 +00005669 }else
drhdbc26722017-07-10 18:04:41 +00005670 if( strcmp(z,"newlines")==0 ){
5671 ShellSetFlag(p, SHFLG_Newlines);
5672 }else
drhe611f142017-03-08 11:44:00 +00005673 {
5674 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
5675 rc = 1;
5676 goto meta_command_exit;
5677 }
5678 }else if( zLike ){
drhdbc26722017-07-10 18:04:41 +00005679 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
5680 "?--newlines? ?LIKE-PATTERN?\n");
drhe611f142017-03-08 11:44:00 +00005681 rc = 1;
5682 goto meta_command_exit;
5683 }else{
5684 zLike = azArg[i];
5685 }
5686 }
drh05782482013-10-24 15:20:20 +00005687 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00005688 /* When playing back a "dump", the content might appear in an order
5689 ** which causes immediate foreign key constraints to be violated.
5690 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00005691 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
5692 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00005693 p->writableSchema = 0;
drh72507d42017-04-08 00:55:13 +00005694 p->showHeader = 0;
drhe611f142017-03-08 11:44:00 +00005695 /* Set writable_schema=ON since doing so forces SQLite to initialize
5696 ** as much of the schema as it can even if the sqlite_master table is
5697 ** corrupt. */
drh56197952011-10-13 16:30:13 +00005698 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00005699 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00005700 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00005701 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00005702 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00005703 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00005704 );
mistachkin1fe36bb2016-04-04 02:16:44 +00005705 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00005706 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00005707 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00005708 );
drh2f464a02011-10-13 00:41:49 +00005709 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00005710 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00005711 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00005712 );
drh4c653a02000-06-07 01:27:47 +00005713 }else{
drhe611f142017-03-08 11:44:00 +00005714 char *zSql;
5715 zSql = sqlite3_mprintf(
5716 "SELECT name, type, sql FROM sqlite_master "
5717 "WHERE tbl_name LIKE %Q AND type=='table'"
5718 " AND sql NOT NULL", zLike);
5719 run_schema_dump_query(p,zSql);
5720 sqlite3_free(zSql);
5721 zSql = sqlite3_mprintf(
5722 "SELECT sql FROM sqlite_master "
5723 "WHERE sql NOT NULL"
5724 " AND type IN ('index','trigger','view')"
5725 " AND tbl_name LIKE %Q", zLike);
5726 run_table_dump_query(p, zSql, 0);
5727 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00005728 }
drh45e29d82006-11-20 16:21:10 +00005729 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00005730 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00005731 p->writableSchema = 0;
5732 }
drh56197952011-10-13 16:30:13 +00005733 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5734 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00005735 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh72507d42017-04-08 00:55:13 +00005736 p->showHeader = savedShowHeader;
drh4c653a02000-06-07 01:27:47 +00005737 }else
drh75897232000-05-29 14:26:00 +00005738
drhc2ce0be2014-05-29 12:36:14 +00005739 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
5740 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00005741 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005742 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005743 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005744 rc = 1;
5745 }
drhdaffd0e2001-04-11 14:28:42 +00005746 }else
5747
drhc2ce0be2014-05-29 12:36:14 +00005748 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
5749 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00005750 if( strcmp(azArg[1],"full")==0 ){
5751 p->autoEQP = 2;
5752 }else{
5753 p->autoEQP = booleanValue(azArg[1]);
5754 }
drhc2ce0be2014-05-29 12:36:14 +00005755 }else{
drheacd29d2016-04-15 15:03:27 +00005756 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00005757 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00005758 }
drhefbf3b12014-02-28 20:47:24 +00005759 }else
5760
drhd3ac7d92013-01-25 18:33:43 +00005761 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00005762 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00005763 rc = 2;
drh75897232000-05-29 14:26:00 +00005764 }else
5765
drhc31b79d2017-06-29 21:11:27 +00005766 /* The ".explain" command is automatic now. It is largely pointless. It
5767 ** retained purely for backwards compatibility */
drhc2ce0be2014-05-29 12:36:14 +00005768 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00005769 int val = 1;
5770 if( nArg>=2 ){
5771 if( strcmp(azArg[1],"auto")==0 ){
5772 val = 99;
5773 }else{
5774 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00005775 }
drh700c2522016-02-09 18:39:25 +00005776 }
5777 if( val==1 && p->mode!=MODE_Explain ){
5778 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00005779 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00005780 p->autoExplain = 0;
5781 }else if( val==0 ){
5782 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5783 p->autoExplain = 0;
5784 }else if( val==99 ){
5785 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5786 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005787 }
drh75897232000-05-29 14:26:00 +00005788 }else
5789
drhc1971542014-06-23 23:28:13 +00005790 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005791 ShellState data;
drhc1971542014-06-23 23:28:13 +00005792 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00005793 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00005794 memcpy(&data, p, sizeof(data));
5795 data.showHeader = 0;
5796 data.cMode = data.mode = MODE_Semi;
5797 if( nArg==2 && optionMatch(azArg[1], "indent") ){
5798 data.cMode = data.mode = MODE_Pretty;
5799 nArg = 1;
5800 }
drhc1971542014-06-23 23:28:13 +00005801 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00005802 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00005803 rc = 1;
5804 goto meta_command_exit;
5805 }
5806 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00005807 rc = sqlite3_exec(p->db,
5808 "SELECT sql FROM"
5809 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
5810 " FROM sqlite_master UNION ALL"
5811 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005812 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00005813 "ORDER BY rowid",
5814 callback, &data, &zErrMsg
5815 );
drh56f674c2014-07-18 14:43:29 +00005816 if( rc==SQLITE_OK ){
5817 sqlite3_stmt *pStmt;
5818 rc = sqlite3_prepare_v2(p->db,
5819 "SELECT rowid FROM sqlite_master"
5820 " WHERE name GLOB 'sqlite_stat[134]'",
5821 -1, &pStmt, 0);
5822 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
5823 sqlite3_finalize(pStmt);
5824 }
5825 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005826 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00005827 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005828 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00005829 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
5830 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00005831 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00005832 data.zDestTable = "sqlite_stat1";
5833 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
5834 shell_callback, &data,&zErrMsg);
5835 data.zDestTable = "sqlite_stat3";
5836 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
5837 shell_callback, &data,&zErrMsg);
5838 data.zDestTable = "sqlite_stat4";
5839 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
5840 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00005841 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00005842 }
drhc1971542014-06-23 23:28:13 +00005843 }else
5844
drhc2ce0be2014-05-29 12:36:14 +00005845 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
5846 if( nArg==2 ){
5847 p->showHeader = booleanValue(azArg[1]);
5848 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005849 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005850 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00005851 }
drh75897232000-05-29 14:26:00 +00005852 }else
5853
drhc2ce0be2014-05-29 12:36:14 +00005854 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005855 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00005856 }else
5857
5858 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00005859 char *zTable; /* Insert data into this table */
5860 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00005861 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00005862 int nCol; /* Number of columns in the table */
5863 int nByte; /* Number of bytes in an SQL string */
5864 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00005865 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00005866 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00005867 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00005868 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00005869 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
5870 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00005871
drhc2ce0be2014-05-29 12:36:14 +00005872 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005873 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00005874 goto meta_command_exit;
5875 }
drh01f37542014-05-31 15:43:33 +00005876 zFile = azArg[1];
5877 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00005878 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00005879 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00005880 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00005881 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00005882 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005883 raw_printf(stderr,
5884 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00005885 return 1;
drhfeac5f82004-08-01 00:10:45 +00005886 }
drhdb95f682013-06-26 22:46:00 +00005887 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005888 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00005889 " for import\n");
5890 return 1;
5891 }
mistachkin636bf9f2014-07-19 20:15:16 +00005892 nSep = strlen30(p->rowSeparator);
5893 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005894 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005895 return 1;
5896 }
mistachkine0d68852014-12-11 03:12:33 +00005897 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
5898 /* When importing CSV (only), if the row separator is set to the
5899 ** default output row separator, change it to the default input
5900 ** row separator. This avoids having to maintain different input
5901 ** and output row separators. */
5902 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
5903 nSep = strlen30(p->rowSeparator);
5904 }
mistachkin636bf9f2014-07-19 20:15:16 +00005905 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005906 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00005907 " for import\n");
5908 return 1;
5909 }
5910 sCtx.zFile = zFile;
5911 sCtx.nLine = 1;
5912 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005913#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005914 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005915 return 1;
5916#else
mistachkin636bf9f2014-07-19 20:15:16 +00005917 sCtx.in = popen(sCtx.zFile+1, "r");
5918 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00005919 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00005920#endif
drh5bde8162013-06-27 14:07:53 +00005921 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00005922 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00005923 xCloser = fclose;
5924 }
mistachkin636bf9f2014-07-19 20:15:16 +00005925 if( p->mode==MODE_Ascii ){
5926 xRead = ascii_read_one_field;
5927 }else{
5928 xRead = csv_read_one_field;
5929 }
5930 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005931 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00005932 return 1;
5933 }
mistachkin636bf9f2014-07-19 20:15:16 +00005934 sCtx.cColSep = p->colSeparator[0];
5935 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00005936 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00005937 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005938 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005939 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005940 return 1;
5941 }
drh4f21c4a2008-12-10 22:15:00 +00005942 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00005943 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00005944 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00005945 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00005946 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
5947 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00005948 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00005949 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00005950 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00005951 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00005952 }
drh5bde8162013-06-27 14:07:53 +00005953 if( cSep=='(' ){
5954 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00005955 sqlite3_free(sCtx.z);
5956 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00005957 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00005958 return 1;
5959 }
drhdb95f682013-06-26 22:46:00 +00005960 zCreate = sqlite3_mprintf("%z\n)", zCreate);
5961 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
5962 sqlite3_free(zCreate);
5963 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00005964 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00005965 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00005966 sqlite3_free(sCtx.z);
5967 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00005968 return 1;
5969 }
drhc7181902014-02-27 15:04:13 +00005970 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00005971 }
drhfeac5f82004-08-01 00:10:45 +00005972 sqlite3_free(zSql);
5973 if( rc ){
shane916f9612009-10-23 00:37:15 +00005974 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00005975 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00005976 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005977 return 1;
drhfeac5f82004-08-01 00:10:45 +00005978 }
shane916f9612009-10-23 00:37:15 +00005979 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00005980 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00005981 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00005982 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00005983 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00005984 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005985 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005986 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005987 return 1;
5988 }
drhdb95f682013-06-26 22:46:00 +00005989 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00005990 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00005991 for(i=1; i<nCol; i++){
5992 zSql[j++] = ',';
5993 zSql[j++] = '?';
5994 }
5995 zSql[j++] = ')';
5996 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00005997 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00005998 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00005999 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006000 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00006001 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00006002 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00006003 return 1;
drhfeac5f82004-08-01 00:10:45 +00006004 }
mistachkin8e189222015-04-19 21:43:16 +00006005 needCommit = sqlite3_get_autocommit(p->db);
6006 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00006007 do{
mistachkin636bf9f2014-07-19 20:15:16 +00006008 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00006009 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00006010 char *z = xRead(&sCtx);
6011 /*
6012 ** Did we reach end-of-file before finding any columns?
6013 ** If so, stop instead of NULL filling the remaining columns.
6014 */
drhdb95f682013-06-26 22:46:00 +00006015 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00006016 /*
6017 ** Did we reach end-of-file OR end-of-line before finding any
6018 ** columns in ASCII mode? If so, stop instead of NULL filling
6019 ** the remaining columns.
6020 */
6021 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00006022 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00006023 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00006024 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00006025 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00006026 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00006027 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00006028 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00006029 }
drhfeac5f82004-08-01 00:10:45 +00006030 }
mistachkin636bf9f2014-07-19 20:15:16 +00006031 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00006032 do{
mistachkin636bf9f2014-07-19 20:15:16 +00006033 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00006034 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00006035 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00006036 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00006037 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00006038 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00006039 }
drhdb95f682013-06-26 22:46:00 +00006040 if( i>=nCol ){
6041 sqlite3_step(pStmt);
6042 rc = sqlite3_reset(pStmt);
6043 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006044 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
6045 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00006046 }
6047 }
mistachkin636bf9f2014-07-19 20:15:16 +00006048 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00006049
mistachkin636bf9f2014-07-19 20:15:16 +00006050 xCloser(sCtx.in);
6051 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00006052 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00006053 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00006054 }else
6055
drhd12602a2016-12-07 15:49:02 +00006056#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00006057 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
6058 char *zSql;
6059 char *zCollist = 0;
6060 sqlite3_stmt *pStmt;
6061 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00006062 int i;
drh16eb5942016-11-03 13:01:38 +00006063 if( nArg!=3 ){
6064 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
6065 rc = 1;
6066 goto meta_command_exit;
6067 }
6068 open_db(p, 0);
6069 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
6070 " WHERE name='%q' AND type='index'", azArg[1]);
6071 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6072 sqlite3_free(zSql);
6073 if( sqlite3_step(pStmt)==SQLITE_ROW ){
6074 tnum = sqlite3_column_int(pStmt, 0);
6075 }
6076 sqlite3_finalize(pStmt);
6077 if( tnum==0 ){
6078 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
6079 rc = 1;
6080 goto meta_command_exit;
6081 }
6082 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
6083 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6084 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00006085 i = 0;
drh16eb5942016-11-03 13:01:38 +00006086 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00006087 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00006088 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00006089 i++;
6090 if( zCol==0 ){
6091 if( sqlite3_column_int(pStmt,1)==-1 ){
6092 zCol = "_ROWID_";
6093 }else{
6094 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
6095 zCol = zLabel;
6096 }
6097 }
drh16eb5942016-11-03 13:01:38 +00006098 if( zCollist==0 ){
6099 zCollist = sqlite3_mprintf("\"%w\"", zCol);
6100 }else{
6101 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
6102 }
6103 }
6104 sqlite3_finalize(pStmt);
6105 zSql = sqlite3_mprintf(
6106 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
6107 azArg[2], zCollist, zCollist);
6108 sqlite3_free(zCollist);
6109 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
6110 if( rc==SQLITE_OK ){
6111 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
6112 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
6113 if( rc ){
6114 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
6115 }else{
6116 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00006117 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00006118 "WARNING: writing to an imposter table will corrupt the index!\n"
6119 );
6120 }
6121 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00006122 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00006123 rc = 1;
6124 }
6125 sqlite3_free(zSql);
6126 }else
6127#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
6128
drhae5e4452007-05-03 17:18:36 +00006129#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00006130 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00006131 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00006132 if( iotrace && iotrace!=stdout ) fclose(iotrace);
6133 iotrace = 0;
6134 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00006135 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00006136 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00006137 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00006138 iotrace = stdout;
6139 }else{
6140 iotrace = fopen(azArg[1], "w");
6141 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006142 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00006143 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00006144 rc = 1;
drhb0603412007-02-28 04:47:26 +00006145 }else{
mlcreech3a00f902008-03-04 17:45:01 +00006146 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00006147 }
6148 }
6149 }else
drhae5e4452007-05-03 17:18:36 +00006150#endif
drh16eb5942016-11-03 13:01:38 +00006151
drh1a513372015-05-02 17:40:23 +00006152 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
6153 static const struct {
6154 const char *zLimitName; /* Name of a limit */
6155 int limitCode; /* Integer code for that limit */
6156 } aLimit[] = {
6157 { "length", SQLITE_LIMIT_LENGTH },
6158 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
6159 { "column", SQLITE_LIMIT_COLUMN },
6160 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
6161 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
6162 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
6163 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
6164 { "attached", SQLITE_LIMIT_ATTACHED },
6165 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
6166 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
6167 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
6168 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
6169 };
6170 int i, n2;
6171 open_db(p, 0);
6172 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00006173 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00006174 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00006175 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
6176 }
6177 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006178 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00006179 rc = 1;
6180 goto meta_command_exit;
6181 }else{
6182 int iLimit = -1;
6183 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006184 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00006185 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
6186 if( iLimit<0 ){
6187 iLimit = i;
6188 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006189 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00006190 rc = 1;
6191 goto meta_command_exit;
6192 }
6193 }
6194 }
6195 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006196 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00006197 "enter \".limits\" with no arguments for a list.\n",
6198 azArg[1]);
6199 rc = 1;
6200 goto meta_command_exit;
6201 }
6202 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00006203 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
6204 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00006205 }
6206 printf("%20s %d\n", aLimit[iLimit].zLimitName,
6207 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
6208 }
6209 }else
drhb0603412007-02-28 04:47:26 +00006210
dan3c7ebeb2016-12-16 17:28:56 +00006211 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00006212 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00006213 lintDotCommand(p, azArg, nArg);
6214 }else
6215
drh70df4fe2006-06-13 15:12:21 +00006216#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00006217 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00006218 const char *zFile, *zProc;
6219 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00006220 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006221 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00006222 rc = 1;
6223 goto meta_command_exit;
6224 }
drh1e397f82006-06-08 15:28:43 +00006225 zFile = azArg[1];
6226 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00006227 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00006228 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
6229 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006230 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00006231 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00006232 rc = 1;
drh1e397f82006-06-08 15:28:43 +00006233 }
6234 }else
drh70df4fe2006-06-13 15:12:21 +00006235#endif
drh1e397f82006-06-08 15:28:43 +00006236
drhc2ce0be2014-05-29 12:36:14 +00006237 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
6238 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006239 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00006240 rc = 1;
6241 }else{
6242 const char *zFile = azArg[1];
6243 output_file_close(p->pLog);
6244 p->pLog = output_file_open(zFile);
6245 }
drh127f9d72010-02-23 01:47:00 +00006246 }else
6247
drhc2ce0be2014-05-29 12:36:14 +00006248 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
6249 const char *zMode = nArg>=2 ? azArg[1] : "";
6250 int n2 = (int)strlen(zMode);
6251 int c2 = zMode[0];
6252 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006253 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00006254 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006255 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006256 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00006257 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006258 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006259 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00006260 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
6261 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006262 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006263 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00006264 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00006265 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00006266 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00006267 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006268 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00006269 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00006270 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00006271 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00006272 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00006273 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00006274 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00006275 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00006276 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00006277 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00006278 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
6279 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00006280 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
6281 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00006282 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
6283 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drha501f7d2017-06-29 21:33:25 +00006284 }else if( nArg==1 ){
6285 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
6286 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006287 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00006288 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00006289 rc = 1;
drh75897232000-05-29 14:26:00 +00006290 }
drh700c2522016-02-09 18:39:25 +00006291 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00006292 }else
6293
drhc2ce0be2014-05-29 12:36:14 +00006294 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
6295 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00006296 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
6297 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00006298 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006299 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00006300 rc = 1;
6301 }
6302 }else
6303
drh05782482013-10-24 15:20:20 +00006304 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00006305 char *zNewFilename; /* Name of the database file to open */
6306 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00006307 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00006308 /* Close the existing database */
6309 session_close_all(p);
6310 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00006311 p->db = 0;
dan21472212017-03-01 11:30:27 +00006312 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00006313 sqlite3_free(p->zFreeOnClose);
6314 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00006315 /* Check for command-line arguments */
6316 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
6317 const char *z = azArg[iName];
6318 if( optionMatch(z,"new") ){
6319 newFlag = 1;
6320 }else if( z[0]=='-' ){
6321 utf8_printf(stderr, "unknown option: %s\n", z);
6322 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00006323 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00006324 }
drhcd0509e2016-09-16 00:26:08 +00006325 }
6326 /* If a filename is specified, try to open it first */
6327 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
6328 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00006329 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00006330 p->zDbFilename = zNewFilename;
6331 open_db(p, 1);
6332 if( p->db==0 ){
6333 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
6334 sqlite3_free(zNewFilename);
6335 }else{
6336 p->zFreeOnClose = zNewFilename;
6337 }
6338 }
6339 if( p->db==0 ){
6340 /* As a fall-back open a TEMP database */
6341 p->zDbFilename = 0;
6342 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00006343 }
6344 }else
6345
drhc2ce0be2014-05-29 12:36:14 +00006346 if( c=='o'
6347 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
6348 ){
6349 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
6350 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006351 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00006352 rc = 1;
6353 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00006354 }
drhc2ce0be2014-05-29 12:36:14 +00006355 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
6356 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006357 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006358 rc = 1;
6359 goto meta_command_exit;
6360 }
6361 p->outCount = 2;
6362 }else{
6363 p->outCount = 0;
6364 }
6365 output_reset(p);
6366 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00006367#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00006368 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00006369 rc = 1;
6370 p->out = stdout;
6371#else
drhc2ce0be2014-05-29 12:36:14 +00006372 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00006373 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006374 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00006375 p->out = stdout;
6376 rc = 1;
6377 }else{
drhc2ce0be2014-05-29 12:36:14 +00006378 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00006379 }
drh8cd5b252015-03-02 22:06:43 +00006380#endif
drh75897232000-05-29 14:26:00 +00006381 }else{
drhc2ce0be2014-05-29 12:36:14 +00006382 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00006383 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006384 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006385 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00006386 }
drh75897232000-05-29 14:26:00 +00006387 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00006388 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00006389 } else {
drhc2ce0be2014-05-29 12:36:14 +00006390 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00006391 }
6392 }
6393 }else
6394
drh078b1fd2012-09-21 13:40:02 +00006395 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
6396 int i;
6397 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00006398 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00006399 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00006400 }
mistachkinaae280e2015-12-31 19:06:24 +00006401 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00006402 }else
6403
drhc2ce0be2014-05-29 12:36:14 +00006404 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00006405 if( nArg >= 2) {
6406 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
6407 }
6408 if( nArg >= 3) {
6409 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
6410 }
6411 }else
6412
drhc2ce0be2014-05-29 12:36:14 +00006413 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00006414 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00006415 }else
6416
drhc2ce0be2014-05-29 12:36:14 +00006417 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
6418 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00006419 if( nArg!=2 ){
6420 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006421 rc = 1;
6422 goto meta_command_exit;
6423 }
drh4e8142c2016-11-11 14:54:22 +00006424 alt = fopen(azArg[1], "rb");
6425 if( alt==0 ){
6426 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
6427 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00006428 }else{
drh4e8142c2016-11-11 14:54:22 +00006429 rc = process_input(p, alt);
6430 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00006431 }
6432 }else
6433
drhc2ce0be2014-05-29 12:36:14 +00006434 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00006435 const char *zSrcFile;
6436 const char *zDb;
6437 sqlite3 *pSrc;
6438 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00006439 int nTimeout = 0;
6440
drh9ff849f2009-02-04 20:55:57 +00006441 if( nArg==2 ){
6442 zSrcFile = azArg[1];
6443 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00006444 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00006445 zSrcFile = azArg[2];
6446 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00006447 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006448 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006449 rc = 1;
6450 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00006451 }
6452 rc = sqlite3_open(zSrcFile, &pSrc);
6453 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006454 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00006455 sqlite3_close(pSrc);
6456 return 1;
6457 }
drh05782482013-10-24 15:20:20 +00006458 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00006459 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
6460 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006461 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00006462 sqlite3_close(pSrc);
6463 return 1;
6464 }
drhdc2c4912009-02-04 22:46:47 +00006465 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
6466 || rc==SQLITE_BUSY ){
6467 if( rc==SQLITE_BUSY ){
6468 if( nTimeout++ >= 3 ) break;
6469 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00006470 }
6471 }
6472 sqlite3_backup_finish(pBackup);
6473 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00006474 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00006475 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00006476 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00006477 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00006478 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006479 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00006480 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00006481 }
6482 sqlite3_close(pSrc);
6483 }else
6484
dan8d1edb92014-11-05 09:07:28 +00006485
6486 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
6487 if( nArg==2 ){
6488 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00006489#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00006490 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00006491#endif
dan8d1edb92014-11-05 09:07:28 +00006492 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006493 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00006494 rc = 1;
6495 }
6496 }else
6497
drhc2ce0be2014-05-29 12:36:14 +00006498 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drh20c9c3f2017-06-15 12:21:09 +00006499 ShellText sSelect;
drhdcd87a92014-08-18 13:45:42 +00006500 ShellState data;
drh75897232000-05-29 14:26:00 +00006501 char *zErrMsg = 0;
drh20c9c3f2017-06-15 12:21:09 +00006502 const char *zDiv = 0;
6503 int iSchema = 0;
6504
drh05782482013-10-24 15:20:20 +00006505 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00006506 memcpy(&data, p, sizeof(data));
6507 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00006508 data.cMode = data.mode = MODE_Semi;
drh20c9c3f2017-06-15 12:21:09 +00006509 initText(&sSelect);
drh4926fec2016-04-13 15:33:42 +00006510 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
6511 data.cMode = data.mode = MODE_Pretty;
6512 nArg--;
6513 if( nArg==2 ) azArg[1] = azArg[2];
6514 }
6515 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00006516 int i;
drhf0693c82011-10-11 20:41:54 +00006517 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00006518 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00006519 char *new_argv[2], *new_colv[2];
6520 new_argv[0] = "CREATE TABLE sqlite_master (\n"
6521 " type text,\n"
6522 " name text,\n"
6523 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00006524 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00006525 " sql text\n"
6526 ")";
6527 new_argv[1] = 0;
6528 new_colv[0] = "sql";
6529 new_colv[1] = 0;
6530 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00006531 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00006532 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00006533 char *new_argv[2], *new_colv[2];
6534 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
6535 " type text,\n"
6536 " name text,\n"
6537 " tbl_name text,\n"
6538 " rootpage integer,\n"
6539 " sql text\n"
6540 ")";
6541 new_argv[1] = 0;
6542 new_colv[0] = "sql";
6543 new_colv[1] = 0;
6544 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00006545 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00006546 }else{
drh20c9c3f2017-06-15 12:21:09 +00006547 zDiv = "(";
drha18c5682000-10-08 22:20:57 +00006548 }
drhc2ce0be2014-05-29 12:36:14 +00006549 }else if( nArg==1 ){
drh20c9c3f2017-06-15 12:21:09 +00006550 zDiv = "(";
drhc2ce0be2014-05-29 12:36:14 +00006551 }else{
drh4926fec2016-04-13 15:33:42 +00006552 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00006553 rc = 1;
6554 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00006555 }
drh20c9c3f2017-06-15 12:21:09 +00006556 if( zDiv ){
6557 sqlite3_stmt *pStmt = 0;
drha7a0bfa2017-07-07 18:06:49 +00006558 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
6559 -1, &pStmt, 0);
6560 if( rc ){
6561 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6562 sqlite3_finalize(pStmt);
6563 rc = 1;
6564 goto meta_command_exit;
6565 }
drh20c9c3f2017-06-15 12:21:09 +00006566 appendText(&sSelect, "SELECT sql FROM", 0);
6567 iSchema = 0;
6568 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6569 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
6570 char zScNum[30];
6571 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
6572 appendText(&sSelect, zDiv, 0);
6573 zDiv = " UNION ALL ";
6574 if( strcmp(zDb, "main")!=0 ){
6575 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
drh90cdec02017-06-15 13:07:56 +00006576 appendText(&sSelect, zDb, '"');
drh20c9c3f2017-06-15 12:21:09 +00006577 appendText(&sSelect, ") AS sql, type, tbl_name, name, rowid,", 0);
6578 appendText(&sSelect, zScNum, 0);
6579 appendText(&sSelect, " AS snum, ", 0);
6580 appendText(&sSelect, zDb, '\'');
6581 appendText(&sSelect, " AS sname FROM ", 0);
drh90cdec02017-06-15 13:07:56 +00006582 appendText(&sSelect, zDb, '"');
drh20c9c3f2017-06-15 12:21:09 +00006583 appendText(&sSelect, ".sqlite_master", 0);
6584 }else{
6585 appendText(&sSelect, "SELECT sql, type, tbl_name, name, rowid, ", 0);
6586 appendText(&sSelect, zScNum, 0);
6587 appendText(&sSelect, " AS snum, 'main' AS sname FROM sqlite_master",0);
6588 }
6589 }
6590 sqlite3_finalize(pStmt);
6591 appendText(&sSelect, ") WHERE ", 0);
6592 if( nArg>1 ){
6593 char *zQarg = sqlite3_mprintf("%Q", azArg[1]);
6594 if( strchr(azArg[1], '.') ){
6595 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
6596 }else{
6597 appendText(&sSelect, "lower(tbl_name)", 0);
6598 }
6599 appendText(&sSelect, strchr(azArg[1], '*') ? " GLOB " : " LIKE ", 0);
6600 appendText(&sSelect, zQarg, 0);
6601 appendText(&sSelect, " AND ", 0);
6602 sqlite3_free(zQarg);
6603 }
6604 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
6605 " ORDER BY snum, rowid", 0);
6606 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
6607 freeText(&sSelect);
6608 }
drh75897232000-05-29 14:26:00 +00006609 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00006610 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00006611 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00006612 rc = 1;
6613 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006614 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00006615 rc = 1;
6616 }else{
6617 rc = 0;
drh75897232000-05-29 14:26:00 +00006618 }
6619 }else
6620
drhabd4c722014-09-20 18:18:33 +00006621#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
6622 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00006623 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00006624 }else
6625#endif
6626
drhe6229612014-08-18 15:08:26 +00006627#if defined(SQLITE_ENABLE_SESSION)
6628 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
6629 OpenSession *pSession = &p->aSession[0];
6630 char **azCmd = &azArg[1];
6631 int iSes = 0;
6632 int nCmd = nArg - 1;
6633 int i;
6634 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00006635 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00006636 if( nArg>=3 ){
6637 for(iSes=0; iSes<p->nSession; iSes++){
6638 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
6639 }
6640 if( iSes<p->nSession ){
6641 pSession = &p->aSession[iSes];
6642 azCmd++;
6643 nCmd--;
6644 }else{
6645 pSession = &p->aSession[0];
6646 iSes = 0;
6647 }
6648 }
6649
drh3a67b042014-08-18 17:56:31 +00006650 /* .session attach TABLE
6651 ** Invoke the sqlite3session_attach() interface to attach a particular
6652 ** table so that it is never filtered.
6653 */
6654 if( strcmp(azCmd[0],"attach")==0 ){
6655 if( nCmd!=2 ) goto session_syntax_error;
6656 if( pSession->p==0 ){
6657 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00006658 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00006659 }else{
6660 rc = sqlite3session_attach(pSession->p, azCmd[1]);
6661 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00006662 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00006663 rc = 0;
6664 }
6665 }
6666 }else
6667
6668 /* .session changeset FILE
6669 ** .session patchset FILE
6670 ** Write a changeset or patchset into a file. The file is overwritten.
6671 */
6672 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
6673 FILE *out = 0;
6674 if( nCmd!=2 ) goto session_syntax_error;
6675 if( pSession->p==0 ) goto session_not_open;
6676 out = fopen(azCmd[1], "wb");
6677 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006678 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00006679 }else{
6680 int szChng;
6681 void *pChng;
6682 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00006683 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00006684 }else{
drh2967e0c2014-08-19 00:26:17 +00006685 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
6686 }
6687 if( rc ){
6688 printf("Error: error code %d\n", rc);
6689 rc = 0;
drh3a67b042014-08-18 17:56:31 +00006690 }
mistachkin1fe36bb2016-04-04 02:16:44 +00006691 if( pChng
drh3a67b042014-08-18 17:56:31 +00006692 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00006693 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00006694 szChng);
6695 }
6696 sqlite3_free(pChng);
6697 fclose(out);
6698 }
6699 }else
6700
drhe6229612014-08-18 15:08:26 +00006701 /* .session close
6702 ** Close the identified session
6703 */
6704 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00006705 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00006706 if( p->nSession ){
6707 session_close(pSession);
6708 p->aSession[iSes] = p->aSession[--p->nSession];
6709 }
6710 }else
6711
drh03168ca2014-08-18 20:01:31 +00006712 /* .session enable ?BOOLEAN?
6713 ** Query or set the enable flag
6714 */
6715 if( strcmp(azCmd[0], "enable")==0 ){
6716 int ii;
6717 if( nCmd>2 ) goto session_syntax_error;
6718 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6719 if( p->nSession ){
6720 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00006721 utf8_printf(p->out, "session %s enable flag = %d\n",
6722 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006723 }
6724 }else
6725
6726 /* .session filter GLOB ....
6727 ** Set a list of GLOB patterns of table names to be excluded.
6728 */
6729 if( strcmp(azCmd[0], "filter")==0 ){
6730 int ii, nByte;
6731 if( nCmd<2 ) goto session_syntax_error;
6732 if( p->nSession ){
6733 for(ii=0; ii<pSession->nFilter; ii++){
6734 sqlite3_free(pSession->azFilter[ii]);
6735 }
6736 sqlite3_free(pSession->azFilter);
6737 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
6738 pSession->azFilter = sqlite3_malloc( nByte );
6739 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006740 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00006741 exit(1);
6742 }
6743 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00006744 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00006745 }
6746 pSession->nFilter = ii-1;
6747 }
6748 }else
6749
6750 /* .session indirect ?BOOLEAN?
6751 ** Query or set the indirect flag
6752 */
6753 if( strcmp(azCmd[0], "indirect")==0 ){
6754 int ii;
6755 if( nCmd>2 ) goto session_syntax_error;
6756 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6757 if( p->nSession ){
6758 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00006759 utf8_printf(p->out, "session %s indirect flag = %d\n",
6760 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006761 }
6762 }else
6763
6764 /* .session isempty
6765 ** Determine if the session is empty
6766 */
6767 if( strcmp(azCmd[0], "isempty")==0 ){
6768 int ii;
6769 if( nCmd!=1 ) goto session_syntax_error;
6770 if( p->nSession ){
6771 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00006772 utf8_printf(p->out, "session %s isempty flag = %d\n",
6773 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006774 }
6775 }else
6776
drhe6229612014-08-18 15:08:26 +00006777 /* .session list
6778 ** List all currently open sessions
6779 */
6780 if( strcmp(azCmd[0],"list")==0 ){
6781 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00006782 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00006783 }
6784 }else
6785
6786 /* .session open DB NAME
6787 ** Open a new session called NAME on the attached database DB.
6788 ** DB is normally "main".
6789 */
6790 if( strcmp(azCmd[0],"open")==0 ){
6791 char *zName;
6792 if( nCmd!=3 ) goto session_syntax_error;
6793 zName = azCmd[2];
6794 if( zName[0]==0 ) goto session_syntax_error;
6795 for(i=0; i<p->nSession; i++){
6796 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006797 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00006798 goto meta_command_exit;
6799 }
6800 }
6801 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00006802 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00006803 goto meta_command_exit;
6804 }
6805 pSession = &p->aSession[p->nSession];
6806 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
6807 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00006808 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00006809 rc = 0;
drhe6229612014-08-18 15:08:26 +00006810 goto meta_command_exit;
6811 }
drh03168ca2014-08-18 20:01:31 +00006812 pSession->nFilter = 0;
6813 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00006814 p->nSession++;
6815 pSession->zName = sqlite3_mprintf("%s", zName);
6816 }else
6817 /* If no command name matches, show a syntax error */
6818 session_syntax_error:
6819 session_help(p);
6820 }else
6821#endif
6822
drh340f5822013-06-27 13:01:21 +00006823#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00006824 /* Undocumented commands for internal testing. Subject to change
6825 ** without notice. */
6826 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
6827 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
6828 int i, v;
6829 for(i=1; i<nArg; i++){
6830 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00006831 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00006832 }
6833 }
6834 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
6835 int i; sqlite3_int64 v;
6836 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00006837 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00006838 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00006839 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00006840 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00006841 }
6842 }
6843 }else
drh340f5822013-06-27 13:01:21 +00006844#endif
drh348d19c2013-06-03 12:47:43 +00006845
drhfb546af2017-03-09 22:00:33 +00006846 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
6847 int bIsInit = 0; /* True to initialize the SELFTEST table */
6848 int bVerbose = 0; /* Verbose output */
6849 int bSelftestExists; /* True if SELFTEST already exists */
drhc5d353f2017-06-09 02:27:49 +00006850 int i, k; /* Loop counters */
drhfb546af2017-03-09 22:00:33 +00006851 int nTest = 0; /* Number of tests runs */
6852 int nErr = 0; /* Number of errors seen */
6853 ShellText str; /* Answer for a query */
drhc5d353f2017-06-09 02:27:49 +00006854 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
drhfb546af2017-03-09 22:00:33 +00006855
6856 open_db(p,0);
6857 for(i=1; i<nArg; i++){
6858 const char *z = azArg[i];
6859 if( z[0]=='-' && z[1]=='-' ) z++;
6860 if( strcmp(z,"-init")==0 ){
6861 bIsInit = 1;
6862 }else
6863 if( strcmp(z,"-v")==0 ){
6864 bVerbose++;
6865 }else
6866 {
6867 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
6868 azArg[i], azArg[0]);
6869 raw_printf(stderr, "Should be one of: --init -v\n");
6870 rc = 1;
6871 goto meta_command_exit;
6872 }
6873 }
6874 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
6875 != SQLITE_OK ){
6876 bSelftestExists = 0;
6877 }else{
6878 bSelftestExists = 1;
6879 }
6880 if( bIsInit ){
drhfb546af2017-03-09 22:00:33 +00006881 createSelftestTable(p);
6882 bSelftestExists = 1;
6883 }
drhc5d353f2017-06-09 02:27:49 +00006884 initText(&str);
6885 appendText(&str, "x", 0);
6886 for(k=bSelftestExists; k>=0; k--){
6887 if( k==1 ){
6888 rc = sqlite3_prepare_v2(p->db,
6889 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
6890 -1, &pStmt, 0);
6891 }else{
6892 rc = sqlite3_prepare_v2(p->db,
6893 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
6894 " (1,'run','PRAGMA integrity_check','ok')",
6895 -1, &pStmt, 0);
6896 }
drhfb546af2017-03-09 22:00:33 +00006897 if( rc ){
6898 raw_printf(stderr, "Error querying the selftest table\n");
6899 rc = 1;
drhc5d353f2017-06-09 02:27:49 +00006900 sqlite3_finalize(pStmt);
drhfb546af2017-03-09 22:00:33 +00006901 goto meta_command_exit;
drhfb546af2017-03-09 22:00:33 +00006902 }
drhc5d353f2017-06-09 02:27:49 +00006903 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
6904 int tno = sqlite3_column_int(pStmt, 0);
6905 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
6906 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
6907 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
mistachkine16a3502017-05-29 03:48:13 +00006908
drhc5d353f2017-06-09 02:27:49 +00006909 k = 0;
6910 if( bVerbose>0 ){
6911 char *zQuote = sqlite3_mprintf("%q", zSql);
6912 printf("%d: %s %s\n", tno, zOp, zSql);
6913 sqlite3_free(zQuote);
drhfb546af2017-03-09 22:00:33 +00006914 }
drhc5d353f2017-06-09 02:27:49 +00006915 if( strcmp(zOp,"memo")==0 ){
6916 utf8_printf(p->out, "%s\n", zSql);
6917 }else
6918 if( strcmp(zOp,"run")==0 ){
6919 char *zErrMsg = 0;
6920 str.n = 0;
6921 str.z[0] = 0;
6922 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
6923 nTest++;
6924 if( bVerbose ){
6925 utf8_printf(p->out, "Result: %s\n", str.z);
6926 }
6927 if( rc || zErrMsg ){
6928 nErr++;
6929 rc = 1;
6930 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
6931 sqlite3_free(zErrMsg);
6932 }else if( strcmp(zAns,str.z)!=0 ){
6933 nErr++;
6934 rc = 1;
6935 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
6936 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
6937 }
6938 }else
6939 {
6940 utf8_printf(stderr,
6941 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
drhfb546af2017-03-09 22:00:33 +00006942 rc = 1;
drhc5d353f2017-06-09 02:27:49 +00006943 break;
drhfb546af2017-03-09 22:00:33 +00006944 }
drhc5d353f2017-06-09 02:27:49 +00006945 } /* End loop over rows of content from SELFTEST */
6946 sqlite3_finalize(pStmt);
6947 } /* End loop over k */
drhfb546af2017-03-09 22:00:33 +00006948 freeText(&str);
drhfb546af2017-03-09 22:00:33 +00006949 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
6950 }else
6951
drhc2ce0be2014-05-29 12:36:14 +00006952 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00006953 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006954 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00006955 rc = 1;
6956 }
drh6976c212014-07-24 12:09:47 +00006957 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00006958 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00006959 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00006960 }
6961 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00006962 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
6963 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00006964 }
drh75897232000-05-29 14:26:00 +00006965 }else
6966
drh1554bc82017-03-08 16:10:34 +00006967 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
6968 const char *zLike = 0; /* Which table to checksum. 0 means everything */
6969 int i; /* Loop counter */
6970 int bSchema = 0; /* Also hash the schema */
drh3ee83ef2017-03-08 17:56:54 +00006971 int bSeparate = 0; /* Hash each table separately */
drh1554bc82017-03-08 16:10:34 +00006972 int iSize = 224; /* Hash algorithm to use */
6973 int bDebug = 0; /* Only show the query that would have run */
6974 sqlite3_stmt *pStmt; /* For querying tables names */
6975 char *zSql; /* SQL to be run */
drh3ee83ef2017-03-08 17:56:54 +00006976 char *zSep; /* Separator */
6977 ShellText sSql; /* Complete SQL for the query to run the hash */
drh1554bc82017-03-08 16:10:34 +00006978 ShellText sQuery; /* Set of queries used to read all content */
drhf80d4ff2017-03-08 18:06:20 +00006979 open_db(p, 0);
drh1554bc82017-03-08 16:10:34 +00006980 for(i=1; i<nArg; i++){
6981 const char *z = azArg[i];
6982 if( z[0]=='-' ){
6983 z++;
6984 if( z[0]=='-' ) z++;
6985 if( strcmp(z,"schema")==0 ){
6986 bSchema = 1;
6987 }else
mistachkine16a3502017-05-29 03:48:13 +00006988 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
6989 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
drh1554bc82017-03-08 16:10:34 +00006990 ){
6991 iSize = atoi(&z[5]);
6992 }else
6993 if( strcmp(z,"debug")==0 ){
6994 bDebug = 1;
6995 }else
6996 {
6997 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
drh3ee83ef2017-03-08 17:56:54 +00006998 azArg[i], azArg[0]);
drh1554bc82017-03-08 16:10:34 +00006999 raw_printf(stderr, "Should be one of: --schema"
7000 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
7001 rc = 1;
7002 goto meta_command_exit;
7003 }
7004 }else if( zLike ){
7005 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
7006 rc = 1;
7007 goto meta_command_exit;
7008 }else{
7009 zLike = z;
drh3ee83ef2017-03-08 17:56:54 +00007010 bSeparate = 1;
7011 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
drh1554bc82017-03-08 16:10:34 +00007012 }
7013 }
7014 if( bSchema ){
7015 zSql = "SELECT lower(name) FROM sqlite_master"
7016 " WHERE type='table' AND coalesce(rootpage,0)>1"
7017 " UNION ALL SELECT 'sqlite_master'"
7018 " ORDER BY 1 collate nocase";
7019 }else{
7020 zSql = "SELECT lower(name) FROM sqlite_master"
7021 " WHERE type='table' AND coalesce(rootpage,0)>1"
7022 " AND name NOT LIKE 'sqlite_%'"
7023 " ORDER BY 1 collate nocase";
7024 }
7025 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
7026 initText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00007027 initText(&sSql);
7028 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
7029 zSep = "VALUES(";
drh1554bc82017-03-08 16:10:34 +00007030 while( SQLITE_ROW==sqlite3_step(pStmt) ){
7031 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
7032 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
7033 if( strncmp(zTab, "sqlite_",7)!=0 ){
7034 appendText(&sQuery,"SELECT * FROM ", 0);
7035 appendText(&sQuery,zTab,'"');
7036 appendText(&sQuery," NOT INDEXED;", 0);
7037 }else if( strcmp(zTab, "sqlite_master")==0 ){
7038 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
7039 " ORDER BY name;", 0);
7040 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
7041 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
7042 " ORDER BY name;", 0);
7043 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
7044 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
7045 " ORDER BY tbl,idx;", 0);
7046 }else if( strcmp(zTab, "sqlite_stat3")==0
7047 || strcmp(zTab, "sqlite_stat4")==0 ){
7048 appendText(&sQuery, "SELECT * FROM ", 0);
7049 appendText(&sQuery, zTab, 0);
7050 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
7051 }
drh3ee83ef2017-03-08 17:56:54 +00007052 appendText(&sSql, zSep, 0);
7053 appendText(&sSql, sQuery.z, '\'');
7054 sQuery.n = 0;
7055 appendText(&sSql, ",", 0);
7056 appendText(&sSql, zTab, '\'');
7057 zSep = "),(";
drh1554bc82017-03-08 16:10:34 +00007058 }
7059 sqlite3_finalize(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00007060 if( bSeparate ){
7061 zSql = sqlite3_mprintf(
7062 "%s))"
7063 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
7064 " FROM [sha3sum$query]",
7065 sSql.z, iSize);
7066 }else{
7067 zSql = sqlite3_mprintf(
7068 "%s))"
7069 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
7070 " FROM [sha3sum$query]",
7071 sSql.z, iSize);
7072 }
drh1554bc82017-03-08 16:10:34 +00007073 freeText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00007074 freeText(&sSql);
drh1554bc82017-03-08 16:10:34 +00007075 if( bDebug ){
7076 utf8_printf(p->out, "%s\n", zSql);
7077 }else{
7078 shell_exec(p->db, zSql, shell_callback, p, 0);
7079 }
7080 sqlite3_free(zSql);
7081 }else
7082
drh62cdde52014-05-28 20:22:28 +00007083 if( c=='s'
7084 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00007085 ){
7086 char *zCmd;
drh54027102014-08-06 14:36:53 +00007087 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00007088 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007089 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00007090 rc = 1;
7091 goto meta_command_exit;
7092 }
drhdcb3e3d2014-05-29 03:17:29 +00007093 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00007094 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00007095 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
7096 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00007097 }
drh54027102014-08-06 14:36:53 +00007098 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00007099 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00007100 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00007101 }else
7102
drhc2ce0be2014-05-29 12:36:14 +00007103 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00007104 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00007105 int i;
drhc2ce0be2014-05-29 12:36:14 +00007106 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00007107 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00007108 rc = 1;
7109 goto meta_command_exit;
7110 }
drhe6e1d122017-03-09 13:50:49 +00007111 utf8_printf(p->out, "%12.12s: %s\n","echo",
7112 azBool[ShellHasFlag(p, SHFLG_Echo)]);
drheacd29d2016-04-15 15:03:27 +00007113 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00007114 utf8_printf(p->out, "%12.12s: %s\n","explain",
7115 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00007116 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00007117 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
7118 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00007119 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00007120 raw_printf(p->out, "\n");
7121 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00007122 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00007123 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00007124 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00007125 raw_printf(p->out, "\n");
7126 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00007127 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00007128 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00007129 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00007130 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00007131 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00007132 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00007133 }
mistachkinaae280e2015-12-31 19:06:24 +00007134 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00007135 utf8_printf(p->out, "%12.12s: %s\n", "filename",
7136 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00007137 }else
7138
drhc2ce0be2014-05-29 12:36:14 +00007139 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
7140 if( nArg==2 ){
7141 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00007142 }else if( nArg==1 ){
7143 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007144 }else{
drh34784902016-02-27 17:12:36 +00007145 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00007146 rc = 1;
7147 }
shaneh642d8b82010-07-28 16:05:34 +00007148 }else
7149
drh6a5a4202016-12-24 21:32:40 +00007150 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
7151 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
7152 || strncmp(azArg[0], "indexes", n)==0) )
7153 ){
drh98781232012-04-23 12:38:05 +00007154 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00007155 char **azResult;
drh98781232012-04-23 12:38:05 +00007156 int nRow, nAlloc;
drh98781232012-04-23 12:38:05 +00007157 int ii;
drh594ccd02017-06-15 12:50:47 +00007158 ShellText s;
7159 initText(&s);
drh05782482013-10-24 15:20:20 +00007160 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00007161 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00007162 if( rc ) return shellDatabaseError(p->db);
7163
drh594ccd02017-06-15 12:50:47 +00007164 if( nArg>2 && c=='i' ){
drh6a5a4202016-12-24 21:32:40 +00007165 /* It is an historical accident that the .indexes command shows an error
7166 ** when called with the wrong number of arguments whereas the .tables
7167 ** command does not. */
7168 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
7169 rc = 1;
7170 goto meta_command_exit;
drh6a5a4202016-12-24 21:32:40 +00007171 }
drh594ccd02017-06-15 12:50:47 +00007172 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00007173 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drh594ccd02017-06-15 12:50:47 +00007174 if( zDbName==0 ) continue;
7175 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
7176 if( sqlite3_stricmp(zDbName, "main")==0 ){
7177 appendText(&s, "SELECT name FROM ", 0);
drh6a5a4202016-12-24 21:32:40 +00007178 }else{
drh594ccd02017-06-15 12:50:47 +00007179 appendText(&s, "SELECT ", 0);
7180 appendText(&s, zDbName, '\'');
7181 appendText(&s, "||'.'||name FROM ", 0);
7182 }
7183 appendText(&s, zDbName, '"');
7184 appendText(&s, ".sqlite_master ", 0);
7185 if( c=='t' ){
7186 appendText(&s," WHERE type IN ('table','view')"
7187 " AND name NOT LIKE 'sqlite_%'"
7188 " AND name LIKE ?1", 0);
7189 }else{
7190 appendText(&s," WHERE type='index'"
7191 " AND tbl_name LIKE ?1", 0);
drh98781232012-04-23 12:38:05 +00007192 }
drha50da102000-08-08 20:19:09 +00007193 }
dand95bb392015-09-30 11:19:05 +00007194 rc = sqlite3_finalize(pStmt);
drh594ccd02017-06-15 12:50:47 +00007195 appendText(&s, " ORDER BY 1", 0);
7196 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
7197 freeText(&s);
dand95bb392015-09-30 11:19:05 +00007198 if( rc ) return shellDatabaseError(p->db);
7199
7200 /* Run the SQL statement prepared by the above block. Store the results
7201 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00007202 nRow = nAlloc = 0;
7203 azResult = 0;
7204 if( nArg>1 ){
7205 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00007206 }else{
drh98781232012-04-23 12:38:05 +00007207 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
7208 }
7209 while( sqlite3_step(pStmt)==SQLITE_ROW ){
7210 if( nRow>=nAlloc ){
7211 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00007212 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00007213 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00007214 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00007215 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00007216 break;
7217 }
mistachkin8e189222015-04-19 21:43:16 +00007218 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00007219 azResult = azNew;
7220 }
7221 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00007222 if( 0==azResult[nRow] ){
7223 rc = shellNomemError();
7224 break;
7225 }
7226 nRow++;
drh98781232012-04-23 12:38:05 +00007227 }
dand95bb392015-09-30 11:19:05 +00007228 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
7229 rc = shellDatabaseError(p->db);
7230 }
7231
7232 /* Pretty-print the contents of array azResult[] to the output */
7233 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00007234 int len, maxlen = 0;
7235 int i, j;
7236 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00007237 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00007238 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00007239 if( len>maxlen ) maxlen = len;
7240 }
7241 nPrintCol = 80/(maxlen+2);
7242 if( nPrintCol<1 ) nPrintCol = 1;
7243 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
7244 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00007245 for(j=i; j<nRow; j+=nPrintRow){
7246 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00007247 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
7248 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00007249 }
mistachkinaae280e2015-12-31 19:06:24 +00007250 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00007251 }
7252 }
dand95bb392015-09-30 11:19:05 +00007253
drh98781232012-04-23 12:38:05 +00007254 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
7255 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00007256 }else
7257
drh2db82112016-09-15 21:35:24 +00007258 /* Begin redirecting output to the file "testcase-out.txt" */
7259 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
7260 output_reset(p);
7261 p->out = output_file_open("testcase-out.txt");
7262 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00007263 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00007264 }
drh760c8162016-09-16 02:52:22 +00007265 if( nArg>=2 ){
7266 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
7267 }else{
7268 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
7269 }
drh2db82112016-09-15 21:35:24 +00007270 }else
drh2db82112016-09-15 21:35:24 +00007271
drhd12602a2016-12-07 15:49:02 +00007272#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00007273 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00007274 static const struct {
7275 const char *zCtrlName; /* Name of a test-control option */
7276 int ctrlCode; /* Integer code for that option */
7277 } aCtrl[] = {
7278 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
7279 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
7280 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
7281 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
7282 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
7283 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
7284 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
7285 { "assert", SQLITE_TESTCTRL_ASSERT },
7286 { "always", SQLITE_TESTCTRL_ALWAYS },
7287 { "reserve", SQLITE_TESTCTRL_RESERVE },
7288 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
7289 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00007290 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00007291 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00007292 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00007293 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00007294 };
shaneh96887e12011-02-10 21:08:58 +00007295 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00007296 int rc2 = 0;
7297 int i, n2;
drh05782482013-10-24 15:20:20 +00007298 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00007299
drhd416fe72011-03-17 16:45:50 +00007300 /* convert testctrl text option to value. allow any unique prefix
7301 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00007302 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00007303 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00007304 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00007305 if( testctrl<0 ){
7306 testctrl = aCtrl[i].ctrlCode;
7307 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007308 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00007309 testctrl = -1;
7310 break;
7311 }
7312 }
7313 }
drh348d19c2013-06-03 12:47:43 +00007314 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007315 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00007316 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007317 }else{
7318 switch(testctrl){
7319
7320 /* sqlite3_test_control(int, db, int) */
7321 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00007322 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00007323 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007324 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00007325 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007326 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007327 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007328 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00007329 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007330 }
7331 break;
7332
7333 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00007334 case SQLITE_TESTCTRL_PRNG_SAVE:
7335 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00007336 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00007337 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00007338 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00007339 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00007340 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007341 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007342 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
7343 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007344 }
7345 break;
7346
7347 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00007348 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00007349 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00007350 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00007351 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007352 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007353 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007354 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00007355 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007356 }
7357 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00007358
shaneh96887e12011-02-10 21:08:58 +00007359 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00007360 case SQLITE_TESTCTRL_ASSERT:
7361 case SQLITE_TESTCTRL_ALWAYS:
7362 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00007363 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007364 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00007365 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007366 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007367 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007368 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00007369 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007370 }
7371 break;
7372
7373 /* sqlite3_test_control(int, char *) */
7374#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00007375 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00007376 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007377 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00007378 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007379 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007380 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007381 utf8_printf(stderr,
7382 "Error: testctrl %s takes a single char * option\n",
7383 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007384 }
7385 break;
7386#endif
7387
drh1ffede82015-01-30 20:59:27 +00007388 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00007389 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007390 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00007391 azArg[2],
drh8964b342015-01-29 17:54:52 +00007392 integerValue(azArg[3]),
7393 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00007394 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00007395 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007396 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00007397 }
7398 break;
7399
mistachkin1fe36bb2016-04-04 02:16:44 +00007400 case SQLITE_TESTCTRL_BITVEC_TEST:
7401 case SQLITE_TESTCTRL_FAULT_INSTALL:
7402 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
7403 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00007404 default:
mistachkinaae280e2015-12-31 19:06:24 +00007405 utf8_printf(stderr,
7406 "Error: CLI support for testctrl %s not implemented\n",
7407 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007408 break;
7409 }
7410 }
7411 }else
drhf1969722017-02-17 23:52:00 +00007412#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00007413
drhc2ce0be2014-05-29 12:36:14 +00007414 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00007415 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007416 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00007417 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00007418
drhc2ce0be2014-05-29 12:36:14 +00007419 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
7420 if( nArg==2 ){
7421 enableTimer = booleanValue(azArg[1]);
7422 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00007423 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00007424 enableTimer = 0;
7425 }
7426 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007427 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00007428 rc = 1;
7429 }
shanehe2aa9d72009-11-06 17:20:17 +00007430 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00007431
drhc2ce0be2014-05-29 12:36:14 +00007432 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00007433 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007434 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007435 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00007436 rc = 1;
7437 goto meta_command_exit;
7438 }
drh657b4a82015-03-19 13:30:41 +00007439 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00007440 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00007441#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00007442 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00007443 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00007444 }else{
drh4b363a52016-07-23 20:27:41 +00007445 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00007446 }
7447#endif
7448 }else
7449
drhf442e332014-09-10 19:01:14 +00007450#if SQLITE_USER_AUTHENTICATION
7451 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
7452 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007453 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00007454 rc = 1;
7455 goto meta_command_exit;
7456 }
drh7883ecf2014-09-11 16:19:31 +00007457 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00007458 if( strcmp(azArg[1],"login")==0 ){
7459 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00007460 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00007461 rc = 1;
7462 goto meta_command_exit;
7463 }
drhd39c40f2014-09-11 00:27:53 +00007464 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
7465 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00007466 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007467 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00007468 rc = 1;
7469 }
7470 }else if( strcmp(azArg[1],"add")==0 ){
7471 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00007472 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00007473 rc = 1;
7474 goto meta_command_exit;
7475 }
drhd39c40f2014-09-11 00:27:53 +00007476 rc = sqlite3_user_add(p->db, azArg[2],
7477 azArg[3], (int)strlen(azArg[3]),
7478 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00007479 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007480 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007481 rc = 1;
7482 }
7483 }else if( strcmp(azArg[1],"edit")==0 ){
7484 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00007485 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00007486 rc = 1;
7487 goto meta_command_exit;
7488 }
drhd39c40f2014-09-11 00:27:53 +00007489 rc = sqlite3_user_change(p->db, azArg[2],
7490 azArg[3], (int)strlen(azArg[3]),
7491 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00007492 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007493 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007494 rc = 1;
7495 }
7496 }else if( strcmp(azArg[1],"delete")==0 ){
7497 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00007498 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00007499 rc = 1;
7500 goto meta_command_exit;
7501 }
7502 rc = sqlite3_user_delete(p->db, azArg[2]);
7503 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007504 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007505 rc = 1;
7506 }
7507 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007508 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00007509 rc = 1;
7510 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00007511 }
drhf442e332014-09-10 19:01:14 +00007512 }else
7513#endif /* SQLITE_USER_AUTHENTICATION */
7514
drh9fd301b2011-06-03 13:28:22 +00007515 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007516 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00007517 sqlite3_libversion(), sqlite3_sourceid());
7518 }else
7519
drh790f2872015-11-28 18:06:36 +00007520 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
7521 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00007522 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00007523 if( p->db ){
7524 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
7525 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00007526 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
7527 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7528 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7529 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00007530 }
7531 }
7532 }else
7533
drhb19e7352016-01-12 19:37:20 +00007534 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
7535 sqlite3_vfs *pVfs;
7536 sqlite3_vfs *pCurrent = 0;
7537 if( p->db ){
7538 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
7539 }
7540 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
7541 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
7542 pVfs==pCurrent ? " <--- CURRENT" : "");
7543 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7544 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7545 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7546 if( pVfs->pNext ){
7547 raw_printf(p->out, "-----------------------------------\n");
7548 }
7549 }
7550 }else
7551
drhde60fc22011-12-14 17:53:36 +00007552 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
7553 const char *zDbName = nArg==2 ? azArg[1] : "main";
7554 char *zVfsName = 0;
7555 if( p->db ){
7556 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
7557 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00007558 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00007559 sqlite3_free(zVfsName);
7560 }
7561 }
7562 }else
7563
drhcef4fc82012-09-21 22:50:45 +00007564#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
7565 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00007566 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00007567 }else
7568#endif
7569
drhc2ce0be2014-05-29 12:36:14 +00007570 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00007571 int j;
drh43617e92006-03-06 20:55:46 +00007572 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00007573 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00007574 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00007575 }
7576 }else
7577
7578 {
mistachkinaae280e2015-12-31 19:06:24 +00007579 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00007580 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00007581 rc = 1;
drh75897232000-05-29 14:26:00 +00007582 }
drh67505e72002-04-19 12:34:06 +00007583
drhc2ce0be2014-05-29 12:36:14 +00007584meta_command_exit:
7585 if( p->outCount ){
7586 p->outCount--;
7587 if( p->outCount==0 ) output_reset(p);
7588 }
drh67505e72002-04-19 12:34:06 +00007589 return rc;
drh75897232000-05-29 14:26:00 +00007590}
7591
drh67505e72002-04-19 12:34:06 +00007592/*
drh91a66392007-09-07 01:12:32 +00007593** Return TRUE if a semicolon occurs anywhere in the first N characters
7594** of string z[].
drh324ccef2003-02-05 14:06:20 +00007595*/
drh9f099fd2013-08-06 14:01:46 +00007596static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00007597 int i;
7598 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
7599 return 0;
drh324ccef2003-02-05 14:06:20 +00007600}
7601
7602/*
drh70c7a4b2003-04-26 03:03:06 +00007603** Test to see if a line consists entirely of whitespace.
7604*/
7605static int _all_whitespace(const char *z){
7606 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00007607 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00007608 if( *z=='/' && z[1]=='*' ){
7609 z += 2;
7610 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
7611 if( *z==0 ) return 0;
7612 z++;
7613 continue;
7614 }
7615 if( *z=='-' && z[1]=='-' ){
7616 z += 2;
7617 while( *z && *z!='\n' ){ z++; }
7618 if( *z==0 ) return 1;
7619 continue;
7620 }
7621 return 0;
7622 }
7623 return 1;
7624}
7625
7626/*
drha9b17162003-04-29 18:01:28 +00007627** Return TRUE if the line typed in is an SQL command terminator other
7628** than a semi-colon. The SQL Server style "go" command is understood
7629** as is the Oracle "/".
7630*/
drh9f099fd2013-08-06 14:01:46 +00007631static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00007632 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00007633 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
7634 return 1; /* Oracle */
7635 }
drhf0693c82011-10-11 20:41:54 +00007636 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00007637 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00007638 return 1; /* SQL Server */
7639 }
7640 return 0;
7641}
7642
7643/*
drh233a5312008-12-18 22:25:13 +00007644** Return true if zSql is a complete SQL statement. Return false if it
7645** ends in the middle of a string literal or C-style comment.
7646*/
drh9f099fd2013-08-06 14:01:46 +00007647static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00007648 int rc;
7649 if( zSql==0 ) return 1;
7650 zSql[nSql] = ';';
7651 zSql[nSql+1] = 0;
7652 rc = sqlite3_complete(zSql);
7653 zSql[nSql] = 0;
7654 return rc;
7655}
7656
7657/*
drh4e8142c2016-11-11 14:54:22 +00007658** Run a single line of SQL
7659*/
7660static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
7661 int rc;
7662 char *zErrMsg = 0;
7663
7664 open_db(p, 0);
drhe6e1d122017-03-09 13:50:49 +00007665 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
drh4e8142c2016-11-11 14:54:22 +00007666 BEGIN_TIMER;
7667 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
7668 END_TIMER;
7669 if( rc || zErrMsg ){
7670 char zPrefix[100];
7671 if( in!=0 || !stdin_is_interactive ){
7672 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
7673 "Error: near line %d:", startline);
7674 }else{
7675 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
7676 }
7677 if( zErrMsg!=0 ){
7678 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
7679 sqlite3_free(zErrMsg);
7680 zErrMsg = 0;
7681 }else{
7682 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
7683 }
7684 return 1;
drhe6e1d122017-03-09 13:50:49 +00007685 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
drh4e8142c2016-11-11 14:54:22 +00007686 raw_printf(p->out, "changes: %3d total_changes: %d\n",
7687 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
7688 }
7689 return 0;
7690}
7691
7692
7693/*
drh67505e72002-04-19 12:34:06 +00007694** Read input from *in and process it. If *in==0 then input
7695** is interactive - the user is typing it it. Otherwise, input
7696** is coming from a file or device. A prompt is issued and history
7697** is saved only if input is interactive. An interrupt signal will
7698** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00007699**
7700** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00007701*/
drhdcd87a92014-08-18 13:45:42 +00007702static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00007703 char *zLine = 0; /* A single input line */
7704 char *zSql = 0; /* Accumulated SQL text */
7705 int nLine; /* Length of current line */
7706 int nSql = 0; /* Bytes of zSql[] used */
7707 int nAlloc = 0; /* Allocated zSql[] space */
7708 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00007709 int rc; /* Error code */
7710 int errCnt = 0; /* Number of errors seen */
7711 int lineno = 0; /* Current line number */
7712 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00007713
7714 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
7715 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00007716 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00007717 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00007718 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00007719 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00007720 break;
drhc49f44e2006-10-26 18:15:42 +00007721 }
drh67505e72002-04-19 12:34:06 +00007722 if( seenInterrupt ){
7723 if( in!=0 ) break;
7724 seenInterrupt = 0;
7725 }
drhc28490c2006-10-26 14:25:58 +00007726 lineno++;
drh849a9d92013-12-21 15:46:06 +00007727 if( nSql==0 && _all_whitespace(zLine) ){
drhe6e1d122017-03-09 13:50:49 +00007728 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drh849a9d92013-12-21 15:46:06 +00007729 continue;
7730 }
drh2af0b2d2002-02-21 02:25:02 +00007731 if( zLine && zLine[0]=='.' && nSql==0 ){
drhe6e1d122017-03-09 13:50:49 +00007732 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00007733 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00007734 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00007735 break;
7736 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00007737 errCnt++;
7738 }
drhdaffd0e2001-04-11 14:28:42 +00007739 continue;
7740 }
drh9f099fd2013-08-06 14:01:46 +00007741 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00007742 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00007743 }
drh9f099fd2013-08-06 14:01:46 +00007744 nLine = strlen30(zLine);
7745 if( nSql+nLine+2>=nAlloc ){
7746 nAlloc = nSql+nLine+100;
7747 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00007748 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007749 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00007750 exit(1);
7751 }
drhdaffd0e2001-04-11 14:28:42 +00007752 }
drh9f099fd2013-08-06 14:01:46 +00007753 nSqlPrior = nSql;
7754 if( nSql==0 ){
7755 int i;
7756 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00007757 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00007758 memcpy(zSql, zLine+i, nLine+1-i);
7759 startline = lineno;
7760 nSql = nLine-i;
7761 }else{
7762 zSql[nSql++] = '\n';
7763 memcpy(zSql+nSql, zLine, nLine+1);
7764 nSql += nLine;
7765 }
7766 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00007767 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00007768 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00007769 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00007770 if( p->outCount ){
7771 output_reset(p);
7772 p->outCount = 0;
7773 }
drh9f099fd2013-08-06 14:01:46 +00007774 }else if( nSql && _all_whitespace(zSql) ){
drhe6e1d122017-03-09 13:50:49 +00007775 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00007776 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00007777 }
7778 }
drh4e8142c2016-11-11 14:54:22 +00007779 if( nSql && !_all_whitespace(zSql) ){
7780 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00007781 }
drh1f9ca2c2015-08-25 16:57:52 +00007782 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00007783 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00007784 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00007785}
7786
drh67505e72002-04-19 12:34:06 +00007787/*
7788** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00007789** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00007790*/
drhd1459152016-09-16 19:11:03 +00007791static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00007792 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00007793 if( clearFlag ){
7794 free(home_dir);
7795 home_dir = 0;
7796 return 0;
7797 }
drh85e72432012-04-11 11:38:53 +00007798 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00007799
drh4ace5362014-11-10 14:42:28 +00007800#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
7801 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00007802 {
7803 struct passwd *pwent;
7804 uid_t uid = getuid();
7805 if( (pwent=getpwuid(uid)) != NULL) {
7806 home_dir = pwent->pw_dir;
7807 }
drh67505e72002-04-19 12:34:06 +00007808 }
7809#endif
7810
chw65d3c132007-11-12 21:09:10 +00007811#if defined(_WIN32_WCE)
7812 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
7813 */
drh85e72432012-04-11 11:38:53 +00007814 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00007815#else
7816
drh83905c92012-06-21 13:00:37 +00007817#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00007818 if (!home_dir) {
7819 home_dir = getenv("USERPROFILE");
7820 }
7821#endif
7822
drh67505e72002-04-19 12:34:06 +00007823 if (!home_dir) {
7824 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00007825 }
7826
drh83905c92012-06-21 13:00:37 +00007827#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00007828 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00007829 char *zDrive, *zPath;
7830 int n;
7831 zDrive = getenv("HOMEDRIVE");
7832 zPath = getenv("HOMEPATH");
7833 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00007834 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00007835 home_dir = malloc( n );
7836 if( home_dir==0 ) return 0;
7837 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
7838 return home_dir;
7839 }
7840 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00007841 }
7842#endif
7843
chw65d3c132007-11-12 21:09:10 +00007844#endif /* !_WIN32_WCE */
7845
drh67505e72002-04-19 12:34:06 +00007846 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00007847 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00007848 char *z = malloc( n );
7849 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00007850 home_dir = z;
7851 }
drhe98d4fa2002-04-21 19:06:22 +00007852
drh67505e72002-04-19 12:34:06 +00007853 return home_dir;
7854}
7855
7856/*
7857** Read input from the file given by sqliterc_override. Or if that
7858** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00007859**
7860** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00007861*/
drh534f4df2015-02-28 14:03:35 +00007862static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00007863 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00007864 const char *sqliterc_override /* Name of config file. NULL to use default */
7865){
persicom7e2dfdd2002-04-18 02:46:52 +00007866 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00007867 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00007868 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00007869 FILE *in = NULL;
7870
7871 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00007872 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00007873 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007874 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00007875 " cannot read ~/.sqliterc\n");
7876 return;
drhe98d4fa2002-04-21 19:06:22 +00007877 }
drh2f3de322012-06-27 16:41:31 +00007878 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00007879 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
7880 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00007881 }
drha1f9b5e2004-02-14 16:31:02 +00007882 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00007883 if( in ){
drhc28490c2006-10-26 14:25:58 +00007884 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00007885 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00007886 }
drh534f4df2015-02-28 14:03:35 +00007887 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00007888 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00007889 }
drh85e72432012-04-11 11:38:53 +00007890 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00007891}
7892
drh67505e72002-04-19 12:34:06 +00007893/*
drhe1e38c42003-05-04 18:30:59 +00007894** Show available command line options
7895*/
mistachkin1fe36bb2016-04-04 02:16:44 +00007896static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00007897 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00007898 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00007899 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00007900 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00007901 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00007902 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00007903 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00007904 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00007905 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00007906#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
7907 " -heap SIZE Size of heap for memsys3 or memsys5\n"
7908#endif
drhcc3b4f82012-02-07 14:13:50 +00007909 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00007910 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00007911 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00007912 " -line set output mode to 'line'\n"
7913 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00007914 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00007915 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00007916#ifdef SQLITE_ENABLE_MULTIPLEX
7917 " -multiplex enable the multiplexor VFS\n"
7918#endif
mistachkine0d68852014-12-11 03:12:33 +00007919 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00007920 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00007921 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
drha501f7d2017-06-29 21:33:25 +00007922 " -quote set output mode to 'quote'\n"
drh44dec872014-08-30 15:49:25 +00007923 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00007924 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00007925 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00007926 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00007927 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00007928#ifdef SQLITE_ENABLE_VFSTRACE
7929 " -vfstrace enable tracing of all VFS calls\n"
7930#endif
drhe1e38c42003-05-04 18:30:59 +00007931;
7932static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00007933 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00007934 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00007935 "FILENAME is the name of an SQLite database. A new database is created\n"
7936 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00007937 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00007938 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00007939 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007940 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00007941 }
7942 exit(1);
7943}
7944
7945/*
drh67505e72002-04-19 12:34:06 +00007946** Initialize the state information in data
7947*/
drhdcd87a92014-08-18 13:45:42 +00007948static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00007949 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00007950 data->normalMode = data->cMode = data->mode = MODE_List;
7951 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00007952 memcpy(data->colSeparator,SEP_Column, 2);
7953 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00007954 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00007955 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00007956 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00007957 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00007958 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00007959 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
7960 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00007961}
7962
drh98d312f2012-10-25 15:23:14 +00007963/*
drh5c7976f2014-02-10 19:59:27 +00007964** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00007965*/
7966#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00007967static void printBold(const char *zText){
7968 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
7969 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
7970 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
7971 SetConsoleTextAttribute(out,
7972 FOREGROUND_RED|FOREGROUND_INTENSITY
7973 );
7974 printf("%s", zText);
7975 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00007976}
7977#else
drh5c7976f2014-02-10 19:59:27 +00007978static void printBold(const char *zText){
7979 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00007980}
7981#endif
7982
7983/*
drh98d312f2012-10-25 15:23:14 +00007984** Get the argument to an --option. Throw an error and die if no argument
7985** is available.
7986*/
7987static char *cmdline_option_value(int argc, char **argv, int i){
7988 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00007989 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00007990 argv[0], argv[argc-1]);
7991 exit(1);
7992 }
7993 return argv[i];
7994}
7995
mistachkin1fe36bb2016-04-04 02:16:44 +00007996#ifndef SQLITE_SHELL_IS_UTF8
7997# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
7998# define SQLITE_SHELL_IS_UTF8 (0)
7999# else
8000# define SQLITE_SHELL_IS_UTF8 (1)
8001# endif
8002#endif
8003
8004#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00008005int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00008006#else
8007int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00008008 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00008009#endif
drh75897232000-05-29 14:26:00 +00008010 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00008011 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00008012 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00008013 int i;
drhc28490c2006-10-26 14:25:58 +00008014 int rc = 0;
drhb3735912014-02-10 16:13:42 +00008015 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00008016 int readStdin = 1;
8017 int nCmd = 0;
8018 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00008019
mistachkin1fe36bb2016-04-04 02:16:44 +00008020 setBinaryMode(stdin, 0);
8021 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00008022 stdin_is_interactive = isatty(0);
8023 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00008024
drh69b30ab2014-02-27 15:11:52 +00008025#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00008026 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008027 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00008028 sqlite3_sourceid(), SQLITE_SOURCE_ID);
8029 exit(1);
8030 }
drhc7181902014-02-27 15:04:13 +00008031#endif
persicom7e2dfdd2002-04-18 02:46:52 +00008032 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00008033#if !SQLITE_SHELL_IS_UTF8
8034 sqlite3_initialize();
8035 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
8036 if( argv==0 ){
8037 raw_printf(stderr, "out of memory\n");
8038 exit(1);
8039 }
8040 for(i=0; i<argc; i++){
8041 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
8042 if( argv[i]==0 ){
8043 raw_printf(stderr, "out of memory\n");
8044 exit(1);
8045 }
8046 }
8047#endif
mistachkin1810f222016-04-04 02:33:34 +00008048 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00008049 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00008050
drh44c2eb12003-04-30 11:38:26 +00008051 /* Make sure we have a valid signal handler early, before anything
8052 ** else is done.
8053 */
drh4c504392000-10-16 22:06:40 +00008054#ifdef SIGINT
8055 signal(SIGINT, interrupt_handler);
8056#endif
drh44c2eb12003-04-30 11:38:26 +00008057
drhac5649a2014-11-28 13:35:03 +00008058#ifdef SQLITE_SHELL_DBNAME_PROC
8059 {
8060 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
8061 ** of a C-function that will provide the name of the database file. Use
8062 ** this compile-time option to embed this shell program in larger
8063 ** applications. */
8064 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
8065 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
8066 warnInmemoryDb = 0;
8067 }
8068#endif
8069
drh22fbcb82004-02-01 01:22:50 +00008070 /* Do an initial pass through the command-line argument to locate
8071 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00008072 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00008073 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00008074 */
drh98d312f2012-10-25 15:23:14 +00008075 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00008076 char *z;
drhc28490c2006-10-26 14:25:58 +00008077 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00008078 if( z[0]!='-' ){
8079 if( data.zDbFilename==0 ){
8080 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00008081 }else{
8082 /* Excesss arguments are interpreted as SQL (or dot-commands) and
8083 ** mean that nothing is read from stdin */
8084 readStdin = 0;
8085 nCmd++;
8086 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
8087 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008088 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00008089 exit(1);
8090 }
8091 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00008092 }
drh98d312f2012-10-25 15:23:14 +00008093 }
drhcc3b4f82012-02-07 14:13:50 +00008094 if( z[1]=='-' ) z++;
8095 if( strcmp(z,"-separator")==0
8096 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00008097 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00008098 || strcmp(z,"-cmd")==0
8099 ){
drh98d312f2012-10-25 15:23:14 +00008100 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00008101 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00008102 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00008103 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00008104 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00008105 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00008106 ** we do the actual processing of arguments later in a second pass.
8107 */
shanef69573d2009-10-24 02:06:14 +00008108 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00008109 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00008110#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00008111 const char *zSize;
8112 sqlite3_int64 szHeap;
8113
drh98d312f2012-10-25 15:23:14 +00008114 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00008115 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00008116 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00008117 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00008118#else
8119 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00008120#endif
drh44dec872014-08-30 15:49:25 +00008121 }else if( strcmp(z,"-scratch")==0 ){
8122 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008123 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008124 if( sz>400000 ) sz = 400000;
8125 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00008126 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008127 if( n>10 ) n = 10;
8128 if( n<1 ) n = 1;
8129 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
8130 data.shellFlgs |= SHFLG_Scratch;
8131 }else if( strcmp(z,"-pagecache")==0 ){
8132 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008133 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008134 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00008135 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00008136 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00008137 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
8138 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00008139 data.shellFlgs |= SHFLG_Pagecache;
8140 }else if( strcmp(z,"-lookaside")==0 ){
8141 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008142 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008143 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00008144 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008145 if( n<0 ) n = 0;
8146 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
8147 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00008148#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00008149 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00008150 extern int vfstrace_register(
8151 const char *zTraceName,
8152 const char *zOldVfsName,
8153 int (*xOut)(const char*,void*),
8154 void *pOutArg,
8155 int makeDefault
8156 );
drh2b625e22011-03-16 17:05:28 +00008157 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00008158#endif
drh6f25e892011-07-08 17:02:57 +00008159#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00008160 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00008161 extern int sqlite3_multiple_initialize(const char*,int);
8162 sqlite3_multiplex_initialize(0, 1);
8163#endif
drh7d9f3942013-04-03 01:26:54 +00008164 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00008165 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8166 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00008167 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00008168 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00008169 if( pVfs ){
8170 sqlite3_vfs_register(pVfs, 1);
8171 }else{
mistachkinaae280e2015-12-31 19:06:24 +00008172 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00008173 exit(1);
8174 }
drh44c2eb12003-04-30 11:38:26 +00008175 }
8176 }
drh98d312f2012-10-25 15:23:14 +00008177 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00008178#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00008179 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00008180 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00008181#else
mistachkinaae280e2015-12-31 19:06:24 +00008182 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00008183 return 1;
drh01b41712005-08-29 23:06:23 +00008184#endif
drh98d312f2012-10-25 15:23:14 +00008185 }
8186 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00008187
drh44c2eb12003-04-30 11:38:26 +00008188 /* Go ahead and open the database file if it already exists. If the
8189 ** file does not exist, delay opening it. This prevents empty database
8190 ** files from being created if a user mistypes the database name argument
8191 ** to the sqlite command-line tool.
8192 */
drhc8d74412004-08-31 23:41:26 +00008193 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00008194 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00008195 }
8196
drh22fbcb82004-02-01 01:22:50 +00008197 /* Process the initialization file if there is one. If no -init option
8198 ** is given on the command line, look for a file named ~/.sqliterc and
8199 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00008200 */
drh534f4df2015-02-28 14:03:35 +00008201 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00008202
drh22fbcb82004-02-01 01:22:50 +00008203 /* Make a second pass through the command-line argument and set
8204 ** options. This second pass is delayed until after the initialization
8205 ** file is processed so that the command-line arguments will override
8206 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00008207 */
drh98d312f2012-10-25 15:23:14 +00008208 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00008209 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00008210 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00008211 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00008212 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00008213 i++;
8214 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008215 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00008216 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008217 data.mode = MODE_List;
drha501f7d2017-06-29 21:33:25 +00008218 }else if( strcmp(z,"-quote")==0 ){
8219 data.mode = MODE_Quote;
drh22fbcb82004-02-01 01:22:50 +00008220 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008221 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00008222 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00008223 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00008224 }else if( strcmp(z,"-csv")==0 ){
8225 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00008226 memcpy(data.colSeparator,",",2);
8227 }else if( strcmp(z,"-ascii")==0 ){
8228 data.mode = MODE_Ascii;
8229 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00008230 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00008231 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00008232 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00008233 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00008234 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00008235 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00008236 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00008237 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00008238 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00008239 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00008240 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00008241 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00008242 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008243 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00008244 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008245 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00008246 }else if( strcmp(z,"-echo")==0 ){
drhe6e1d122017-03-09 13:50:49 +00008247 ShellSetFlag(&data, SHFLG_Echo);
drhefbf3b12014-02-28 20:47:24 +00008248 }else if( strcmp(z,"-eqp")==0 ){
8249 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00008250 }else if( strcmp(z,"-eqpfull")==0 ){
8251 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00008252 }else if( strcmp(z,"-stats")==0 ){
8253 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00008254 }else if( strcmp(z,"-scanstats")==0 ){
8255 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00008256 }else if( strcmp(z,"-backslash")==0 ){
8257 /* Undocumented command-line option: -backslash
8258 ** Causes C-style backslash escapes to be evaluated in SQL statements
8259 ** prior to sending the SQL into SQLite. Useful for injecting
8260 ** crazy bytes in the middle of SQL statements for testing and debugging.
8261 */
drhe6e1d122017-03-09 13:50:49 +00008262 ShellSetFlag(&data, SHFLG_Backslash);
drhc49f44e2006-10-26 18:15:42 +00008263 }else if( strcmp(z,"-bail")==0 ){
8264 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00008265 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00008266 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00008267 return 0;
drhc28490c2006-10-26 14:25:58 +00008268 }else if( strcmp(z,"-interactive")==0 ){
8269 stdin_is_interactive = 1;
8270 }else if( strcmp(z,"-batch")==0 ){
8271 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00008272 }else if( strcmp(z,"-heap")==0 ){
8273 i++;
drh44dec872014-08-30 15:49:25 +00008274 }else if( strcmp(z,"-scratch")==0 ){
8275 i+=2;
8276 }else if( strcmp(z,"-pagecache")==0 ){
8277 i+=2;
8278 }else if( strcmp(z,"-lookaside")==0 ){
8279 i+=2;
drh7d9f3942013-04-03 01:26:54 +00008280 }else if( strcmp(z,"-mmap")==0 ){
8281 i++;
drha7e61d82011-03-12 17:02:57 +00008282 }else if( strcmp(z,"-vfs")==0 ){
8283 i++;
drh6f25e892011-07-08 17:02:57 +00008284#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00008285 }else if( strcmp(z,"-vfstrace")==0 ){
8286 i++;
drh6f25e892011-07-08 17:02:57 +00008287#endif
8288#ifdef SQLITE_ENABLE_MULTIPLEX
8289 }else if( strcmp(z,"-multiplex")==0 ){
8290 i++;
8291#endif
drhcc3b4f82012-02-07 14:13:50 +00008292 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00008293 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00008294 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00008295 /* Run commands that follow -cmd first and separately from commands
8296 ** that simply appear on the command-line. This seems goofy. It would
8297 ** be better if all commands ran in the order that they appear. But
8298 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00008299 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00008300 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00008301 if( z[0]=='.' ){
8302 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00008303 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00008304 }else{
drh05782482013-10-24 15:20:20 +00008305 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00008306 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
8307 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008308 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00008309 if( bail_on_error ) return rc!=0 ? rc : 1;
8310 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008311 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00008312 if( bail_on_error ) return rc;
8313 }
8314 }
drh1e5d0e92000-05-31 23:33:17 +00008315 }else{
mistachkinaae280e2015-12-31 19:06:24 +00008316 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
8317 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00008318 return 1;
8319 }
drh700c2522016-02-09 18:39:25 +00008320 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00008321 }
drh44c2eb12003-04-30 11:38:26 +00008322
drhac5649a2014-11-28 13:35:03 +00008323 if( !readStdin ){
8324 /* Run all arguments that do not begin with '-' as if they were separate
8325 ** command-line inputs, except for the argToSkip argument which contains
8326 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00008327 */
drhac5649a2014-11-28 13:35:03 +00008328 for(i=0; i<nCmd; i++){
8329 if( azCmd[i][0]=='.' ){
8330 rc = do_meta_command(azCmd[i], &data);
8331 if( rc ) return rc==2 ? 0 : rc;
8332 }else{
8333 open_db(&data, 0);
8334 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
8335 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008336 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00008337 return rc!=0 ? rc : 1;
8338 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008339 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00008340 return rc;
8341 }
drh6ff13852001-11-25 13:18:23 +00008342 }
drh75897232000-05-29 14:26:00 +00008343 }
drhac5649a2014-11-28 13:35:03 +00008344 free(azCmd);
drh75897232000-05-29 14:26:00 +00008345 }else{
drh44c2eb12003-04-30 11:38:26 +00008346 /* Run commands received from standard input
8347 */
drhc28490c2006-10-26 14:25:58 +00008348 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00008349 char *zHome;
8350 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00008351 int nHistory;
drh75897232000-05-29 14:26:00 +00008352 printf(
drh743e0032011-12-12 16:51:50 +00008353 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00008354 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00008355 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00008356 );
drhb3735912014-02-10 16:13:42 +00008357 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00008358 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00008359 printBold("transient in-memory database");
8360 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00008361 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00008362 }
drhd1459152016-09-16 19:11:03 +00008363 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00008364 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00008365 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00008366 if( (zHistory = malloc(nHistory))!=0 ){
8367 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
8368 }
drh67505e72002-04-19 12:34:06 +00008369 }
drhf5ed7ad2015-06-15 14:43:25 +00008370 if( zHistory ){ shell_read_history(zHistory); }
drh56eb09b2017-07-11 13:59:07 +00008371#if HAVE_READLINE || HAVE_EDITLINE
8372 rl_attempted_completion_function = readline_completion;
8373#elif HAVE_LINENOISE
8374 linenoiseSetCompletionCallback(linenoise_completion);
8375#endif
drhc28490c2006-10-26 14:25:58 +00008376 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00008377 if( zHistory ){
drh80f134c2017-07-18 14:41:44 +00008378 shell_stifle_history(2000);
danfd34d6d2015-02-25 10:54:53 +00008379 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00008380 free(zHistory);
drh67505e72002-04-19 12:34:06 +00008381 }
drhdaffd0e2001-04-11 14:28:42 +00008382 }else{
drhc28490c2006-10-26 14:25:58 +00008383 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00008384 }
8385 }
drh33048c02001-10-01 14:29:22 +00008386 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00008387 if( data.db ){
drhe6229612014-08-18 15:08:26 +00008388 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00008389 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00008390 }
mistachkin1fe36bb2016-04-04 02:16:44 +00008391 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00008392 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00008393#if !SQLITE_SHELL_IS_UTF8
8394 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
8395 sqlite3_free(argv);
8396#endif
drhc28490c2006-10-26 14:25:58 +00008397 return rc;
drh75897232000-05-29 14:26:00 +00008398}
drh2ce15c32017-07-11 13:34:40 +00008399