blob: 4fe0fd3856b4698cdd1d0d8434cc962717765e4c [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;
4269 int rc;
4270 sqlite3_finalize(pStmt);
4271 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4272 " FROM completion(%Q) ORDER BY 1", text);
4273 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4274 sqlite3_free(zSql);
4275 }
4276 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4277 zRet = strdup(sqlite3_column_text(pStmt, 0));
4278 }else{
4279 sqlite3_finalize(pStmt);
4280 pStmt = 0;
4281 zRet = 0;
4282 }
4283 return zRet;
4284}
4285static char **readline_completion(const char *zText, int iStart, int iEnd){
4286 rl_attempted_completion_over = 1;
4287 return rl_completion_matches(zText, readline_completion_generator);
4288}
4289
4290#elif HAVE_LINENOISE
4291/*
4292** Linenoise completion callback
4293*/
4294static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
4295 int nLine = (int)strlen(zLine);
4296 int i, iStart;
4297 sqlite3_stmt *pStmt = 0;
4298 char *zSql;
4299 char zBuf[1000];
4300
4301 if( nLine>sizeof(zBuf)-30 ) return;
4302 if( zLine[0]=='.' ) return;
4303 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
4304 if( i==nLine-1 ) return;
4305 iStart = i+1;
4306 memcpy(zBuf, zLine, iStart);
4307 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4308 " FROM completion(%Q,%Q) ORDER BY 1",
4309 &zLine[iStart], zLine);
4310 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4311 sqlite3_free(zSql);
4312 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
4313 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4314 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
4315 int nCompletion = sqlite3_column_bytes(pStmt, 0);
4316 if( iStart+nCompletion < sizeof(zBuf)-1 ){
4317 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
4318 linenoiseAddCompletion(lc, zBuf);
4319 }
4320 }
4321 sqlite3_finalize(pStmt);
4322}
4323#endif
4324
drh44c2eb12003-04-30 11:38:26 +00004325/*
drhfeac5f82004-08-01 00:10:45 +00004326** Do C-language style dequoting.
4327**
mistachkinf21979d2015-01-18 05:35:01 +00004328** \a -> alarm
4329** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00004330** \t -> tab
4331** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00004332** \v -> vertical tab
4333** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00004334** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00004335** \s -> space
drh4c56b992013-06-27 13:26:55 +00004336** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00004337** \' -> '
drhfeac5f82004-08-01 00:10:45 +00004338** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00004339** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00004340*/
4341static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00004342 int i, j;
4343 char c;
drhc2ce0be2014-05-29 12:36:14 +00004344 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00004345 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00004346 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00004347 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00004348 if( c=='a' ){
4349 c = '\a';
4350 }else if( c=='b' ){
4351 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00004352 }else if( c=='t' ){
4353 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00004354 }else if( c=='n' ){
4355 c = '\n';
4356 }else if( c=='v' ){
4357 c = '\v';
4358 }else if( c=='f' ){
4359 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00004360 }else if( c=='r' ){
4361 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00004362 }else if( c=='"' ){
4363 c = '"';
4364 }else if( c=='\'' ){
4365 c = '\'';
drh4c56b992013-06-27 13:26:55 +00004366 }else if( c=='\\' ){
4367 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00004368 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00004369 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00004370 if( z[i+1]>='0' && z[i+1]<='7' ){
4371 i++;
4372 c = (c<<3) + z[i] - '0';
4373 if( z[i+1]>='0' && z[i+1]<='7' ){
4374 i++;
4375 c = (c<<3) + z[i] - '0';
4376 }
4377 }
4378 }
4379 }
4380 z[j] = c;
4381 }
drhc2ce0be2014-05-29 12:36:14 +00004382 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00004383}
4384
4385/*
drh348d19c2013-06-03 12:47:43 +00004386** Return the value of a hexadecimal digit. Return -1 if the input
4387** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00004388*/
drh348d19c2013-06-03 12:47:43 +00004389static int hexDigitValue(char c){
4390 if( c>='0' && c<='9' ) return c - '0';
4391 if( c>='a' && c<='f' ) return c - 'a' + 10;
4392 if( c>='A' && c<='F' ) return c - 'A' + 10;
4393 return -1;
drhc28490c2006-10-26 14:25:58 +00004394}
4395
4396/*
drh7d9f3942013-04-03 01:26:54 +00004397** Interpret zArg as an integer value, possibly with suffixes.
4398*/
4399static sqlite3_int64 integerValue(const char *zArg){
4400 sqlite3_int64 v = 0;
4401 static const struct { char *zSuffix; int iMult; } aMult[] = {
4402 { "KiB", 1024 },
4403 { "MiB", 1024*1024 },
4404 { "GiB", 1024*1024*1024 },
4405 { "KB", 1000 },
4406 { "MB", 1000000 },
4407 { "GB", 1000000000 },
4408 { "K", 1000 },
4409 { "M", 1000000 },
4410 { "G", 1000000000 },
4411 };
4412 int i;
4413 int isNeg = 0;
4414 if( zArg[0]=='-' ){
4415 isNeg = 1;
4416 zArg++;
4417 }else if( zArg[0]=='+' ){
4418 zArg++;
4419 }
drh348d19c2013-06-03 12:47:43 +00004420 if( zArg[0]=='0' && zArg[1]=='x' ){
4421 int x;
4422 zArg += 2;
4423 while( (x = hexDigitValue(zArg[0]))>=0 ){
4424 v = (v<<4) + x;
4425 zArg++;
4426 }
4427 }else{
4428 while( IsDigit(zArg[0]) ){
4429 v = v*10 + zArg[0] - '0';
4430 zArg++;
4431 }
drh7d9f3942013-04-03 01:26:54 +00004432 }
drhc2bed0a2013-05-24 11:57:50 +00004433 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00004434 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
4435 v *= aMult[i].iMult;
4436 break;
4437 }
4438 }
4439 return isNeg? -v : v;
4440}
4441
4442/*
drh348d19c2013-06-03 12:47:43 +00004443** Interpret zArg as either an integer or a boolean value. Return 1 or 0
4444** for TRUE and FALSE. Return the integer value if appropriate.
4445*/
drhe6e1d122017-03-09 13:50:49 +00004446static int booleanValue(const char *zArg){
drh348d19c2013-06-03 12:47:43 +00004447 int i;
4448 if( zArg[0]=='0' && zArg[1]=='x' ){
4449 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
4450 }else{
4451 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
4452 }
4453 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
4454 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
4455 return 1;
4456 }
4457 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
4458 return 0;
4459 }
mistachkinaae280e2015-12-31 19:06:24 +00004460 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00004461 zArg);
4462 return 0;
4463}
4464
4465/*
drhe6e1d122017-03-09 13:50:49 +00004466** Set or clear a shell flag according to a boolean value.
4467*/
4468static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
4469 if( booleanValue(zArg) ){
4470 ShellSetFlag(p, mFlag);
4471 }else{
4472 ShellClearFlag(p, mFlag);
4473 }
4474}
4475
4476/*
drh42f64e52012-04-04 16:56:23 +00004477** Close an output file, assuming it is not stderr or stdout
4478*/
4479static void output_file_close(FILE *f){
4480 if( f && f!=stdout && f!=stderr ) fclose(f);
4481}
4482
4483/*
4484** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00004485** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00004486** filename is "off".
4487*/
4488static FILE *output_file_open(const char *zFile){
4489 FILE *f;
4490 if( strcmp(zFile,"stdout")==0 ){
4491 f = stdout;
4492 }else if( strcmp(zFile, "stderr")==0 ){
4493 f = stderr;
4494 }else if( strcmp(zFile, "off")==0 ){
4495 f = 0;
4496 }else{
4497 f = fopen(zFile, "wb");
4498 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004499 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00004500 }
4501 }
4502 return f;
4503}
4504
drhd12602a2016-12-07 15:49:02 +00004505#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00004506#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00004507/*
4508** A routine for handling output from sqlite3_trace().
4509*/
drh4b363a52016-07-23 20:27:41 +00004510static int sql_trace_callback(
4511 unsigned mType,
4512 void *pArg,
4513 void *pP,
4514 void *pX
4515){
drh42f64e52012-04-04 16:56:23 +00004516 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00004517 UNUSED_PARAMETER(mType);
4518 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00004519 if( f ){
drh4b363a52016-07-23 20:27:41 +00004520 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00004521 int i = (int)strlen(z);
4522 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00004523 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00004524 }
drh4b363a52016-07-23 20:27:41 +00004525 return 0;
drh42f64e52012-04-04 16:56:23 +00004526}
drhc10b9da2016-11-20 17:59:59 +00004527#endif
4528#endif
drh42f64e52012-04-04 16:56:23 +00004529
4530/*
drhd8621b92012-04-17 09:09:33 +00004531** A no-op routine that runs with the ".breakpoint" doc-command. This is
4532** a useful spot to set a debugger breakpoint.
4533*/
4534static void test_breakpoint(void){
4535 static int nCall = 0;
4536 nCall++;
4537}
4538
4539/*
mistachkin636bf9f2014-07-19 20:15:16 +00004540** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00004541*/
mistachkin636bf9f2014-07-19 20:15:16 +00004542typedef struct ImportCtx ImportCtx;
4543struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00004544 const char *zFile; /* Name of the input file */
4545 FILE *in; /* Read the CSV text from this input stream */
4546 char *z; /* Accumulated text for a field */
4547 int n; /* Number of bytes in z */
4548 int nAlloc; /* Space allocated for z[] */
4549 int nLine; /* Current line number */
drhd5fbde82017-06-26 18:42:23 +00004550 int bNotFirst; /* True if one or more bytes already read */
drhdb95f682013-06-26 22:46:00 +00004551 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00004552 int cColSep; /* The column separator character. (Usually ",") */
4553 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00004554};
4555
4556/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00004557static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00004558 if( p->n+1>=p->nAlloc ){
4559 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00004560 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00004561 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004562 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00004563 exit(1);
4564 }
4565 }
4566 p->z[p->n++] = (char)c;
4567}
4568
4569/* Read a single field of CSV text. Compatible with rfc4180 and extended
4570** with the option of having a separator other than ",".
4571**
4572** + Input comes from p->in.
4573** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00004574** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00004575** + Use p->cSep as the column separator. The default is ",".
4576** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00004577** + Keep track of the line number in p->nLine.
4578** + Store the character that terminates the field in p->cTerm. Store
4579** EOF on end-of-file.
4580** + Report syntax errors on stderr
4581*/
mistachkin44723ce2015-03-21 02:22:37 +00004582static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00004583 int c;
4584 int cSep = p->cColSep;
4585 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00004586 p->n = 0;
4587 c = fgetc(p->in);
4588 if( c==EOF || seenInterrupt ){
4589 p->cTerm = EOF;
4590 return 0;
4591 }
4592 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00004593 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00004594 int startLine = p->nLine;
4595 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00004596 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00004597 while( 1 ){
4598 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00004599 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00004600 if( c==cQuote ){
4601 if( pc==cQuote ){
4602 pc = 0;
4603 continue;
4604 }
4605 }
4606 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00004607 || (c==rSep && pc==cQuote)
4608 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00004609 || (c==EOF && pc==cQuote)
4610 ){
4611 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00004612 p->cTerm = c;
4613 break;
4614 }
4615 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00004616 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00004617 p->zFile, p->nLine, cQuote);
4618 }
4619 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00004620 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00004621 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00004622 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00004623 break;
4624 }
mistachkin636bf9f2014-07-19 20:15:16 +00004625 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00004626 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00004627 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00004628 }
drhdb95f682013-06-26 22:46:00 +00004629 }else{
drhd5fbde82017-06-26 18:42:23 +00004630 /* If this is the first field being parsed and it begins with the
4631 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
4632 if( (c&0xff)==0xef && p->bNotFirst==0 ){
4633 import_append_char(p, c);
4634 c = fgetc(p->in);
4635 if( (c&0xff)==0xbb ){
4636 import_append_char(p, c);
4637 c = fgetc(p->in);
4638 if( (c&0xff)==0xbf ){
4639 p->bNotFirst = 1;
4640 p->n = 0;
4641 return csv_read_one_field(p);
4642 }
4643 }
4644 }
mistachkin636bf9f2014-07-19 20:15:16 +00004645 while( c!=EOF && c!=cSep && c!=rSep ){
4646 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00004647 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00004648 }
mistachkin636bf9f2014-07-19 20:15:16 +00004649 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00004650 p->nLine++;
drh3852b682014-02-26 13:53:34 +00004651 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00004652 }
drhdb95f682013-06-26 22:46:00 +00004653 p->cTerm = c;
4654 }
drh8dd675e2013-07-12 21:09:24 +00004655 if( p->z ) p->z[p->n] = 0;
drhd5fbde82017-06-26 18:42:23 +00004656 p->bNotFirst = 1;
drhdb95f682013-06-26 22:46:00 +00004657 return p->z;
4658}
4659
mistachkin636bf9f2014-07-19 20:15:16 +00004660/* Read a single field of ASCII delimited text.
4661**
4662** + Input comes from p->in.
4663** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00004664** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00004665** + Use p->cSep as the column separator. The default is "\x1F".
4666** + Use p->rSep as the row separator. The default is "\x1E".
4667** + Keep track of the row number in p->nLine.
4668** + Store the character that terminates the field in p->cTerm. Store
4669** EOF on end-of-file.
4670** + Report syntax errors on stderr
4671*/
mistachkin44723ce2015-03-21 02:22:37 +00004672static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00004673 int c;
4674 int cSep = p->cColSep;
4675 int rSep = p->cRowSep;
4676 p->n = 0;
4677 c = fgetc(p->in);
4678 if( c==EOF || seenInterrupt ){
4679 p->cTerm = EOF;
4680 return 0;
4681 }
4682 while( c!=EOF && c!=cSep && c!=rSep ){
4683 import_append_char(p, c);
4684 c = fgetc(p->in);
4685 }
4686 if( c==rSep ){
4687 p->nLine++;
4688 }
4689 p->cTerm = c;
4690 if( p->z ) p->z[p->n] = 0;
4691 return p->z;
4692}
4693
drhdb95f682013-06-26 22:46:00 +00004694/*
drh4bbcf102014-02-06 02:46:08 +00004695** Try to transfer data for table zTable. If an error is seen while
4696** moving forward, try to go backwards. The backwards movement won't
4697** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00004698*/
mistachkine31ae902014-02-06 01:15:29 +00004699static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00004700 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00004701 sqlite3 *newDb,
4702 const char *zTable
4703){
mistachkin1fe36bb2016-04-04 02:16:44 +00004704 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00004705 sqlite3_stmt *pInsert = 0;
4706 char *zQuery = 0;
4707 char *zInsert = 0;
4708 int rc;
4709 int i, j, n;
4710 int nTable = (int)strlen(zTable);
4711 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00004712 int cnt = 0;
4713 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00004714
4715 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
4716 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4717 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004718 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004719 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4720 zQuery);
4721 goto end_data_xfer;
4722 }
4723 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00004724 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00004725 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004726 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00004727 goto end_data_xfer;
4728 }
4729 sqlite3_snprintf(200+nTable,zInsert,
4730 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
4731 i = (int)strlen(zInsert);
4732 for(j=1; j<n; j++){
4733 memcpy(zInsert+i, ",?", 2);
4734 i += 2;
4735 }
4736 memcpy(zInsert+i, ");", 3);
4737 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
4738 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004739 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004740 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
4741 zQuery);
4742 goto end_data_xfer;
4743 }
4744 for(k=0; k<2; k++){
4745 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4746 for(i=0; i<n; i++){
4747 switch( sqlite3_column_type(pQuery, i) ){
4748 case SQLITE_NULL: {
4749 sqlite3_bind_null(pInsert, i+1);
4750 break;
4751 }
4752 case SQLITE_INTEGER: {
4753 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
4754 break;
4755 }
4756 case SQLITE_FLOAT: {
4757 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
4758 break;
4759 }
4760 case SQLITE_TEXT: {
4761 sqlite3_bind_text(pInsert, i+1,
4762 (const char*)sqlite3_column_text(pQuery,i),
4763 -1, SQLITE_STATIC);
4764 break;
4765 }
4766 case SQLITE_BLOB: {
4767 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
4768 sqlite3_column_bytes(pQuery,i),
4769 SQLITE_STATIC);
4770 break;
4771 }
4772 }
4773 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00004774 rc = sqlite3_step(pInsert);
4775 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00004776 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00004777 sqlite3_errmsg(newDb));
4778 }
drh3350ce92014-02-06 00:49:12 +00004779 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00004780 cnt++;
4781 if( (cnt%spinRate)==0 ){
4782 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
4783 fflush(stdout);
4784 }
drh3350ce92014-02-06 00:49:12 +00004785 } /* End while */
4786 if( rc==SQLITE_DONE ) break;
4787 sqlite3_finalize(pQuery);
4788 sqlite3_free(zQuery);
4789 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
4790 zTable);
4791 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4792 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004793 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00004794 break;
drh3350ce92014-02-06 00:49:12 +00004795 }
4796 } /* End for(k=0...) */
4797
4798end_data_xfer:
4799 sqlite3_finalize(pQuery);
4800 sqlite3_finalize(pInsert);
4801 sqlite3_free(zQuery);
4802 sqlite3_free(zInsert);
4803}
4804
4805
4806/*
4807** Try to transfer all rows of the schema that match zWhere. For
4808** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00004809** If an error is encountered while moving forward through the
4810** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00004811*/
mistachkine31ae902014-02-06 01:15:29 +00004812static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00004813 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00004814 sqlite3 *newDb,
4815 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00004816 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00004817){
4818 sqlite3_stmt *pQuery = 0;
4819 char *zQuery = 0;
4820 int rc;
4821 const unsigned char *zName;
4822 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00004823 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00004824
4825 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4826 " WHERE %s", zWhere);
4827 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4828 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004829 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004830 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4831 zQuery);
4832 goto end_schema_xfer;
4833 }
4834 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4835 zName = sqlite3_column_text(pQuery, 0);
4836 zSql = sqlite3_column_text(pQuery, 1);
4837 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00004838 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4839 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004840 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00004841 sqlite3_free(zErrMsg);
4842 zErrMsg = 0;
4843 }
drh3350ce92014-02-06 00:49:12 +00004844 if( xForEach ){
4845 xForEach(p, newDb, (const char*)zName);
4846 }
4847 printf("done\n");
4848 }
4849 if( rc!=SQLITE_DONE ){
4850 sqlite3_finalize(pQuery);
4851 sqlite3_free(zQuery);
4852 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4853 " WHERE %s ORDER BY rowid DESC", zWhere);
4854 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4855 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004856 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00004857 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4858 zQuery);
4859 goto end_schema_xfer;
4860 }
4861 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4862 zName = sqlite3_column_text(pQuery, 0);
4863 zSql = sqlite3_column_text(pQuery, 1);
4864 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00004865 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4866 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004867 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00004868 sqlite3_free(zErrMsg);
4869 zErrMsg = 0;
4870 }
drh3350ce92014-02-06 00:49:12 +00004871 if( xForEach ){
4872 xForEach(p, newDb, (const char*)zName);
4873 }
4874 printf("done\n");
4875 }
4876 }
4877end_schema_xfer:
4878 sqlite3_finalize(pQuery);
4879 sqlite3_free(zQuery);
4880}
4881
4882/*
4883** Open a new database file named "zNewDb". Try to recover as much information
4884** as possible out of the main database (which might be corrupt) and write it
4885** into zNewDb.
4886*/
drhdcd87a92014-08-18 13:45:42 +00004887static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00004888 int rc;
4889 sqlite3 *newDb = 0;
4890 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004891 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00004892 return;
4893 }
4894 rc = sqlite3_open(zNewDb, &newDb);
4895 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004896 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00004897 sqlite3_errmsg(newDb));
4898 }else{
drh54d0d2d2014-04-03 00:32:13 +00004899 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00004900 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00004901 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
4902 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00004903 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00004904 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00004905 }
4906 sqlite3_close(newDb);
4907}
4908
4909/*
drhc2ce0be2014-05-29 12:36:14 +00004910** Change the output file back to stdout
4911*/
drhdcd87a92014-08-18 13:45:42 +00004912static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00004913 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004914#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00004915 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00004916#endif
drhc2ce0be2014-05-29 12:36:14 +00004917 }else{
4918 output_file_close(p->out);
4919 }
4920 p->outfile[0] = 0;
4921 p->out = stdout;
4922}
4923
4924/*
drhf7502f02015-02-06 14:19:44 +00004925** Run an SQL command and return the single integer result.
4926*/
4927static int db_int(ShellState *p, const char *zSql){
4928 sqlite3_stmt *pStmt;
4929 int res = 0;
4930 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4931 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
4932 res = sqlite3_column_int(pStmt,0);
4933 }
4934 sqlite3_finalize(pStmt);
4935 return res;
4936}
4937
4938/*
4939** Convert a 2-byte or 4-byte big-endian integer into a native integer
4940*/
drha0620ac2016-07-13 13:05:13 +00004941static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00004942 return (a[0]<<8) + a[1];
4943}
drha0620ac2016-07-13 13:05:13 +00004944static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00004945 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
4946}
4947
4948/*
4949** Implementation of the ".info" command.
4950**
4951** Return 1 on error, 2 to exit, and 0 otherwise.
4952*/
drh0e55db12015-02-06 14:51:13 +00004953static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00004954 static const struct { const char *zName; int ofst; } aField[] = {
4955 { "file change counter:", 24 },
4956 { "database page count:", 28 },
4957 { "freelist page count:", 36 },
4958 { "schema cookie:", 40 },
4959 { "schema format:", 44 },
4960 { "default cache size:", 48 },
4961 { "autovacuum top root:", 52 },
4962 { "incremental vacuum:", 64 },
4963 { "text encoding:", 56 },
4964 { "user version:", 60 },
4965 { "application id:", 68 },
4966 { "software version:", 96 },
4967 };
drh0e55db12015-02-06 14:51:13 +00004968 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4969 { "number of tables:",
4970 "SELECT count(*) FROM %s WHERE type='table'" },
4971 { "number of indexes:",
4972 "SELECT count(*) FROM %s WHERE type='index'" },
4973 { "number of triggers:",
4974 "SELECT count(*) FROM %s WHERE type='trigger'" },
4975 { "number of views:",
4976 "SELECT count(*) FROM %s WHERE type='view'" },
4977 { "schema size:",
4978 "SELECT total(length(sql)) FROM %s" },
4979 };
mistachkinbfe8bd52015-11-17 19:17:14 +00004980 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00004981 int i;
4982 char *zSchemaTab;
4983 char *zDb = nArg>=2 ? azArg[1] : "main";
4984 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00004985 open_db(p, 0);
4986 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00004987 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00004988 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
4989 return 1;
4990 }
4991 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
4992 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004993 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00004994 return 1;
4995 }
4996 i = get2byteInt(aHdr+16);
4997 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00004998 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4999 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5000 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5001 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00005002 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00005003 int ofst = aField[i].ofst;
5004 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00005005 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00005006 switch( ofst ){
5007 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00005008 if( val==1 ) raw_printf(p->out, " (utf8)");
5009 if( val==2 ) raw_printf(p->out, " (utf16le)");
5010 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00005011 }
5012 }
mistachkinaae280e2015-12-31 19:06:24 +00005013 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00005014 }
drh0e55db12015-02-06 14:51:13 +00005015 if( zDb==0 ){
5016 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
5017 }else if( strcmp(zDb,"temp")==0 ){
5018 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
5019 }else{
5020 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
5021 }
drhf5ed7ad2015-06-15 14:43:25 +00005022 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00005023 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5024 int val = db_int(p, zSql);
5025 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00005026 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00005027 }
5028 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00005029 return 0;
5030}
5031
dand95bb392015-09-30 11:19:05 +00005032/*
5033** Print the current sqlite3_errmsg() value to stderr and return 1.
5034*/
5035static int shellDatabaseError(sqlite3 *db){
5036 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00005037 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00005038 return 1;
5039}
5040
5041/*
5042** Print an out-of-memory message to stderr and return 1.
5043*/
5044static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00005045 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00005046 return 1;
5047}
drhf7502f02015-02-06 14:19:44 +00005048
drh2db82112016-09-15 21:35:24 +00005049/*
5050** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
5051** if they match and FALSE (0) if they do not match.
5052**
5053** Globbing rules:
5054**
5055** '*' Matches any sequence of zero or more characters.
5056**
5057** '?' Matches exactly one character.
5058**
5059** [...] Matches one character from the enclosed list of
5060** characters.
5061**
5062** [^...] Matches one character not in the enclosed list.
5063**
5064** '#' Matches any sequence of one or more digits with an
5065** optional + or - sign in front
5066**
5067** ' ' Any span of whitespace matches any other span of
5068** whitespace.
5069**
5070** Extra whitespace at the end of z[] is ignored.
5071*/
5072static int testcase_glob(const char *zGlob, const char *z){
5073 int c, c2;
5074 int invert;
5075 int seen;
5076
5077 while( (c = (*(zGlob++)))!=0 ){
5078 if( IsSpace(c) ){
5079 if( !IsSpace(*z) ) return 0;
5080 while( IsSpace(*zGlob) ) zGlob++;
5081 while( IsSpace(*z) ) z++;
5082 }else if( c=='*' ){
5083 while( (c=(*(zGlob++))) == '*' || c=='?' ){
5084 if( c=='?' && (*(z++))==0 ) return 0;
5085 }
5086 if( c==0 ){
5087 return 1;
5088 }else if( c=='[' ){
5089 while( *z && testcase_glob(zGlob-1,z)==0 ){
5090 z++;
5091 }
5092 return (*z)!=0;
5093 }
5094 while( (c2 = (*(z++)))!=0 ){
5095 while( c2!=c ){
5096 c2 = *(z++);
5097 if( c2==0 ) return 0;
5098 }
5099 if( testcase_glob(zGlob,z) ) return 1;
5100 }
5101 return 0;
5102 }else if( c=='?' ){
5103 if( (*(z++))==0 ) return 0;
5104 }else if( c=='[' ){
5105 int prior_c = 0;
5106 seen = 0;
5107 invert = 0;
5108 c = *(z++);
5109 if( c==0 ) return 0;
5110 c2 = *(zGlob++);
5111 if( c2=='^' ){
5112 invert = 1;
5113 c2 = *(zGlob++);
5114 }
5115 if( c2==']' ){
5116 if( c==']' ) seen = 1;
5117 c2 = *(zGlob++);
5118 }
5119 while( c2 && c2!=']' ){
5120 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5121 c2 = *(zGlob++);
5122 if( c>=prior_c && c<=c2 ) seen = 1;
5123 prior_c = 0;
5124 }else{
5125 if( c==c2 ){
5126 seen = 1;
5127 }
5128 prior_c = c2;
5129 }
5130 c2 = *(zGlob++);
5131 }
5132 if( c2==0 || (seen ^ invert)==0 ) return 0;
5133 }else if( c=='#' ){
5134 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5135 if( !IsDigit(z[0]) ) return 0;
5136 z++;
5137 while( IsDigit(z[0]) ){ z++; }
5138 }else{
5139 if( c!=(*(z++)) ) return 0;
5140 }
5141 }
5142 while( IsSpace(*z) ){ z++; }
5143 return *z==0;
5144}
drh2db82112016-09-15 21:35:24 +00005145
5146
drhf7502f02015-02-06 14:19:44 +00005147/*
drh4926fec2016-04-13 15:33:42 +00005148** Compare the string as a command-line option with either one or two
5149** initial "-" characters.
5150*/
5151static int optionMatch(const char *zStr, const char *zOpt){
5152 if( zStr[0]!='-' ) return 0;
5153 zStr++;
5154 if( zStr[0]=='-' ) zStr++;
5155 return strcmp(zStr, zOpt)==0;
5156}
5157
5158/*
drhcd0509e2016-09-16 00:26:08 +00005159** Delete a file.
5160*/
5161int shellDeleteFile(const char *zFilename){
5162 int rc;
5163#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00005164 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00005165 rc = _wunlink(z);
5166 sqlite3_free(z);
5167#else
5168 rc = unlink(zFilename);
5169#endif
5170 return rc;
5171}
5172
dan35ac58e2016-12-14 19:28:27 +00005173
dan35ac58e2016-12-14 19:28:27 +00005174/*
dandd9e0be2016-12-16 16:44:27 +00005175** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00005176** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00005177** called with four arguments - the parent table name, the parent column name,
5178** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00005179**
5180** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
5181**
5182** If either of the named tables or columns do not exist, this function
mistachkine16a3502017-05-29 03:48:13 +00005183** returns an empty string. An empty string is also returned if both tables
dan35ac58e2016-12-14 19:28:27 +00005184** and columns exist but have the same default collation sequence. Or,
5185** if both exist but the default collation sequences are different, this
5186** function returns the string " COLLATE <parent-collation>", where
5187** <parent-collation> is the default collation sequence of the parent column.
5188*/
5189static void shellFkeyCollateClause(
mistachkine16a3502017-05-29 03:48:13 +00005190 sqlite3_context *pCtx,
5191 int nVal,
dan35ac58e2016-12-14 19:28:27 +00005192 sqlite3_value **apVal
5193){
5194 sqlite3 *db = sqlite3_context_db_handle(pCtx);
5195 const char *zParent;
5196 const char *zParentCol;
5197 const char *zParentSeq;
5198 const char *zChild;
5199 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00005200 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00005201 int rc;
mistachkine16a3502017-05-29 03:48:13 +00005202
dan35ac58e2016-12-14 19:28:27 +00005203 assert( nVal==4 );
5204 zParent = (const char*)sqlite3_value_text(apVal[0]);
5205 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
5206 zChild = (const char*)sqlite3_value_text(apVal[2]);
5207 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
5208
5209 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
5210 rc = sqlite3_table_column_metadata(
5211 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
5212 );
5213 if( rc==SQLITE_OK ){
5214 rc = sqlite3_table_column_metadata(
5215 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
5216 );
5217 }
5218
5219 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
5220 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
5221 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
5222 sqlite3_free(z);
5223 }
5224}
5225
5226
5227/*
dan3c7ebeb2016-12-16 17:28:56 +00005228** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00005229*/
dan3c7ebeb2016-12-16 17:28:56 +00005230static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00005231 ShellState *pState, /* Current shell tool state */
5232 char **azArg, /* Array of arguments passed to dot command */
5233 int nArg /* Number of entries in azArg[] */
5234){
dandd9e0be2016-12-16 16:44:27 +00005235 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
5236 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00005237 int bVerbose = 0; /* If -verbose is present */
5238 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00005239 int i; /* To iterate through azArg[] */
5240 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
5241 int rc; /* Return code */
5242 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00005243
dandd9e0be2016-12-16 16:44:27 +00005244 /*
5245 ** This SELECT statement returns one row for each foreign key constraint
5246 ** in the schema of the main database. The column values are:
5247 **
5248 ** 0. The text of an SQL statement similar to:
5249 **
5250 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
5251 **
5252 ** This is the same SELECT that the foreign keys implementation needs
5253 ** to run internally on child tables. If there is an index that can
5254 ** be used to optimize this query, then it can also be used by the FK
5255 ** implementation to optimize DELETE or UPDATE statements on the parent
5256 ** table.
5257 **
5258 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
5259 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
5260 ** contains an index that can be used to optimize the query.
5261 **
5262 ** 2. Human readable text that describes the child table and columns. e.g.
5263 **
5264 ** "child_table(child_key1, child_key2)"
5265 **
5266 ** 3. Human readable text that describes the parent table and columns. e.g.
5267 **
5268 ** "parent_table(parent_key1, parent_key2)"
5269 **
5270 ** 4. A full CREATE INDEX statement for an index that could be used to
5271 ** optimize DELETE or UPDATE statements on the parent table. e.g.
5272 **
5273 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
5274 **
5275 ** 5. The name of the parent table.
5276 **
5277 ** These six values are used by the C logic below to generate the report.
5278 */
dan35ac58e2016-12-14 19:28:27 +00005279 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00005280 "SELECT "
5281 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
5282 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
dan50da9382017-04-06 12:06:56 +00005283 " || fkey_collate_clause("
5284 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00005285 ", "
dandd9e0be2016-12-16 16:44:27 +00005286 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00005287 " || group_concat('*=?', ' AND ') || ')'"
5288 ", "
dandd9e0be2016-12-16 16:44:27 +00005289 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00005290 ", "
dan50da9382017-04-06 12:06:56 +00005291 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
dan35ac58e2016-12-14 19:28:27 +00005292 ", "
dandd9e0be2016-12-16 16:44:27 +00005293 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
5294 " || ' ON ' || quote(s.name) || '('"
5295 " || group_concat(quote(f.[from]) ||"
dan50da9382017-04-06 12:06:56 +00005296 " fkey_collate_clause("
5297 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00005298 " || ');'"
danf9647b62016-12-15 06:01:40 +00005299 ", "
dandd9e0be2016-12-16 16:44:27 +00005300 " f.[table] "
dandd9e0be2016-12-16 16:44:27 +00005301 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
dan50da9382017-04-06 12:06:56 +00005302 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
dandd9e0be2016-12-16 16:44:27 +00005303 "GROUP BY s.name, f.id "
5304 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00005305 ;
dan54e2efc2017-04-06 14:56:26 +00005306 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
dan35ac58e2016-12-14 19:28:27 +00005307
dan3c7ebeb2016-12-16 17:28:56 +00005308 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00005309 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00005310 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
5311 bVerbose = 1;
5312 }
5313 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
5314 bGroupByParent = 1;
5315 zIndent = " ";
5316 }
5317 else{
dan3c7ebeb2016-12-16 17:28:56 +00005318 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
5319 azArg[0], azArg[1]
5320 );
danf9647b62016-12-15 06:01:40 +00005321 return SQLITE_ERROR;
5322 }
dan35ac58e2016-12-14 19:28:27 +00005323 }
mistachkine16a3502017-05-29 03:48:13 +00005324
dan35ac58e2016-12-14 19:28:27 +00005325 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00005326 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
5327 0, shellFkeyCollateClause, 0, 0
5328 );
dan35ac58e2016-12-14 19:28:27 +00005329
5330
5331 if( rc==SQLITE_OK ){
5332 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
5333 }
danf9647b62016-12-15 06:01:40 +00005334 if( rc==SQLITE_OK ){
5335 sqlite3_bind_int(pSql, 1, bGroupByParent);
5336 }
dan35ac58e2016-12-14 19:28:27 +00005337
5338 if( rc==SQLITE_OK ){
5339 int rc2;
danf9647b62016-12-15 06:01:40 +00005340 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00005341 while( SQLITE_ROW==sqlite3_step(pSql) ){
5342 int res = -1;
5343 sqlite3_stmt *pExplain = 0;
5344 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
5345 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
5346 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
5347 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
5348 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00005349 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00005350
5351 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
5352 if( rc!=SQLITE_OK ) break;
5353 if( SQLITE_ROW==sqlite3_step(pExplain) ){
5354 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
dan54e2efc2017-04-06 14:56:26 +00005355 res = (
5356 0==sqlite3_strglob(zGlob, zPlan)
5357 || 0==sqlite3_strglob(zGlobIPK, zPlan)
5358 );
dan35ac58e2016-12-14 19:28:27 +00005359 }
5360 rc = sqlite3_finalize(pExplain);
5361 if( rc!=SQLITE_OK ) break;
5362
5363 if( res<0 ){
5364 raw_printf(stderr, "Error: internal error");
5365 break;
danf9647b62016-12-15 06:01:40 +00005366 }else{
mistachkine16a3502017-05-29 03:48:13 +00005367 if( bGroupByParent
danf9647b62016-12-15 06:01:40 +00005368 && (bVerbose || res==0)
mistachkine16a3502017-05-29 03:48:13 +00005369 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
danf9647b62016-12-15 06:01:40 +00005370 ){
5371 raw_printf(out, "-- Parent table %s\n", zParent);
5372 sqlite3_free(zPrev);
5373 zPrev = sqlite3_mprintf("%s", zParent);
5374 }
5375
5376 if( res==0 ){
5377 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
5378 }else if( bVerbose ){
mistachkine16a3502017-05-29 03:48:13 +00005379 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
danf9647b62016-12-15 06:01:40 +00005380 zIndent, zFrom, zTarget
5381 );
5382 }
dan35ac58e2016-12-14 19:28:27 +00005383 }
5384 }
danf9647b62016-12-15 06:01:40 +00005385 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00005386
5387 if( rc!=SQLITE_OK ){
5388 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5389 }
5390
5391 rc2 = sqlite3_finalize(pSql);
5392 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
5393 rc = rc2;
5394 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5395 }
5396 }else{
5397 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5398 }
5399
5400 return rc;
5401}
dan3c7ebeb2016-12-16 17:28:56 +00005402
dan35ac58e2016-12-14 19:28:27 +00005403/*
dan3c7ebeb2016-12-16 17:28:56 +00005404** Implementation of ".lint" dot command.
5405*/
5406static int lintDotCommand(
5407 ShellState *pState, /* Current shell tool state */
5408 char **azArg, /* Array of arguments passed to dot command */
5409 int nArg /* Number of entries in azArg[] */
5410){
5411 int n;
drh96ada592016-12-29 19:48:46 +00005412 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00005413 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
5414 return lintFkeyIndexes(pState, azArg, nArg);
5415
5416 usage:
5417 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
5418 raw_printf(stderr, "Where sub-commands are:\n");
5419 raw_printf(stderr, " fkey-indexes\n");
5420 return SQLITE_ERROR;
5421}
5422
dan35ac58e2016-12-14 19:28:27 +00005423
drhcd0509e2016-09-16 00:26:08 +00005424/*
drh75897232000-05-29 14:26:00 +00005425** If an input line begins with "." then invoke this routine to
5426** process that line.
drh67505e72002-04-19 12:34:06 +00005427**
drh47ad6842006-11-08 12:25:42 +00005428** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00005429*/
drhdcd87a92014-08-18 13:45:42 +00005430static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00005431 int h = 1;
drh75897232000-05-29 14:26:00 +00005432 int nArg = 0;
5433 int n, c;
drh67505e72002-04-19 12:34:06 +00005434 int rc = 0;
drh75897232000-05-29 14:26:00 +00005435 char *azArg[50];
5436
5437 /* Parse the input line into tokens.
5438 */
mistachkin8e189222015-04-19 21:43:16 +00005439 while( zLine[h] && nArg<ArraySize(azArg) ){
5440 while( IsSpace(zLine[h]) ){ h++; }
5441 if( zLine[h]==0 ) break;
5442 if( zLine[h]=='\'' || zLine[h]=='"' ){
5443 int delim = zLine[h++];
5444 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00005445 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00005446 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00005447 h++;
drh4c56b992013-06-27 13:26:55 +00005448 }
mistachkin8e189222015-04-19 21:43:16 +00005449 if( zLine[h]==delim ){
5450 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00005451 }
drhfeac5f82004-08-01 00:10:45 +00005452 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00005453 }else{
mistachkin8e189222015-04-19 21:43:16 +00005454 azArg[nArg++] = &zLine[h];
5455 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
5456 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00005457 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00005458 }
5459 }
5460
5461 /* Process the input line.
5462 */
shane9bd1b442009-10-23 01:27:39 +00005463 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00005464 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00005465 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00005466
drha0daa752016-09-16 11:53:10 +00005467#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00005468 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
5469 if( nArg!=2 ){
5470 raw_printf(stderr, "Usage: .auth ON|OFF\n");
5471 rc = 1;
5472 goto meta_command_exit;
5473 }
5474 open_db(p, 0);
5475 if( booleanValue(azArg[1]) ){
5476 sqlite3_set_authorizer(p->db, shellAuth, p);
5477 }else{
5478 sqlite3_set_authorizer(p->db, 0, 0);
5479 }
5480 }else
drha0daa752016-09-16 11:53:10 +00005481#endif
drhde613c62016-04-04 17:23:10 +00005482
drh5c7976f2014-02-10 19:59:27 +00005483 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
5484 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
5485 ){
drhbc46f022013-01-23 18:53:23 +00005486 const char *zDestFile = 0;
5487 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00005488 sqlite3 *pDest;
5489 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00005490 int j;
5491 for(j=1; j<nArg; j++){
5492 const char *z = azArg[j];
5493 if( z[0]=='-' ){
5494 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00005495 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00005496 {
mistachkinaae280e2015-12-31 19:06:24 +00005497 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00005498 return 1;
5499 }
5500 }else if( zDestFile==0 ){
5501 zDestFile = azArg[j];
5502 }else if( zDb==0 ){
5503 zDb = zDestFile;
5504 zDestFile = azArg[j];
5505 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005506 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00005507 return 1;
5508 }
drh9ff849f2009-02-04 20:55:57 +00005509 }
drhbc46f022013-01-23 18:53:23 +00005510 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005511 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00005512 return 1;
5513 }
5514 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00005515 rc = sqlite3_open(zDestFile, &pDest);
5516 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005517 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00005518 sqlite3_close(pDest);
5519 return 1;
5520 }
drh05782482013-10-24 15:20:20 +00005521 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005522 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
5523 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005524 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00005525 sqlite3_close(pDest);
5526 return 1;
5527 }
5528 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
5529 sqlite3_backup_finish(pBackup);
5530 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005531 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00005532 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005533 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00005534 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005535 }
5536 sqlite3_close(pDest);
5537 }else
5538
drhc2ce0be2014-05-29 12:36:14 +00005539 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
5540 if( nArg==2 ){
5541 bail_on_error = booleanValue(azArg[1]);
5542 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005543 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005544 rc = 1;
5545 }
drhc49f44e2006-10-26 18:15:42 +00005546 }else
5547
mistachkinf21979d2015-01-18 05:35:01 +00005548 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
5549 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00005550 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00005551 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00005552 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00005553 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00005554 }
mistachkinf21979d2015-01-18 05:35:01 +00005555 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005556 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00005557 rc = 1;
5558 }
5559 }else
5560
drh453ca042017-05-22 18:00:34 +00005561 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
5562 if( nArg==2 ){
5563#if defined(_WIN32) || defined(WIN32)
5564 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
5565 rc = !SetCurrentDirectoryW(z);
5566 sqlite3_free(z);
5567#else
5568 rc = chdir(azArg[1]);
5569#endif
5570 if( rc ){
5571 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
5572 rc = 1;
5573 }
5574 }else{
5575 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
5576 rc = 1;
5577 }
5578 }else
5579
drhd8621b92012-04-17 09:09:33 +00005580 /* The undocumented ".breakpoint" command causes a call to the no-op
5581 ** routine named test_breakpoint().
5582 */
5583 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
5584 test_breakpoint();
5585 }else
5586
drhdf12f1c2015-12-07 21:46:19 +00005587 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
5588 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00005589 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
drhdf12f1c2015-12-07 21:46:19 +00005590 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005591 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00005592 rc = 1;
5593 }
5594 }else
5595
drh2db82112016-09-15 21:35:24 +00005596 /* Cancel output redirection, if it is currently set (by .testcase)
5597 ** Then read the content of the testcase-out.txt file and compare against
5598 ** azArg[1]. If there are differences, report an error and exit.
5599 */
5600 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
5601 char *zRes = 0;
5602 output_reset(p);
5603 if( nArg!=2 ){
5604 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00005605 rc = 2;
dan11da0022016-12-17 08:18:05 +00005606 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00005607 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
5608 rc = 2;
5609 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00005610 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00005611 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
5612 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00005613 rc = 2;
drh760c8162016-09-16 02:52:22 +00005614 }else{
mistachkin8145fc62016-09-16 20:39:21 +00005615 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00005616 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00005617 }
5618 sqlite3_free(zRes);
5619 }else
drh2db82112016-09-15 21:35:24 +00005620
drhc2ce0be2014-05-29 12:36:14 +00005621 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
5622 if( nArg==2 ){
5623 tryToClone(p, azArg[1]);
5624 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005625 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005626 rc = 1;
5627 }
mistachkine31ae902014-02-06 01:15:29 +00005628 }else
5629
drhc2ce0be2014-05-29 12:36:14 +00005630 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005631 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00005632 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005633 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00005634 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00005635 data.showHeader = 0;
5636 data.cMode = data.mode = MODE_List;
5637 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00005638 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00005639 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
5640 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00005641 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005642 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005643 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005644 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00005645 }
5646 }else
5647
drh0e55db12015-02-06 14:51:13 +00005648 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
5649 rc = shell_dbinfo_command(p, nArg, azArg);
5650 }else
5651
drhc2ce0be2014-05-29 12:36:14 +00005652 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00005653 const char *zLike = 0;
5654 int i;
drh72507d42017-04-08 00:55:13 +00005655 int savedShowHeader = p->showHeader;
drhdbc26722017-07-10 18:04:41 +00005656 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
drhe611f142017-03-08 11:44:00 +00005657 for(i=1; i<nArg; i++){
5658 if( azArg[i][0]=='-' ){
5659 const char *z = azArg[i]+1;
5660 if( z[0]=='-' ) z++;
5661 if( strcmp(z,"preserve-rowids")==0 ){
drh34ad36b2017-03-25 18:15:05 +00005662#ifdef SQLITE_OMIT_VIRTUALTABLE
5663 raw_printf(stderr, "The --preserve-rowids option is not compatible"
5664 " with SQLITE_OMIT_VIRTUALTABLE\n");
5665 rc = 1;
5666 goto meta_command_exit;
5667#else
drhe6e1d122017-03-09 13:50:49 +00005668 ShellSetFlag(p, SHFLG_PreserveRowid);
drh34ad36b2017-03-25 18:15:05 +00005669#endif
drhe611f142017-03-08 11:44:00 +00005670 }else
drhdbc26722017-07-10 18:04:41 +00005671 if( strcmp(z,"newlines")==0 ){
5672 ShellSetFlag(p, SHFLG_Newlines);
5673 }else
drhe611f142017-03-08 11:44:00 +00005674 {
5675 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
5676 rc = 1;
5677 goto meta_command_exit;
5678 }
5679 }else if( zLike ){
drhdbc26722017-07-10 18:04:41 +00005680 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
5681 "?--newlines? ?LIKE-PATTERN?\n");
drhe611f142017-03-08 11:44:00 +00005682 rc = 1;
5683 goto meta_command_exit;
5684 }else{
5685 zLike = azArg[i];
5686 }
5687 }
drh05782482013-10-24 15:20:20 +00005688 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00005689 /* When playing back a "dump", the content might appear in an order
5690 ** which causes immediate foreign key constraints to be violated.
5691 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00005692 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
5693 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00005694 p->writableSchema = 0;
drh72507d42017-04-08 00:55:13 +00005695 p->showHeader = 0;
drhe611f142017-03-08 11:44:00 +00005696 /* Set writable_schema=ON since doing so forces SQLite to initialize
5697 ** as much of the schema as it can even if the sqlite_master table is
5698 ** corrupt. */
drh56197952011-10-13 16:30:13 +00005699 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00005700 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00005701 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00005702 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00005703 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00005704 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00005705 );
mistachkin1fe36bb2016-04-04 02:16:44 +00005706 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00005707 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00005708 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00005709 );
drh2f464a02011-10-13 00:41:49 +00005710 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00005711 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00005712 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00005713 );
drh4c653a02000-06-07 01:27:47 +00005714 }else{
drhe611f142017-03-08 11:44:00 +00005715 char *zSql;
5716 zSql = sqlite3_mprintf(
5717 "SELECT name, type, sql FROM sqlite_master "
5718 "WHERE tbl_name LIKE %Q AND type=='table'"
5719 " AND sql NOT NULL", zLike);
5720 run_schema_dump_query(p,zSql);
5721 sqlite3_free(zSql);
5722 zSql = sqlite3_mprintf(
5723 "SELECT sql FROM sqlite_master "
5724 "WHERE sql NOT NULL"
5725 " AND type IN ('index','trigger','view')"
5726 " AND tbl_name LIKE %Q", zLike);
5727 run_table_dump_query(p, zSql, 0);
5728 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00005729 }
drh45e29d82006-11-20 16:21:10 +00005730 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00005731 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00005732 p->writableSchema = 0;
5733 }
drh56197952011-10-13 16:30:13 +00005734 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5735 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00005736 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh72507d42017-04-08 00:55:13 +00005737 p->showHeader = savedShowHeader;
drh4c653a02000-06-07 01:27:47 +00005738 }else
drh75897232000-05-29 14:26:00 +00005739
drhc2ce0be2014-05-29 12:36:14 +00005740 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
5741 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00005742 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005743 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005744 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005745 rc = 1;
5746 }
drhdaffd0e2001-04-11 14:28:42 +00005747 }else
5748
drhc2ce0be2014-05-29 12:36:14 +00005749 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
5750 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00005751 if( strcmp(azArg[1],"full")==0 ){
5752 p->autoEQP = 2;
5753 }else{
5754 p->autoEQP = booleanValue(azArg[1]);
5755 }
drhc2ce0be2014-05-29 12:36:14 +00005756 }else{
drheacd29d2016-04-15 15:03:27 +00005757 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00005758 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00005759 }
drhefbf3b12014-02-28 20:47:24 +00005760 }else
5761
drhd3ac7d92013-01-25 18:33:43 +00005762 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00005763 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00005764 rc = 2;
drh75897232000-05-29 14:26:00 +00005765 }else
5766
drhc31b79d2017-06-29 21:11:27 +00005767 /* The ".explain" command is automatic now. It is largely pointless. It
5768 ** retained purely for backwards compatibility */
drhc2ce0be2014-05-29 12:36:14 +00005769 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00005770 int val = 1;
5771 if( nArg>=2 ){
5772 if( strcmp(azArg[1],"auto")==0 ){
5773 val = 99;
5774 }else{
5775 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00005776 }
drh700c2522016-02-09 18:39:25 +00005777 }
5778 if( val==1 && p->mode!=MODE_Explain ){
5779 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00005780 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00005781 p->autoExplain = 0;
5782 }else if( val==0 ){
5783 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5784 p->autoExplain = 0;
5785 }else if( val==99 ){
5786 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5787 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005788 }
drh75897232000-05-29 14:26:00 +00005789 }else
5790
drhc1971542014-06-23 23:28:13 +00005791 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005792 ShellState data;
drhc1971542014-06-23 23:28:13 +00005793 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00005794 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00005795 memcpy(&data, p, sizeof(data));
5796 data.showHeader = 0;
5797 data.cMode = data.mode = MODE_Semi;
5798 if( nArg==2 && optionMatch(azArg[1], "indent") ){
5799 data.cMode = data.mode = MODE_Pretty;
5800 nArg = 1;
5801 }
drhc1971542014-06-23 23:28:13 +00005802 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00005803 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00005804 rc = 1;
5805 goto meta_command_exit;
5806 }
5807 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00005808 rc = sqlite3_exec(p->db,
5809 "SELECT sql FROM"
5810 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
5811 " FROM sqlite_master UNION ALL"
5812 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005813 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00005814 "ORDER BY rowid",
5815 callback, &data, &zErrMsg
5816 );
drh56f674c2014-07-18 14:43:29 +00005817 if( rc==SQLITE_OK ){
5818 sqlite3_stmt *pStmt;
5819 rc = sqlite3_prepare_v2(p->db,
5820 "SELECT rowid FROM sqlite_master"
5821 " WHERE name GLOB 'sqlite_stat[134]'",
5822 -1, &pStmt, 0);
5823 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
5824 sqlite3_finalize(pStmt);
5825 }
5826 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005827 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00005828 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005829 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00005830 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
5831 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00005832 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00005833 data.zDestTable = "sqlite_stat1";
5834 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
5835 shell_callback, &data,&zErrMsg);
5836 data.zDestTable = "sqlite_stat3";
5837 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
5838 shell_callback, &data,&zErrMsg);
5839 data.zDestTable = "sqlite_stat4";
5840 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
5841 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00005842 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00005843 }
drhc1971542014-06-23 23:28:13 +00005844 }else
5845
drhc2ce0be2014-05-29 12:36:14 +00005846 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
5847 if( nArg==2 ){
5848 p->showHeader = booleanValue(azArg[1]);
5849 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005850 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00005851 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00005852 }
drh75897232000-05-29 14:26:00 +00005853 }else
5854
drhc2ce0be2014-05-29 12:36:14 +00005855 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005856 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00005857 }else
5858
5859 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00005860 char *zTable; /* Insert data into this table */
5861 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00005862 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00005863 int nCol; /* Number of columns in the table */
5864 int nByte; /* Number of bytes in an SQL string */
5865 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00005866 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00005867 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00005868 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00005869 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00005870 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
5871 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00005872
drhc2ce0be2014-05-29 12:36:14 +00005873 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005874 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00005875 goto meta_command_exit;
5876 }
drh01f37542014-05-31 15:43:33 +00005877 zFile = azArg[1];
5878 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00005879 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00005880 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00005881 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00005882 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00005883 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005884 raw_printf(stderr,
5885 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00005886 return 1;
drhfeac5f82004-08-01 00:10:45 +00005887 }
drhdb95f682013-06-26 22:46:00 +00005888 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005889 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00005890 " for import\n");
5891 return 1;
5892 }
mistachkin636bf9f2014-07-19 20:15:16 +00005893 nSep = strlen30(p->rowSeparator);
5894 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005895 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005896 return 1;
5897 }
mistachkine0d68852014-12-11 03:12:33 +00005898 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
5899 /* When importing CSV (only), if the row separator is set to the
5900 ** default output row separator, change it to the default input
5901 ** row separator. This avoids having to maintain different input
5902 ** and output row separators. */
5903 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
5904 nSep = strlen30(p->rowSeparator);
5905 }
mistachkin636bf9f2014-07-19 20:15:16 +00005906 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005907 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00005908 " for import\n");
5909 return 1;
5910 }
5911 sCtx.zFile = zFile;
5912 sCtx.nLine = 1;
5913 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005914#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005915 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005916 return 1;
5917#else
mistachkin636bf9f2014-07-19 20:15:16 +00005918 sCtx.in = popen(sCtx.zFile+1, "r");
5919 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00005920 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00005921#endif
drh5bde8162013-06-27 14:07:53 +00005922 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00005923 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00005924 xCloser = fclose;
5925 }
mistachkin636bf9f2014-07-19 20:15:16 +00005926 if( p->mode==MODE_Ascii ){
5927 xRead = ascii_read_one_field;
5928 }else{
5929 xRead = csv_read_one_field;
5930 }
5931 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005932 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00005933 return 1;
5934 }
mistachkin636bf9f2014-07-19 20:15:16 +00005935 sCtx.cColSep = p->colSeparator[0];
5936 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00005937 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00005938 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005939 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005940 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005941 return 1;
5942 }
drh4f21c4a2008-12-10 22:15:00 +00005943 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00005944 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00005945 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00005946 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00005947 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
5948 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00005949 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00005950 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00005951 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00005952 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00005953 }
drh5bde8162013-06-27 14:07:53 +00005954 if( cSep=='(' ){
5955 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00005956 sqlite3_free(sCtx.z);
5957 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00005958 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00005959 return 1;
5960 }
drhdb95f682013-06-26 22:46:00 +00005961 zCreate = sqlite3_mprintf("%z\n)", zCreate);
5962 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
5963 sqlite3_free(zCreate);
5964 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00005965 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00005966 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00005967 sqlite3_free(sCtx.z);
5968 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00005969 return 1;
5970 }
drhc7181902014-02-27 15:04:13 +00005971 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00005972 }
drhfeac5f82004-08-01 00:10:45 +00005973 sqlite3_free(zSql);
5974 if( rc ){
shane916f9612009-10-23 00:37:15 +00005975 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00005976 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00005977 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005978 return 1;
drhfeac5f82004-08-01 00:10:45 +00005979 }
shane916f9612009-10-23 00:37:15 +00005980 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00005981 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00005982 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00005983 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00005984 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00005985 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005986 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00005987 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005988 return 1;
5989 }
drhdb95f682013-06-26 22:46:00 +00005990 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00005991 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00005992 for(i=1; i<nCol; i++){
5993 zSql[j++] = ',';
5994 zSql[j++] = '?';
5995 }
5996 zSql[j++] = ')';
5997 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00005998 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00005999 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00006000 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006001 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00006002 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00006003 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00006004 return 1;
drhfeac5f82004-08-01 00:10:45 +00006005 }
mistachkin8e189222015-04-19 21:43:16 +00006006 needCommit = sqlite3_get_autocommit(p->db);
6007 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00006008 do{
mistachkin636bf9f2014-07-19 20:15:16 +00006009 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00006010 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00006011 char *z = xRead(&sCtx);
6012 /*
6013 ** Did we reach end-of-file before finding any columns?
6014 ** If so, stop instead of NULL filling the remaining columns.
6015 */
drhdb95f682013-06-26 22:46:00 +00006016 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00006017 /*
6018 ** Did we reach end-of-file OR end-of-line before finding any
6019 ** columns in ASCII mode? If so, stop instead of NULL filling
6020 ** the remaining columns.
6021 */
6022 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00006023 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00006024 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00006025 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00006026 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00006027 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00006028 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00006029 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00006030 }
drhfeac5f82004-08-01 00:10:45 +00006031 }
mistachkin636bf9f2014-07-19 20:15:16 +00006032 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00006033 do{
mistachkin636bf9f2014-07-19 20:15:16 +00006034 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00006035 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00006036 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00006037 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00006038 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00006039 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00006040 }
drhdb95f682013-06-26 22:46:00 +00006041 if( i>=nCol ){
6042 sqlite3_step(pStmt);
6043 rc = sqlite3_reset(pStmt);
6044 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006045 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
6046 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00006047 }
6048 }
mistachkin636bf9f2014-07-19 20:15:16 +00006049 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00006050
mistachkin636bf9f2014-07-19 20:15:16 +00006051 xCloser(sCtx.in);
6052 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00006053 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00006054 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00006055 }else
6056
drhd12602a2016-12-07 15:49:02 +00006057#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00006058 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
6059 char *zSql;
6060 char *zCollist = 0;
6061 sqlite3_stmt *pStmt;
6062 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00006063 int i;
drh16eb5942016-11-03 13:01:38 +00006064 if( nArg!=3 ){
6065 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
6066 rc = 1;
6067 goto meta_command_exit;
6068 }
6069 open_db(p, 0);
6070 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
6071 " WHERE name='%q' AND type='index'", azArg[1]);
6072 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6073 sqlite3_free(zSql);
6074 if( sqlite3_step(pStmt)==SQLITE_ROW ){
6075 tnum = sqlite3_column_int(pStmt, 0);
6076 }
6077 sqlite3_finalize(pStmt);
6078 if( tnum==0 ){
6079 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
6080 rc = 1;
6081 goto meta_command_exit;
6082 }
6083 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
6084 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6085 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00006086 i = 0;
drh16eb5942016-11-03 13:01:38 +00006087 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00006088 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00006089 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00006090 i++;
6091 if( zCol==0 ){
6092 if( sqlite3_column_int(pStmt,1)==-1 ){
6093 zCol = "_ROWID_";
6094 }else{
6095 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
6096 zCol = zLabel;
6097 }
6098 }
drh16eb5942016-11-03 13:01:38 +00006099 if( zCollist==0 ){
6100 zCollist = sqlite3_mprintf("\"%w\"", zCol);
6101 }else{
6102 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
6103 }
6104 }
6105 sqlite3_finalize(pStmt);
6106 zSql = sqlite3_mprintf(
6107 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
6108 azArg[2], zCollist, zCollist);
6109 sqlite3_free(zCollist);
6110 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
6111 if( rc==SQLITE_OK ){
6112 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
6113 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
6114 if( rc ){
6115 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
6116 }else{
6117 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00006118 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00006119 "WARNING: writing to an imposter table will corrupt the index!\n"
6120 );
6121 }
6122 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00006123 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00006124 rc = 1;
6125 }
6126 sqlite3_free(zSql);
6127 }else
6128#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
6129
drhae5e4452007-05-03 17:18:36 +00006130#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00006131 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00006132 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00006133 if( iotrace && iotrace!=stdout ) fclose(iotrace);
6134 iotrace = 0;
6135 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00006136 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00006137 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00006138 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00006139 iotrace = stdout;
6140 }else{
6141 iotrace = fopen(azArg[1], "w");
6142 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006143 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00006144 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00006145 rc = 1;
drhb0603412007-02-28 04:47:26 +00006146 }else{
mlcreech3a00f902008-03-04 17:45:01 +00006147 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00006148 }
6149 }
6150 }else
drhae5e4452007-05-03 17:18:36 +00006151#endif
drh16eb5942016-11-03 13:01:38 +00006152
drh1a513372015-05-02 17:40:23 +00006153 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
6154 static const struct {
6155 const char *zLimitName; /* Name of a limit */
6156 int limitCode; /* Integer code for that limit */
6157 } aLimit[] = {
6158 { "length", SQLITE_LIMIT_LENGTH },
6159 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
6160 { "column", SQLITE_LIMIT_COLUMN },
6161 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
6162 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
6163 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
6164 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
6165 { "attached", SQLITE_LIMIT_ATTACHED },
6166 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
6167 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
6168 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
6169 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
6170 };
6171 int i, n2;
6172 open_db(p, 0);
6173 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00006174 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00006175 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00006176 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
6177 }
6178 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006179 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00006180 rc = 1;
6181 goto meta_command_exit;
6182 }else{
6183 int iLimit = -1;
6184 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006185 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00006186 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
6187 if( iLimit<0 ){
6188 iLimit = i;
6189 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006190 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00006191 rc = 1;
6192 goto meta_command_exit;
6193 }
6194 }
6195 }
6196 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006197 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00006198 "enter \".limits\" with no arguments for a list.\n",
6199 azArg[1]);
6200 rc = 1;
6201 goto meta_command_exit;
6202 }
6203 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00006204 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
6205 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00006206 }
6207 printf("%20s %d\n", aLimit[iLimit].zLimitName,
6208 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
6209 }
6210 }else
drhb0603412007-02-28 04:47:26 +00006211
dan3c7ebeb2016-12-16 17:28:56 +00006212 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00006213 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00006214 lintDotCommand(p, azArg, nArg);
6215 }else
6216
drh70df4fe2006-06-13 15:12:21 +00006217#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00006218 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00006219 const char *zFile, *zProc;
6220 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00006221 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006222 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00006223 rc = 1;
6224 goto meta_command_exit;
6225 }
drh1e397f82006-06-08 15:28:43 +00006226 zFile = azArg[1];
6227 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00006228 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00006229 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
6230 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006231 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00006232 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00006233 rc = 1;
drh1e397f82006-06-08 15:28:43 +00006234 }
6235 }else
drh70df4fe2006-06-13 15:12:21 +00006236#endif
drh1e397f82006-06-08 15:28:43 +00006237
drhc2ce0be2014-05-29 12:36:14 +00006238 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
6239 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006240 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00006241 rc = 1;
6242 }else{
6243 const char *zFile = azArg[1];
6244 output_file_close(p->pLog);
6245 p->pLog = output_file_open(zFile);
6246 }
drh127f9d72010-02-23 01:47:00 +00006247 }else
6248
drhc2ce0be2014-05-29 12:36:14 +00006249 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
6250 const char *zMode = nArg>=2 ? azArg[1] : "";
6251 int n2 = (int)strlen(zMode);
6252 int c2 = zMode[0];
6253 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006254 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00006255 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006256 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006257 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00006258 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006259 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00006260 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00006261 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
6262 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006263 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006264 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00006265 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00006266 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00006267 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00006268 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00006269 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00006270 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00006271 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00006272 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00006273 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00006274 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00006275 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00006276 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00006277 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00006278 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00006279 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
6280 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00006281 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
6282 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00006283 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
6284 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drha501f7d2017-06-29 21:33:25 +00006285 }else if( nArg==1 ){
6286 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
6287 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006288 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00006289 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00006290 rc = 1;
drh75897232000-05-29 14:26:00 +00006291 }
drh700c2522016-02-09 18:39:25 +00006292 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00006293 }else
6294
drhc2ce0be2014-05-29 12:36:14 +00006295 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
6296 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00006297 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
6298 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00006299 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006300 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00006301 rc = 1;
6302 }
6303 }else
6304
drh05782482013-10-24 15:20:20 +00006305 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00006306 char *zNewFilename; /* Name of the database file to open */
6307 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00006308 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00006309 /* Close the existing database */
6310 session_close_all(p);
6311 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00006312 p->db = 0;
dan21472212017-03-01 11:30:27 +00006313 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00006314 sqlite3_free(p->zFreeOnClose);
6315 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00006316 /* Check for command-line arguments */
6317 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
6318 const char *z = azArg[iName];
6319 if( optionMatch(z,"new") ){
6320 newFlag = 1;
6321 }else if( z[0]=='-' ){
6322 utf8_printf(stderr, "unknown option: %s\n", z);
6323 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00006324 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00006325 }
drhcd0509e2016-09-16 00:26:08 +00006326 }
6327 /* If a filename is specified, try to open it first */
6328 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
6329 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00006330 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00006331 p->zDbFilename = zNewFilename;
6332 open_db(p, 1);
6333 if( p->db==0 ){
6334 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
6335 sqlite3_free(zNewFilename);
6336 }else{
6337 p->zFreeOnClose = zNewFilename;
6338 }
6339 }
6340 if( p->db==0 ){
6341 /* As a fall-back open a TEMP database */
6342 p->zDbFilename = 0;
6343 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00006344 }
6345 }else
6346
drhc2ce0be2014-05-29 12:36:14 +00006347 if( c=='o'
6348 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
6349 ){
6350 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
6351 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006352 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00006353 rc = 1;
6354 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00006355 }
drhc2ce0be2014-05-29 12:36:14 +00006356 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
6357 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006358 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006359 rc = 1;
6360 goto meta_command_exit;
6361 }
6362 p->outCount = 2;
6363 }else{
6364 p->outCount = 0;
6365 }
6366 output_reset(p);
6367 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00006368#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00006369 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00006370 rc = 1;
6371 p->out = stdout;
6372#else
drhc2ce0be2014-05-29 12:36:14 +00006373 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00006374 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006375 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00006376 p->out = stdout;
6377 rc = 1;
6378 }else{
drhc2ce0be2014-05-29 12:36:14 +00006379 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00006380 }
drh8cd5b252015-03-02 22:06:43 +00006381#endif
drh75897232000-05-29 14:26:00 +00006382 }else{
drhc2ce0be2014-05-29 12:36:14 +00006383 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00006384 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006385 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006386 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00006387 }
drh75897232000-05-29 14:26:00 +00006388 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00006389 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00006390 } else {
drhc2ce0be2014-05-29 12:36:14 +00006391 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00006392 }
6393 }
6394 }else
6395
drh078b1fd2012-09-21 13:40:02 +00006396 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
6397 int i;
6398 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00006399 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00006400 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00006401 }
mistachkinaae280e2015-12-31 19:06:24 +00006402 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00006403 }else
6404
drhc2ce0be2014-05-29 12:36:14 +00006405 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00006406 if( nArg >= 2) {
6407 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
6408 }
6409 if( nArg >= 3) {
6410 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
6411 }
6412 }else
6413
drhc2ce0be2014-05-29 12:36:14 +00006414 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00006415 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00006416 }else
6417
drhc2ce0be2014-05-29 12:36:14 +00006418 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
6419 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00006420 if( nArg!=2 ){
6421 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006422 rc = 1;
6423 goto meta_command_exit;
6424 }
drh4e8142c2016-11-11 14:54:22 +00006425 alt = fopen(azArg[1], "rb");
6426 if( alt==0 ){
6427 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
6428 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00006429 }else{
drh4e8142c2016-11-11 14:54:22 +00006430 rc = process_input(p, alt);
6431 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00006432 }
6433 }else
6434
drhc2ce0be2014-05-29 12:36:14 +00006435 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00006436 const char *zSrcFile;
6437 const char *zDb;
6438 sqlite3 *pSrc;
6439 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00006440 int nTimeout = 0;
6441
drh9ff849f2009-02-04 20:55:57 +00006442 if( nArg==2 ){
6443 zSrcFile = azArg[1];
6444 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00006445 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00006446 zSrcFile = azArg[2];
6447 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00006448 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006449 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00006450 rc = 1;
6451 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00006452 }
6453 rc = sqlite3_open(zSrcFile, &pSrc);
6454 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006455 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00006456 sqlite3_close(pSrc);
6457 return 1;
6458 }
drh05782482013-10-24 15:20:20 +00006459 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00006460 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
6461 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006462 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00006463 sqlite3_close(pSrc);
6464 return 1;
6465 }
drhdc2c4912009-02-04 22:46:47 +00006466 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
6467 || rc==SQLITE_BUSY ){
6468 if( rc==SQLITE_BUSY ){
6469 if( nTimeout++ >= 3 ) break;
6470 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00006471 }
6472 }
6473 sqlite3_backup_finish(pBackup);
6474 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00006475 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00006476 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00006477 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00006478 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00006479 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006480 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00006481 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00006482 }
6483 sqlite3_close(pSrc);
6484 }else
6485
dan8d1edb92014-11-05 09:07:28 +00006486
6487 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
6488 if( nArg==2 ){
6489 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00006490#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00006491 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00006492#endif
dan8d1edb92014-11-05 09:07:28 +00006493 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006494 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00006495 rc = 1;
6496 }
6497 }else
6498
drhc2ce0be2014-05-29 12:36:14 +00006499 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drh20c9c3f2017-06-15 12:21:09 +00006500 ShellText sSelect;
drhdcd87a92014-08-18 13:45:42 +00006501 ShellState data;
drh75897232000-05-29 14:26:00 +00006502 char *zErrMsg = 0;
drh20c9c3f2017-06-15 12:21:09 +00006503 const char *zDiv = 0;
6504 int iSchema = 0;
6505
drh05782482013-10-24 15:20:20 +00006506 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00006507 memcpy(&data, p, sizeof(data));
6508 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00006509 data.cMode = data.mode = MODE_Semi;
drh20c9c3f2017-06-15 12:21:09 +00006510 initText(&sSelect);
drh4926fec2016-04-13 15:33:42 +00006511 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
6512 data.cMode = data.mode = MODE_Pretty;
6513 nArg--;
6514 if( nArg==2 ) azArg[1] = azArg[2];
6515 }
6516 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00006517 int i;
drhf0693c82011-10-11 20:41:54 +00006518 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00006519 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00006520 char *new_argv[2], *new_colv[2];
6521 new_argv[0] = "CREATE TABLE sqlite_master (\n"
6522 " type text,\n"
6523 " name text,\n"
6524 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00006525 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00006526 " sql text\n"
6527 ")";
6528 new_argv[1] = 0;
6529 new_colv[0] = "sql";
6530 new_colv[1] = 0;
6531 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00006532 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00006533 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00006534 char *new_argv[2], *new_colv[2];
6535 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
6536 " type text,\n"
6537 " name text,\n"
6538 " tbl_name text,\n"
6539 " rootpage integer,\n"
6540 " sql text\n"
6541 ")";
6542 new_argv[1] = 0;
6543 new_colv[0] = "sql";
6544 new_colv[1] = 0;
6545 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00006546 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00006547 }else{
drh20c9c3f2017-06-15 12:21:09 +00006548 zDiv = "(";
drha18c5682000-10-08 22:20:57 +00006549 }
drhc2ce0be2014-05-29 12:36:14 +00006550 }else if( nArg==1 ){
drh20c9c3f2017-06-15 12:21:09 +00006551 zDiv = "(";
drhc2ce0be2014-05-29 12:36:14 +00006552 }else{
drh4926fec2016-04-13 15:33:42 +00006553 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00006554 rc = 1;
6555 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00006556 }
drh20c9c3f2017-06-15 12:21:09 +00006557 if( zDiv ){
6558 sqlite3_stmt *pStmt = 0;
drha7a0bfa2017-07-07 18:06:49 +00006559 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
6560 -1, &pStmt, 0);
6561 if( rc ){
6562 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6563 sqlite3_finalize(pStmt);
6564 rc = 1;
6565 goto meta_command_exit;
6566 }
drh20c9c3f2017-06-15 12:21:09 +00006567 appendText(&sSelect, "SELECT sql FROM", 0);
6568 iSchema = 0;
6569 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6570 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
6571 char zScNum[30];
6572 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
6573 appendText(&sSelect, zDiv, 0);
6574 zDiv = " UNION ALL ";
6575 if( strcmp(zDb, "main")!=0 ){
6576 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
drh90cdec02017-06-15 13:07:56 +00006577 appendText(&sSelect, zDb, '"');
drh20c9c3f2017-06-15 12:21:09 +00006578 appendText(&sSelect, ") AS sql, type, tbl_name, name, rowid,", 0);
6579 appendText(&sSelect, zScNum, 0);
6580 appendText(&sSelect, " AS snum, ", 0);
6581 appendText(&sSelect, zDb, '\'');
6582 appendText(&sSelect, " AS sname FROM ", 0);
drh90cdec02017-06-15 13:07:56 +00006583 appendText(&sSelect, zDb, '"');
drh20c9c3f2017-06-15 12:21:09 +00006584 appendText(&sSelect, ".sqlite_master", 0);
6585 }else{
6586 appendText(&sSelect, "SELECT sql, type, tbl_name, name, rowid, ", 0);
6587 appendText(&sSelect, zScNum, 0);
6588 appendText(&sSelect, " AS snum, 'main' AS sname FROM sqlite_master",0);
6589 }
6590 }
6591 sqlite3_finalize(pStmt);
6592 appendText(&sSelect, ") WHERE ", 0);
6593 if( nArg>1 ){
6594 char *zQarg = sqlite3_mprintf("%Q", azArg[1]);
6595 if( strchr(azArg[1], '.') ){
6596 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
6597 }else{
6598 appendText(&sSelect, "lower(tbl_name)", 0);
6599 }
6600 appendText(&sSelect, strchr(azArg[1], '*') ? " GLOB " : " LIKE ", 0);
6601 appendText(&sSelect, zQarg, 0);
6602 appendText(&sSelect, " AND ", 0);
6603 sqlite3_free(zQarg);
6604 }
6605 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
6606 " ORDER BY snum, rowid", 0);
6607 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
6608 freeText(&sSelect);
6609 }
drh75897232000-05-29 14:26:00 +00006610 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00006611 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00006612 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00006613 rc = 1;
6614 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00006615 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00006616 rc = 1;
6617 }else{
6618 rc = 0;
drh75897232000-05-29 14:26:00 +00006619 }
6620 }else
6621
drhabd4c722014-09-20 18:18:33 +00006622#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
6623 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00006624 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00006625 }else
6626#endif
6627
drhe6229612014-08-18 15:08:26 +00006628#if defined(SQLITE_ENABLE_SESSION)
6629 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
6630 OpenSession *pSession = &p->aSession[0];
6631 char **azCmd = &azArg[1];
6632 int iSes = 0;
6633 int nCmd = nArg - 1;
6634 int i;
6635 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00006636 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00006637 if( nArg>=3 ){
6638 for(iSes=0; iSes<p->nSession; iSes++){
6639 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
6640 }
6641 if( iSes<p->nSession ){
6642 pSession = &p->aSession[iSes];
6643 azCmd++;
6644 nCmd--;
6645 }else{
6646 pSession = &p->aSession[0];
6647 iSes = 0;
6648 }
6649 }
6650
drh3a67b042014-08-18 17:56:31 +00006651 /* .session attach TABLE
6652 ** Invoke the sqlite3session_attach() interface to attach a particular
6653 ** table so that it is never filtered.
6654 */
6655 if( strcmp(azCmd[0],"attach")==0 ){
6656 if( nCmd!=2 ) goto session_syntax_error;
6657 if( pSession->p==0 ){
6658 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00006659 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00006660 }else{
6661 rc = sqlite3session_attach(pSession->p, azCmd[1]);
6662 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00006663 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00006664 rc = 0;
6665 }
6666 }
6667 }else
6668
6669 /* .session changeset FILE
6670 ** .session patchset FILE
6671 ** Write a changeset or patchset into a file. The file is overwritten.
6672 */
6673 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
6674 FILE *out = 0;
6675 if( nCmd!=2 ) goto session_syntax_error;
6676 if( pSession->p==0 ) goto session_not_open;
6677 out = fopen(azCmd[1], "wb");
6678 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006679 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00006680 }else{
6681 int szChng;
6682 void *pChng;
6683 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00006684 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00006685 }else{
drh2967e0c2014-08-19 00:26:17 +00006686 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
6687 }
6688 if( rc ){
6689 printf("Error: error code %d\n", rc);
6690 rc = 0;
drh3a67b042014-08-18 17:56:31 +00006691 }
mistachkin1fe36bb2016-04-04 02:16:44 +00006692 if( pChng
drh3a67b042014-08-18 17:56:31 +00006693 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00006694 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00006695 szChng);
6696 }
6697 sqlite3_free(pChng);
6698 fclose(out);
6699 }
6700 }else
6701
drhe6229612014-08-18 15:08:26 +00006702 /* .session close
6703 ** Close the identified session
6704 */
6705 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00006706 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00006707 if( p->nSession ){
6708 session_close(pSession);
6709 p->aSession[iSes] = p->aSession[--p->nSession];
6710 }
6711 }else
6712
drh03168ca2014-08-18 20:01:31 +00006713 /* .session enable ?BOOLEAN?
6714 ** Query or set the enable flag
6715 */
6716 if( strcmp(azCmd[0], "enable")==0 ){
6717 int ii;
6718 if( nCmd>2 ) goto session_syntax_error;
6719 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6720 if( p->nSession ){
6721 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00006722 utf8_printf(p->out, "session %s enable flag = %d\n",
6723 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006724 }
6725 }else
6726
6727 /* .session filter GLOB ....
6728 ** Set a list of GLOB patterns of table names to be excluded.
6729 */
6730 if( strcmp(azCmd[0], "filter")==0 ){
6731 int ii, nByte;
6732 if( nCmd<2 ) goto session_syntax_error;
6733 if( p->nSession ){
6734 for(ii=0; ii<pSession->nFilter; ii++){
6735 sqlite3_free(pSession->azFilter[ii]);
6736 }
6737 sqlite3_free(pSession->azFilter);
6738 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
6739 pSession->azFilter = sqlite3_malloc( nByte );
6740 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006741 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00006742 exit(1);
6743 }
6744 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00006745 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00006746 }
6747 pSession->nFilter = ii-1;
6748 }
6749 }else
6750
6751 /* .session indirect ?BOOLEAN?
6752 ** Query or set the indirect flag
6753 */
6754 if( strcmp(azCmd[0], "indirect")==0 ){
6755 int ii;
6756 if( nCmd>2 ) goto session_syntax_error;
6757 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6758 if( p->nSession ){
6759 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00006760 utf8_printf(p->out, "session %s indirect flag = %d\n",
6761 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006762 }
6763 }else
6764
6765 /* .session isempty
6766 ** Determine if the session is empty
6767 */
6768 if( strcmp(azCmd[0], "isempty")==0 ){
6769 int ii;
6770 if( nCmd!=1 ) goto session_syntax_error;
6771 if( p->nSession ){
6772 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00006773 utf8_printf(p->out, "session %s isempty flag = %d\n",
6774 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00006775 }
6776 }else
6777
drhe6229612014-08-18 15:08:26 +00006778 /* .session list
6779 ** List all currently open sessions
6780 */
6781 if( strcmp(azCmd[0],"list")==0 ){
6782 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00006783 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00006784 }
6785 }else
6786
6787 /* .session open DB NAME
6788 ** Open a new session called NAME on the attached database DB.
6789 ** DB is normally "main".
6790 */
6791 if( strcmp(azCmd[0],"open")==0 ){
6792 char *zName;
6793 if( nCmd!=3 ) goto session_syntax_error;
6794 zName = azCmd[2];
6795 if( zName[0]==0 ) goto session_syntax_error;
6796 for(i=0; i<p->nSession; i++){
6797 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00006798 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00006799 goto meta_command_exit;
6800 }
6801 }
6802 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00006803 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00006804 goto meta_command_exit;
6805 }
6806 pSession = &p->aSession[p->nSession];
6807 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
6808 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00006809 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00006810 rc = 0;
drhe6229612014-08-18 15:08:26 +00006811 goto meta_command_exit;
6812 }
drh03168ca2014-08-18 20:01:31 +00006813 pSession->nFilter = 0;
6814 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00006815 p->nSession++;
6816 pSession->zName = sqlite3_mprintf("%s", zName);
6817 }else
6818 /* If no command name matches, show a syntax error */
6819 session_syntax_error:
6820 session_help(p);
6821 }else
6822#endif
6823
drh340f5822013-06-27 13:01:21 +00006824#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00006825 /* Undocumented commands for internal testing. Subject to change
6826 ** without notice. */
6827 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
6828 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
6829 int i, v;
6830 for(i=1; i<nArg; i++){
6831 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00006832 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00006833 }
6834 }
6835 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
6836 int i; sqlite3_int64 v;
6837 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00006838 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00006839 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00006840 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00006841 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00006842 }
6843 }
6844 }else
drh340f5822013-06-27 13:01:21 +00006845#endif
drh348d19c2013-06-03 12:47:43 +00006846
drhfb546af2017-03-09 22:00:33 +00006847 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
6848 int bIsInit = 0; /* True to initialize the SELFTEST table */
6849 int bVerbose = 0; /* Verbose output */
6850 int bSelftestExists; /* True if SELFTEST already exists */
drhc5d353f2017-06-09 02:27:49 +00006851 int i, k; /* Loop counters */
drhfb546af2017-03-09 22:00:33 +00006852 int nTest = 0; /* Number of tests runs */
6853 int nErr = 0; /* Number of errors seen */
6854 ShellText str; /* Answer for a query */
drhc5d353f2017-06-09 02:27:49 +00006855 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
drhfb546af2017-03-09 22:00:33 +00006856
6857 open_db(p,0);
6858 for(i=1; i<nArg; i++){
6859 const char *z = azArg[i];
6860 if( z[0]=='-' && z[1]=='-' ) z++;
6861 if( strcmp(z,"-init")==0 ){
6862 bIsInit = 1;
6863 }else
6864 if( strcmp(z,"-v")==0 ){
6865 bVerbose++;
6866 }else
6867 {
6868 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
6869 azArg[i], azArg[0]);
6870 raw_printf(stderr, "Should be one of: --init -v\n");
6871 rc = 1;
6872 goto meta_command_exit;
6873 }
6874 }
6875 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
6876 != SQLITE_OK ){
6877 bSelftestExists = 0;
6878 }else{
6879 bSelftestExists = 1;
6880 }
6881 if( bIsInit ){
drhfb546af2017-03-09 22:00:33 +00006882 createSelftestTable(p);
6883 bSelftestExists = 1;
6884 }
drhc5d353f2017-06-09 02:27:49 +00006885 initText(&str);
6886 appendText(&str, "x", 0);
6887 for(k=bSelftestExists; k>=0; k--){
6888 if( k==1 ){
6889 rc = sqlite3_prepare_v2(p->db,
6890 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
6891 -1, &pStmt, 0);
6892 }else{
6893 rc = sqlite3_prepare_v2(p->db,
6894 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
6895 " (1,'run','PRAGMA integrity_check','ok')",
6896 -1, &pStmt, 0);
6897 }
drhfb546af2017-03-09 22:00:33 +00006898 if( rc ){
6899 raw_printf(stderr, "Error querying the selftest table\n");
6900 rc = 1;
drhc5d353f2017-06-09 02:27:49 +00006901 sqlite3_finalize(pStmt);
drhfb546af2017-03-09 22:00:33 +00006902 goto meta_command_exit;
drhfb546af2017-03-09 22:00:33 +00006903 }
drhc5d353f2017-06-09 02:27:49 +00006904 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
6905 int tno = sqlite3_column_int(pStmt, 0);
6906 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
6907 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
6908 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
mistachkine16a3502017-05-29 03:48:13 +00006909
drhc5d353f2017-06-09 02:27:49 +00006910 k = 0;
6911 if( bVerbose>0 ){
6912 char *zQuote = sqlite3_mprintf("%q", zSql);
6913 printf("%d: %s %s\n", tno, zOp, zSql);
6914 sqlite3_free(zQuote);
drhfb546af2017-03-09 22:00:33 +00006915 }
drhc5d353f2017-06-09 02:27:49 +00006916 if( strcmp(zOp,"memo")==0 ){
6917 utf8_printf(p->out, "%s\n", zSql);
6918 }else
6919 if( strcmp(zOp,"run")==0 ){
6920 char *zErrMsg = 0;
6921 str.n = 0;
6922 str.z[0] = 0;
6923 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
6924 nTest++;
6925 if( bVerbose ){
6926 utf8_printf(p->out, "Result: %s\n", str.z);
6927 }
6928 if( rc || zErrMsg ){
6929 nErr++;
6930 rc = 1;
6931 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
6932 sqlite3_free(zErrMsg);
6933 }else if( strcmp(zAns,str.z)!=0 ){
6934 nErr++;
6935 rc = 1;
6936 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
6937 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
6938 }
6939 }else
6940 {
6941 utf8_printf(stderr,
6942 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
drhfb546af2017-03-09 22:00:33 +00006943 rc = 1;
drhc5d353f2017-06-09 02:27:49 +00006944 break;
drhfb546af2017-03-09 22:00:33 +00006945 }
drhc5d353f2017-06-09 02:27:49 +00006946 } /* End loop over rows of content from SELFTEST */
6947 sqlite3_finalize(pStmt);
6948 } /* End loop over k */
drhfb546af2017-03-09 22:00:33 +00006949 freeText(&str);
drhfb546af2017-03-09 22:00:33 +00006950 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
6951 }else
6952
drhc2ce0be2014-05-29 12:36:14 +00006953 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00006954 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006955 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00006956 rc = 1;
6957 }
drh6976c212014-07-24 12:09:47 +00006958 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00006959 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00006960 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00006961 }
6962 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00006963 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
6964 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00006965 }
drh75897232000-05-29 14:26:00 +00006966 }else
6967
drh1554bc82017-03-08 16:10:34 +00006968 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
6969 const char *zLike = 0; /* Which table to checksum. 0 means everything */
6970 int i; /* Loop counter */
6971 int bSchema = 0; /* Also hash the schema */
drh3ee83ef2017-03-08 17:56:54 +00006972 int bSeparate = 0; /* Hash each table separately */
drh1554bc82017-03-08 16:10:34 +00006973 int iSize = 224; /* Hash algorithm to use */
6974 int bDebug = 0; /* Only show the query that would have run */
6975 sqlite3_stmt *pStmt; /* For querying tables names */
6976 char *zSql; /* SQL to be run */
drh3ee83ef2017-03-08 17:56:54 +00006977 char *zSep; /* Separator */
6978 ShellText sSql; /* Complete SQL for the query to run the hash */
drh1554bc82017-03-08 16:10:34 +00006979 ShellText sQuery; /* Set of queries used to read all content */
drhf80d4ff2017-03-08 18:06:20 +00006980 open_db(p, 0);
drh1554bc82017-03-08 16:10:34 +00006981 for(i=1; i<nArg; i++){
6982 const char *z = azArg[i];
6983 if( z[0]=='-' ){
6984 z++;
6985 if( z[0]=='-' ) z++;
6986 if( strcmp(z,"schema")==0 ){
6987 bSchema = 1;
6988 }else
mistachkine16a3502017-05-29 03:48:13 +00006989 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
6990 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
drh1554bc82017-03-08 16:10:34 +00006991 ){
6992 iSize = atoi(&z[5]);
6993 }else
6994 if( strcmp(z,"debug")==0 ){
6995 bDebug = 1;
6996 }else
6997 {
6998 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
drh3ee83ef2017-03-08 17:56:54 +00006999 azArg[i], azArg[0]);
drh1554bc82017-03-08 16:10:34 +00007000 raw_printf(stderr, "Should be one of: --schema"
7001 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
7002 rc = 1;
7003 goto meta_command_exit;
7004 }
7005 }else if( zLike ){
7006 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
7007 rc = 1;
7008 goto meta_command_exit;
7009 }else{
7010 zLike = z;
drh3ee83ef2017-03-08 17:56:54 +00007011 bSeparate = 1;
7012 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
drh1554bc82017-03-08 16:10:34 +00007013 }
7014 }
7015 if( bSchema ){
7016 zSql = "SELECT lower(name) FROM sqlite_master"
7017 " WHERE type='table' AND coalesce(rootpage,0)>1"
7018 " UNION ALL SELECT 'sqlite_master'"
7019 " ORDER BY 1 collate nocase";
7020 }else{
7021 zSql = "SELECT lower(name) FROM sqlite_master"
7022 " WHERE type='table' AND coalesce(rootpage,0)>1"
7023 " AND name NOT LIKE 'sqlite_%'"
7024 " ORDER BY 1 collate nocase";
7025 }
7026 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
7027 initText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00007028 initText(&sSql);
7029 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
7030 zSep = "VALUES(";
drh1554bc82017-03-08 16:10:34 +00007031 while( SQLITE_ROW==sqlite3_step(pStmt) ){
7032 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
7033 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
7034 if( strncmp(zTab, "sqlite_",7)!=0 ){
7035 appendText(&sQuery,"SELECT * FROM ", 0);
7036 appendText(&sQuery,zTab,'"');
7037 appendText(&sQuery," NOT INDEXED;", 0);
7038 }else if( strcmp(zTab, "sqlite_master")==0 ){
7039 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
7040 " ORDER BY name;", 0);
7041 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
7042 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
7043 " ORDER BY name;", 0);
7044 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
7045 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
7046 " ORDER BY tbl,idx;", 0);
7047 }else if( strcmp(zTab, "sqlite_stat3")==0
7048 || strcmp(zTab, "sqlite_stat4")==0 ){
7049 appendText(&sQuery, "SELECT * FROM ", 0);
7050 appendText(&sQuery, zTab, 0);
7051 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
7052 }
drh3ee83ef2017-03-08 17:56:54 +00007053 appendText(&sSql, zSep, 0);
7054 appendText(&sSql, sQuery.z, '\'');
7055 sQuery.n = 0;
7056 appendText(&sSql, ",", 0);
7057 appendText(&sSql, zTab, '\'');
7058 zSep = "),(";
drh1554bc82017-03-08 16:10:34 +00007059 }
7060 sqlite3_finalize(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00007061 if( bSeparate ){
7062 zSql = sqlite3_mprintf(
7063 "%s))"
7064 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
7065 " FROM [sha3sum$query]",
7066 sSql.z, iSize);
7067 }else{
7068 zSql = sqlite3_mprintf(
7069 "%s))"
7070 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
7071 " FROM [sha3sum$query]",
7072 sSql.z, iSize);
7073 }
drh1554bc82017-03-08 16:10:34 +00007074 freeText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00007075 freeText(&sSql);
drh1554bc82017-03-08 16:10:34 +00007076 if( bDebug ){
7077 utf8_printf(p->out, "%s\n", zSql);
7078 }else{
7079 shell_exec(p->db, zSql, shell_callback, p, 0);
7080 }
7081 sqlite3_free(zSql);
7082 }else
7083
drh62cdde52014-05-28 20:22:28 +00007084 if( c=='s'
7085 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00007086 ){
7087 char *zCmd;
drh54027102014-08-06 14:36:53 +00007088 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00007089 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007090 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00007091 rc = 1;
7092 goto meta_command_exit;
7093 }
drhdcb3e3d2014-05-29 03:17:29 +00007094 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00007095 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00007096 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
7097 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00007098 }
drh54027102014-08-06 14:36:53 +00007099 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00007100 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00007101 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00007102 }else
7103
drhc2ce0be2014-05-29 12:36:14 +00007104 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00007105 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00007106 int i;
drhc2ce0be2014-05-29 12:36:14 +00007107 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00007108 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00007109 rc = 1;
7110 goto meta_command_exit;
7111 }
drhe6e1d122017-03-09 13:50:49 +00007112 utf8_printf(p->out, "%12.12s: %s\n","echo",
7113 azBool[ShellHasFlag(p, SHFLG_Echo)]);
drheacd29d2016-04-15 15:03:27 +00007114 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00007115 utf8_printf(p->out, "%12.12s: %s\n","explain",
7116 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00007117 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00007118 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
7119 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00007120 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00007121 raw_printf(p->out, "\n");
7122 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00007123 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00007124 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00007125 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00007126 raw_printf(p->out, "\n");
7127 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00007128 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00007129 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00007130 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00007131 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00007132 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00007133 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00007134 }
mistachkinaae280e2015-12-31 19:06:24 +00007135 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00007136 utf8_printf(p->out, "%12.12s: %s\n", "filename",
7137 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00007138 }else
7139
drhc2ce0be2014-05-29 12:36:14 +00007140 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
7141 if( nArg==2 ){
7142 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00007143 }else if( nArg==1 ){
7144 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007145 }else{
drh34784902016-02-27 17:12:36 +00007146 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00007147 rc = 1;
7148 }
shaneh642d8b82010-07-28 16:05:34 +00007149 }else
7150
drh6a5a4202016-12-24 21:32:40 +00007151 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
7152 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
7153 || strncmp(azArg[0], "indexes", n)==0) )
7154 ){
drh98781232012-04-23 12:38:05 +00007155 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00007156 char **azResult;
drh98781232012-04-23 12:38:05 +00007157 int nRow, nAlloc;
drh98781232012-04-23 12:38:05 +00007158 int ii;
drh594ccd02017-06-15 12:50:47 +00007159 ShellText s;
7160 initText(&s);
drh05782482013-10-24 15:20:20 +00007161 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00007162 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00007163 if( rc ) return shellDatabaseError(p->db);
7164
drh594ccd02017-06-15 12:50:47 +00007165 if( nArg>2 && c=='i' ){
drh6a5a4202016-12-24 21:32:40 +00007166 /* It is an historical accident that the .indexes command shows an error
7167 ** when called with the wrong number of arguments whereas the .tables
7168 ** command does not. */
7169 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
7170 rc = 1;
7171 goto meta_command_exit;
drh6a5a4202016-12-24 21:32:40 +00007172 }
drh594ccd02017-06-15 12:50:47 +00007173 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00007174 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drh594ccd02017-06-15 12:50:47 +00007175 if( zDbName==0 ) continue;
7176 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
7177 if( sqlite3_stricmp(zDbName, "main")==0 ){
7178 appendText(&s, "SELECT name FROM ", 0);
drh6a5a4202016-12-24 21:32:40 +00007179 }else{
drh594ccd02017-06-15 12:50:47 +00007180 appendText(&s, "SELECT ", 0);
7181 appendText(&s, zDbName, '\'');
7182 appendText(&s, "||'.'||name FROM ", 0);
7183 }
7184 appendText(&s, zDbName, '"');
7185 appendText(&s, ".sqlite_master ", 0);
7186 if( c=='t' ){
7187 appendText(&s," WHERE type IN ('table','view')"
7188 " AND name NOT LIKE 'sqlite_%'"
7189 " AND name LIKE ?1", 0);
7190 }else{
7191 appendText(&s," WHERE type='index'"
7192 " AND tbl_name LIKE ?1", 0);
drh98781232012-04-23 12:38:05 +00007193 }
drha50da102000-08-08 20:19:09 +00007194 }
dand95bb392015-09-30 11:19:05 +00007195 rc = sqlite3_finalize(pStmt);
drh594ccd02017-06-15 12:50:47 +00007196 appendText(&s, " ORDER BY 1", 0);
7197 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
7198 freeText(&s);
dand95bb392015-09-30 11:19:05 +00007199 if( rc ) return shellDatabaseError(p->db);
7200
7201 /* Run the SQL statement prepared by the above block. Store the results
7202 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00007203 nRow = nAlloc = 0;
7204 azResult = 0;
7205 if( nArg>1 ){
7206 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00007207 }else{
drh98781232012-04-23 12:38:05 +00007208 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
7209 }
7210 while( sqlite3_step(pStmt)==SQLITE_ROW ){
7211 if( nRow>=nAlloc ){
7212 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00007213 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00007214 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00007215 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00007216 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00007217 break;
7218 }
mistachkin8e189222015-04-19 21:43:16 +00007219 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00007220 azResult = azNew;
7221 }
7222 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00007223 if( 0==azResult[nRow] ){
7224 rc = shellNomemError();
7225 break;
7226 }
7227 nRow++;
drh98781232012-04-23 12:38:05 +00007228 }
dand95bb392015-09-30 11:19:05 +00007229 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
7230 rc = shellDatabaseError(p->db);
7231 }
7232
7233 /* Pretty-print the contents of array azResult[] to the output */
7234 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00007235 int len, maxlen = 0;
7236 int i, j;
7237 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00007238 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00007239 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00007240 if( len>maxlen ) maxlen = len;
7241 }
7242 nPrintCol = 80/(maxlen+2);
7243 if( nPrintCol<1 ) nPrintCol = 1;
7244 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
7245 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00007246 for(j=i; j<nRow; j+=nPrintRow){
7247 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00007248 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
7249 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00007250 }
mistachkinaae280e2015-12-31 19:06:24 +00007251 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00007252 }
7253 }
dand95bb392015-09-30 11:19:05 +00007254
drh98781232012-04-23 12:38:05 +00007255 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
7256 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00007257 }else
7258
drh2db82112016-09-15 21:35:24 +00007259 /* Begin redirecting output to the file "testcase-out.txt" */
7260 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
7261 output_reset(p);
7262 p->out = output_file_open("testcase-out.txt");
7263 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00007264 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00007265 }
drh760c8162016-09-16 02:52:22 +00007266 if( nArg>=2 ){
7267 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
7268 }else{
7269 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
7270 }
drh2db82112016-09-15 21:35:24 +00007271 }else
drh2db82112016-09-15 21:35:24 +00007272
drhd12602a2016-12-07 15:49:02 +00007273#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00007274 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00007275 static const struct {
7276 const char *zCtrlName; /* Name of a test-control option */
7277 int ctrlCode; /* Integer code for that option */
7278 } aCtrl[] = {
7279 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
7280 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
7281 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
7282 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
7283 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
7284 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
7285 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
7286 { "assert", SQLITE_TESTCTRL_ASSERT },
7287 { "always", SQLITE_TESTCTRL_ALWAYS },
7288 { "reserve", SQLITE_TESTCTRL_RESERVE },
7289 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
7290 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00007291 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00007292 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00007293 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00007294 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00007295 };
shaneh96887e12011-02-10 21:08:58 +00007296 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00007297 int rc2 = 0;
7298 int i, n2;
drh05782482013-10-24 15:20:20 +00007299 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00007300
drhd416fe72011-03-17 16:45:50 +00007301 /* convert testctrl text option to value. allow any unique prefix
7302 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00007303 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00007304 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00007305 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00007306 if( testctrl<0 ){
7307 testctrl = aCtrl[i].ctrlCode;
7308 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007309 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00007310 testctrl = -1;
7311 break;
7312 }
7313 }
7314 }
drh348d19c2013-06-03 12:47:43 +00007315 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007316 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00007317 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007318 }else{
7319 switch(testctrl){
7320
7321 /* sqlite3_test_control(int, db, int) */
7322 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00007323 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00007324 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007325 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00007326 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007327 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007328 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007329 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00007330 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007331 }
7332 break;
7333
7334 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00007335 case SQLITE_TESTCTRL_PRNG_SAVE:
7336 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00007337 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00007338 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00007339 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00007340 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00007341 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007342 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007343 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
7344 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007345 }
7346 break;
7347
7348 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00007349 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00007350 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00007351 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00007352 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007353 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007354 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007355 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00007356 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007357 }
7358 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00007359
shaneh96887e12011-02-10 21:08:58 +00007360 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00007361 case SQLITE_TESTCTRL_ASSERT:
7362 case SQLITE_TESTCTRL_ALWAYS:
7363 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00007364 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007365 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00007366 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007367 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007368 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007369 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00007370 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007371 }
7372 break;
7373
7374 /* sqlite3_test_control(int, char *) */
7375#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00007376 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00007377 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007378 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00007379 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00007380 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00007381 } else {
mistachkinaae280e2015-12-31 19:06:24 +00007382 utf8_printf(stderr,
7383 "Error: testctrl %s takes a single char * option\n",
7384 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007385 }
7386 break;
7387#endif
7388
drh1ffede82015-01-30 20:59:27 +00007389 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00007390 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00007391 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00007392 azArg[2],
drh8964b342015-01-29 17:54:52 +00007393 integerValue(azArg[3]),
7394 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00007395 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00007396 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007397 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00007398 }
7399 break;
7400
mistachkin1fe36bb2016-04-04 02:16:44 +00007401 case SQLITE_TESTCTRL_BITVEC_TEST:
7402 case SQLITE_TESTCTRL_FAULT_INSTALL:
7403 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
7404 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00007405 default:
mistachkinaae280e2015-12-31 19:06:24 +00007406 utf8_printf(stderr,
7407 "Error: CLI support for testctrl %s not implemented\n",
7408 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00007409 break;
7410 }
7411 }
7412 }else
drhf1969722017-02-17 23:52:00 +00007413#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00007414
drhc2ce0be2014-05-29 12:36:14 +00007415 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00007416 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007417 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00007418 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00007419
drhc2ce0be2014-05-29 12:36:14 +00007420 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
7421 if( nArg==2 ){
7422 enableTimer = booleanValue(azArg[1]);
7423 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00007424 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00007425 enableTimer = 0;
7426 }
7427 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007428 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00007429 rc = 1;
7430 }
shanehe2aa9d72009-11-06 17:20:17 +00007431 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00007432
drhc2ce0be2014-05-29 12:36:14 +00007433 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00007434 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00007435 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007436 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00007437 rc = 1;
7438 goto meta_command_exit;
7439 }
drh657b4a82015-03-19 13:30:41 +00007440 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00007441 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00007442#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00007443 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00007444 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00007445 }else{
drh4b363a52016-07-23 20:27:41 +00007446 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00007447 }
7448#endif
7449 }else
7450
drhf442e332014-09-10 19:01:14 +00007451#if SQLITE_USER_AUTHENTICATION
7452 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
7453 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00007454 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00007455 rc = 1;
7456 goto meta_command_exit;
7457 }
drh7883ecf2014-09-11 16:19:31 +00007458 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00007459 if( strcmp(azArg[1],"login")==0 ){
7460 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00007461 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00007462 rc = 1;
7463 goto meta_command_exit;
7464 }
drhd39c40f2014-09-11 00:27:53 +00007465 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
7466 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00007467 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007468 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00007469 rc = 1;
7470 }
7471 }else if( strcmp(azArg[1],"add")==0 ){
7472 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00007473 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00007474 rc = 1;
7475 goto meta_command_exit;
7476 }
drhd39c40f2014-09-11 00:27:53 +00007477 rc = sqlite3_user_add(p->db, azArg[2],
7478 azArg[3], (int)strlen(azArg[3]),
7479 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00007480 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007481 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007482 rc = 1;
7483 }
7484 }else if( strcmp(azArg[1],"edit")==0 ){
7485 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00007486 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00007487 rc = 1;
7488 goto meta_command_exit;
7489 }
drhd39c40f2014-09-11 00:27:53 +00007490 rc = sqlite3_user_change(p->db, azArg[2],
7491 azArg[3], (int)strlen(azArg[3]),
7492 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00007493 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007494 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007495 rc = 1;
7496 }
7497 }else if( strcmp(azArg[1],"delete")==0 ){
7498 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00007499 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00007500 rc = 1;
7501 goto meta_command_exit;
7502 }
7503 rc = sqlite3_user_delete(p->db, azArg[2]);
7504 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00007505 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00007506 rc = 1;
7507 }
7508 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007509 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00007510 rc = 1;
7511 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00007512 }
drhf442e332014-09-10 19:01:14 +00007513 }else
7514#endif /* SQLITE_USER_AUTHENTICATION */
7515
drh9fd301b2011-06-03 13:28:22 +00007516 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007517 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00007518 sqlite3_libversion(), sqlite3_sourceid());
7519 }else
7520
drh790f2872015-11-28 18:06:36 +00007521 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
7522 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00007523 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00007524 if( p->db ){
7525 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
7526 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00007527 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
7528 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7529 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7530 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00007531 }
7532 }
7533 }else
7534
drhb19e7352016-01-12 19:37:20 +00007535 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
7536 sqlite3_vfs *pVfs;
7537 sqlite3_vfs *pCurrent = 0;
7538 if( p->db ){
7539 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
7540 }
7541 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
7542 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
7543 pVfs==pCurrent ? " <--- CURRENT" : "");
7544 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7545 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7546 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7547 if( pVfs->pNext ){
7548 raw_printf(p->out, "-----------------------------------\n");
7549 }
7550 }
7551 }else
7552
drhde60fc22011-12-14 17:53:36 +00007553 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
7554 const char *zDbName = nArg==2 ? azArg[1] : "main";
7555 char *zVfsName = 0;
7556 if( p->db ){
7557 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
7558 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00007559 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00007560 sqlite3_free(zVfsName);
7561 }
7562 }
7563 }else
7564
drhcef4fc82012-09-21 22:50:45 +00007565#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
7566 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00007567 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00007568 }else
7569#endif
7570
drhc2ce0be2014-05-29 12:36:14 +00007571 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00007572 int j;
drh43617e92006-03-06 20:55:46 +00007573 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00007574 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00007575 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00007576 }
7577 }else
7578
7579 {
mistachkinaae280e2015-12-31 19:06:24 +00007580 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00007581 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00007582 rc = 1;
drh75897232000-05-29 14:26:00 +00007583 }
drh67505e72002-04-19 12:34:06 +00007584
drhc2ce0be2014-05-29 12:36:14 +00007585meta_command_exit:
7586 if( p->outCount ){
7587 p->outCount--;
7588 if( p->outCount==0 ) output_reset(p);
7589 }
drh67505e72002-04-19 12:34:06 +00007590 return rc;
drh75897232000-05-29 14:26:00 +00007591}
7592
drh67505e72002-04-19 12:34:06 +00007593/*
drh91a66392007-09-07 01:12:32 +00007594** Return TRUE if a semicolon occurs anywhere in the first N characters
7595** of string z[].
drh324ccef2003-02-05 14:06:20 +00007596*/
drh9f099fd2013-08-06 14:01:46 +00007597static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00007598 int i;
7599 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
7600 return 0;
drh324ccef2003-02-05 14:06:20 +00007601}
7602
7603/*
drh70c7a4b2003-04-26 03:03:06 +00007604** Test to see if a line consists entirely of whitespace.
7605*/
7606static int _all_whitespace(const char *z){
7607 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00007608 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00007609 if( *z=='/' && z[1]=='*' ){
7610 z += 2;
7611 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
7612 if( *z==0 ) return 0;
7613 z++;
7614 continue;
7615 }
7616 if( *z=='-' && z[1]=='-' ){
7617 z += 2;
7618 while( *z && *z!='\n' ){ z++; }
7619 if( *z==0 ) return 1;
7620 continue;
7621 }
7622 return 0;
7623 }
7624 return 1;
7625}
7626
7627/*
drha9b17162003-04-29 18:01:28 +00007628** Return TRUE if the line typed in is an SQL command terminator other
7629** than a semi-colon. The SQL Server style "go" command is understood
7630** as is the Oracle "/".
7631*/
drh9f099fd2013-08-06 14:01:46 +00007632static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00007633 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00007634 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
7635 return 1; /* Oracle */
7636 }
drhf0693c82011-10-11 20:41:54 +00007637 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00007638 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00007639 return 1; /* SQL Server */
7640 }
7641 return 0;
7642}
7643
7644/*
drh233a5312008-12-18 22:25:13 +00007645** Return true if zSql is a complete SQL statement. Return false if it
7646** ends in the middle of a string literal or C-style comment.
7647*/
drh9f099fd2013-08-06 14:01:46 +00007648static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00007649 int rc;
7650 if( zSql==0 ) return 1;
7651 zSql[nSql] = ';';
7652 zSql[nSql+1] = 0;
7653 rc = sqlite3_complete(zSql);
7654 zSql[nSql] = 0;
7655 return rc;
7656}
7657
7658/*
drh4e8142c2016-11-11 14:54:22 +00007659** Run a single line of SQL
7660*/
7661static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
7662 int rc;
7663 char *zErrMsg = 0;
7664
7665 open_db(p, 0);
drhe6e1d122017-03-09 13:50:49 +00007666 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
drh4e8142c2016-11-11 14:54:22 +00007667 BEGIN_TIMER;
7668 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
7669 END_TIMER;
7670 if( rc || zErrMsg ){
7671 char zPrefix[100];
7672 if( in!=0 || !stdin_is_interactive ){
7673 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
7674 "Error: near line %d:", startline);
7675 }else{
7676 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
7677 }
7678 if( zErrMsg!=0 ){
7679 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
7680 sqlite3_free(zErrMsg);
7681 zErrMsg = 0;
7682 }else{
7683 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
7684 }
7685 return 1;
drhe6e1d122017-03-09 13:50:49 +00007686 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
drh4e8142c2016-11-11 14:54:22 +00007687 raw_printf(p->out, "changes: %3d total_changes: %d\n",
7688 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
7689 }
7690 return 0;
7691}
7692
7693
7694/*
drh67505e72002-04-19 12:34:06 +00007695** Read input from *in and process it. If *in==0 then input
7696** is interactive - the user is typing it it. Otherwise, input
7697** is coming from a file or device. A prompt is issued and history
7698** is saved only if input is interactive. An interrupt signal will
7699** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00007700**
7701** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00007702*/
drhdcd87a92014-08-18 13:45:42 +00007703static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00007704 char *zLine = 0; /* A single input line */
7705 char *zSql = 0; /* Accumulated SQL text */
7706 int nLine; /* Length of current line */
7707 int nSql = 0; /* Bytes of zSql[] used */
7708 int nAlloc = 0; /* Allocated zSql[] space */
7709 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00007710 int rc; /* Error code */
7711 int errCnt = 0; /* Number of errors seen */
7712 int lineno = 0; /* Current line number */
7713 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00007714
7715 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
7716 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00007717 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00007718 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00007719 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00007720 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00007721 break;
drhc49f44e2006-10-26 18:15:42 +00007722 }
drh67505e72002-04-19 12:34:06 +00007723 if( seenInterrupt ){
7724 if( in!=0 ) break;
7725 seenInterrupt = 0;
7726 }
drhc28490c2006-10-26 14:25:58 +00007727 lineno++;
drh849a9d92013-12-21 15:46:06 +00007728 if( nSql==0 && _all_whitespace(zLine) ){
drhe6e1d122017-03-09 13:50:49 +00007729 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drh849a9d92013-12-21 15:46:06 +00007730 continue;
7731 }
drh2af0b2d2002-02-21 02:25:02 +00007732 if( zLine && zLine[0]=='.' && nSql==0 ){
drhe6e1d122017-03-09 13:50:49 +00007733 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00007734 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00007735 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00007736 break;
7737 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00007738 errCnt++;
7739 }
drhdaffd0e2001-04-11 14:28:42 +00007740 continue;
7741 }
drh9f099fd2013-08-06 14:01:46 +00007742 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00007743 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00007744 }
drh9f099fd2013-08-06 14:01:46 +00007745 nLine = strlen30(zLine);
7746 if( nSql+nLine+2>=nAlloc ){
7747 nAlloc = nSql+nLine+100;
7748 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00007749 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007750 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00007751 exit(1);
7752 }
drhdaffd0e2001-04-11 14:28:42 +00007753 }
drh9f099fd2013-08-06 14:01:46 +00007754 nSqlPrior = nSql;
7755 if( nSql==0 ){
7756 int i;
7757 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00007758 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00007759 memcpy(zSql, zLine+i, nLine+1-i);
7760 startline = lineno;
7761 nSql = nLine-i;
7762 }else{
7763 zSql[nSql++] = '\n';
7764 memcpy(zSql+nSql, zLine, nLine+1);
7765 nSql += nLine;
7766 }
7767 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00007768 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00007769 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00007770 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00007771 if( p->outCount ){
7772 output_reset(p);
7773 p->outCount = 0;
7774 }
drh9f099fd2013-08-06 14:01:46 +00007775 }else if( nSql && _all_whitespace(zSql) ){
drhe6e1d122017-03-09 13:50:49 +00007776 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00007777 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00007778 }
7779 }
drh4e8142c2016-11-11 14:54:22 +00007780 if( nSql && !_all_whitespace(zSql) ){
7781 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00007782 }
drh1f9ca2c2015-08-25 16:57:52 +00007783 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00007784 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00007785 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00007786}
7787
drh67505e72002-04-19 12:34:06 +00007788/*
7789** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00007790** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00007791*/
drhd1459152016-09-16 19:11:03 +00007792static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00007793 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00007794 if( clearFlag ){
7795 free(home_dir);
7796 home_dir = 0;
7797 return 0;
7798 }
drh85e72432012-04-11 11:38:53 +00007799 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00007800
drh4ace5362014-11-10 14:42:28 +00007801#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
7802 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00007803 {
7804 struct passwd *pwent;
7805 uid_t uid = getuid();
7806 if( (pwent=getpwuid(uid)) != NULL) {
7807 home_dir = pwent->pw_dir;
7808 }
drh67505e72002-04-19 12:34:06 +00007809 }
7810#endif
7811
chw65d3c132007-11-12 21:09:10 +00007812#if defined(_WIN32_WCE)
7813 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
7814 */
drh85e72432012-04-11 11:38:53 +00007815 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00007816#else
7817
drh83905c92012-06-21 13:00:37 +00007818#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00007819 if (!home_dir) {
7820 home_dir = getenv("USERPROFILE");
7821 }
7822#endif
7823
drh67505e72002-04-19 12:34:06 +00007824 if (!home_dir) {
7825 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00007826 }
7827
drh83905c92012-06-21 13:00:37 +00007828#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00007829 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00007830 char *zDrive, *zPath;
7831 int n;
7832 zDrive = getenv("HOMEDRIVE");
7833 zPath = getenv("HOMEPATH");
7834 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00007835 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00007836 home_dir = malloc( n );
7837 if( home_dir==0 ) return 0;
7838 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
7839 return home_dir;
7840 }
7841 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00007842 }
7843#endif
7844
chw65d3c132007-11-12 21:09:10 +00007845#endif /* !_WIN32_WCE */
7846
drh67505e72002-04-19 12:34:06 +00007847 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00007848 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00007849 char *z = malloc( n );
7850 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00007851 home_dir = z;
7852 }
drhe98d4fa2002-04-21 19:06:22 +00007853
drh67505e72002-04-19 12:34:06 +00007854 return home_dir;
7855}
7856
7857/*
7858** Read input from the file given by sqliterc_override. Or if that
7859** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00007860**
7861** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00007862*/
drh534f4df2015-02-28 14:03:35 +00007863static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00007864 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00007865 const char *sqliterc_override /* Name of config file. NULL to use default */
7866){
persicom7e2dfdd2002-04-18 02:46:52 +00007867 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00007868 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00007869 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00007870 FILE *in = NULL;
7871
7872 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00007873 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00007874 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007875 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00007876 " cannot read ~/.sqliterc\n");
7877 return;
drhe98d4fa2002-04-21 19:06:22 +00007878 }
drh2f3de322012-06-27 16:41:31 +00007879 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00007880 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
7881 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00007882 }
drha1f9b5e2004-02-14 16:31:02 +00007883 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00007884 if( in ){
drhc28490c2006-10-26 14:25:58 +00007885 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00007886 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00007887 }
drh534f4df2015-02-28 14:03:35 +00007888 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00007889 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00007890 }
drh85e72432012-04-11 11:38:53 +00007891 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00007892}
7893
drh67505e72002-04-19 12:34:06 +00007894/*
drhe1e38c42003-05-04 18:30:59 +00007895** Show available command line options
7896*/
mistachkin1fe36bb2016-04-04 02:16:44 +00007897static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00007898 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00007899 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00007900 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00007901 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00007902 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00007903 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00007904 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00007905 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00007906 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00007907#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
7908 " -heap SIZE Size of heap for memsys3 or memsys5\n"
7909#endif
drhcc3b4f82012-02-07 14:13:50 +00007910 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00007911 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00007912 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00007913 " -line set output mode to 'line'\n"
7914 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00007915 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00007916 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00007917#ifdef SQLITE_ENABLE_MULTIPLEX
7918 " -multiplex enable the multiplexor VFS\n"
7919#endif
mistachkine0d68852014-12-11 03:12:33 +00007920 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00007921 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00007922 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
drha501f7d2017-06-29 21:33:25 +00007923 " -quote set output mode to 'quote'\n"
drh44dec872014-08-30 15:49:25 +00007924 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00007925 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00007926 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00007927 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00007928 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00007929#ifdef SQLITE_ENABLE_VFSTRACE
7930 " -vfstrace enable tracing of all VFS calls\n"
7931#endif
drhe1e38c42003-05-04 18:30:59 +00007932;
7933static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00007934 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00007935 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00007936 "FILENAME is the name of an SQLite database. A new database is created\n"
7937 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00007938 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00007939 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00007940 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007941 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00007942 }
7943 exit(1);
7944}
7945
7946/*
drh67505e72002-04-19 12:34:06 +00007947** Initialize the state information in data
7948*/
drhdcd87a92014-08-18 13:45:42 +00007949static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00007950 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00007951 data->normalMode = data->cMode = data->mode = MODE_List;
7952 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00007953 memcpy(data->colSeparator,SEP_Column, 2);
7954 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00007955 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00007956 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00007957 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00007958 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00007959 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00007960 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
7961 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00007962}
7963
drh98d312f2012-10-25 15:23:14 +00007964/*
drh5c7976f2014-02-10 19:59:27 +00007965** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00007966*/
7967#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00007968static void printBold(const char *zText){
7969 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
7970 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
7971 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
7972 SetConsoleTextAttribute(out,
7973 FOREGROUND_RED|FOREGROUND_INTENSITY
7974 );
7975 printf("%s", zText);
7976 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00007977}
7978#else
drh5c7976f2014-02-10 19:59:27 +00007979static void printBold(const char *zText){
7980 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00007981}
7982#endif
7983
7984/*
drh98d312f2012-10-25 15:23:14 +00007985** Get the argument to an --option. Throw an error and die if no argument
7986** is available.
7987*/
7988static char *cmdline_option_value(int argc, char **argv, int i){
7989 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00007990 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00007991 argv[0], argv[argc-1]);
7992 exit(1);
7993 }
7994 return argv[i];
7995}
7996
mistachkin1fe36bb2016-04-04 02:16:44 +00007997#ifndef SQLITE_SHELL_IS_UTF8
7998# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
7999# define SQLITE_SHELL_IS_UTF8 (0)
8000# else
8001# define SQLITE_SHELL_IS_UTF8 (1)
8002# endif
8003#endif
8004
8005#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00008006int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00008007#else
8008int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00008009 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00008010#endif
drh75897232000-05-29 14:26:00 +00008011 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00008012 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00008013 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00008014 int i;
drhc28490c2006-10-26 14:25:58 +00008015 int rc = 0;
drhb3735912014-02-10 16:13:42 +00008016 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00008017 int readStdin = 1;
8018 int nCmd = 0;
8019 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00008020
mistachkin1fe36bb2016-04-04 02:16:44 +00008021 setBinaryMode(stdin, 0);
8022 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00008023 stdin_is_interactive = isatty(0);
8024 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00008025
drh69b30ab2014-02-27 15:11:52 +00008026#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00008027 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008028 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00008029 sqlite3_sourceid(), SQLITE_SOURCE_ID);
8030 exit(1);
8031 }
drhc7181902014-02-27 15:04:13 +00008032#endif
persicom7e2dfdd2002-04-18 02:46:52 +00008033 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00008034#if !SQLITE_SHELL_IS_UTF8
8035 sqlite3_initialize();
8036 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
8037 if( argv==0 ){
8038 raw_printf(stderr, "out of memory\n");
8039 exit(1);
8040 }
8041 for(i=0; i<argc; i++){
8042 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
8043 if( argv[i]==0 ){
8044 raw_printf(stderr, "out of memory\n");
8045 exit(1);
8046 }
8047 }
8048#endif
mistachkin1810f222016-04-04 02:33:34 +00008049 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00008050 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00008051
drh44c2eb12003-04-30 11:38:26 +00008052 /* Make sure we have a valid signal handler early, before anything
8053 ** else is done.
8054 */
drh4c504392000-10-16 22:06:40 +00008055#ifdef SIGINT
8056 signal(SIGINT, interrupt_handler);
8057#endif
drh44c2eb12003-04-30 11:38:26 +00008058
drhac5649a2014-11-28 13:35:03 +00008059#ifdef SQLITE_SHELL_DBNAME_PROC
8060 {
8061 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
8062 ** of a C-function that will provide the name of the database file. Use
8063 ** this compile-time option to embed this shell program in larger
8064 ** applications. */
8065 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
8066 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
8067 warnInmemoryDb = 0;
8068 }
8069#endif
8070
drh22fbcb82004-02-01 01:22:50 +00008071 /* Do an initial pass through the command-line argument to locate
8072 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00008073 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00008074 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00008075 */
drh98d312f2012-10-25 15:23:14 +00008076 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00008077 char *z;
drhc28490c2006-10-26 14:25:58 +00008078 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00008079 if( z[0]!='-' ){
8080 if( data.zDbFilename==0 ){
8081 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00008082 }else{
8083 /* Excesss arguments are interpreted as SQL (or dot-commands) and
8084 ** mean that nothing is read from stdin */
8085 readStdin = 0;
8086 nCmd++;
8087 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
8088 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008089 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00008090 exit(1);
8091 }
8092 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00008093 }
drh98d312f2012-10-25 15:23:14 +00008094 }
drhcc3b4f82012-02-07 14:13:50 +00008095 if( z[1]=='-' ) z++;
8096 if( strcmp(z,"-separator")==0
8097 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00008098 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00008099 || strcmp(z,"-cmd")==0
8100 ){
drh98d312f2012-10-25 15:23:14 +00008101 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00008102 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00008103 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00008104 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00008105 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00008106 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00008107 ** we do the actual processing of arguments later in a second pass.
8108 */
shanef69573d2009-10-24 02:06:14 +00008109 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00008110 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00008111#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00008112 const char *zSize;
8113 sqlite3_int64 szHeap;
8114
drh98d312f2012-10-25 15:23:14 +00008115 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00008116 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00008117 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00008118 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00008119#else
8120 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00008121#endif
drh44dec872014-08-30 15:49:25 +00008122 }else if( strcmp(z,"-scratch")==0 ){
8123 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008124 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008125 if( sz>400000 ) sz = 400000;
8126 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00008127 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008128 if( n>10 ) n = 10;
8129 if( n<1 ) n = 1;
8130 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
8131 data.shellFlgs |= SHFLG_Scratch;
8132 }else if( strcmp(z,"-pagecache")==0 ){
8133 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008134 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008135 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00008136 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00008137 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00008138 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
8139 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00008140 data.shellFlgs |= SHFLG_Pagecache;
8141 }else if( strcmp(z,"-lookaside")==0 ){
8142 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00008143 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008144 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00008145 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00008146 if( n<0 ) n = 0;
8147 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
8148 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00008149#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00008150 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00008151 extern int vfstrace_register(
8152 const char *zTraceName,
8153 const char *zOldVfsName,
8154 int (*xOut)(const char*,void*),
8155 void *pOutArg,
8156 int makeDefault
8157 );
drh2b625e22011-03-16 17:05:28 +00008158 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00008159#endif
drh6f25e892011-07-08 17:02:57 +00008160#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00008161 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00008162 extern int sqlite3_multiple_initialize(const char*,int);
8163 sqlite3_multiplex_initialize(0, 1);
8164#endif
drh7d9f3942013-04-03 01:26:54 +00008165 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00008166 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8167 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00008168 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00008169 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00008170 if( pVfs ){
8171 sqlite3_vfs_register(pVfs, 1);
8172 }else{
mistachkinaae280e2015-12-31 19:06:24 +00008173 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00008174 exit(1);
8175 }
drh44c2eb12003-04-30 11:38:26 +00008176 }
8177 }
drh98d312f2012-10-25 15:23:14 +00008178 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00008179#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00008180 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00008181 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00008182#else
mistachkinaae280e2015-12-31 19:06:24 +00008183 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00008184 return 1;
drh01b41712005-08-29 23:06:23 +00008185#endif
drh98d312f2012-10-25 15:23:14 +00008186 }
8187 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00008188
drh44c2eb12003-04-30 11:38:26 +00008189 /* Go ahead and open the database file if it already exists. If the
8190 ** file does not exist, delay opening it. This prevents empty database
8191 ** files from being created if a user mistypes the database name argument
8192 ** to the sqlite command-line tool.
8193 */
drhc8d74412004-08-31 23:41:26 +00008194 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00008195 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00008196 }
8197
drh22fbcb82004-02-01 01:22:50 +00008198 /* Process the initialization file if there is one. If no -init option
8199 ** is given on the command line, look for a file named ~/.sqliterc and
8200 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00008201 */
drh534f4df2015-02-28 14:03:35 +00008202 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00008203
drh22fbcb82004-02-01 01:22:50 +00008204 /* Make a second pass through the command-line argument and set
8205 ** options. This second pass is delayed until after the initialization
8206 ** file is processed so that the command-line arguments will override
8207 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00008208 */
drh98d312f2012-10-25 15:23:14 +00008209 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00008210 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00008211 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00008212 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00008213 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00008214 i++;
8215 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008216 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00008217 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008218 data.mode = MODE_List;
drha501f7d2017-06-29 21:33:25 +00008219 }else if( strcmp(z,"-quote")==0 ){
8220 data.mode = MODE_Quote;
drh22fbcb82004-02-01 01:22:50 +00008221 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008222 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00008223 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00008224 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00008225 }else if( strcmp(z,"-csv")==0 ){
8226 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00008227 memcpy(data.colSeparator,",",2);
8228 }else if( strcmp(z,"-ascii")==0 ){
8229 data.mode = MODE_Ascii;
8230 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00008231 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00008232 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00008233 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00008234 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00008235 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00008236 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00008237 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00008238 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00008239 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00008240 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00008241 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00008242 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00008243 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008244 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00008245 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00008246 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00008247 }else if( strcmp(z,"-echo")==0 ){
drhe6e1d122017-03-09 13:50:49 +00008248 ShellSetFlag(&data, SHFLG_Echo);
drhefbf3b12014-02-28 20:47:24 +00008249 }else if( strcmp(z,"-eqp")==0 ){
8250 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00008251 }else if( strcmp(z,"-eqpfull")==0 ){
8252 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00008253 }else if( strcmp(z,"-stats")==0 ){
8254 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00008255 }else if( strcmp(z,"-scanstats")==0 ){
8256 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00008257 }else if( strcmp(z,"-backslash")==0 ){
8258 /* Undocumented command-line option: -backslash
8259 ** Causes C-style backslash escapes to be evaluated in SQL statements
8260 ** prior to sending the SQL into SQLite. Useful for injecting
8261 ** crazy bytes in the middle of SQL statements for testing and debugging.
8262 */
drhe6e1d122017-03-09 13:50:49 +00008263 ShellSetFlag(&data, SHFLG_Backslash);
drhc49f44e2006-10-26 18:15:42 +00008264 }else if( strcmp(z,"-bail")==0 ){
8265 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00008266 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00008267 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00008268 return 0;
drhc28490c2006-10-26 14:25:58 +00008269 }else if( strcmp(z,"-interactive")==0 ){
8270 stdin_is_interactive = 1;
8271 }else if( strcmp(z,"-batch")==0 ){
8272 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00008273 }else if( strcmp(z,"-heap")==0 ){
8274 i++;
drh44dec872014-08-30 15:49:25 +00008275 }else if( strcmp(z,"-scratch")==0 ){
8276 i+=2;
8277 }else if( strcmp(z,"-pagecache")==0 ){
8278 i+=2;
8279 }else if( strcmp(z,"-lookaside")==0 ){
8280 i+=2;
drh7d9f3942013-04-03 01:26:54 +00008281 }else if( strcmp(z,"-mmap")==0 ){
8282 i++;
drha7e61d82011-03-12 17:02:57 +00008283 }else if( strcmp(z,"-vfs")==0 ){
8284 i++;
drh6f25e892011-07-08 17:02:57 +00008285#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00008286 }else if( strcmp(z,"-vfstrace")==0 ){
8287 i++;
drh6f25e892011-07-08 17:02:57 +00008288#endif
8289#ifdef SQLITE_ENABLE_MULTIPLEX
8290 }else if( strcmp(z,"-multiplex")==0 ){
8291 i++;
8292#endif
drhcc3b4f82012-02-07 14:13:50 +00008293 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00008294 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00008295 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00008296 /* Run commands that follow -cmd first and separately from commands
8297 ** that simply appear on the command-line. This seems goofy. It would
8298 ** be better if all commands ran in the order that they appear. But
8299 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00008300 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00008301 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00008302 if( z[0]=='.' ){
8303 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00008304 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00008305 }else{
drh05782482013-10-24 15:20:20 +00008306 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00008307 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
8308 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008309 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00008310 if( bail_on_error ) return rc!=0 ? rc : 1;
8311 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008312 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00008313 if( bail_on_error ) return rc;
8314 }
8315 }
drh1e5d0e92000-05-31 23:33:17 +00008316 }else{
mistachkinaae280e2015-12-31 19:06:24 +00008317 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
8318 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00008319 return 1;
8320 }
drh700c2522016-02-09 18:39:25 +00008321 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00008322 }
drh44c2eb12003-04-30 11:38:26 +00008323
drhac5649a2014-11-28 13:35:03 +00008324 if( !readStdin ){
8325 /* Run all arguments that do not begin with '-' as if they were separate
8326 ** command-line inputs, except for the argToSkip argument which contains
8327 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00008328 */
drhac5649a2014-11-28 13:35:03 +00008329 for(i=0; i<nCmd; i++){
8330 if( azCmd[i][0]=='.' ){
8331 rc = do_meta_command(azCmd[i], &data);
8332 if( rc ) return rc==2 ? 0 : rc;
8333 }else{
8334 open_db(&data, 0);
8335 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
8336 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008337 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00008338 return rc!=0 ? rc : 1;
8339 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00008340 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00008341 return rc;
8342 }
drh6ff13852001-11-25 13:18:23 +00008343 }
drh75897232000-05-29 14:26:00 +00008344 }
drhac5649a2014-11-28 13:35:03 +00008345 free(azCmd);
drh75897232000-05-29 14:26:00 +00008346 }else{
drh44c2eb12003-04-30 11:38:26 +00008347 /* Run commands received from standard input
8348 */
drhc28490c2006-10-26 14:25:58 +00008349 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00008350 char *zHome;
8351 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00008352 int nHistory;
drh75897232000-05-29 14:26:00 +00008353 printf(
drh743e0032011-12-12 16:51:50 +00008354 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00008355 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00008356 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00008357 );
drhb3735912014-02-10 16:13:42 +00008358 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00008359 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00008360 printBold("transient in-memory database");
8361 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00008362 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00008363 }
drhd1459152016-09-16 19:11:03 +00008364 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00008365 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00008366 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00008367 if( (zHistory = malloc(nHistory))!=0 ){
8368 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
8369 }
drh67505e72002-04-19 12:34:06 +00008370 }
drhf5ed7ad2015-06-15 14:43:25 +00008371 if( zHistory ){ shell_read_history(zHistory); }
drh56eb09b2017-07-11 13:59:07 +00008372#if HAVE_READLINE || HAVE_EDITLINE
8373 rl_attempted_completion_function = readline_completion;
8374#elif HAVE_LINENOISE
8375 linenoiseSetCompletionCallback(linenoise_completion);
8376#endif
drhc28490c2006-10-26 14:25:58 +00008377 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00008378 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00008379 shell_stifle_history(100);
8380 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00008381 free(zHistory);
drh67505e72002-04-19 12:34:06 +00008382 }
drhdaffd0e2001-04-11 14:28:42 +00008383 }else{
drhc28490c2006-10-26 14:25:58 +00008384 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00008385 }
8386 }
drh33048c02001-10-01 14:29:22 +00008387 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00008388 if( data.db ){
drhe6229612014-08-18 15:08:26 +00008389 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00008390 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00008391 }
mistachkin1fe36bb2016-04-04 02:16:44 +00008392 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00008393 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00008394#if !SQLITE_SHELL_IS_UTF8
8395 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
8396 sqlite3_free(argv);
8397#endif
drhc28490c2006-10-26 14:25:58 +00008398 return rc;
drh75897232000-05-29 14:26:00 +00008399}
drh2ce15c32017-07-11 13:34:40 +00008400