blob: 371efa024e0cfbb2d457385daf55075b770fb7d5 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
21** Enable large-file support for fopen() and friends on unix.
22*/
23#ifndef SQLITE_DISABLE_LFS
24# define _LARGE_FILE 1
25# ifndef _FILE_OFFSET_BITS
26# define _FILE_OFFSET_BITS 64
27# endif
28# define _LARGEFILE_SOURCE 1
29#endif
30
drh75897232000-05-29 14:26:00 +000031#include <stdlib.h>
32#include <string.h>
33#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000034#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000035#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000036#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000037#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000038
drh83905c92012-06-21 13:00:37 +000039#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000040# include <signal.h>
chw97185482008-11-17 08:05:31 +000041# if !defined(__RTP__) && !defined(_WRS_KERNEL)
42# include <pwd.h>
43# endif
drhdd45df82002-04-18 12:39:03 +000044# include <unistd.h>
45# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000046#endif
drh75897232000-05-29 14:26:00 +000047
drhaaa21b42014-02-11 14:37:51 +000048#if defined(HAVE_READLINE) && HAVE_READLINE!=0
drh8e7e7a22000-05-30 18:45:23 +000049# include <readline/readline.h>
50# include <readline/history.h>
drhaaa21b42014-02-11 14:37:51 +000051#else
52# undef HAVE_READLINE
drh81d7fd12010-12-08 00:02:26 +000053#endif
drhaaa21b42014-02-11 14:37:51 +000054#if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
55# define HAVE_READLINE 1
56# include <editline/readline.h>
57#endif
58#if !defined(HAVE_READLINE)
persicom1d0b8722002-04-18 02:53:04 +000059# define add_history(X)
drh67505e72002-04-19 12:34:06 +000060# define read_history(X)
61# define write_history(X)
62# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000063#endif
64
adamd2e8464a2006-09-06 21:39:40 +000065#if defined(_WIN32) || defined(WIN32)
66# include <io.h>
drh6976c212014-07-24 12:09:47 +000067# include <fcntl.h>
shane18e526c2008-12-10 22:30:24 +000068#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +000069#ifndef access
70# define access(f,m) _access((f),(m))
71#endif
drh67ceaa62012-08-27 21:19:03 +000072#undef popen
drh53371f92013-07-25 17:07:03 +000073#define popen _popen
drh67ceaa62012-08-27 21:19:03 +000074#undef pclose
drh12cd6cf2013-06-29 15:40:22 +000075#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +000076#else
drh4328c8b2003-04-26 02:50:11 +000077/* Make sure isatty() has a prototype.
78*/
drhb2acc3b2011-10-13 16:36:29 +000079extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +000080
drh53371f92013-07-25 17:07:03 +000081/* popen and pclose are not C89 functions and so are sometimes omitted from
82** the <stdio.h> header */
mistachkinf6418892013-08-28 01:54:12 +000083extern FILE *popen(const char*,const char*);
84extern int pclose(FILE*);
85#endif
drh53371f92013-07-25 17:07:03 +000086
chw65d3c132007-11-12 21:09:10 +000087#if defined(_WIN32_WCE)
88/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
89 * thus we always assume that we have a console. That can be
90 * overridden with the -batch command line option.
91 */
92#define isatty(x) 1
93#endif
94
drhf0693c82011-10-11 20:41:54 +000095/* ctype macros that work with signed characters */
96#define IsSpace(X) isspace((unsigned char)X)
97#define IsDigit(X) isdigit((unsigned char)X)
98#define ToLower(X) (char)tolower((unsigned char)X)
99
drh43408312013-10-30 12:43:36 +0000100
101/* True if the timer is enabled */
102static int enableTimer = 0;
103
104/* Return the current wall-clock time */
105static sqlite3_int64 timeOfDay(void){
106 static sqlite3_vfs *clockVfs = 0;
107 sqlite3_int64 t;
108 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
109 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
110 clockVfs->xCurrentTimeInt64(clockVfs, &t);
111 }else{
112 double r;
113 clockVfs->xCurrentTime(clockVfs, &r);
114 t = (sqlite3_int64)(r*86400000.0);
115 }
116 return t;
117}
118
drhd5d0f642013-02-20 00:54:21 +0000119#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
120 && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000121#include <sys/time.h>
122#include <sys/resource.h>
123
drhda108222009-02-25 19:07:24 +0000124/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000125static struct rusage sBegin; /* CPU time at start */
126static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000127
drhda108222009-02-25 19:07:24 +0000128/*
129** Begin timing an operation
130*/
131static void beginTimer(void){
132 if( enableTimer ){
133 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000134 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000135 }
136}
137
138/* Return the difference of two time_structs in seconds */
139static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
140 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
141 (double)(pEnd->tv_sec - pStart->tv_sec);
142}
143
144/*
145** Print the timing results.
146*/
147static void endTimer(void){
148 if( enableTimer ){
149 struct rusage sEnd;
drh43408312013-10-30 12:43:36 +0000150 sqlite3_int64 iEnd = timeOfDay();
drhda108222009-02-25 19:07:24 +0000151 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000152 printf("Run Time: real %.3f user %f sys %f\n",
153 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000154 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
155 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
156 }
157}
shaneb320ccd2009-10-21 03:42:58 +0000158
drhda108222009-02-25 19:07:24 +0000159#define BEGIN_TIMER beginTimer()
160#define END_TIMER endTimer()
161#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000162
163#elif (defined(_WIN32) || defined(WIN32))
164
165#include <windows.h>
166
167/* Saved resource information for the beginning of an operation */
168static HANDLE hProcess;
169static FILETIME ftKernelBegin;
170static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000171static sqlite3_int64 ftWallBegin;
shaneb320ccd2009-10-21 03:42:58 +0000172typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
173static GETPROCTIMES getProcessTimesAddr = NULL;
174
shaneb320ccd2009-10-21 03:42:58 +0000175/*
176** Check to see if we have timer support. Return 1 if necessary
177** support found (or found previously).
178*/
179static int hasTimer(void){
180 if( getProcessTimesAddr ){
181 return 1;
182 } else {
183 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
184 ** See if the version we are running on has it, and if it does, save off
185 ** a pointer to it and the current process handle.
186 */
187 hProcess = GetCurrentProcess();
188 if( hProcess ){
189 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
190 if( NULL != hinstLib ){
191 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
192 if( NULL != getProcessTimesAddr ){
193 return 1;
194 }
195 FreeLibrary(hinstLib);
196 }
197 }
198 }
199 return 0;
200}
201
202/*
203** Begin timing an operation
204*/
205static void beginTimer(void){
206 if( enableTimer && getProcessTimesAddr ){
207 FILETIME ftCreation, ftExit;
208 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
drh43408312013-10-30 12:43:36 +0000209 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000210 }
211}
212
213/* Return the difference of two FILETIME structs in seconds */
214static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
215 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
216 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
217 return (double) ((i64End - i64Start) / 10000000.0);
218}
219
220/*
221** Print the timing results.
222*/
223static void endTimer(void){
224 if( enableTimer && getProcessTimesAddr){
225 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000226 sqlite3_int64 ftWallEnd = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000227 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
drh43408312013-10-30 12:43:36 +0000228 printf("Run Time: real %.3f user %f sys %f\n",
229 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000230 timeDiff(&ftUserBegin, &ftUserEnd),
231 timeDiff(&ftKernelBegin, &ftKernelEnd));
232 }
233}
234
235#define BEGIN_TIMER beginTimer()
236#define END_TIMER endTimer()
237#define HAS_TIMER hasTimer()
238
drhda108222009-02-25 19:07:24 +0000239#else
240#define BEGIN_TIMER
241#define END_TIMER
242#define HAS_TIMER 0
243#endif
244
shanec0688ea2009-03-05 03:48:06 +0000245/*
246** Used to prevent warnings about unused parameters
247*/
248#define UNUSED_PARAMETER(x) (void)(x)
249
drhe91d16b2008-12-08 18:27:31 +0000250/*
drhc49f44e2006-10-26 18:15:42 +0000251** If the following flag is set, then command execution stops
252** at an error if we are not interactive.
253*/
254static int bail_on_error = 0;
255
256/*
drhc28490c2006-10-26 14:25:58 +0000257** Threat stdin as an interactive input if the following variable
258** is true. Otherwise, assume stdin is connected to a file or pipe.
259*/
260static int stdin_is_interactive = 1;
261
262/*
drh4c504392000-10-16 22:06:40 +0000263** The following is the open SQLite database. We make a pointer
264** to this database a static variable so that it can be accessed
265** by the SIGINT handler to interrupt database processing.
266*/
danielk197792f9a1b2004-06-19 09:08:16 +0000267static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000268
269/*
drh67505e72002-04-19 12:34:06 +0000270** True if an interrupt (Control-C) has been received.
271*/
drh43617e92006-03-06 20:55:46 +0000272static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000273
274/*
persicom7e2dfdd2002-04-18 02:46:52 +0000275** This is the name of our program. It is set in main(), used
276** in a number of other places, mostly for error messages.
277*/
278static char *Argv0;
279
280/*
281** Prompt strings. Initialized in main. Settable with
282** .prompt main continue
283*/
284static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
285static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
286
drhb0603412007-02-28 04:47:26 +0000287/*
288** Write I/O traces to the following stream.
289*/
rsebe0a9092007-07-30 18:24:38 +0000290#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000291static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000292#endif
drhb0603412007-02-28 04:47:26 +0000293
294/*
295** This routine works like printf in that its first argument is a
296** format string and subsequent arguments are values to be substituted
297** in place of % fields. The result of formatting this string
298** is written to iotrace.
299*/
rsebe0a9092007-07-30 18:24:38 +0000300#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000301static void iotracePrintf(const char *zFormat, ...){
302 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000303 char *z;
drhb0603412007-02-28 04:47:26 +0000304 if( iotrace==0 ) return;
305 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000306 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000307 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000308 fprintf(iotrace, "%s", z);
309 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000310}
rsebe0a9092007-07-30 18:24:38 +0000311#endif
drhb0603412007-02-28 04:47:26 +0000312
drh44c2eb12003-04-30 11:38:26 +0000313
persicom7e2dfdd2002-04-18 02:46:52 +0000314/*
drh83965662003-04-17 02:54:13 +0000315** Determines if a string is a number of not.
316*/
danielk19772e588c72005-12-09 14:25:08 +0000317static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000318 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000319 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000320 return 0;
321 }
322 z++;
323 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000324 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000325 if( *z=='.' ){
326 z++;
drhf0693c82011-10-11 20:41:54 +0000327 if( !IsDigit(*z) ) return 0;
328 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000329 if( realnum ) *realnum = 1;
330 }
331 if( *z=='e' || *z=='E' ){
332 z++;
333 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000334 if( !IsDigit(*z) ) return 0;
335 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000336 if( realnum ) *realnum = 1;
337 }
338 return *z==0;
339}
drh83965662003-04-17 02:54:13 +0000340
341/*
danielk1977bc6ada42004-06-30 08:20:16 +0000342** A global char* and an SQL function to access its current value
343** from within an SQL statement. This program used to use the
344** sqlite_exec_printf() API to substitue a string into an SQL statement.
345** The correct way to do this with sqlite3 is to use the bind API, but
346** since the shell is built around the callback paradigm it would be a lot
347** of work. Instead just use this hack, which is quite harmless.
348*/
349static const char *zShellStatic = 0;
350static void shellstaticFunc(
351 sqlite3_context *context,
352 int argc,
353 sqlite3_value **argv
354){
355 assert( 0==argc );
356 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000357 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000358 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000359 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
360}
361
362
363/*
drhfeac5f82004-08-01 00:10:45 +0000364** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000365** the text in memory obtained from malloc() and returns a pointer
366** to the text. NULL is returned at end of file, or if malloc()
367** fails.
368**
drh9f099fd2013-08-06 14:01:46 +0000369** If zLine is not NULL then it is a malloced buffer returned from
370** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000371*/
drh9f099fd2013-08-06 14:01:46 +0000372static char *local_getline(char *zLine, FILE *in){
373 int nLine = zLine==0 ? 0 : 100;
374 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000375
drhb07028f2011-10-14 21:49:18 +0000376 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000377 if( n+100>nLine ){
378 nLine = nLine*2 + 100;
379 zLine = realloc(zLine, nLine);
380 if( zLine==0 ) return 0;
381 }
drhdaffd0e2001-04-11 14:28:42 +0000382 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000383 if( n==0 ){
384 free(zLine);
385 return 0;
386 }
387 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000388 break;
389 }
drh9f099fd2013-08-06 14:01:46 +0000390 while( zLine[n] ) n++;
391 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000392 n--;
shaneh13b36022009-12-17 21:07:15 +0000393 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000394 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000395 break;
drh8e7e7a22000-05-30 18:45:23 +0000396 }
397 }
drh8e7e7a22000-05-30 18:45:23 +0000398 return zLine;
399}
400
401/*
drhc28490c2006-10-26 14:25:58 +0000402** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000403**
drh9f099fd2013-08-06 14:01:46 +0000404** If in==0 then read from standard input and prompt before each line.
405** If isContinuation is true, then a continuation prompt is appropriate.
406** If isContinuation is zero, then the main prompt should be used.
407**
408** If zPrior is not NULL then it is a buffer from a prior call to this
409** routine that can be reused.
410**
411** The result is stored in space obtained from malloc() and must either
412** be freed by the caller or else passed back into this routine via the
413** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000414*/
drh9f099fd2013-08-06 14:01:46 +0000415static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000416 char *zPrompt;
417 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000418 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000419 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000420 }else{
drh9f099fd2013-08-06 14:01:46 +0000421 zPrompt = isContinuation ? continuePrompt : mainPrompt;
drhaaa21b42014-02-11 14:37:51 +0000422#if defined(HAVE_READLINE)
drh9f099fd2013-08-06 14:01:46 +0000423 free(zPrior);
424 zResult = readline(zPrompt);
425 if( zResult && *zResult ) add_history(zResult);
426#else
427 printf("%s", zPrompt);
428 fflush(stdout);
429 zResult = local_getline(zPrior, stdin);
danielk19774af00c62005-01-23 23:43:21 +0000430#endif
drh9f099fd2013-08-06 14:01:46 +0000431 }
drh8e7e7a22000-05-30 18:45:23 +0000432 return zResult;
433}
434
persicom7e2dfdd2002-04-18 02:46:52 +0000435struct previous_mode_data {
436 int valid; /* Is there legit data in here? */
437 int mode;
438 int showHeader;
439 int colWidth[100];
440};
drh45e29d82006-11-20 16:21:10 +0000441
drh8e7e7a22000-05-30 18:45:23 +0000442/*
drh75897232000-05-29 14:26:00 +0000443** An pointer to an instance of this structure is passed from
444** the main program to the callback. This is used to communicate
445** state and mode information.
446*/
447struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000448 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000449 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000450 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000451 int statsOn; /* True to display memory stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +0000452 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000453 int cnt; /* Number of records displayed so far */
454 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000455 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000456 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000457 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000458 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000459 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000460 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000461 char separator[20]; /* Separator character for MODE_List */
drh6976c212014-07-24 12:09:47 +0000462 char newline[20]; /* Record separator in MODE_Csv */
drha0c66f52000-07-29 13:20:21 +0000463 int colWidth[100]; /* Requested width of each column when in column mode*/
464 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000465 char nullvalue[20]; /* The text to print when a NULL comes back from
466 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000467 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000468 /* Holds the mode information just before
469 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000470 char outfile[FILENAME_MAX]; /* Filename for *out */
471 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000472 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000473 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000474 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000475 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000476 int *aiIndent; /* Array of indents used in MODE_Explain */
477 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000478 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000479};
480
481/*
482** These are the allowed modes.
483*/
drh967e8b72000-06-21 13:59:10 +0000484#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000485#define MODE_Column 1 /* One record per line in neat columns */
486#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000487#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
488#define MODE_Html 4 /* Generate an XHTML table */
489#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000490#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000491#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000492#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000493
drh66ce4d02008-02-15 17:38:06 +0000494static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000495 "line",
496 "column",
497 "list",
498 "semi",
499 "html",
drhfeac5f82004-08-01 00:10:45 +0000500 "insert",
501 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000502 "csv",
drh66ce4d02008-02-15 17:38:06 +0000503 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000504};
drh75897232000-05-29 14:26:00 +0000505
506/*
507** Number of elements in an array
508*/
drh902b9ee2008-12-05 17:17:07 +0000509#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000510
511/*
drhea678832008-12-10 19:26:22 +0000512** Compute a string length that is limited to what can be stored in
513** lower 30 bits of a 32-bit signed integer.
514*/
drh4f21c4a2008-12-10 22:15:00 +0000515static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000516 const char *z2 = z;
517 while( *z2 ){ z2++; }
518 return 0x3fffffff & (int)(z2 - z);
519}
520
521/*
drh127f9d72010-02-23 01:47:00 +0000522** A callback for the sqlite3_log() interface.
523*/
524static void shellLog(void *pArg, int iErrCode, const char *zMsg){
525 struct callback_data *p = (struct callback_data*)pArg;
526 if( p->pLog==0 ) return;
527 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
528 fflush(p->pLog);
529}
530
531/*
shane626a6e42009-10-22 17:30:15 +0000532** Output the given string as a hex-encoded blob (eg. X'1234' )
533*/
534static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
535 int i;
536 char *zBlob = (char *)pBlob;
537 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000538 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000539 fprintf(out,"'");
540}
541
542/*
drh28bd4bc2000-06-15 15:57:22 +0000543** Output the given string as a quoted string using SQL quoting conventions.
544*/
545static void output_quoted_string(FILE *out, const char *z){
546 int i;
547 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000548 for(i=0; z[i]; i++){
549 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000550 }
551 if( nSingle==0 ){
552 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000553 }else{
554 fprintf(out,"'");
555 while( *z ){
556 for(i=0; z[i] && z[i]!='\''; i++){}
557 if( i==0 ){
558 fprintf(out,"''");
559 z++;
560 }else if( z[i]=='\'' ){
561 fprintf(out,"%.*s''",i,z);
562 z += i+1;
563 }else{
drhcd7d2732002-02-26 23:24:26 +0000564 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000565 break;
566 }
567 }
drhcd7d2732002-02-26 23:24:26 +0000568 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000569 }
570}
571
572/*
drhfeac5f82004-08-01 00:10:45 +0000573** Output the given string as a quoted according to C or TCL quoting rules.
574*/
575static void output_c_string(FILE *out, const char *z){
576 unsigned int c;
577 fputc('"', out);
578 while( (c = *(z++))!=0 ){
579 if( c=='\\' ){
580 fputc(c, out);
581 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000582 }else if( c=='"' ){
583 fputc('\\', out);
584 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000585 }else if( c=='\t' ){
586 fputc('\\', out);
587 fputc('t', out);
588 }else if( c=='\n' ){
589 fputc('\\', out);
590 fputc('n', out);
591 }else if( c=='\r' ){
592 fputc('\\', out);
593 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000594 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000595 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000596 }else{
597 fputc(c, out);
598 }
599 }
600 fputc('"', out);
601}
602
603/*
drhc08a4f12000-06-15 16:49:48 +0000604** Output the given string with characters that are special to
605** HTML escaped.
606*/
607static void output_html_string(FILE *out, const char *z){
608 int i;
drhc3d6ba42014-01-13 20:38:35 +0000609 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000610 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000611 for(i=0; z[i]
612 && z[i]!='<'
613 && z[i]!='&'
614 && z[i]!='>'
615 && z[i]!='\"'
616 && z[i]!='\'';
617 i++){}
drhc08a4f12000-06-15 16:49:48 +0000618 if( i>0 ){
619 fprintf(out,"%.*s",i,z);
620 }
621 if( z[i]=='<' ){
622 fprintf(out,"&lt;");
623 }else if( z[i]=='&' ){
624 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000625 }else if( z[i]=='>' ){
626 fprintf(out,"&gt;");
627 }else if( z[i]=='\"' ){
628 fprintf(out,"&quot;");
629 }else if( z[i]=='\'' ){
630 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000631 }else{
632 break;
633 }
634 z += i + 1;
635 }
636}
637
638/*
drhc49f44e2006-10-26 18:15:42 +0000639** If a field contains any character identified by a 1 in the following
640** array, then the string must be quoted for CSV.
641*/
642static const char needCsvQuote[] = {
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
648 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
649 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
650 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
651 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
652 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
653 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
656 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
657 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
658 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
659};
660
661/*
drh8e64d1c2004-10-07 00:32:39 +0000662** Output a single term of CSV. Actually, p->separator is used for
663** the separator, which may or may not be a comma. p->nullvalue is
drh6976c212014-07-24 12:09:47 +0000664** the null value. Strings are quoted if necessary. The separator
665** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000666*/
667static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000668 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000669 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000670 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000671 }else{
drhc49f44e2006-10-26 18:15:42 +0000672 int i;
drh4f21c4a2008-12-10 22:15:00 +0000673 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000674 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000675 if( needCsvQuote[((unsigned char*)z)[i]]
676 || (z[i]==p->separator[0] &&
677 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000678 i = 0;
679 break;
680 }
681 }
682 if( i==0 ){
683 putc('"', out);
684 for(i=0; z[i]; i++){
685 if( z[i]=='"' ) putc('"', out);
686 putc(z[i], out);
687 }
688 putc('"', out);
689 }else{
690 fprintf(out, "%s", z);
691 }
drh8e64d1c2004-10-07 00:32:39 +0000692 }
693 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000694 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000695 }
696}
697
danielk19774af00c62005-01-23 23:43:21 +0000698#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000699/*
drh4c504392000-10-16 22:06:40 +0000700** This routine runs when the user presses Ctrl-C
701*/
702static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000703 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000704 seenInterrupt++;
705 if( seenInterrupt>2 ) exit(1);
danielk19776f8a5032004-05-10 10:34:51 +0000706 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000707}
danielk19774af00c62005-01-23 23:43:21 +0000708#endif
drh4c504392000-10-16 22:06:40 +0000709
710/*
shane626a6e42009-10-22 17:30:15 +0000711** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000712** invokes for each row of a query result.
713*/
shane626a6e42009-10-22 17:30:15 +0000714static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000715 int i;
716 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000717
drh75897232000-05-29 14:26:00 +0000718 switch( p->mode ){
719 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000720 int w = 5;
drh6a535342001-10-19 16:44:56 +0000721 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000722 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000723 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000724 if( len>w ) w = len;
725 }
drh75897232000-05-29 14:26:00 +0000726 if( p->cnt++>0 ) fprintf(p->out,"\n");
727 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000728 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000729 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000730 }
731 break;
732 }
danielk19770d78bae2008-01-03 07:09:48 +0000733 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000734 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000735 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000736 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000737 int w, n;
738 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000739 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000740 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000741 w = 0;
drh75897232000-05-29 14:26:00 +0000742 }
drh078b1fd2012-09-21 13:40:02 +0000743 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000744 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000745 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000746 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000747 if( w<n ) w = n;
748 }
749 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000750 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000751 }
752 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000753 if( w<0 ){
754 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
755 }else{
756 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
757 }
drha0c66f52000-07-29 13:20:21 +0000758 }
759 }
760 if( p->showHeader ){
761 for(i=0; i<nArg; i++){
762 int w;
763 if( i<ArraySize(p->actualWidth) ){
764 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000765 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000766 }else{
767 w = 10;
768 }
769 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
770 "----------------------------------------------------------",
771 i==nArg-1 ? "\n": " ");
772 }
drh75897232000-05-29 14:26:00 +0000773 }
774 }
drh6a535342001-10-19 16:44:56 +0000775 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000776 for(i=0; i<nArg; i++){
777 int w;
drha0c66f52000-07-29 13:20:21 +0000778 if( i<ArraySize(p->actualWidth) ){
779 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000780 }else{
781 w = 10;
782 }
dana98bf362013-11-13 18:35:01 +0000783 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000784 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000785 }
dana98bf362013-11-13 18:35:01 +0000786 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000787 if( p->iIndent<p->nIndent ){
788 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000789 }
danc4650bb2013-11-18 08:41:06 +0000790 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000791 }
drh078b1fd2012-09-21 13:40:02 +0000792 if( w<0 ){
793 fprintf(p->out,"%*.*s%s",-w,-w,
794 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
795 }else{
796 fprintf(p->out,"%-*.*s%s",w,w,
797 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
798 }
drh75897232000-05-29 14:26:00 +0000799 }
800 break;
801 }
drhe3710332000-09-29 13:30:53 +0000802 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000803 case MODE_List: {
804 if( p->cnt++==0 && p->showHeader ){
805 for(i=0; i<nArg; i++){
806 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
807 }
808 }
drh6a535342001-10-19 16:44:56 +0000809 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000810 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000811 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000812 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000813 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000814 if( i<nArg-1 ){
815 fprintf(p->out, "%s", p->separator);
816 }else if( p->mode==MODE_Semi ){
817 fprintf(p->out, ";\n");
818 }else{
819 fprintf(p->out, "\n");
820 }
drh75897232000-05-29 14:26:00 +0000821 }
822 break;
823 }
drh1e5d0e92000-05-31 23:33:17 +0000824 case MODE_Html: {
825 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000826 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000827 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000828 fprintf(p->out,"<TH>");
829 output_html_string(p->out, azCol[i]);
830 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000831 }
mihailim57c591a2008-06-23 21:26:05 +0000832 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000833 }
drh6a535342001-10-19 16:44:56 +0000834 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000835 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000836 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000837 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000838 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000839 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000840 }
mihailim57c591a2008-06-23 21:26:05 +0000841 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000842 break;
843 }
drhfeac5f82004-08-01 00:10:45 +0000844 case MODE_Tcl: {
845 if( p->cnt++==0 && p->showHeader ){
846 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000847 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin585dcb22012-12-04 00:23:43 +0000848 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000849 }
850 fprintf(p->out,"\n");
851 }
852 if( azArg==0 ) break;
853 for(i=0; i<nArg; i++){
854 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mistachkin585dcb22012-12-04 00:23:43 +0000855 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
drhfeac5f82004-08-01 00:10:45 +0000856 }
857 fprintf(p->out,"\n");
858 break;
859 }
drh8e64d1c2004-10-07 00:32:39 +0000860 case MODE_Csv: {
drh6976c212014-07-24 12:09:47 +0000861#if defined(WIN32) || defined(_WIN32)
862 fflush(p->out);
863 _setmode(_fileno(p->out), _O_BINARY);
864#endif
drh8e64d1c2004-10-07 00:32:39 +0000865 if( p->cnt++==0 && p->showHeader ){
866 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000867 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000868 }
drh6976c212014-07-24 12:09:47 +0000869 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000870 }
drh6976c212014-07-24 12:09:47 +0000871 if( azArg>0 ){
872 for(i=0; i<nArg; i++){
873 output_csv(p, azArg[i], i<nArg-1);
874 }
875 fprintf(p->out,"%s",p->newline);
drh8e64d1c2004-10-07 00:32:39 +0000876 }
drh6976c212014-07-24 12:09:47 +0000877#if defined(WIN32) || defined(_WIN32)
878 fflush(p->out);
879 _setmode(_fileno(p->out), _O_TEXT);
880#endif
drh8e64d1c2004-10-07 00:32:39 +0000881 break;
882 }
drh28bd4bc2000-06-15 15:57:22 +0000883 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000884 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000885 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000886 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000887 for(i=0; i<nArg; i++){
888 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000889 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000890 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000891 }else if( aiType && aiType[i]==SQLITE_TEXT ){
892 if( zSep[0] ) fprintf(p->out,"%s",zSep);
893 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +0000894 }else if( aiType && (aiType[i]==SQLITE_INTEGER
895 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +0000896 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000897 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
898 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
899 int nBlob = sqlite3_column_bytes(p->pStmt, i);
900 if( zSep[0] ) fprintf(p->out,"%s",zSep);
901 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000902 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000903 fprintf(p->out,"%s%s",zSep, azArg[i]);
904 }else{
905 if( zSep[0] ) fprintf(p->out,"%s",zSep);
906 output_quoted_string(p->out, azArg[i]);
907 }
908 }
909 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000910 break;
drh28bd4bc2000-06-15 15:57:22 +0000911 }
persicom1d0b8722002-04-18 02:53:04 +0000912 }
drh75897232000-05-29 14:26:00 +0000913 return 0;
914}
915
916/*
shane626a6e42009-10-22 17:30:15 +0000917** This is the callback routine that the SQLite library
918** invokes for each row of a query result.
919*/
920static int callback(void *pArg, int nArg, char **azArg, char **azCol){
921 /* since we don't have type info, call the shell_callback with a NULL value */
922 return shell_callback(pArg, nArg, azArg, azCol, NULL);
923}
924
925/*
drh33048c02001-10-01 14:29:22 +0000926** Set the destination table field of the callback_data structure to
927** the name of the table given. Escape any quote characters in the
928** table name.
929*/
930static void set_table_name(struct callback_data *p, const char *zName){
931 int i, n;
932 int needQuote;
933 char *z;
934
935 if( p->zDestTable ){
936 free(p->zDestTable);
937 p->zDestTable = 0;
938 }
939 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000940 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000941 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000942 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000943 needQuote = 1;
944 if( zName[i]=='\'' ) n++;
945 }
946 }
947 if( needQuote ) n += 2;
948 z = p->zDestTable = malloc( n+1 );
949 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000950 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000951 exit(1);
952 }
953 n = 0;
954 if( needQuote ) z[n++] = '\'';
955 for(i=0; zName[i]; i++){
956 z[n++] = zName[i];
957 if( zName[i]=='\'' ) z[n++] = '\'';
958 }
959 if( needQuote ) z[n++] = '\'';
960 z[n] = 0;
961}
962
danielk19772a02e332004-06-05 08:04:36 +0000963/* zIn is either a pointer to a NULL-terminated string in memory obtained
964** from malloc(), or a NULL pointer. The string pointed to by zAppend is
965** added to zIn, and the result returned in memory obtained from malloc().
966** zIn, if it was not NULL, is freed.
967**
968** If the third argument, quote, is not '\0', then it is used as a
969** quote character for zAppend.
970*/
drhc28490c2006-10-26 14:25:58 +0000971static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000972 int len;
973 int i;
drh4f21c4a2008-12-10 22:15:00 +0000974 int nAppend = strlen30(zAppend);
975 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000976
977 len = nAppend+nIn+1;
978 if( quote ){
979 len += 2;
980 for(i=0; i<nAppend; i++){
981 if( zAppend[i]==quote ) len++;
982 }
983 }
984
985 zIn = (char *)realloc(zIn, len);
986 if( !zIn ){
987 return 0;
988 }
989
990 if( quote ){
991 char *zCsr = &zIn[nIn];
992 *zCsr++ = quote;
993 for(i=0; i<nAppend; i++){
994 *zCsr++ = zAppend[i];
995 if( zAppend[i]==quote ) *zCsr++ = quote;
996 }
997 *zCsr++ = quote;
998 *zCsr++ = '\0';
999 assert( (zCsr-zIn)==len );
1000 }else{
1001 memcpy(&zIn[nIn], zAppend, nAppend);
1002 zIn[len-1] = '\0';
1003 }
1004
1005 return zIn;
1006}
1007
drhdd3d4592004-08-30 01:54:05 +00001008
1009/*
drhb21a8e42012-01-28 21:08:51 +00001010** Execute a query statement that will generate SQL output. Print
1011** the result columns, comma-separated, on a line and then add a
1012** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001013**
drhb21a8e42012-01-28 21:08:51 +00001014** If the number of columns is 1 and that column contains text "--"
1015** then write the semicolon on a separate line. That way, if a
1016** "--" comment occurs at the end of the statement, the comment
1017** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001018*/
drh157e29a2009-05-21 15:15:00 +00001019static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +00001020 struct callback_data *p, /* Query context */
1021 const char *zSelect, /* SELECT statement to extract content */
1022 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001023){
drhdd3d4592004-08-30 01:54:05 +00001024 sqlite3_stmt *pSelect;
1025 int rc;
drhb21a8e42012-01-28 21:08:51 +00001026 int nResult;
1027 int i;
1028 const char *z;
drhc7181902014-02-27 15:04:13 +00001029 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001030 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001031 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001032 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001033 return rc;
1034 }
1035 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001036 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001037 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001038 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001039 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001040 zFirstRow = 0;
1041 }
drhb21a8e42012-01-28 21:08:51 +00001042 z = (const char*)sqlite3_column_text(pSelect, 0);
1043 fprintf(p->out, "%s", z);
1044 for(i=1; i<nResult; i++){
1045 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1046 }
1047 if( z==0 ) z = "";
1048 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1049 if( z[0] ){
1050 fprintf(p->out, "\n;\n");
1051 }else{
1052 fprintf(p->out, ";\n");
1053 }
drhdd3d4592004-08-30 01:54:05 +00001054 rc = sqlite3_step(pSelect);
1055 }
drh2f464a02011-10-13 00:41:49 +00001056 rc = sqlite3_finalize(pSelect);
1057 if( rc!=SQLITE_OK ){
1058 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001059 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001060 }
1061 return rc;
drhdd3d4592004-08-30 01:54:05 +00001062}
1063
shane626a6e42009-10-22 17:30:15 +00001064/*
1065** Allocate space and save off current error string.
1066*/
1067static char *save_err_msg(
1068 sqlite3 *db /* Database to query */
1069){
1070 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1071 char *zErrMsg = sqlite3_malloc(nErrMsg);
1072 if( zErrMsg ){
1073 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1074 }
1075 return zErrMsg;
1076}
1077
1078/*
shaneh642d8b82010-07-28 16:05:34 +00001079** Display memory stats.
1080*/
1081static int display_stats(
1082 sqlite3 *db, /* Database to query */
1083 struct callback_data *pArg, /* Pointer to struct callback_data */
1084 int bReset /* True to reset the stats */
1085){
1086 int iCur;
1087 int iHiwtr;
1088
1089 if( pArg && pArg->out ){
1090
1091 iHiwtr = iCur = -1;
1092 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001093 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001094 iHiwtr = iCur = -1;
1095 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001096 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001097/*
1098** Not currently used by the CLI.
1099** iHiwtr = iCur = -1;
1100** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1101** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1102*/
1103 iHiwtr = iCur = -1;
1104 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1105 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1106/*
1107** Not currently used by the CLI.
1108** iHiwtr = iCur = -1;
1109** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1110** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1111*/
1112 iHiwtr = iCur = -1;
1113 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1114 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1115 iHiwtr = iCur = -1;
1116 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1117 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1118 iHiwtr = iCur = -1;
1119 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1120 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1121 iHiwtr = iCur = -1;
1122 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1123 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1124#ifdef YYTRACKMAXSTACKDEPTH
1125 iHiwtr = iCur = -1;
1126 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1127 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1128#endif
1129 }
1130
1131 if( pArg && pArg->out && db ){
1132 iHiwtr = iCur = -1;
1133 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1134 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001135 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1136 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1137 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1138 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1139 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1140 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001141 iHiwtr = iCur = -1;
1142 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001143 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1144 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1145 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1146 iHiwtr = iCur = -1;
1147 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1148 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001149 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001150 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1151 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1152 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001153 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1154 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1155 iHiwtr = iCur = -1;
1156 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1157 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1158 }
1159
1160 if( pArg && pArg->out && db && pArg->pStmt ){
1161 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1162 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1163 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1164 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1165 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1166 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001167 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1168 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001169 }
1170
1171 return 0;
1172}
1173
1174/*
dana98bf362013-11-13 18:35:01 +00001175** Parameter azArray points to a zero-terminated array of strings. zStr
1176** points to a single nul-terminated string. Return non-zero if zStr
1177** is equal, according to strcmp(), to any of the strings in the array.
1178** Otherwise, return zero.
1179*/
1180static int str_in_array(const char *zStr, const char **azArray){
1181 int i;
1182 for(i=0; azArray[i]; i++){
1183 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1184 }
1185 return 0;
1186}
1187
1188/*
1189** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1190** and populate the callback_data.aiIndent[] array with the number of
1191** spaces each opcode should be indented before it is output.
1192**
1193** The indenting rules are:
1194**
1195** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1196** all opcodes that occur between the p2 jump destination and the opcode
1197** itself by 2 spaces.
1198**
drh01752bc2013-11-14 23:59:33 +00001199** * For each "Goto", if the jump destination is earlier in the program
1200** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001201** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001202** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001203** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001204** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001205*/
1206static void explain_data_prepare(struct callback_data *p, sqlite3_stmt *pSql){
1207 const char *zSql; /* The text of the SQL statement */
1208 const char *z; /* Used to check if this is an EXPLAIN */
1209 int *abYield = 0; /* True if op is an OP_Yield */
1210 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001211 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001212
drh8ad0de32014-03-20 18:45:27 +00001213 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1214 "NextIfOpen", "PrevIfOpen", 0 };
drhb463fef2014-05-29 20:17:57 +00001215 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001216 const char *azGoto[] = { "Goto", 0 };
1217
1218 /* Try to figure out if this is really an EXPLAIN statement. If this
1219 ** cannot be verified, return early. */
1220 zSql = sqlite3_sql(pSql);
1221 if( zSql==0 ) return;
1222 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1223 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1224
1225 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1226 int i;
danc4650bb2013-11-18 08:41:06 +00001227 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001228 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001229
1230 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1231 ** p2 is an instruction address, set variable p2op to the index of that
1232 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1233 ** the current instruction is part of a sub-program generated by an
1234 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001235 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001236 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001237
1238 /* Grow the p->aiIndent array as required */
1239 if( iOp>=nAlloc ){
1240 nAlloc += 100;
1241 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1242 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1243 }
1244 abYield[iOp] = str_in_array(zOp, azYield);
1245 p->aiIndent[iOp] = 0;
1246 p->nIndent = iOp+1;
1247
1248 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001249 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001250 }
drhfe705102014-03-06 13:38:37 +00001251 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1252 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1253 ){
drhe73f0592014-01-21 22:25:45 +00001254 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001255 }
1256 }
1257
danc4650bb2013-11-18 08:41:06 +00001258 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001259 sqlite3_free(abYield);
1260 sqlite3_reset(pSql);
1261}
1262
1263/*
1264** Free the array allocated by explain_data_prepare().
1265*/
1266static void explain_data_delete(struct callback_data *p){
1267 sqlite3_free(p->aiIndent);
1268 p->aiIndent = 0;
1269 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001270 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001271}
1272
1273/*
shane626a6e42009-10-22 17:30:15 +00001274** Execute a statement or set of statements. Print
1275** any result rows/columns depending on the current mode
1276** set via the supplied callback.
1277**
1278** This is very similar to SQLite's built-in sqlite3_exec()
1279** function except it takes a slightly different callback
1280** and callback data argument.
1281*/
1282static int shell_exec(
1283 sqlite3 *db, /* An open database */
1284 const char *zSql, /* SQL to be evaluated */
1285 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1286 /* (not the same as sqlite3_exec) */
1287 struct callback_data *pArg, /* Pointer to struct callback_data */
1288 char **pzErrMsg /* Error msg written here */
1289){
dan4564ced2010-01-05 04:59:56 +00001290 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1291 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001292 int rc2;
dan4564ced2010-01-05 04:59:56 +00001293 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001294
1295 if( pzErrMsg ){
1296 *pzErrMsg = NULL;
1297 }
1298
shaneb9fc17d2009-10-22 21:23:35 +00001299 while( zSql[0] && (SQLITE_OK == rc) ){
1300 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1301 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001302 if( pzErrMsg ){
1303 *pzErrMsg = save_err_msg(db);
1304 }
1305 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001306 if( !pStmt ){
1307 /* this happens for a comment or white-space */
1308 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001309 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001310 continue;
1311 }
shane626a6e42009-10-22 17:30:15 +00001312
shaneh642d8b82010-07-28 16:05:34 +00001313 /* save off the prepared statment handle and reset row count */
1314 if( pArg ){
1315 pArg->pStmt = pStmt;
1316 pArg->cnt = 0;
1317 }
1318
shanehb7977c52010-01-18 18:17:10 +00001319 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001320 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001321 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001322 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001323 }
shanehb7977c52010-01-18 18:17:10 +00001324
drhefbf3b12014-02-28 20:47:24 +00001325 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1326 if( pArg && pArg->autoEQP ){
1327 sqlite3_stmt *pExplain;
1328 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt));
1329 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1330 if( rc==SQLITE_OK ){
1331 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1332 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1333 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1334 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1335 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1336 }
1337 }
1338 sqlite3_finalize(pExplain);
1339 sqlite3_free(zEQP);
1340 }
1341
drh7e02e5e2011-12-06 19:44:51 +00001342 /* Output TESTCTRL_EXPLAIN text of requested */
1343 if( pArg && pArg->mode==MODE_Explain ){
1344 const char *zExplain = 0;
1345 sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain);
1346 if( zExplain && zExplain[0] ){
1347 fprintf(pArg->out, "%s", zExplain);
1348 }
1349 }
1350
dana98bf362013-11-13 18:35:01 +00001351 /* If the shell is currently in ".explain" mode, gather the extra
1352 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001353 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001354 explain_data_prepare(pArg, pStmt);
1355 }
1356
shaneb9fc17d2009-10-22 21:23:35 +00001357 /* perform the first step. this will tell us if we
1358 ** have a result set or not and how wide it is.
1359 */
1360 rc = sqlite3_step(pStmt);
1361 /* if we have a result set... */
1362 if( SQLITE_ROW == rc ){
1363 /* if we have a callback... */
1364 if( xCallback ){
1365 /* allocate space for col name ptr, value ptr, and type */
1366 int nCol = sqlite3_column_count(pStmt);
1367 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1368 if( !pData ){
1369 rc = SQLITE_NOMEM;
1370 }else{
1371 char **azCols = (char **)pData; /* Names of result columns */
1372 char **azVals = &azCols[nCol]; /* Results */
1373 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001374 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001375 assert(sizeof(int) <= sizeof(char *));
1376 /* save off ptrs to column names */
1377 for(i=0; i<nCol; i++){
1378 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1379 }
shaneb9fc17d2009-10-22 21:23:35 +00001380 do{
1381 /* extract the data and data types */
1382 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001383 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001384 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001385 azVals[i] = "";
1386 }else{
1387 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1388 }
shaneb9fc17d2009-10-22 21:23:35 +00001389 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1390 rc = SQLITE_NOMEM;
1391 break; /* from for */
1392 }
1393 } /* end for */
1394
1395 /* if data and types extracted successfully... */
1396 if( SQLITE_ROW == rc ){
1397 /* call the supplied callback with the result row data */
1398 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1399 rc = SQLITE_ABORT;
1400 }else{
1401 rc = sqlite3_step(pStmt);
1402 }
1403 }
1404 } while( SQLITE_ROW == rc );
1405 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001406 }
1407 }else{
1408 do{
1409 rc = sqlite3_step(pStmt);
1410 } while( rc == SQLITE_ROW );
1411 }
1412 }
1413
dana98bf362013-11-13 18:35:01 +00001414 explain_data_delete(pArg);
1415
shaneh642d8b82010-07-28 16:05:34 +00001416 /* print usage stats if stats on */
1417 if( pArg && pArg->statsOn ){
1418 display_stats(db, pArg, 0);
1419 }
1420
dan4564ced2010-01-05 04:59:56 +00001421 /* Finalize the statement just executed. If this fails, save a
1422 ** copy of the error message. Otherwise, set zSql to point to the
1423 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001424 rc2 = sqlite3_finalize(pStmt);
1425 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001426 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001427 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001428 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001429 }else if( pzErrMsg ){
1430 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001431 }
shaneh642d8b82010-07-28 16:05:34 +00001432
1433 /* clear saved stmt handle */
1434 if( pArg ){
1435 pArg->pStmt = NULL;
1436 }
shane626a6e42009-10-22 17:30:15 +00001437 }
shaneb9fc17d2009-10-22 21:23:35 +00001438 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001439
1440 return rc;
1441}
1442
drhdd3d4592004-08-30 01:54:05 +00001443
drh33048c02001-10-01 14:29:22 +00001444/*
drh4c653a02000-06-07 01:27:47 +00001445** This is a different callback routine used for dumping the database.
1446** Each row received by this callback consists of a table name,
1447** the table type ("index" or "table") and SQL to create the table.
1448** This routine should print text sufficient to recreate the table.
1449*/
1450static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001451 int rc;
1452 const char *zTable;
1453 const char *zType;
1454 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001455 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001456 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001457
drh902b9ee2008-12-05 17:17:07 +00001458 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001459 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001460 zTable = azArg[0];
1461 zType = azArg[1];
1462 zSql = azArg[2];
1463
drh00b950d2005-09-11 02:03:03 +00001464 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001465 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001466 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001467 fprintf(p->out, "ANALYZE sqlite_master;\n");
1468 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1469 return 0;
drh45e29d82006-11-20 16:21:10 +00001470 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1471 char *zIns;
1472 if( !p->writableSchema ){
1473 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1474 p->writableSchema = 1;
1475 }
1476 zIns = sqlite3_mprintf(
1477 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1478 "VALUES('table','%q','%q',0,'%q');",
1479 zTable, zTable, zSql);
1480 fprintf(p->out, "%s\n", zIns);
1481 sqlite3_free(zIns);
1482 return 0;
drh00b950d2005-09-11 02:03:03 +00001483 }else{
1484 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001485 }
danielk19772a02e332004-06-05 08:04:36 +00001486
1487 if( strcmp(zType, "table")==0 ){
1488 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001489 char *zSelect = 0;
1490 char *zTableInfo = 0;
1491 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001492 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001493
1494 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1495 zTableInfo = appendText(zTableInfo, zTable, '"');
1496 zTableInfo = appendText(zTableInfo, ");", 0);
1497
drhc7181902014-02-27 15:04:13 +00001498 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001499 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001500 if( rc!=SQLITE_OK || !pTableInfo ){
1501 return 1;
1502 }
1503
1504 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001505 /* Always quote the table name, even if it appears to be pure ascii,
1506 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1507 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001508 if( zTmp ){
1509 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001510 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001511 }
1512 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1513 rc = sqlite3_step(pTableInfo);
1514 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001515 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001516 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001517 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001518 rc = sqlite3_step(pTableInfo);
1519 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001520 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001521 }else{
1522 zSelect = appendText(zSelect, ") ", 0);
1523 }
drh157e29a2009-05-21 15:15:00 +00001524 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001525 }
1526 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001527 if( rc!=SQLITE_OK || nRow==0 ){
1528 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001529 return 1;
1530 }
1531 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1532 zSelect = appendText(zSelect, zTable, '"');
1533
drh2f464a02011-10-13 00:41:49 +00001534 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001535 if( rc==SQLITE_CORRUPT ){
1536 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001537 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001538 }
drh85e72432012-04-11 11:38:53 +00001539 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001540 }
drh4c653a02000-06-07 01:27:47 +00001541 return 0;
1542}
1543
1544/*
drh45e29d82006-11-20 16:21:10 +00001545** Run zQuery. Use dump_callback() as the callback routine so that
1546** the contents of the query are output as SQL statements.
1547**
drhdd3d4592004-08-30 01:54:05 +00001548** If we get a SQLITE_CORRUPT error, rerun the query after appending
1549** "ORDER BY rowid DESC" to the end.
1550*/
1551static int run_schema_dump_query(
1552 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001553 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001554){
1555 int rc;
drh2f464a02011-10-13 00:41:49 +00001556 char *zErr = 0;
1557 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001558 if( rc==SQLITE_CORRUPT ){
1559 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001560 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001561 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1562 if( zErr ){
1563 fprintf(p->out, "/****** %s ******/\n", zErr);
1564 sqlite3_free(zErr);
1565 zErr = 0;
1566 }
drhdd3d4592004-08-30 01:54:05 +00001567 zQ2 = malloc( len+100 );
1568 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001569 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001570 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1571 if( rc ){
1572 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1573 }else{
1574 rc = SQLITE_CORRUPT;
1575 }
1576 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001577 free(zQ2);
1578 }
1579 return rc;
1580}
1581
1582/*
drh75897232000-05-29 14:26:00 +00001583** Text of a help message
1584*/
persicom1d0b8722002-04-18 02:53:04 +00001585static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001586 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001587 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001588 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001589 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001590 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001591 " If TABLE specified, only dump tables matching\n"
1592 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001593 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001594 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001595 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001596 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001597 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001598 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001599 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001600 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001601 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001602 ".indices ?TABLE? Show names of all indices\n"
1603 " If TABLE specified, only show indices for tables\n"
1604 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001605#ifdef SQLITE_ENABLE_IOTRACE
1606 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1607#endif
drh70df4fe2006-06-13 15:12:21 +00001608#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001609 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001610#endif
drh127f9d72010-02-23 01:47:00 +00001611 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001612 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001613 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001614 " column Left-aligned columns. (See .width)\n"
1615 " html HTML <table> code\n"
1616 " insert SQL insert statements for TABLE\n"
1617 " line One value per line\n"
1618 " list Values delimited by .separator string\n"
1619 " tabs Tab-separated values\n"
1620 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001621 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001622 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001623 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001624 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001625 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001626 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001627 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001628 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001629 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001630 ".save FILE Write in-memory database into FILE\n"
drh75897232000-05-29 14:26:00 +00001631 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001632 " If TABLE specified, only show tables matching\n"
1633 " LIKE pattern TABLE.\n"
drh6976c212014-07-24 12:09:47 +00001634 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1635 " NL is the end-of-line mark for CSV\n"
drh62cdde52014-05-28 20:22:28 +00001636 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001637 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001638 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001639 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001640 ".tables ?TABLE? List names of tables\n"
1641 " If TABLE specified, only list tables matching\n"
1642 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001643 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001644 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001645 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001646 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001647 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001648 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001649;
1650
drhdaffd0e2001-04-11 14:28:42 +00001651/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001652static int process_input(struct callback_data *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001653/*
1654** Implementation of the "readfile(X)" SQL function. The entire content
1655** of the file named X is read and returned as a BLOB. NULL is returned
1656** if the file does not exist or is unreadable.
1657*/
1658static void readfileFunc(
1659 sqlite3_context *context,
1660 int argc,
1661 sqlite3_value **argv
1662){
1663 const char *zName;
1664 FILE *in;
1665 long nIn;
1666 void *pBuf;
1667
1668 zName = (const char*)sqlite3_value_text(argv[0]);
1669 if( zName==0 ) return;
1670 in = fopen(zName, "rb");
1671 if( in==0 ) return;
1672 fseek(in, 0, SEEK_END);
1673 nIn = ftell(in);
1674 rewind(in);
1675 pBuf = sqlite3_malloc( nIn );
1676 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1677 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1678 }else{
1679 sqlite3_free(pBuf);
1680 }
1681 fclose(in);
1682}
1683
1684/*
1685** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1686** is written into file X. The number of bytes written is returned. Or
1687** NULL is returned if something goes wrong, such as being unable to open
1688** file X for writing.
1689*/
1690static void writefileFunc(
1691 sqlite3_context *context,
1692 int argc,
1693 sqlite3_value **argv
1694){
1695 FILE *out;
1696 const char *z;
1697 int n;
1698 sqlite3_int64 rc;
1699 const char *zFile;
1700
1701 zFile = (const char*)sqlite3_value_text(argv[0]);
1702 if( zFile==0 ) return;
1703 out = fopen(zFile, "wb");
1704 if( out==0 ) return;
1705 z = (const char*)sqlite3_value_blob(argv[1]);
1706 if( z==0 ){
1707 n = 0;
1708 rc = 0;
1709 }else{
1710 n = sqlite3_value_bytes(argv[1]);
1711 rc = fwrite(z, 1, n, out);
1712 }
1713 fclose(out);
1714 sqlite3_result_int64(context, rc);
1715}
drhdaffd0e2001-04-11 14:28:42 +00001716
drh75897232000-05-29 14:26:00 +00001717/*
drh44c2eb12003-04-30 11:38:26 +00001718** Make sure the database is open. If it is not, then open it. If
1719** the database fails to open, print an error message and exit.
1720*/
drh05782482013-10-24 15:20:20 +00001721static void open_db(struct callback_data *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001722 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001723 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001724 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001725 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001726 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1727 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1728 shellstaticFunc, 0, 0);
1729 }
1730 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001731 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001732 p->zDbFilename, sqlite3_errmsg(db));
drh05782482013-10-24 15:20:20 +00001733 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001734 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001735 }
drhc2e87a32006-06-27 15:16:14 +00001736#ifndef SQLITE_OMIT_LOAD_EXTENSION
1737 sqlite3_enable_load_extension(p->db, 1);
1738#endif
drhba5b0932014-07-24 12:39:59 +00001739 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1740 readfileFunc, 0, 0);
1741 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1742 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001743 }
1744}
1745
1746/*
drhfeac5f82004-08-01 00:10:45 +00001747** Do C-language style dequoting.
1748**
1749** \t -> tab
1750** \n -> newline
1751** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001752** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001753** \NNN -> ascii character NNN in octal
1754** \\ -> backslash
1755*/
1756static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001757 int i, j;
1758 char c;
drhc2ce0be2014-05-29 12:36:14 +00001759 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001760 for(i=j=0; (c = z[i])!=0; i++, j++){
1761 if( c=='\\' ){
1762 c = z[++i];
1763 if( c=='n' ){
1764 c = '\n';
1765 }else if( c=='t' ){
1766 c = '\t';
1767 }else if( c=='r' ){
1768 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001769 }else if( c=='\\' ){
1770 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001771 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001772 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001773 if( z[i+1]>='0' && z[i+1]<='7' ){
1774 i++;
1775 c = (c<<3) + z[i] - '0';
1776 if( z[i+1]>='0' && z[i+1]<='7' ){
1777 i++;
1778 c = (c<<3) + z[i] - '0';
1779 }
1780 }
1781 }
1782 }
1783 z[j] = c;
1784 }
drhc2ce0be2014-05-29 12:36:14 +00001785 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001786}
1787
1788/*
drh348d19c2013-06-03 12:47:43 +00001789** Return the value of a hexadecimal digit. Return -1 if the input
1790** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001791*/
drh348d19c2013-06-03 12:47:43 +00001792static int hexDigitValue(char c){
1793 if( c>='0' && c<='9' ) return c - '0';
1794 if( c>='a' && c<='f' ) return c - 'a' + 10;
1795 if( c>='A' && c<='F' ) return c - 'A' + 10;
1796 return -1;
drhc28490c2006-10-26 14:25:58 +00001797}
1798
1799/*
drh7d9f3942013-04-03 01:26:54 +00001800** Interpret zArg as an integer value, possibly with suffixes.
1801*/
1802static sqlite3_int64 integerValue(const char *zArg){
1803 sqlite3_int64 v = 0;
1804 static const struct { char *zSuffix; int iMult; } aMult[] = {
1805 { "KiB", 1024 },
1806 { "MiB", 1024*1024 },
1807 { "GiB", 1024*1024*1024 },
1808 { "KB", 1000 },
1809 { "MB", 1000000 },
1810 { "GB", 1000000000 },
1811 { "K", 1000 },
1812 { "M", 1000000 },
1813 { "G", 1000000000 },
1814 };
1815 int i;
1816 int isNeg = 0;
1817 if( zArg[0]=='-' ){
1818 isNeg = 1;
1819 zArg++;
1820 }else if( zArg[0]=='+' ){
1821 zArg++;
1822 }
drh348d19c2013-06-03 12:47:43 +00001823 if( zArg[0]=='0' && zArg[1]=='x' ){
1824 int x;
1825 zArg += 2;
1826 while( (x = hexDigitValue(zArg[0]))>=0 ){
1827 v = (v<<4) + x;
1828 zArg++;
1829 }
1830 }else{
1831 while( IsDigit(zArg[0]) ){
1832 v = v*10 + zArg[0] - '0';
1833 zArg++;
1834 }
drh7d9f3942013-04-03 01:26:54 +00001835 }
drhc2bed0a2013-05-24 11:57:50 +00001836 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00001837 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1838 v *= aMult[i].iMult;
1839 break;
1840 }
1841 }
1842 return isNeg? -v : v;
1843}
1844
1845/*
drh348d19c2013-06-03 12:47:43 +00001846** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1847** for TRUE and FALSE. Return the integer value if appropriate.
1848*/
1849static int booleanValue(char *zArg){
1850 int i;
1851 if( zArg[0]=='0' && zArg[1]=='x' ){
1852 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1853 }else{
1854 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1855 }
1856 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1857 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1858 return 1;
1859 }
1860 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1861 return 0;
1862 }
1863 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1864 zArg);
1865 return 0;
1866}
1867
1868/*
drh42f64e52012-04-04 16:56:23 +00001869** Close an output file, assuming it is not stderr or stdout
1870*/
1871static void output_file_close(FILE *f){
1872 if( f && f!=stdout && f!=stderr ) fclose(f);
1873}
1874
1875/*
1876** Try to open an output file. The names "stdout" and "stderr" are
1877** recognized and do the right thing. NULL is returned if the output
1878** filename is "off".
1879*/
1880static FILE *output_file_open(const char *zFile){
1881 FILE *f;
1882 if( strcmp(zFile,"stdout")==0 ){
1883 f = stdout;
1884 }else if( strcmp(zFile, "stderr")==0 ){
1885 f = stderr;
1886 }else if( strcmp(zFile, "off")==0 ){
1887 f = 0;
1888 }else{
1889 f = fopen(zFile, "wb");
1890 if( f==0 ){
1891 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1892 }
1893 }
1894 return f;
1895}
1896
1897/*
1898** A routine for handling output from sqlite3_trace().
1899*/
1900static void sql_trace_callback(void *pArg, const char *z){
1901 FILE *f = (FILE*)pArg;
1902 if( f ) fprintf(f, "%s\n", z);
1903}
1904
1905/*
drhd8621b92012-04-17 09:09:33 +00001906** A no-op routine that runs with the ".breakpoint" doc-command. This is
1907** a useful spot to set a debugger breakpoint.
1908*/
1909static void test_breakpoint(void){
1910 static int nCall = 0;
1911 nCall++;
1912}
1913
1914/*
drhdb95f682013-06-26 22:46:00 +00001915** An object used to read a CSV file
1916*/
1917typedef struct CSVReader CSVReader;
1918struct CSVReader {
1919 const char *zFile; /* Name of the input file */
1920 FILE *in; /* Read the CSV text from this input stream */
1921 char *z; /* Accumulated text for a field */
1922 int n; /* Number of bytes in z */
1923 int nAlloc; /* Space allocated for z[] */
1924 int nLine; /* Current line number */
1925 int cTerm; /* Character that terminated the most recent field */
1926 int cSeparator; /* The separator character. (Usually ",") */
1927};
1928
1929/* Append a single byte to z[] */
1930static void csv_append_char(CSVReader *p, int c){
1931 if( p->n+1>=p->nAlloc ){
1932 p->nAlloc += p->nAlloc + 100;
1933 p->z = sqlite3_realloc(p->z, p->nAlloc);
1934 if( p->z==0 ){
1935 fprintf(stderr, "out of memory\n");
1936 exit(1);
1937 }
1938 }
1939 p->z[p->n++] = (char)c;
1940}
1941
1942/* Read a single field of CSV text. Compatible with rfc4180 and extended
1943** with the option of having a separator other than ",".
1944**
1945** + Input comes from p->in.
1946** + Store results in p->z of length p->n. Space to hold p->z comes
1947** from sqlite3_malloc().
1948** + Use p->cSep as the separator. The default is ",".
1949** + Keep track of the line number in p->nLine.
1950** + Store the character that terminates the field in p->cTerm. Store
1951** EOF on end-of-file.
1952** + Report syntax errors on stderr
1953*/
1954static char *csv_read_one_field(CSVReader *p){
drha81ad172013-12-11 14:00:04 +00001955 int c, pc, ppc;
drhdb95f682013-06-26 22:46:00 +00001956 int cSep = p->cSeparator;
1957 p->n = 0;
1958 c = fgetc(p->in);
1959 if( c==EOF || seenInterrupt ){
1960 p->cTerm = EOF;
1961 return 0;
1962 }
1963 if( c=='"' ){
1964 int startLine = p->nLine;
1965 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00001966 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00001967 while( 1 ){
1968 c = fgetc(p->in);
1969 if( c=='\n' ) p->nLine++;
1970 if( c==cQuote ){
1971 if( pc==cQuote ){
1972 pc = 0;
1973 continue;
1974 }
1975 }
1976 if( (c==cSep && pc==cQuote)
1977 || (c=='\n' && pc==cQuote)
drha81ad172013-12-11 14:00:04 +00001978 || (c=='\n' && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00001979 || (c==EOF && pc==cQuote)
1980 ){
1981 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00001982 p->cTerm = c;
1983 break;
1984 }
1985 if( pc==cQuote && c!='\r' ){
1986 fprintf(stderr, "%s:%d: unescaped %c character\n",
1987 p->zFile, p->nLine, cQuote);
1988 }
1989 if( c==EOF ){
1990 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1991 p->zFile, startLine, cQuote);
drhdb95f682013-06-26 22:46:00 +00001992 p->cTerm = EOF;
1993 break;
1994 }
1995 csv_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00001996 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00001997 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00001998 }
drhdb95f682013-06-26 22:46:00 +00001999 }else{
drhd0a64dc2013-06-30 20:24:26 +00002000 while( c!=EOF && c!=cSep && c!='\n' ){
drhdb95f682013-06-26 22:46:00 +00002001 csv_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002002 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002003 }
2004 if( c=='\n' ){
2005 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002006 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002007 }
drhdb95f682013-06-26 22:46:00 +00002008 p->cTerm = c;
2009 }
drh8dd675e2013-07-12 21:09:24 +00002010 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002011 return p->z;
2012}
2013
2014/*
drh4bbcf102014-02-06 02:46:08 +00002015** Try to transfer data for table zTable. If an error is seen while
2016** moving forward, try to go backwards. The backwards movement won't
2017** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002018*/
mistachkine31ae902014-02-06 01:15:29 +00002019static void tryToCloneData(
drh3350ce92014-02-06 00:49:12 +00002020 struct callback_data *p,
2021 sqlite3 *newDb,
2022 const char *zTable
2023){
2024 sqlite3_stmt *pQuery = 0;
2025 sqlite3_stmt *pInsert = 0;
2026 char *zQuery = 0;
2027 char *zInsert = 0;
2028 int rc;
2029 int i, j, n;
2030 int nTable = (int)strlen(zTable);
2031 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002032 int cnt = 0;
2033 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002034
2035 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2036 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2037 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002038 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002039 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2040 zQuery);
2041 goto end_data_xfer;
2042 }
2043 n = sqlite3_column_count(pQuery);
2044 zInsert = sqlite3_malloc(200 + nTable + n*3);
2045 if( zInsert==0 ){
2046 fprintf(stderr, "out of memory\n");
2047 goto end_data_xfer;
2048 }
2049 sqlite3_snprintf(200+nTable,zInsert,
2050 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2051 i = (int)strlen(zInsert);
2052 for(j=1; j<n; j++){
2053 memcpy(zInsert+i, ",?", 2);
2054 i += 2;
2055 }
2056 memcpy(zInsert+i, ");", 3);
2057 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2058 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002059 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002060 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2061 zQuery);
2062 goto end_data_xfer;
2063 }
2064 for(k=0; k<2; k++){
2065 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2066 for(i=0; i<n; i++){
2067 switch( sqlite3_column_type(pQuery, i) ){
2068 case SQLITE_NULL: {
2069 sqlite3_bind_null(pInsert, i+1);
2070 break;
2071 }
2072 case SQLITE_INTEGER: {
2073 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2074 break;
2075 }
2076 case SQLITE_FLOAT: {
2077 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2078 break;
2079 }
2080 case SQLITE_TEXT: {
2081 sqlite3_bind_text(pInsert, i+1,
2082 (const char*)sqlite3_column_text(pQuery,i),
2083 -1, SQLITE_STATIC);
2084 break;
2085 }
2086 case SQLITE_BLOB: {
2087 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2088 sqlite3_column_bytes(pQuery,i),
2089 SQLITE_STATIC);
2090 break;
2091 }
2092 }
2093 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002094 rc = sqlite3_step(pInsert);
2095 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2096 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2097 sqlite3_errmsg(newDb));
2098 }
drh3350ce92014-02-06 00:49:12 +00002099 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002100 cnt++;
2101 if( (cnt%spinRate)==0 ){
2102 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2103 fflush(stdout);
2104 }
drh3350ce92014-02-06 00:49:12 +00002105 } /* End while */
2106 if( rc==SQLITE_DONE ) break;
2107 sqlite3_finalize(pQuery);
2108 sqlite3_free(zQuery);
2109 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2110 zTable);
2111 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2112 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002113 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2114 break;
drh3350ce92014-02-06 00:49:12 +00002115 }
2116 } /* End for(k=0...) */
2117
2118end_data_xfer:
2119 sqlite3_finalize(pQuery);
2120 sqlite3_finalize(pInsert);
2121 sqlite3_free(zQuery);
2122 sqlite3_free(zInsert);
2123}
2124
2125
2126/*
2127** Try to transfer all rows of the schema that match zWhere. For
2128** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002129** If an error is encountered while moving forward through the
2130** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002131*/
mistachkine31ae902014-02-06 01:15:29 +00002132static void tryToCloneSchema(
drh3350ce92014-02-06 00:49:12 +00002133 struct callback_data *p,
2134 sqlite3 *newDb,
2135 const char *zWhere,
2136 void (*xForEach)(struct callback_data*,sqlite3*,const char*)
2137){
2138 sqlite3_stmt *pQuery = 0;
2139 char *zQuery = 0;
2140 int rc;
2141 const unsigned char *zName;
2142 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002143 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002144
2145 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2146 " WHERE %s", zWhere);
2147 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2148 if( rc ){
2149 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2150 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2151 zQuery);
2152 goto end_schema_xfer;
2153 }
2154 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2155 zName = sqlite3_column_text(pQuery, 0);
2156 zSql = sqlite3_column_text(pQuery, 1);
2157 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002158 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2159 if( zErrMsg ){
2160 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2161 sqlite3_free(zErrMsg);
2162 zErrMsg = 0;
2163 }
drh3350ce92014-02-06 00:49:12 +00002164 if( xForEach ){
2165 xForEach(p, newDb, (const char*)zName);
2166 }
2167 printf("done\n");
2168 }
2169 if( rc!=SQLITE_DONE ){
2170 sqlite3_finalize(pQuery);
2171 sqlite3_free(zQuery);
2172 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2173 " WHERE %s ORDER BY rowid DESC", zWhere);
2174 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2175 if( rc ){
2176 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2177 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2178 zQuery);
2179 goto end_schema_xfer;
2180 }
2181 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2182 zName = sqlite3_column_text(pQuery, 0);
2183 zSql = sqlite3_column_text(pQuery, 1);
2184 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002185 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2186 if( zErrMsg ){
2187 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2188 sqlite3_free(zErrMsg);
2189 zErrMsg = 0;
2190 }
drh3350ce92014-02-06 00:49:12 +00002191 if( xForEach ){
2192 xForEach(p, newDb, (const char*)zName);
2193 }
2194 printf("done\n");
2195 }
2196 }
2197end_schema_xfer:
2198 sqlite3_finalize(pQuery);
2199 sqlite3_free(zQuery);
2200}
2201
2202/*
2203** Open a new database file named "zNewDb". Try to recover as much information
2204** as possible out of the main database (which might be corrupt) and write it
2205** into zNewDb.
2206*/
mistachkine31ae902014-02-06 01:15:29 +00002207static void tryToClone(struct callback_data *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002208 int rc;
2209 sqlite3 *newDb = 0;
2210 if( access(zNewDb,0)==0 ){
2211 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2212 return;
2213 }
2214 rc = sqlite3_open(zNewDb, &newDb);
2215 if( rc ){
2216 fprintf(stderr, "Cannot create output database: %s\n",
2217 sqlite3_errmsg(newDb));
2218 }else{
drh54d0d2d2014-04-03 00:32:13 +00002219 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002220 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002221 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2222 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002223 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002224 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002225 }
2226 sqlite3_close(newDb);
2227}
2228
2229/*
drhc2ce0be2014-05-29 12:36:14 +00002230** Change the output file back to stdout
2231*/
2232static void output_reset(struct callback_data *p){
2233 if( p->outfile[0]=='|' ){
2234 pclose(p->out);
2235 }else{
2236 output_file_close(p->out);
2237 }
2238 p->outfile[0] = 0;
2239 p->out = stdout;
2240}
2241
2242/*
drh75897232000-05-29 14:26:00 +00002243** If an input line begins with "." then invoke this routine to
2244** process that line.
drh67505e72002-04-19 12:34:06 +00002245**
drh47ad6842006-11-08 12:25:42 +00002246** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002247*/
drh44c2eb12003-04-30 11:38:26 +00002248static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00002249 int i = 1;
2250 int nArg = 0;
2251 int n, c;
drh67505e72002-04-19 12:34:06 +00002252 int rc = 0;
drh75897232000-05-29 14:26:00 +00002253 char *azArg[50];
2254
2255 /* Parse the input line into tokens.
2256 */
2257 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00002258 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00002259 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00002260 if( zLine[i]=='\'' || zLine[i]=='"' ){
2261 int delim = zLine[i++];
2262 azArg[nArg++] = &zLine[i];
drh4c56b992013-06-27 13:26:55 +00002263 while( zLine[i] && zLine[i]!=delim ){
2264 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2265 i++;
2266 }
drh75897232000-05-29 14:26:00 +00002267 if( zLine[i]==delim ){
2268 zLine[i++] = 0;
2269 }
drhfeac5f82004-08-01 00:10:45 +00002270 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002271 }else{
2272 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00002273 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00002274 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002275 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002276 }
2277 }
2278
2279 /* Process the input line.
2280 */
shane9bd1b442009-10-23 01:27:39 +00002281 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002282 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002283 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002284 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2285 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2286 ){
drhbc46f022013-01-23 18:53:23 +00002287 const char *zDestFile = 0;
2288 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002289 sqlite3 *pDest;
2290 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002291 int j;
2292 for(j=1; j<nArg; j++){
2293 const char *z = azArg[j];
2294 if( z[0]=='-' ){
2295 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002296 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002297 {
2298 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2299 return 1;
2300 }
2301 }else if( zDestFile==0 ){
2302 zDestFile = azArg[j];
2303 }else if( zDb==0 ){
2304 zDb = zDestFile;
2305 zDestFile = azArg[j];
2306 }else{
2307 fprintf(stderr, "too many arguments to .backup\n");
2308 return 1;
2309 }
drh9ff849f2009-02-04 20:55:57 +00002310 }
drhbc46f022013-01-23 18:53:23 +00002311 if( zDestFile==0 ){
2312 fprintf(stderr, "missing FILENAME argument on .backup\n");
2313 return 1;
2314 }
2315 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002316 rc = sqlite3_open(zDestFile, &pDest);
2317 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002318 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002319 sqlite3_close(pDest);
2320 return 1;
2321 }
drh05782482013-10-24 15:20:20 +00002322 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002323 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2324 if( pBackup==0 ){
2325 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2326 sqlite3_close(pDest);
2327 return 1;
2328 }
2329 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2330 sqlite3_backup_finish(pBackup);
2331 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002332 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002333 }else{
2334 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002335 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002336 }
2337 sqlite3_close(pDest);
2338 }else
2339
drhc2ce0be2014-05-29 12:36:14 +00002340 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2341 if( nArg==2 ){
2342 bail_on_error = booleanValue(azArg[1]);
2343 }else{
2344 fprintf(stderr, "Usage: .bail on|off\n");
2345 rc = 1;
2346 }
drhc49f44e2006-10-26 18:15:42 +00002347 }else
2348
drhd8621b92012-04-17 09:09:33 +00002349 /* The undocumented ".breakpoint" command causes a call to the no-op
2350 ** routine named test_breakpoint().
2351 */
2352 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2353 test_breakpoint();
2354 }else
2355
drhc2ce0be2014-05-29 12:36:14 +00002356 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2357 if( nArg==2 ){
2358 tryToClone(p, azArg[1]);
2359 }else{
2360 fprintf(stderr, "Usage: .clone FILENAME\n");
2361 rc = 1;
2362 }
mistachkine31ae902014-02-06 01:15:29 +00002363 }else
2364
drhc2ce0be2014-05-29 12:36:14 +00002365 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
jplyon672a1ed2003-05-11 20:07:05 +00002366 struct callback_data data;
2367 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002368 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002369 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002370 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002371 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002372 data.colWidth[0] = 3;
2373 data.colWidth[1] = 15;
2374 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002375 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002376 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002377 if( zErrMsg ){
2378 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002379 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002380 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002381 }
2382 }else
2383
drhc2ce0be2014-05-29 12:36:14 +00002384 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002385 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002386 /* When playing back a "dump", the content might appear in an order
2387 ** which causes immediate foreign key constraints to be violated.
2388 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002389 if( nArg!=1 && nArg!=2 ){
2390 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2391 rc = 1;
2392 goto meta_command_exit;
2393 }
drhf1dfc4f2009-09-23 15:51:35 +00002394 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002395 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002396 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002397 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002398 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002399 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002400 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002401 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002402 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002403 );
2404 run_schema_dump_query(p,
2405 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002406 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002407 );
drh2f464a02011-10-13 00:41:49 +00002408 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002409 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002410 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002411 );
drh4c653a02000-06-07 01:27:47 +00002412 }else{
2413 int i;
drhdd3d4592004-08-30 01:54:05 +00002414 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002415 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002416 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002417 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002418 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002419 " AND sql NOT NULL");
2420 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002421 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002422 "WHERE sql NOT NULL"
2423 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002424 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002425 );
danielk1977bc6ada42004-06-30 08:20:16 +00002426 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002427 }
2428 }
drh45e29d82006-11-20 16:21:10 +00002429 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002430 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002431 p->writableSchema = 0;
2432 }
drh56197952011-10-13 16:30:13 +00002433 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2434 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002435 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002436 }else
drh75897232000-05-29 14:26:00 +00002437
drhc2ce0be2014-05-29 12:36:14 +00002438 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2439 if( nArg==2 ){
2440 p->echoOn = booleanValue(azArg[1]);
2441 }else{
2442 fprintf(stderr, "Usage: .echo on|off\n");
2443 rc = 1;
2444 }
drhdaffd0e2001-04-11 14:28:42 +00002445 }else
2446
drhc2ce0be2014-05-29 12:36:14 +00002447 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2448 if( nArg==2 ){
2449 p->autoEQP = booleanValue(azArg[1]);
2450 }else{
2451 fprintf(stderr, "Usage: .eqp on|off\n");
2452 rc = 1;
2453 }
drhefbf3b12014-02-28 20:47:24 +00002454 }else
2455
drhd3ac7d92013-01-25 18:33:43 +00002456 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002457 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002458 rc = 2;
drh75897232000-05-29 14:26:00 +00002459 }else
2460
drhc2ce0be2014-05-29 12:36:14 +00002461 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002462 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002463 if(val == 1) {
2464 if(!p->explainPrev.valid) {
2465 p->explainPrev.valid = 1;
2466 p->explainPrev.mode = p->mode;
2467 p->explainPrev.showHeader = p->showHeader;
2468 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
2469 }
2470 /* We could put this code under the !p->explainValid
2471 ** condition so that it does not execute if we are already in
2472 ** explain mode. However, always executing it allows us an easy
2473 ** was to reset to explain mode in case the user previously
2474 ** did an .explain followed by a .width, .mode or .header
2475 ** command.
2476 */
danielk19770d78bae2008-01-03 07:09:48 +00002477 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002478 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002479 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002480 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002481 p->colWidth[1] = 13; /* opcode */
2482 p->colWidth[2] = 4; /* P1 */
2483 p->colWidth[3] = 4; /* P2 */
2484 p->colWidth[4] = 4; /* P3 */
2485 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002486 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002487 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00002488 }else if (p->explainPrev.valid) {
2489 p->explainPrev.valid = 0;
2490 p->mode = p->explainPrev.mode;
2491 p->showHeader = p->explainPrev.showHeader;
2492 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
2493 }
drh75897232000-05-29 14:26:00 +00002494 }else
2495
drhc1971542014-06-23 23:28:13 +00002496 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
2497 struct callback_data data;
2498 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002499 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002500 if( nArg!=1 ){
2501 fprintf(stderr, "Usage: .fullschema\n");
2502 rc = 1;
2503 goto meta_command_exit;
2504 }
2505 open_db(p, 0);
2506 memcpy(&data, p, sizeof(data));
2507 data.showHeader = 0;
2508 data.mode = MODE_Semi;
2509 rc = sqlite3_exec(p->db,
2510 "SELECT sql FROM"
2511 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2512 " FROM sqlite_master UNION ALL"
2513 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2514 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
2515 "ORDER BY rowid",
2516 callback, &data, &zErrMsg
2517 );
drh56f674c2014-07-18 14:43:29 +00002518 if( rc==SQLITE_OK ){
2519 sqlite3_stmt *pStmt;
2520 rc = sqlite3_prepare_v2(p->db,
2521 "SELECT rowid FROM sqlite_master"
2522 " WHERE name GLOB 'sqlite_stat[134]'",
2523 -1, &pStmt, 0);
2524 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2525 sqlite3_finalize(pStmt);
2526 }
2527 if( doStats==0 ){
2528 fprintf(p->out, "/* No STAT tables available */\n");
2529 }else{
2530 fprintf(p->out, "ANALYZE sqlite_master;\n");
2531 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2532 callback, &data, &zErrMsg);
2533 data.mode = MODE_Insert;
2534 data.zDestTable = "sqlite_stat1";
2535 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2536 shell_callback, &data,&zErrMsg);
2537 data.zDestTable = "sqlite_stat3";
2538 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2539 shell_callback, &data,&zErrMsg);
2540 data.zDestTable = "sqlite_stat4";
2541 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2542 shell_callback, &data, &zErrMsg);
2543 fprintf(p->out, "ANALYZE sqlite_master;\n");
2544 }
drhc1971542014-06-23 23:28:13 +00002545 }else
2546
drhc2ce0be2014-05-29 12:36:14 +00002547 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2548 if( nArg==2 ){
2549 p->showHeader = booleanValue(azArg[1]);
2550 }else{
2551 fprintf(stderr, "Usage: .headers on|off\n");
2552 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002553 }
drh75897232000-05-29 14:26:00 +00002554 }else
2555
drhc2ce0be2014-05-29 12:36:14 +00002556 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2557 fprintf(p->out, "%s", zHelp);
2558 }else
2559
2560 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002561 char *zTable; /* Insert data into this table */
2562 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002563 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002564 int nCol; /* Number of columns in the table */
2565 int nByte; /* Number of bytes in an SQL string */
2566 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002567 int needCommit; /* True to COMMIT or ROLLBACK at end */
drhfeac5f82004-08-01 00:10:45 +00002568 int nSep; /* Number of bytes in p->separator[] */
2569 char *zSql; /* An SQL statement */
drhdb95f682013-06-26 22:46:00 +00002570 CSVReader sCsv; /* Reader context */
drh5bde8162013-06-27 14:07:53 +00002571 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
drhfeac5f82004-08-01 00:10:45 +00002572
drhc2ce0be2014-05-29 12:36:14 +00002573 if( nArg!=3 ){
2574 fprintf(stderr, "Usage: .import FILE TABLE\n");
2575 goto meta_command_exit;
2576 }
drh01f37542014-05-31 15:43:33 +00002577 zFile = azArg[1];
2578 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002579 seenInterrupt = 0;
2580 memset(&sCsv, 0, sizeof(sCsv));
drh05782482013-10-24 15:20:20 +00002581 open_db(p, 0);
drh4f21c4a2008-12-10 22:15:00 +00002582 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00002583 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00002584 fprintf(stderr, "Error: non-null separator required for import\n");
2585 return 1;
drhfeac5f82004-08-01 00:10:45 +00002586 }
drhdb95f682013-06-26 22:46:00 +00002587 if( nSep>1 ){
2588 fprintf(stderr, "Error: multi-character separators not allowed"
2589 " for import\n");
2590 return 1;
2591 }
drh5bde8162013-06-27 14:07:53 +00002592 sCsv.zFile = zFile;
2593 sCsv.nLine = 1;
2594 if( sCsv.zFile[0]=='|' ){
2595 sCsv.in = popen(sCsv.zFile+1, "r");
2596 sCsv.zFile = "<pipe>";
2597 xCloser = pclose;
2598 }else{
2599 sCsv.in = fopen(sCsv.zFile, "rb");
2600 xCloser = fclose;
2601 }
drhdb95f682013-06-26 22:46:00 +00002602 if( sCsv.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002603 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002604 return 1;
2605 }
2606 sCsv.cSeparator = p->separator[0];
drh7b075e32011-09-28 01:10:00 +00002607 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002608 if( zSql==0 ){
2609 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002610 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002611 return 1;
2612 }
drh4f21c4a2008-12-10 22:15:00 +00002613 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002614 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
dan6a8ac852014-05-26 18:27:12 +00002615 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
drhdb95f682013-06-26 22:46:00 +00002616 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2617 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2618 char cSep = '(';
2619 while( csv_read_one_field(&sCsv) ){
2620 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2621 cSep = ',';
2622 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2623 }
drh5bde8162013-06-27 14:07:53 +00002624 if( cSep=='(' ){
2625 sqlite3_free(zCreate);
2626 sqlite3_free(sCsv.z);
2627 xCloser(sCsv.in);
2628 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2629 return 1;
2630 }
drhdb95f682013-06-26 22:46:00 +00002631 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2632 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2633 sqlite3_free(zCreate);
2634 if( rc ){
2635 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2636 sqlite3_errmsg(db));
2637 sqlite3_free(sCsv.z);
drh5bde8162013-06-27 14:07:53 +00002638 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002639 return 1;
2640 }
drhc7181902014-02-27 15:04:13 +00002641 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002642 }
drhfeac5f82004-08-01 00:10:45 +00002643 sqlite3_free(zSql);
2644 if( rc ){
shane916f9612009-10-23 00:37:15 +00002645 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002646 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
drh5bde8162013-06-27 14:07:53 +00002647 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002648 return 1;
drhfeac5f82004-08-01 00:10:45 +00002649 }
shane916f9612009-10-23 00:37:15 +00002650 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00002651 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00002652 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00002653 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00002654 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00002655 if( zSql==0 ){
2656 fprintf(stderr, "Error: out of memory\n");
drh5bde8162013-06-27 14:07:53 +00002657 xCloser(sCsv.in);
shane916f9612009-10-23 00:37:15 +00002658 return 1;
2659 }
drhdb95f682013-06-26 22:46:00 +00002660 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00002661 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00002662 for(i=1; i<nCol; i++){
2663 zSql[j++] = ',';
2664 zSql[j++] = '?';
2665 }
2666 zSql[j++] = ')';
2667 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00002668 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00002669 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00002670 if( rc ){
2671 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00002672 if (pStmt) sqlite3_finalize(pStmt);
drh5bde8162013-06-27 14:07:53 +00002673 xCloser(sCsv.in);
drh47ad6842006-11-08 12:25:42 +00002674 return 1;
drhfeac5f82004-08-01 00:10:45 +00002675 }
drh2d463112013-08-06 14:36:36 +00002676 needCommit = sqlite3_get_autocommit(db);
2677 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00002678 do{
2679 int startLine = sCsv.nLine;
drhfeac5f82004-08-01 00:10:45 +00002680 for(i=0; i<nCol; i++){
drhdb95f682013-06-26 22:46:00 +00002681 char *z = csv_read_one_field(&sCsv);
2682 if( z==0 && i==0 ) break;
2683 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
2684 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
2685 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2686 "filling the rest with NULL\n",
2687 sCsv.zFile, startLine, nCol, i+1);
2688 i++;
mistachkin6fe03382014-06-16 22:45:28 +00002689 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00002690 }
drhfeac5f82004-08-01 00:10:45 +00002691 }
drhdb95f682013-06-26 22:46:00 +00002692 if( sCsv.cTerm==sCsv.cSeparator ){
2693 do{
2694 csv_read_one_field(&sCsv);
2695 i++;
2696 }while( sCsv.cTerm==sCsv.cSeparator );
2697 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2698 "extras ignored\n",
2699 sCsv.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00002700 }
drhdb95f682013-06-26 22:46:00 +00002701 if( i>=nCol ){
2702 sqlite3_step(pStmt);
2703 rc = sqlite3_reset(pStmt);
2704 if( rc!=SQLITE_OK ){
2705 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
2706 sqlite3_errmsg(db));
2707 }
2708 }
2709 }while( sCsv.cTerm!=EOF );
2710
drh5bde8162013-06-27 14:07:53 +00002711 xCloser(sCsv.in);
drhdb95f682013-06-26 22:46:00 +00002712 sqlite3_free(sCsv.z);
drhfeac5f82004-08-01 00:10:45 +00002713 sqlite3_finalize(pStmt);
drh2d463112013-08-06 14:36:36 +00002714 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00002715 }else
2716
drhc2ce0be2014-05-29 12:36:14 +00002717 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
drh75897232000-05-29 14:26:00 +00002718 struct callback_data data;
2719 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002720 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00002721 memcpy(&data, p, sizeof(data));
2722 data.showHeader = 0;
2723 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00002724 if( nArg==1 ){
2725 rc = sqlite3_exec(p->db,
2726 "SELECT name FROM sqlite_master "
2727 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
2728 "UNION ALL "
2729 "SELECT name FROM sqlite_temp_master "
2730 "WHERE type='index' "
2731 "ORDER BY 1",
2732 callback, &data, &zErrMsg
2733 );
drhc2ce0be2014-05-29 12:36:14 +00002734 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00002735 zShellStatic = azArg[1];
2736 rc = sqlite3_exec(p->db,
2737 "SELECT name FROM sqlite_master "
2738 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2739 "UNION ALL "
2740 "SELECT name FROM sqlite_temp_master "
2741 "WHERE type='index' AND tbl_name LIKE shellstatic() "
2742 "ORDER BY 1",
2743 callback, &data, &zErrMsg
2744 );
2745 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00002746 }else{
2747 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2748 rc = 1;
2749 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00002750 }
drh75897232000-05-29 14:26:00 +00002751 if( zErrMsg ){
2752 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002753 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002754 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00002755 }else if( rc != SQLITE_OK ){
2756 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2757 rc = 1;
drh75897232000-05-29 14:26:00 +00002758 }
2759 }else
2760
drhae5e4452007-05-03 17:18:36 +00002761#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00002762 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002763 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00002764 if( iotrace && iotrace!=stdout ) fclose(iotrace);
2765 iotrace = 0;
2766 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00002767 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00002768 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00002769 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002770 iotrace = stdout;
2771 }else{
2772 iotrace = fopen(azArg[1], "w");
2773 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00002774 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00002775 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00002776 rc = 1;
drhb0603412007-02-28 04:47:26 +00002777 }else{
mlcreech3a00f902008-03-04 17:45:01 +00002778 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00002779 }
2780 }
2781 }else
drhae5e4452007-05-03 17:18:36 +00002782#endif
drhb0603412007-02-28 04:47:26 +00002783
drh70df4fe2006-06-13 15:12:21 +00002784#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00002785 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00002786 const char *zFile, *zProc;
2787 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00002788 if( nArg<2 ){
2789 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2790 rc = 1;
2791 goto meta_command_exit;
2792 }
drh1e397f82006-06-08 15:28:43 +00002793 zFile = azArg[1];
2794 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00002795 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00002796 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
2797 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002798 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00002799 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00002800 rc = 1;
drh1e397f82006-06-08 15:28:43 +00002801 }
2802 }else
drh70df4fe2006-06-13 15:12:21 +00002803#endif
drh1e397f82006-06-08 15:28:43 +00002804
drhc2ce0be2014-05-29 12:36:14 +00002805 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
2806 if( nArg!=2 ){
2807 fprintf(stderr, "Usage: .log FILENAME\n");
2808 rc = 1;
2809 }else{
2810 const char *zFile = azArg[1];
2811 output_file_close(p->pLog);
2812 p->pLog = output_file_open(zFile);
2813 }
drh127f9d72010-02-23 01:47:00 +00002814 }else
2815
drhc2ce0be2014-05-29 12:36:14 +00002816 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
2817 const char *zMode = nArg>=2 ? azArg[1] : "";
2818 int n2 = (int)strlen(zMode);
2819 int c2 = zMode[0];
2820 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002821 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00002822 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002823 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00002824 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00002825 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00002826 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002827 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00002828 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002829 p->mode = MODE_Tcl;
mistachkin585dcb22012-12-04 00:23:43 +00002830 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
drhc2ce0be2014-05-29 12:36:14 +00002831 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00002832 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002833 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drh6976c212014-07-24 12:09:47 +00002834 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
drhc2ce0be2014-05-29 12:36:14 +00002835 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00002836 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002837 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drhc2ce0be2014-05-29 12:36:14 +00002838 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00002839 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00002840 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drhdaffd0e2001-04-11 14:28:42 +00002841 }else {
shane9bd1b442009-10-23 01:27:39 +00002842 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00002843 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00002844 rc = 1;
drh75897232000-05-29 14:26:00 +00002845 }
2846 }else
2847
drhc2ce0be2014-05-29 12:36:14 +00002848 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
2849 if( nArg==2 ){
2850 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
2851 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
2852 }else{
2853 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00002854 rc = 1;
2855 }
2856 }else
2857
drh05782482013-10-24 15:20:20 +00002858 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
2859 sqlite3 *savedDb = p->db;
2860 const char *zSavedFilename = p->zDbFilename;
2861 char *zNewFilename = 0;
2862 p->db = 0;
2863 if( nArg>=2 ){
2864 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2865 }
2866 open_db(p, 1);
2867 if( p->db!=0 ){
2868 sqlite3_close(savedDb);
2869 sqlite3_free(p->zFreeOnClose);
2870 p->zFreeOnClose = zNewFilename;
2871 }else{
2872 sqlite3_free(zNewFilename);
2873 p->db = savedDb;
2874 p->zDbFilename = zSavedFilename;
2875 }
2876 }else
2877
drhc2ce0be2014-05-29 12:36:14 +00002878 if( c=='o'
2879 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
2880 ){
2881 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2882 if( nArg>2 ){
2883 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2884 rc = 1;
2885 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00002886 }
drhc2ce0be2014-05-29 12:36:14 +00002887 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
2888 if( nArg<2 ){
2889 fprintf(stderr, "Usage: .once FILE\n");
2890 rc = 1;
2891 goto meta_command_exit;
2892 }
2893 p->outCount = 2;
2894 }else{
2895 p->outCount = 0;
2896 }
2897 output_reset(p);
2898 if( zFile[0]=='|' ){
2899 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00002900 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002901 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00002902 p->out = stdout;
2903 rc = 1;
2904 }else{
drhc2ce0be2014-05-29 12:36:14 +00002905 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00002906 }
drh75897232000-05-29 14:26:00 +00002907 }else{
drhc2ce0be2014-05-29 12:36:14 +00002908 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00002909 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00002910 if( strcmp(zFile,"off")!=0 ){
2911 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00002912 }
drh75897232000-05-29 14:26:00 +00002913 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00002914 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002915 } else {
drhc2ce0be2014-05-29 12:36:14 +00002916 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00002917 }
2918 }
2919 }else
2920
drh078b1fd2012-09-21 13:40:02 +00002921 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2922 int i;
2923 for(i=1; i<nArg; i++){
2924 if( i>1 ) fprintf(p->out, " ");
2925 fprintf(p->out, "%s", azArg[i]);
2926 }
2927 fprintf(p->out, "\n");
2928 }else
2929
drhc2ce0be2014-05-29 12:36:14 +00002930 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002931 if( nArg >= 2) {
2932 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
2933 }
2934 if( nArg >= 3) {
2935 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
2936 }
2937 }else
2938
drhc2ce0be2014-05-29 12:36:14 +00002939 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00002940 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00002941 }else
2942
drhc2ce0be2014-05-29 12:36:14 +00002943 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
2944 FILE *alt;
2945 if( nArg!=2 ){
2946 fprintf(stderr, "Usage: .read FILE\n");
2947 rc = 1;
2948 goto meta_command_exit;
2949 }
2950 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00002951 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00002952 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
2953 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00002954 }else{
shane9bd1b442009-10-23 01:27:39 +00002955 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00002956 fclose(alt);
2957 }
2958 }else
2959
drhc2ce0be2014-05-29 12:36:14 +00002960 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00002961 const char *zSrcFile;
2962 const char *zDb;
2963 sqlite3 *pSrc;
2964 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002965 int nTimeout = 0;
2966
drh9ff849f2009-02-04 20:55:57 +00002967 if( nArg==2 ){
2968 zSrcFile = azArg[1];
2969 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00002970 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00002971 zSrcFile = azArg[2];
2972 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00002973 }else{
2974 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
2975 rc = 1;
2976 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00002977 }
2978 rc = sqlite3_open(zSrcFile, &pSrc);
2979 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002980 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002981 sqlite3_close(pSrc);
2982 return 1;
2983 }
drh05782482013-10-24 15:20:20 +00002984 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002985 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2986 if( pBackup==0 ){
2987 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2988 sqlite3_close(pSrc);
2989 return 1;
2990 }
drhdc2c4912009-02-04 22:46:47 +00002991 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2992 || rc==SQLITE_BUSY ){
2993 if( rc==SQLITE_BUSY ){
2994 if( nTimeout++ >= 3 ) break;
2995 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002996 }
2997 }
2998 sqlite3_backup_finish(pBackup);
2999 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003000 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003001 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003002 fprintf(stderr, "Error: source database is busy\n");
3003 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003004 }else{
3005 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003006 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003007 }
3008 sqlite3_close(pSrc);
3009 }else
3010
drhc2ce0be2014-05-29 12:36:14 +00003011 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drh75897232000-05-29 14:26:00 +00003012 struct callback_data data;
3013 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003014 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003015 memcpy(&data, p, sizeof(data));
3016 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003017 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003018 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003019 int i;
drhf0693c82011-10-11 20:41:54 +00003020 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003021 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003022 char *new_argv[2], *new_colv[2];
3023 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3024 " type text,\n"
3025 " name text,\n"
3026 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003027 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003028 " sql text\n"
3029 ")";
3030 new_argv[1] = 0;
3031 new_colv[0] = "sql";
3032 new_colv[1] = 0;
3033 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003034 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003035 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003036 char *new_argv[2], *new_colv[2];
3037 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3038 " type text,\n"
3039 " name text,\n"
3040 " tbl_name text,\n"
3041 " rootpage integer,\n"
3042 " sql text\n"
3043 ")";
3044 new_argv[1] = 0;
3045 new_colv[0] = "sql";
3046 new_colv[1] = 0;
3047 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003048 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003049 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003050 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003051 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003052 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003053 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003054 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003055 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003056 "WHERE lower(tbl_name) LIKE shellstatic()"
3057 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003058 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003059 callback, &data, &zErrMsg);
3060 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003061 }
drhc2ce0be2014-05-29 12:36:14 +00003062 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003063 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003064 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003065 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003066 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003067 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00003068 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drh1ba00292013-05-06 21:01:06 +00003069 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003070 callback, &data, &zErrMsg
3071 );
drhc2ce0be2014-05-29 12:36:14 +00003072 }else{
3073 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3074 rc = 1;
3075 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003076 }
drh75897232000-05-29 14:26:00 +00003077 if( zErrMsg ){
3078 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003079 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003080 rc = 1;
3081 }else if( rc != SQLITE_OK ){
3082 fprintf(stderr,"Error: querying schema information\n");
3083 rc = 1;
3084 }else{
3085 rc = 0;
drh75897232000-05-29 14:26:00 +00003086 }
3087 }else
3088
drh340f5822013-06-27 13:01:21 +00003089#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003090 /* Undocumented commands for internal testing. Subject to change
3091 ** without notice. */
3092 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3093 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3094 int i, v;
3095 for(i=1; i<nArg; i++){
3096 v = booleanValue(azArg[i]);
3097 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3098 }
3099 }
3100 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3101 int i; sqlite3_int64 v;
3102 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003103 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003104 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003105 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003106 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003107 }
3108 }
3109 }else
drh340f5822013-06-27 13:01:21 +00003110#endif
drh348d19c2013-06-03 12:47:43 +00003111
drhc2ce0be2014-05-29 12:36:14 +00003112 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003113 if( nArg<2 || nArg>3 ){
3114 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
drhc2ce0be2014-05-29 12:36:14 +00003115 rc = 1;
3116 }
drh6976c212014-07-24 12:09:47 +00003117 if( nArg>=2 ){
3118 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3119 }
3120 if( nArg>=3 ){
3121 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3122 }
drh75897232000-05-29 14:26:00 +00003123 }else
3124
drh62cdde52014-05-28 20:22:28 +00003125 if( c=='s'
3126 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003127 ){
3128 char *zCmd;
3129 int i;
drhc2ce0be2014-05-29 12:36:14 +00003130 if( nArg<2 ){
3131 fprintf(stderr, "Usage: .system COMMAND\n");
3132 rc = 1;
3133 goto meta_command_exit;
3134 }
drhdcb3e3d2014-05-29 03:17:29 +00003135 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003136 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003137 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3138 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003139 }
drh3c4461f2014-05-29 20:39:59 +00003140 (void)system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003141 sqlite3_free(zCmd);
3142 }else
3143
drhc2ce0be2014-05-29 12:36:14 +00003144 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003145 int i;
drhc2ce0be2014-05-29 12:36:14 +00003146 if( nArg!=1 ){
3147 fprintf(stderr, "Usage: .show\n");
3148 rc = 1;
3149 goto meta_command_exit;
3150 }
persicom7e2dfdd2002-04-18 02:46:52 +00003151 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drhefbf3b12014-02-28 20:47:24 +00003152 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00003153 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00003154 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003155 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00003156 fprintf(p->out,"%9.9s: ", "nullvalue");
3157 output_c_string(p->out, p->nullvalue);
3158 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00003159 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003160 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00003161 fprintf(p->out,"%9.9s: ", "separator");
3162 output_c_string(p->out, p->separator);
drh6976c212014-07-24 12:09:47 +00003163 fprintf(p->out," ");
3164 output_c_string(p->out, p->newline);
drhfeac5f82004-08-01 00:10:45 +00003165 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00003166 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00003167 fprintf(p->out,"%9.9s: ","width");
3168 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003169 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003170 }
drhfeac5f82004-08-01 00:10:45 +00003171 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003172 }else
3173
drhc2ce0be2014-05-29 12:36:14 +00003174 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3175 if( nArg==2 ){
3176 p->statsOn = booleanValue(azArg[1]);
3177 }else{
3178 fprintf(stderr, "Usage: .stats on|off\n");
3179 rc = 1;
3180 }
shaneh642d8b82010-07-28 16:05:34 +00003181 }else
3182
drhc2ce0be2014-05-29 12:36:14 +00003183 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003184 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003185 char **azResult;
drh98781232012-04-23 12:38:05 +00003186 int nRow, nAlloc;
3187 char *zSql = 0;
3188 int ii;
drh05782482013-10-24 15:20:20 +00003189 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003190 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3191 if( rc ) return rc;
3192 zSql = sqlite3_mprintf(
3193 "SELECT name FROM sqlite_master"
3194 " WHERE type IN ('table','view')"
3195 " AND name NOT LIKE 'sqlite_%%'"
3196 " AND name LIKE ?1");
3197 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3198 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3199 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3200 if( strcmp(zDbName,"temp")==0 ){
3201 zSql = sqlite3_mprintf(
3202 "%z UNION ALL "
3203 "SELECT 'temp.' || name FROM sqlite_temp_master"
3204 " WHERE type IN ('table','view')"
3205 " AND name NOT LIKE 'sqlite_%%'"
3206 " AND name LIKE ?1", zSql);
3207 }else{
3208 zSql = sqlite3_mprintf(
3209 "%z UNION ALL "
3210 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3211 " WHERE type IN ('table','view')"
3212 " AND name NOT LIKE 'sqlite_%%'"
3213 " AND name LIKE ?1", zSql, zDbName, zDbName);
3214 }
drha50da102000-08-08 20:19:09 +00003215 }
drh98781232012-04-23 12:38:05 +00003216 sqlite3_finalize(pStmt);
3217 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3218 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3219 sqlite3_free(zSql);
3220 if( rc ) return rc;
3221 nRow = nAlloc = 0;
3222 azResult = 0;
3223 if( nArg>1 ){
3224 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003225 }else{
drh98781232012-04-23 12:38:05 +00003226 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3227 }
3228 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3229 if( nRow>=nAlloc ){
3230 char **azNew;
3231 int n = nAlloc*2 + 10;
3232 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
3233 if( azNew==0 ){
3234 fprintf(stderr, "Error: out of memory\n");
3235 break;
3236 }
3237 nAlloc = n;
3238 azResult = azNew;
3239 }
3240 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3241 if( azResult[nRow] ) nRow++;
3242 }
3243 sqlite3_finalize(pStmt);
3244 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003245 int len, maxlen = 0;
3246 int i, j;
3247 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003248 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003249 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003250 if( len>maxlen ) maxlen = len;
3251 }
3252 nPrintCol = 80/(maxlen+2);
3253 if( nPrintCol<1 ) nPrintCol = 1;
3254 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3255 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003256 for(j=i; j<nRow; j+=nPrintRow){
3257 char *zSp = j<nPrintRow ? "" : " ";
drh151b7d52013-05-06 20:28:54 +00003258 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
drhe3710332000-09-29 13:30:53 +00003259 }
drh151b7d52013-05-06 20:28:54 +00003260 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003261 }
3262 }
drh98781232012-04-23 12:38:05 +00003263 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3264 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003265 }else
3266
shaneh96887e12011-02-10 21:08:58 +00003267 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003268 static const struct {
3269 const char *zCtrlName; /* Name of a test-control option */
3270 int ctrlCode; /* Integer code for that option */
3271 } aCtrl[] = {
3272 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3273 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3274 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3275 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3276 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3277 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3278 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3279 { "assert", SQLITE_TESTCTRL_ASSERT },
3280 { "always", SQLITE_TESTCTRL_ALWAYS },
3281 { "reserve", SQLITE_TESTCTRL_RESERVE },
3282 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3283 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003284 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003285 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhd416fe72011-03-17 16:45:50 +00003286 };
shaneh96887e12011-02-10 21:08:58 +00003287 int testctrl = -1;
3288 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00003289 int i, n;
drh05782482013-10-24 15:20:20 +00003290 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003291
drhd416fe72011-03-17 16:45:50 +00003292 /* convert testctrl text option to value. allow any unique prefix
3293 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00003294 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003295 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00003296 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
3297 if( testctrl<0 ){
3298 testctrl = aCtrl[i].ctrlCode;
3299 }else{
drhb07028f2011-10-14 21:49:18 +00003300 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003301 testctrl = -1;
3302 break;
3303 }
3304 }
3305 }
drh348d19c2013-06-03 12:47:43 +00003306 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003307 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3308 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3309 }else{
3310 switch(testctrl){
3311
3312 /* sqlite3_test_control(int, db, int) */
3313 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3314 case SQLITE_TESTCTRL_RESERVE:
3315 if( nArg==3 ){
3316 int opt = (int)strtol(azArg[2], 0, 0);
3317 rc = sqlite3_test_control(testctrl, p->db, opt);
drh151b7d52013-05-06 20:28:54 +00003318 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003319 } else {
drhd416fe72011-03-17 16:45:50 +00003320 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3321 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003322 }
3323 break;
3324
3325 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003326 case SQLITE_TESTCTRL_PRNG_SAVE:
3327 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003328 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003329 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003330 if( nArg==2 ){
3331 rc = sqlite3_test_control(testctrl);
drh151b7d52013-05-06 20:28:54 +00003332 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003333 } else {
3334 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3335 }
3336 break;
3337
3338 /* sqlite3_test_control(int, uint) */
3339 case SQLITE_TESTCTRL_PENDING_BYTE:
3340 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003341 unsigned int opt = (unsigned int)integerValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003342 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003343 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003344 } else {
drhd416fe72011-03-17 16:45:50 +00003345 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3346 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003347 }
3348 break;
3349
3350 /* sqlite3_test_control(int, int) */
3351 case SQLITE_TESTCTRL_ASSERT:
3352 case SQLITE_TESTCTRL_ALWAYS:
3353 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003354 int opt = booleanValue(azArg[2]);
shaneh96887e12011-02-10 21:08:58 +00003355 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003356 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003357 } else {
drhd416fe72011-03-17 16:45:50 +00003358 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3359 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003360 }
3361 break;
3362
3363 /* sqlite3_test_control(int, char *) */
3364#ifdef SQLITE_N_KEYWORD
3365 case SQLITE_TESTCTRL_ISKEYWORD:
3366 if( nArg==3 ){
3367 const char *opt = azArg[2];
3368 rc = sqlite3_test_control(testctrl, opt);
drh151b7d52013-05-06 20:28:54 +00003369 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
shaneh96887e12011-02-10 21:08:58 +00003370 } else {
drhd416fe72011-03-17 16:45:50 +00003371 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3372 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003373 }
3374 break;
3375#endif
3376
3377 case SQLITE_TESTCTRL_BITVEC_TEST:
3378 case SQLITE_TESTCTRL_FAULT_INSTALL:
3379 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3380 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3381 default:
drhd416fe72011-03-17 16:45:50 +00003382 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3383 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003384 break;
3385 }
3386 }
3387 }else
3388
drhc2ce0be2014-05-29 12:36:14 +00003389 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003390 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003391 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003392 }else
3393
drhc2ce0be2014-05-29 12:36:14 +00003394 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3395 if( nArg==2 ){
3396 enableTimer = booleanValue(azArg[1]);
3397 if( enableTimer && !HAS_TIMER ){
3398 fprintf(stderr, "Error: timer not available on this system.\n");
3399 enableTimer = 0;
3400 }
3401 }else{
3402 fprintf(stderr, "Usage: .timer on|off\n");
3403 rc = 1;
3404 }
shanehe2aa9d72009-11-06 17:20:17 +00003405 }else
3406
drhc2ce0be2014-05-29 12:36:14 +00003407 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003408 open_db(p, 0);
drh42f64e52012-04-04 16:56:23 +00003409 output_file_close(p->traceOut);
drhc2ce0be2014-05-29 12:36:14 +00003410 if( nArg!=2 ){
3411 fprintf(stderr, "Usage: .trace FILE|off\n");
3412 rc = 1;
3413 goto meta_command_exit;
3414 }
drh42f64e52012-04-04 16:56:23 +00003415 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003416#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003417 if( p->traceOut==0 ){
3418 sqlite3_trace(p->db, 0, 0);
3419 }else{
3420 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3421 }
3422#endif
3423 }else
3424
drh9fd301b2011-06-03 13:28:22 +00003425 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003426 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003427 sqlite3_libversion(), sqlite3_sourceid());
3428 }else
3429
drhde60fc22011-12-14 17:53:36 +00003430 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3431 const char *zDbName = nArg==2 ? azArg[1] : "main";
3432 char *zVfsName = 0;
3433 if( p->db ){
3434 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3435 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003436 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003437 sqlite3_free(zVfsName);
3438 }
3439 }
3440 }else
3441
drhcef4fc82012-09-21 22:50:45 +00003442#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3443 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3444 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003445 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003446 }else
3447#endif
3448
drhc2ce0be2014-05-29 12:36:14 +00003449 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003450 int j;
drh43617e92006-03-06 20:55:46 +00003451 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003452 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003453 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003454 }
3455 }else
3456
3457 {
shane9bd1b442009-10-23 01:27:39 +00003458 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003459 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003460 rc = 1;
drh75897232000-05-29 14:26:00 +00003461 }
drh67505e72002-04-19 12:34:06 +00003462
drhc2ce0be2014-05-29 12:36:14 +00003463meta_command_exit:
3464 if( p->outCount ){
3465 p->outCount--;
3466 if( p->outCount==0 ) output_reset(p);
3467 }
drh67505e72002-04-19 12:34:06 +00003468 return rc;
drh75897232000-05-29 14:26:00 +00003469}
3470
drh67505e72002-04-19 12:34:06 +00003471/*
drh91a66392007-09-07 01:12:32 +00003472** Return TRUE if a semicolon occurs anywhere in the first N characters
3473** of string z[].
drh324ccef2003-02-05 14:06:20 +00003474*/
drh9f099fd2013-08-06 14:01:46 +00003475static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003476 int i;
3477 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3478 return 0;
drh324ccef2003-02-05 14:06:20 +00003479}
3480
3481/*
drh70c7a4b2003-04-26 03:03:06 +00003482** Test to see if a line consists entirely of whitespace.
3483*/
3484static int _all_whitespace(const char *z){
3485 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003486 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003487 if( *z=='/' && z[1]=='*' ){
3488 z += 2;
3489 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3490 if( *z==0 ) return 0;
3491 z++;
3492 continue;
3493 }
3494 if( *z=='-' && z[1]=='-' ){
3495 z += 2;
3496 while( *z && *z!='\n' ){ z++; }
3497 if( *z==0 ) return 1;
3498 continue;
3499 }
3500 return 0;
3501 }
3502 return 1;
3503}
3504
3505/*
drha9b17162003-04-29 18:01:28 +00003506** Return TRUE if the line typed in is an SQL command terminator other
3507** than a semi-colon. The SQL Server style "go" command is understood
3508** as is the Oracle "/".
3509*/
drh9f099fd2013-08-06 14:01:46 +00003510static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00003511 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00003512 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
3513 return 1; /* Oracle */
3514 }
drhf0693c82011-10-11 20:41:54 +00003515 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00003516 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00003517 return 1; /* SQL Server */
3518 }
3519 return 0;
3520}
3521
3522/*
drh233a5312008-12-18 22:25:13 +00003523** Return true if zSql is a complete SQL statement. Return false if it
3524** ends in the middle of a string literal or C-style comment.
3525*/
drh9f099fd2013-08-06 14:01:46 +00003526static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00003527 int rc;
3528 if( zSql==0 ) return 1;
3529 zSql[nSql] = ';';
3530 zSql[nSql+1] = 0;
3531 rc = sqlite3_complete(zSql);
3532 zSql[nSql] = 0;
3533 return rc;
3534}
3535
3536/*
drh67505e72002-04-19 12:34:06 +00003537** Read input from *in and process it. If *in==0 then input
3538** is interactive - the user is typing it it. Otherwise, input
3539** is coming from a file or device. A prompt is issued and history
3540** is saved only if input is interactive. An interrupt signal will
3541** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00003542**
3543** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00003544*/
drhc28490c2006-10-26 14:25:58 +00003545static int process_input(struct callback_data *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00003546 char *zLine = 0; /* A single input line */
3547 char *zSql = 0; /* Accumulated SQL text */
3548 int nLine; /* Length of current line */
3549 int nSql = 0; /* Bytes of zSql[] used */
3550 int nAlloc = 0; /* Allocated zSql[] space */
3551 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
3552 char *zErrMsg; /* Error message returned */
3553 int rc; /* Error code */
3554 int errCnt = 0; /* Number of errors seen */
3555 int lineno = 0; /* Current line number */
3556 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00003557
3558 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
3559 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00003560 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00003561 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00003562 /* End of input */
3563 if( stdin_is_interactive ) printf("\n");
3564 break;
drhc49f44e2006-10-26 18:15:42 +00003565 }
drh67505e72002-04-19 12:34:06 +00003566 if( seenInterrupt ){
3567 if( in!=0 ) break;
3568 seenInterrupt = 0;
3569 }
drhc28490c2006-10-26 14:25:58 +00003570 lineno++;
drh849a9d92013-12-21 15:46:06 +00003571 if( nSql==0 && _all_whitespace(zLine) ){
3572 if( p->echoOn ) printf("%s\n", zLine);
3573 continue;
3574 }
drh2af0b2d2002-02-21 02:25:02 +00003575 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00003576 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00003577 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00003578 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00003579 break;
3580 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00003581 errCnt++;
3582 }
drhdaffd0e2001-04-11 14:28:42 +00003583 continue;
3584 }
drh9f099fd2013-08-06 14:01:46 +00003585 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00003586 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00003587 }
drh9f099fd2013-08-06 14:01:46 +00003588 nLine = strlen30(zLine);
3589 if( nSql+nLine+2>=nAlloc ){
3590 nAlloc = nSql+nLine+100;
3591 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00003592 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00003593 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00003594 exit(1);
3595 }
drhdaffd0e2001-04-11 14:28:42 +00003596 }
drh9f099fd2013-08-06 14:01:46 +00003597 nSqlPrior = nSql;
3598 if( nSql==0 ){
3599 int i;
3600 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00003601 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00003602 memcpy(zSql, zLine+i, nLine+1-i);
3603 startline = lineno;
3604 nSql = nLine-i;
3605 }else{
3606 zSql[nSql++] = '\n';
3607 memcpy(zSql+nSql, zLine, nLine+1);
3608 nSql += nLine;
3609 }
3610 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00003611 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00003612 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00003613 open_db(p, 0);
drh3b1a9882007-11-02 12:53:03 +00003614 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00003615 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00003616 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00003617 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00003618 char zPrefix[100];
3619 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00003620 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00003621 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00003622 }else{
shane9bd1b442009-10-23 01:27:39 +00003623 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00003624 }
drh7f953e22002-07-13 17:33:45 +00003625 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00003626 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003627 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00003628 zErrMsg = 0;
3629 }else{
shaned2bed1c2009-10-21 03:56:54 +00003630 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00003631 }
drhc49f44e2006-10-26 18:15:42 +00003632 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00003633 }
drhdaffd0e2001-04-11 14:28:42 +00003634 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00003635 if( p->outCount ){
3636 output_reset(p);
3637 p->outCount = 0;
3638 }
drh9f099fd2013-08-06 14:01:46 +00003639 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00003640 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00003641 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00003642 }
3643 }
drh9f099fd2013-08-06 14:01:46 +00003644 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00003645 if( !_all_whitespace(zSql) ){
3646 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3647 }
drhdaffd0e2001-04-11 14:28:42 +00003648 free(zSql);
3649 }
danielk19772ac27622007-07-03 05:31:16 +00003650 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00003651 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00003652}
3653
drh67505e72002-04-19 12:34:06 +00003654/*
3655** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00003656** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00003657*/
3658static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00003659 static char *home_dir = NULL;
3660 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00003661
drh83905c92012-06-21 13:00:37 +00003662#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00003663 {
3664 struct passwd *pwent;
3665 uid_t uid = getuid();
3666 if( (pwent=getpwuid(uid)) != NULL) {
3667 home_dir = pwent->pw_dir;
3668 }
drh67505e72002-04-19 12:34:06 +00003669 }
3670#endif
3671
chw65d3c132007-11-12 21:09:10 +00003672#if defined(_WIN32_WCE)
3673 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
3674 */
drh85e72432012-04-11 11:38:53 +00003675 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00003676#else
3677
drh83905c92012-06-21 13:00:37 +00003678#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00003679 if (!home_dir) {
3680 home_dir = getenv("USERPROFILE");
3681 }
3682#endif
3683
drh67505e72002-04-19 12:34:06 +00003684 if (!home_dir) {
3685 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00003686 }
3687
drh83905c92012-06-21 13:00:37 +00003688#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00003689 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00003690 char *zDrive, *zPath;
3691 int n;
3692 zDrive = getenv("HOMEDRIVE");
3693 zPath = getenv("HOMEPATH");
3694 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00003695 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00003696 home_dir = malloc( n );
3697 if( home_dir==0 ) return 0;
3698 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
3699 return home_dir;
3700 }
3701 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00003702 }
3703#endif
3704
chw65d3c132007-11-12 21:09:10 +00003705#endif /* !_WIN32_WCE */
3706
drh67505e72002-04-19 12:34:06 +00003707 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00003708 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00003709 char *z = malloc( n );
3710 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00003711 home_dir = z;
3712 }
drhe98d4fa2002-04-21 19:06:22 +00003713
drh67505e72002-04-19 12:34:06 +00003714 return home_dir;
3715}
3716
3717/*
3718** Read input from the file given by sqliterc_override. Or if that
3719** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00003720**
3721** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00003722*/
shane9bd1b442009-10-23 01:27:39 +00003723static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00003724 struct callback_data *p, /* Configuration data */
3725 const char *sqliterc_override /* Name of config file. NULL to use default */
3726){
persicom7e2dfdd2002-04-18 02:46:52 +00003727 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00003728 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00003729 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003730 FILE *in = NULL;
shane9bd1b442009-10-23 01:27:39 +00003731 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00003732
3733 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00003734 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00003735 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00003736#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00003737 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00003738#endif
shane9bd1b442009-10-23 01:27:39 +00003739 return 1;
drhe98d4fa2002-04-21 19:06:22 +00003740 }
drh2f3de322012-06-27 16:41:31 +00003741 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00003742 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
3743 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00003744 }
drha1f9b5e2004-02-14 16:31:02 +00003745 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00003746 if( in ){
drhc28490c2006-10-26 14:25:58 +00003747 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00003748 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00003749 }
shane9bd1b442009-10-23 01:27:39 +00003750 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00003751 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00003752 }
drh85e72432012-04-11 11:38:53 +00003753 sqlite3_free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00003754 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00003755}
3756
drh67505e72002-04-19 12:34:06 +00003757/*
drhe1e38c42003-05-04 18:30:59 +00003758** Show available command line options
3759*/
3760static const char zOptions[] =
drhc49f44e2006-10-26 18:15:42 +00003761 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00003762 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003763 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00003764 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00003765 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00003766 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00003767 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00003768 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00003769#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3770 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3771#endif
drhcc3b4f82012-02-07 14:13:50 +00003772 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00003773 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00003774 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00003775 " -line set output mode to 'line'\n"
3776 " -list set output mode to 'list'\n"
drh7d9f3942013-04-03 01:26:54 +00003777 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00003778#ifdef SQLITE_ENABLE_MULTIPLEX
3779 " -multiplex enable the multiplexor VFS\n"
3780#endif
drh6976c212014-07-24 12:09:47 +00003781 " -newline SEP set newline character(s) for CSV\n"
drh98d312f2012-10-25 15:23:14 +00003782 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3783 " -separator SEP set output field separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00003784 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00003785 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00003786 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00003787#ifdef SQLITE_ENABLE_VFSTRACE
3788 " -vfstrace enable tracing of all VFS calls\n"
3789#endif
drhe1e38c42003-05-04 18:30:59 +00003790;
3791static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00003792 fprintf(stderr,
3793 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
3794 "FILENAME is the name of an SQLite database. A new database is created\n"
3795 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00003796 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00003797 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00003798 }else{
3799 fprintf(stderr, "Use the -help option for additional information\n");
3800 }
3801 exit(1);
3802}
3803
3804/*
drh67505e72002-04-19 12:34:06 +00003805** Initialize the state information in data
3806*/
drh0850b532006-01-31 19:31:43 +00003807static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00003808 memset(data, 0, sizeof(*data));
3809 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00003810 memcpy(data->separator,"|", 2);
drh6976c212014-07-24 12:09:47 +00003811 memcpy(data->newline,"\r\n", 3);
persicom7e2dfdd2002-04-18 02:46:52 +00003812 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00003813 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00003814 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00003815 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
3816 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00003817 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00003818}
3819
drh98d312f2012-10-25 15:23:14 +00003820/*
drh5c7976f2014-02-10 19:59:27 +00003821** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00003822*/
3823#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00003824static void printBold(const char *zText){
3825 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3826 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3827 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3828 SetConsoleTextAttribute(out,
3829 FOREGROUND_RED|FOREGROUND_INTENSITY
3830 );
3831 printf("%s", zText);
3832 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00003833}
3834#else
drh5c7976f2014-02-10 19:59:27 +00003835static void printBold(const char *zText){
3836 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00003837}
3838#endif
3839
3840/*
drh98d312f2012-10-25 15:23:14 +00003841** Get the argument to an --option. Throw an error and die if no argument
3842** is available.
3843*/
3844static char *cmdline_option_value(int argc, char **argv, int i){
3845 if( i==argc ){
3846 fprintf(stderr, "%s: Error: missing argument to %s\n",
3847 argv[0], argv[argc-1]);
3848 exit(1);
3849 }
3850 return argv[i];
3851}
3852
drh75897232000-05-29 14:26:00 +00003853int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00003854 char *zErrMsg = 0;
3855 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00003856 const char *zInitFile = 0;
3857 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00003858 int i;
drhc28490c2006-10-26 14:25:58 +00003859 int rc = 0;
drhb3735912014-02-10 16:13:42 +00003860 int warnInmemoryDb = 0;
drh75897232000-05-29 14:26:00 +00003861
drh69b30ab2014-02-27 15:11:52 +00003862#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00003863 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
3864 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
3865 sqlite3_sourceid(), SQLITE_SOURCE_ID);
3866 exit(1);
3867 }
drhc7181902014-02-27 15:04:13 +00003868#endif
drhdaffd0e2001-04-11 14:28:42 +00003869 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00003870 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00003871 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00003872
drh44c2eb12003-04-30 11:38:26 +00003873 /* Make sure we have a valid signal handler early, before anything
3874 ** else is done.
3875 */
drh4c504392000-10-16 22:06:40 +00003876#ifdef SIGINT
3877 signal(SIGINT, interrupt_handler);
3878#endif
drh44c2eb12003-04-30 11:38:26 +00003879
drh22fbcb82004-02-01 01:22:50 +00003880 /* Do an initial pass through the command-line argument to locate
3881 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00003882 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00003883 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00003884 */
drh98d312f2012-10-25 15:23:14 +00003885 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00003886 char *z;
drhc28490c2006-10-26 14:25:58 +00003887 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003888 if( z[0]!='-' ){
3889 if( data.zDbFilename==0 ){
3890 data.zDbFilename = z;
3891 continue;
3892 }
3893 if( zFirstCmd==0 ){
3894 zFirstCmd = z;
3895 continue;
3896 }
3897 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
3898 fprintf(stderr,"Use -help for a list of options.\n");
3899 return 1;
3900 }
drhcc3b4f82012-02-07 14:13:50 +00003901 if( z[1]=='-' ) z++;
3902 if( strcmp(z,"-separator")==0
3903 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00003904 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00003905 || strcmp(z,"-cmd")==0
3906 ){
drh98d312f2012-10-25 15:23:14 +00003907 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003908 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00003909 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00003910 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00003911 /* Need to check for batch mode here to so we can avoid printing
3912 ** informational messages (like from process_sqliterc) before
3913 ** we do the actual processing of arguments later in a second pass.
3914 */
shanef69573d2009-10-24 02:06:14 +00003915 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00003916 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00003917#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00003918 const char *zSize;
3919 sqlite3_int64 szHeap;
3920
drh98d312f2012-10-25 15:23:14 +00003921 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00003922 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00003923 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00003924 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
3925#endif
drh97ae8ff2011-03-16 16:56:29 +00003926#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00003927 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00003928 extern int vfstrace_register(
3929 const char *zTraceName,
3930 const char *zOldVfsName,
3931 int (*xOut)(const char*,void*),
3932 void *pOutArg,
3933 int makeDefault
3934 );
drh2b625e22011-03-16 17:05:28 +00003935 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00003936#endif
drh6f25e892011-07-08 17:02:57 +00003937#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00003938 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00003939 extern int sqlite3_multiple_initialize(const char*,int);
3940 sqlite3_multiplex_initialize(0, 1);
3941#endif
drh7d9f3942013-04-03 01:26:54 +00003942 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00003943 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
3944 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00003945 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00003946 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00003947 if( pVfs ){
3948 sqlite3_vfs_register(pVfs, 1);
3949 }else{
3950 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
3951 exit(1);
3952 }
drh44c2eb12003-04-30 11:38:26 +00003953 }
3954 }
drh98d312f2012-10-25 15:23:14 +00003955 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00003956#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00003957 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00003958 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00003959#else
shane86f5bdb2009-10-24 02:00:07 +00003960 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
3961 return 1;
drh01b41712005-08-29 23:06:23 +00003962#endif
drhc7181902014-02-27 15:04:13 +00003963#ifdef SQLITE_SHELL_DBNAME_PROC
3964 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
3965 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
3966 warnInmemoryDb = 0; }
3967#endif
drh98d312f2012-10-25 15:23:14 +00003968 }
3969 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00003970
drh44c2eb12003-04-30 11:38:26 +00003971 /* Go ahead and open the database file if it already exists. If the
3972 ** file does not exist, delay opening it. This prevents empty database
3973 ** files from being created if a user mistypes the database name argument
3974 ** to the sqlite command-line tool.
3975 */
drhc8d74412004-08-31 23:41:26 +00003976 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00003977 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00003978 }
3979
drh22fbcb82004-02-01 01:22:50 +00003980 /* Process the initialization file if there is one. If no -init option
3981 ** is given on the command line, look for a file named ~/.sqliterc and
3982 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00003983 */
shane86f5bdb2009-10-24 02:00:07 +00003984 rc = process_sqliterc(&data,zInitFile);
3985 if( rc>0 ){
3986 return rc;
3987 }
drh44c2eb12003-04-30 11:38:26 +00003988
drh22fbcb82004-02-01 01:22:50 +00003989 /* Make a second pass through the command-line argument and set
3990 ** options. This second pass is delayed until after the initialization
3991 ** file is processed so that the command-line arguments will override
3992 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00003993 */
drh98d312f2012-10-25 15:23:14 +00003994 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00003995 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00003996 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00003997 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00003998 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00003999 i++;
4000 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004001 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004002 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004003 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004004 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004005 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004006 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004007 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004008 }else if( strcmp(z,"-csv")==0 ){
4009 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00004010 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00004011 }else if( strcmp(z,"-separator")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004012 sqlite3_snprintf(sizeof(data.separator), data.separator,
drh98d312f2012-10-25 15:23:14 +00004013 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004014 }else if( strcmp(z,"-newline")==0 ){
4015 sqlite3_snprintf(sizeof(data.newline), data.newline,
4016 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004017 }else if( strcmp(z,"-nullvalue")==0 ){
drh5bb3eb92007-05-04 13:15:55 +00004018 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
drh98d312f2012-10-25 15:23:14 +00004019 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004020 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004021 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004022 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004023 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004024 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004025 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004026 }else if( strcmp(z,"-eqp")==0 ){
4027 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004028 }else if( strcmp(z,"-stats")==0 ){
4029 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004030 }else if( strcmp(z,"-bail")==0 ){
4031 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004032 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004033 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004034 return 0;
drhc28490c2006-10-26 14:25:58 +00004035 }else if( strcmp(z,"-interactive")==0 ){
4036 stdin_is_interactive = 1;
4037 }else if( strcmp(z,"-batch")==0 ){
4038 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004039 }else if( strcmp(z,"-heap")==0 ){
4040 i++;
drh7d9f3942013-04-03 01:26:54 +00004041 }else if( strcmp(z,"-mmap")==0 ){
4042 i++;
drha7e61d82011-03-12 17:02:57 +00004043 }else if( strcmp(z,"-vfs")==0 ){
4044 i++;
drh6f25e892011-07-08 17:02:57 +00004045#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004046 }else if( strcmp(z,"-vfstrace")==0 ){
4047 i++;
drh6f25e892011-07-08 17:02:57 +00004048#endif
4049#ifdef SQLITE_ENABLE_MULTIPLEX
4050 }else if( strcmp(z,"-multiplex")==0 ){
4051 i++;
4052#endif
drhcc3b4f82012-02-07 14:13:50 +00004053 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004054 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004055 }else if( strcmp(z,"-cmd")==0 ){
4056 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004057 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004058 if( z[0]=='.' ){
4059 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004060 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004061 }else{
drh05782482013-10-24 15:20:20 +00004062 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004063 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4064 if( zErrMsg!=0 ){
4065 fprintf(stderr,"Error: %s\n", zErrMsg);
4066 if( bail_on_error ) return rc!=0 ? rc : 1;
4067 }else if( rc!=0 ){
4068 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4069 if( bail_on_error ) return rc;
4070 }
4071 }
drh1e5d0e92000-05-31 23:33:17 +00004072 }else{
shane86f5bdb2009-10-24 02:00:07 +00004073 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004074 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004075 return 1;
4076 }
4077 }
drh44c2eb12003-04-30 11:38:26 +00004078
drh22fbcb82004-02-01 01:22:50 +00004079 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00004080 /* Run just the command that follows the database name
4081 */
drh22fbcb82004-02-01 01:22:50 +00004082 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00004083 rc = do_meta_command(zFirstCmd, &data);
drh99b39082013-04-17 12:19:48 +00004084 if( rc==2 ) rc = 0;
drh6ff13852001-11-25 13:18:23 +00004085 }else{
drh05782482013-10-24 15:20:20 +00004086 open_db(&data, 0);
shane626a6e42009-10-22 17:30:15 +00004087 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00004088 if( zErrMsg!=0 ){
4089 fprintf(stderr,"Error: %s\n", zErrMsg);
4090 return rc!=0 ? rc : 1;
4091 }else if( rc!=0 ){
4092 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
4093 return rc;
drh6ff13852001-11-25 13:18:23 +00004094 }
drh75897232000-05-29 14:26:00 +00004095 }
4096 }else{
drh44c2eb12003-04-30 11:38:26 +00004097 /* Run commands received from standard input
4098 */
drhc28490c2006-10-26 14:25:58 +00004099 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004100 char *zHome;
4101 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004102 int nHistory;
drh75897232000-05-29 14:26:00 +00004103 printf(
drh743e0032011-12-12 16:51:50 +00004104 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004105 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004106 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004107 );
drhb3735912014-02-10 16:13:42 +00004108 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004109 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004110 printBold("transient in-memory database");
4111 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004112 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004113 }
drh67505e72002-04-19 12:34:06 +00004114 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004115 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004116 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004117 if( (zHistory = malloc(nHistory))!=0 ){
4118 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4119 }
drh67505e72002-04-19 12:34:06 +00004120 }
drhaaa21b42014-02-11 14:37:51 +00004121#if defined(HAVE_READLINE)
drh67505e72002-04-19 12:34:06 +00004122 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00004123#endif
drhc28490c2006-10-26 14:25:58 +00004124 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004125 if( zHistory ){
4126 stifle_history(100);
4127 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004128 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004129 }
drhdaffd0e2001-04-11 14:28:42 +00004130 }else{
drhc28490c2006-10-26 14:25:58 +00004131 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004132 }
4133 }
drh33048c02001-10-01 14:29:22 +00004134 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004135 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004136 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004137 }
drh05782482013-10-24 15:20:20 +00004138 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004139 return rc;
drh75897232000-05-29 14:26:00 +00004140}