blob: 503d8a6a8d724bc8d818313294a4b279664a5d90 [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
drh454ad582007-11-26 22:54:27 +000039#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
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
drhcdb36b72006-06-12 12:57:45 +000048#ifdef __OS2__
49# include <unistd.h>
50#endif
51
drh81d7fd12010-12-08 00:02:26 +000052#ifdef HAVE_EDITLINE
53# include <editline/editline.h>
54#endif
drh16e59552000-07-31 11:57:37 +000055#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000056# include <readline/readline.h>
57# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000058#endif
59#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1)
drh9347b202003-07-18 01:30:59 +000060# define readline(p) local_getline(p,stdin)
persicom1d0b8722002-04-18 02:53:04 +000061# define add_history(X)
drh67505e72002-04-19 12:34:06 +000062# define read_history(X)
63# define write_history(X)
64# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000065#endif
66
adamd2e8464a2006-09-06 21:39:40 +000067#if defined(_WIN32) || defined(WIN32)
68# include <io.h>
shane18e526c2008-12-10 22:30:24 +000069#define isatty(h) _isatty(h)
70#define access(f,m) _access((f),(m))
adamd2e8464a2006-09-06 21:39:40 +000071#else
drh4328c8b2003-04-26 02:50:11 +000072/* Make sure isatty() has a prototype.
73*/
drhb2acc3b2011-10-13 16:36:29 +000074extern int isatty(int);
adamd2e8464a2006-09-06 21:39:40 +000075#endif
drh4328c8b2003-04-26 02:50:11 +000076
chw65d3c132007-11-12 21:09:10 +000077#if defined(_WIN32_WCE)
78/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
79 * thus we always assume that we have a console. That can be
80 * overridden with the -batch command line option.
81 */
82#define isatty(x) 1
83#endif
84
drhc6e41722011-04-11 15:36:26 +000085/* True if the timer is enabled */
86static int enableTimer = 0;
87
drhf0693c82011-10-11 20:41:54 +000088/* ctype macros that work with signed characters */
89#define IsSpace(X) isspace((unsigned char)X)
90#define IsDigit(X) isdigit((unsigned char)X)
91#define ToLower(X) (char)tolower((unsigned char)X)
92
chw97185482008-11-17 08:05:31 +000093#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__) && !defined(_WRS_KERNEL)
drh3b1a9882007-11-02 12:53:03 +000094#include <sys/time.h>
95#include <sys/resource.h>
96
drhda108222009-02-25 19:07:24 +000097/* Saved resource information for the beginning of an operation */
98static struct rusage sBegin;
99
drhda108222009-02-25 19:07:24 +0000100/*
101** Begin timing an operation
102*/
103static void beginTimer(void){
104 if( enableTimer ){
105 getrusage(RUSAGE_SELF, &sBegin);
106 }
107}
108
109/* Return the difference of two time_structs in seconds */
110static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
111 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
112 (double)(pEnd->tv_sec - pStart->tv_sec);
113}
114
115/*
116** Print the timing results.
117*/
118static void endTimer(void){
119 if( enableTimer ){
120 struct rusage sEnd;
121 getrusage(RUSAGE_SELF, &sEnd);
122 printf("CPU Time: user %f sys %f\n",
123 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
124 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
125 }
126}
shaneb320ccd2009-10-21 03:42:58 +0000127
drhda108222009-02-25 19:07:24 +0000128#define BEGIN_TIMER beginTimer()
129#define END_TIMER endTimer()
130#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000131
132#elif (defined(_WIN32) || defined(WIN32))
133
134#include <windows.h>
135
136/* Saved resource information for the beginning of an operation */
137static HANDLE hProcess;
138static FILETIME ftKernelBegin;
139static FILETIME ftUserBegin;
140typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
141static GETPROCTIMES getProcessTimesAddr = NULL;
142
shaneb320ccd2009-10-21 03:42:58 +0000143/*
144** Check to see if we have timer support. Return 1 if necessary
145** support found (or found previously).
146*/
147static int hasTimer(void){
148 if( getProcessTimesAddr ){
149 return 1;
150 } else {
151 /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions.
152 ** See if the version we are running on has it, and if it does, save off
153 ** a pointer to it and the current process handle.
154 */
155 hProcess = GetCurrentProcess();
156 if( hProcess ){
157 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
158 if( NULL != hinstLib ){
159 getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
160 if( NULL != getProcessTimesAddr ){
161 return 1;
162 }
163 FreeLibrary(hinstLib);
164 }
165 }
166 }
167 return 0;
168}
169
170/*
171** Begin timing an operation
172*/
173static void beginTimer(void){
174 if( enableTimer && getProcessTimesAddr ){
175 FILETIME ftCreation, ftExit;
176 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin);
177 }
178}
179
180/* Return the difference of two FILETIME structs in seconds */
181static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
182 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
183 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
184 return (double) ((i64End - i64Start) / 10000000.0);
185}
186
187/*
188** Print the timing results.
189*/
190static void endTimer(void){
191 if( enableTimer && getProcessTimesAddr){
192 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
193 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd);
194 printf("CPU Time: user %f sys %f\n",
195 timeDiff(&ftUserBegin, &ftUserEnd),
196 timeDiff(&ftKernelBegin, &ftKernelEnd));
197 }
198}
199
200#define BEGIN_TIMER beginTimer()
201#define END_TIMER endTimer()
202#define HAS_TIMER hasTimer()
203
drhda108222009-02-25 19:07:24 +0000204#else
205#define BEGIN_TIMER
206#define END_TIMER
207#define HAS_TIMER 0
208#endif
209
shanec0688ea2009-03-05 03:48:06 +0000210/*
211** Used to prevent warnings about unused parameters
212*/
213#define UNUSED_PARAMETER(x) (void)(x)
214
drhe91d16b2008-12-08 18:27:31 +0000215/*
drhc49f44e2006-10-26 18:15:42 +0000216** If the following flag is set, then command execution stops
217** at an error if we are not interactive.
218*/
219static int bail_on_error = 0;
220
221/*
drhc28490c2006-10-26 14:25:58 +0000222** Threat stdin as an interactive input if the following variable
223** is true. Otherwise, assume stdin is connected to a file or pipe.
224*/
225static int stdin_is_interactive = 1;
226
227/*
drh4c504392000-10-16 22:06:40 +0000228** The following is the open SQLite database. We make a pointer
229** to this database a static variable so that it can be accessed
230** by the SIGINT handler to interrupt database processing.
231*/
danielk197792f9a1b2004-06-19 09:08:16 +0000232static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000233
234/*
drh67505e72002-04-19 12:34:06 +0000235** True if an interrupt (Control-C) has been received.
236*/
drh43617e92006-03-06 20:55:46 +0000237static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000238
239/*
persicom7e2dfdd2002-04-18 02:46:52 +0000240** This is the name of our program. It is set in main(), used
241** in a number of other places, mostly for error messages.
242*/
243static char *Argv0;
244
245/*
246** Prompt strings. Initialized in main. Settable with
247** .prompt main continue
248*/
249static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
250static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
251
drhb0603412007-02-28 04:47:26 +0000252/*
253** Write I/O traces to the following stream.
254*/
rsebe0a9092007-07-30 18:24:38 +0000255#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000256static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000257#endif
drhb0603412007-02-28 04:47:26 +0000258
259/*
260** This routine works like printf in that its first argument is a
261** format string and subsequent arguments are values to be substituted
262** in place of % fields. The result of formatting this string
263** is written to iotrace.
264*/
rsebe0a9092007-07-30 18:24:38 +0000265#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000266static void iotracePrintf(const char *zFormat, ...){
267 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000268 char *z;
drhb0603412007-02-28 04:47:26 +0000269 if( iotrace==0 ) return;
270 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000271 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000272 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000273 fprintf(iotrace, "%s", z);
274 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000275}
rsebe0a9092007-07-30 18:24:38 +0000276#endif
drhb0603412007-02-28 04:47:26 +0000277
drh44c2eb12003-04-30 11:38:26 +0000278
persicom7e2dfdd2002-04-18 02:46:52 +0000279/*
drh83965662003-04-17 02:54:13 +0000280** Determines if a string is a number of not.
281*/
danielk19772e588c72005-12-09 14:25:08 +0000282static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000283 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000284 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000285 return 0;
286 }
287 z++;
288 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000289 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000290 if( *z=='.' ){
291 z++;
drhf0693c82011-10-11 20:41:54 +0000292 if( !IsDigit(*z) ) return 0;
293 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000294 if( realnum ) *realnum = 1;
295 }
296 if( *z=='e' || *z=='E' ){
297 z++;
298 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000299 if( !IsDigit(*z) ) return 0;
300 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000301 if( realnum ) *realnum = 1;
302 }
303 return *z==0;
304}
drh83965662003-04-17 02:54:13 +0000305
306/*
danielk1977bc6ada42004-06-30 08:20:16 +0000307** A global char* and an SQL function to access its current value
308** from within an SQL statement. This program used to use the
309** sqlite_exec_printf() API to substitue a string into an SQL statement.
310** The correct way to do this with sqlite3 is to use the bind API, but
311** since the shell is built around the callback paradigm it would be a lot
312** of work. Instead just use this hack, which is quite harmless.
313*/
314static const char *zShellStatic = 0;
315static void shellstaticFunc(
316 sqlite3_context *context,
317 int argc,
318 sqlite3_value **argv
319){
320 assert( 0==argc );
321 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000322 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000323 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000324 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
325}
326
327
328/*
drhfeac5f82004-08-01 00:10:45 +0000329** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000330** the text in memory obtained from malloc() and returns a pointer
331** to the text. NULL is returned at end of file, or if malloc()
332** fails.
333**
334** The interface is like "readline" but no command-line editing
335** is done.
336*/
drh9347b202003-07-18 01:30:59 +0000337static char *local_getline(char *zPrompt, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +0000338 char *zLine;
339 int nLine;
drh8e7e7a22000-05-30 18:45:23 +0000340 int n;
drh8e7e7a22000-05-30 18:45:23 +0000341
342 if( zPrompt && *zPrompt ){
343 printf("%s",zPrompt);
344 fflush(stdout);
345 }
346 nLine = 100;
347 zLine = malloc( nLine );
348 if( zLine==0 ) return 0;
349 n = 0;
drhb07028f2011-10-14 21:49:18 +0000350 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000351 if( n+100>nLine ){
352 nLine = nLine*2 + 100;
353 zLine = realloc(zLine, nLine);
354 if( zLine==0 ) return 0;
355 }
drhdaffd0e2001-04-11 14:28:42 +0000356 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000357 if( n==0 ){
358 free(zLine);
359 return 0;
360 }
361 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000362 break;
363 }
364 while( zLine[n] ){ n++; }
365 if( n>0 && zLine[n-1]=='\n' ){
366 n--;
shaneh13b36022009-12-17 21:07:15 +0000367 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000368 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000369 break;
drh8e7e7a22000-05-30 18:45:23 +0000370 }
371 }
372 zLine = realloc( zLine, n+1 );
373 return zLine;
374}
375
376/*
drhc28490c2006-10-26 14:25:58 +0000377** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000378**
379** zPrior is a string of prior text retrieved. If not the empty
380** string, then issue a continuation prompt.
381*/
drhdaffd0e2001-04-11 14:28:42 +0000382static char *one_input_line(const char *zPrior, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +0000383 char *zPrompt;
384 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000385 if( in!=0 ){
drh9347b202003-07-18 01:30:59 +0000386 return local_getline(0, in);
drh8e7e7a22000-05-30 18:45:23 +0000387 }
388 if( zPrior && zPrior[0] ){
persicom7e2dfdd2002-04-18 02:46:52 +0000389 zPrompt = continuePrompt;
drh8e7e7a22000-05-30 18:45:23 +0000390 }else{
persicom7e2dfdd2002-04-18 02:46:52 +0000391 zPrompt = mainPrompt;
drh8e7e7a22000-05-30 18:45:23 +0000392 }
393 zResult = readline(zPrompt);
danielk19774af00c62005-01-23 23:43:21 +0000394#if defined(HAVE_READLINE) && HAVE_READLINE==1
drheb741d52006-06-03 17:37:25 +0000395 if( zResult && *zResult ) add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000396#endif
drh8e7e7a22000-05-30 18:45:23 +0000397 return zResult;
398}
399
persicom7e2dfdd2002-04-18 02:46:52 +0000400struct previous_mode_data {
401 int valid; /* Is there legit data in here? */
402 int mode;
403 int showHeader;
404 int colWidth[100];
405};
drh45e29d82006-11-20 16:21:10 +0000406
drh8e7e7a22000-05-30 18:45:23 +0000407/*
drh75897232000-05-29 14:26:00 +0000408** An pointer to an instance of this structure is passed from
409** the main program to the callback. This is used to communicate
410** state and mode information.
411*/
412struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000413 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000414 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000415 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000416 int cnt; /* Number of records displayed so far */
417 FILE *out; /* Write results here */
drh2f464a02011-10-13 00:41:49 +0000418 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000419 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000420 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000421 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000422 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000423 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000424 int colWidth[100]; /* Requested width of each column when in column mode*/
425 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000426 char nullvalue[20]; /* The text to print when a NULL comes back from
427 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000428 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000429 /* Holds the mode information just before
430 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000431 char outfile[FILENAME_MAX]; /* Filename for *out */
432 const char *zDbFilename; /* name of the database file */
drha7e61d82011-03-12 17:02:57 +0000433 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000434 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000435 FILE *pLog; /* Write log output here */
drh75897232000-05-29 14:26:00 +0000436};
437
438/*
439** These are the allowed modes.
440*/
drh967e8b72000-06-21 13:59:10 +0000441#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000442#define MODE_Column 1 /* One record per line in neat columns */
443#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000444#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
445#define MODE_Html 4 /* Generate an XHTML table */
446#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000447#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000448#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000449#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000450
drh66ce4d02008-02-15 17:38:06 +0000451static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000452 "line",
453 "column",
454 "list",
455 "semi",
456 "html",
drhfeac5f82004-08-01 00:10:45 +0000457 "insert",
458 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000459 "csv",
drh66ce4d02008-02-15 17:38:06 +0000460 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000461};
drh75897232000-05-29 14:26:00 +0000462
463/*
464** Number of elements in an array
465*/
drh902b9ee2008-12-05 17:17:07 +0000466#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000467
468/*
drhea678832008-12-10 19:26:22 +0000469** Compute a string length that is limited to what can be stored in
470** lower 30 bits of a 32-bit signed integer.
471*/
drh4f21c4a2008-12-10 22:15:00 +0000472static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000473 const char *z2 = z;
474 while( *z2 ){ z2++; }
475 return 0x3fffffff & (int)(z2 - z);
476}
477
478/*
drh127f9d72010-02-23 01:47:00 +0000479** A callback for the sqlite3_log() interface.
480*/
481static void shellLog(void *pArg, int iErrCode, const char *zMsg){
482 struct callback_data *p = (struct callback_data*)pArg;
483 if( p->pLog==0 ) return;
484 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
485 fflush(p->pLog);
486}
487
488/*
shane626a6e42009-10-22 17:30:15 +0000489** Output the given string as a hex-encoded blob (eg. X'1234' )
490*/
491static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
492 int i;
493 char *zBlob = (char *)pBlob;
494 fprintf(out,"X'");
495 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); }
496 fprintf(out,"'");
497}
498
499/*
drh28bd4bc2000-06-15 15:57:22 +0000500** Output the given string as a quoted string using SQL quoting conventions.
501*/
502static void output_quoted_string(FILE *out, const char *z){
503 int i;
504 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000505 for(i=0; z[i]; i++){
506 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000507 }
508 if( nSingle==0 ){
509 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000510 }else{
511 fprintf(out,"'");
512 while( *z ){
513 for(i=0; z[i] && z[i]!='\''; i++){}
514 if( i==0 ){
515 fprintf(out,"''");
516 z++;
517 }else if( z[i]=='\'' ){
518 fprintf(out,"%.*s''",i,z);
519 z += i+1;
520 }else{
drhcd7d2732002-02-26 23:24:26 +0000521 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000522 break;
523 }
524 }
drhcd7d2732002-02-26 23:24:26 +0000525 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000526 }
527}
528
529/*
drhfeac5f82004-08-01 00:10:45 +0000530** Output the given string as a quoted according to C or TCL quoting rules.
531*/
532static void output_c_string(FILE *out, const char *z){
533 unsigned int c;
534 fputc('"', out);
535 while( (c = *(z++))!=0 ){
536 if( c=='\\' ){
537 fputc(c, out);
538 fputc(c, out);
539 }else if( c=='\t' ){
540 fputc('\\', out);
541 fputc('t', out);
542 }else if( c=='\n' ){
543 fputc('\\', out);
544 fputc('n', out);
545 }else if( c=='\r' ){
546 fputc('\\', out);
547 fputc('r', out);
548 }else if( !isprint(c) ){
drh0a8640d2005-08-30 20:12:02 +0000549 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000550 }else{
551 fputc(c, out);
552 }
553 }
554 fputc('"', out);
555}
556
557/*
drhc08a4f12000-06-15 16:49:48 +0000558** Output the given string with characters that are special to
559** HTML escaped.
560*/
561static void output_html_string(FILE *out, const char *z){
562 int i;
563 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000564 for(i=0; z[i]
565 && z[i]!='<'
566 && z[i]!='&'
567 && z[i]!='>'
568 && z[i]!='\"'
569 && z[i]!='\'';
570 i++){}
drhc08a4f12000-06-15 16:49:48 +0000571 if( i>0 ){
572 fprintf(out,"%.*s",i,z);
573 }
574 if( z[i]=='<' ){
575 fprintf(out,"&lt;");
576 }else if( z[i]=='&' ){
577 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000578 }else if( z[i]=='>' ){
579 fprintf(out,"&gt;");
580 }else if( z[i]=='\"' ){
581 fprintf(out,"&quot;");
582 }else if( z[i]=='\'' ){
583 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000584 }else{
585 break;
586 }
587 z += i + 1;
588 }
589}
590
591/*
drhc49f44e2006-10-26 18:15:42 +0000592** If a field contains any character identified by a 1 in the following
593** array, then the string must be quoted for CSV.
594*/
595static const char needCsvQuote[] = {
596 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
597 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
598 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
599 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
600 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
601 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
602 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
603 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
604 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
605 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
606 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
607 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
608 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
609 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
610 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
611 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
612};
613
614/*
drh8e64d1c2004-10-07 00:32:39 +0000615** Output a single term of CSV. Actually, p->separator is used for
616** the separator, which may or may not be a comma. p->nullvalue is
617** the null value. Strings are quoted using ANSI-C rules. Numbers
618** appear outside of quotes.
619*/
620static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000621 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000622 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000623 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000624 }else{
drhc49f44e2006-10-26 18:15:42 +0000625 int i;
drh4f21c4a2008-12-10 22:15:00 +0000626 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000627 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000628 if( needCsvQuote[((unsigned char*)z)[i]]
629 || (z[i]==p->separator[0] &&
630 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000631 i = 0;
632 break;
633 }
634 }
635 if( i==0 ){
636 putc('"', out);
637 for(i=0; z[i]; i++){
638 if( z[i]=='"' ) putc('"', out);
639 putc(z[i], out);
640 }
641 putc('"', out);
642 }else{
643 fprintf(out, "%s", z);
644 }
drh8e64d1c2004-10-07 00:32:39 +0000645 }
646 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000647 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000648 }
649}
650
danielk19774af00c62005-01-23 23:43:21 +0000651#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000652/*
drh4c504392000-10-16 22:06:40 +0000653** This routine runs when the user presses Ctrl-C
654*/
655static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000656 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000657 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000658 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000659}
danielk19774af00c62005-01-23 23:43:21 +0000660#endif
drh4c504392000-10-16 22:06:40 +0000661
662/*
shane626a6e42009-10-22 17:30:15 +0000663** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000664** invokes for each row of a query result.
665*/
shane626a6e42009-10-22 17:30:15 +0000666static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000667 int i;
668 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000669
drh75897232000-05-29 14:26:00 +0000670 switch( p->mode ){
671 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000672 int w = 5;
drh6a535342001-10-19 16:44:56 +0000673 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000674 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000675 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000676 if( len>w ) w = len;
677 }
drh75897232000-05-29 14:26:00 +0000678 if( p->cnt++>0 ) fprintf(p->out,"\n");
679 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000680 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000681 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000682 }
683 break;
684 }
danielk19770d78bae2008-01-03 07:09:48 +0000685 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000686 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000687 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000688 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000689 int w, n;
690 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000691 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000692 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000693 w = 0;
drh75897232000-05-29 14:26:00 +0000694 }
drha0c66f52000-07-29 13:20:21 +0000695 if( w<=0 ){
drh4f21c4a2008-12-10 22:15:00 +0000696 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000697 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000698 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000699 if( w<n ) w = n;
700 }
701 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000702 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000703 }
704 if( p->showHeader ){
705 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
706 }
707 }
708 if( p->showHeader ){
709 for(i=0; i<nArg; i++){
710 int w;
711 if( i<ArraySize(p->actualWidth) ){
712 w = p->actualWidth[i];
713 }else{
714 w = 10;
715 }
716 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
717 "----------------------------------------------------------",
718 i==nArg-1 ? "\n": " ");
719 }
drh75897232000-05-29 14:26:00 +0000720 }
721 }
drh6a535342001-10-19 16:44:56 +0000722 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000723 for(i=0; i<nArg; i++){
724 int w;
drha0c66f52000-07-29 13:20:21 +0000725 if( i<ArraySize(p->actualWidth) ){
726 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000727 }else{
728 w = 10;
729 }
drhea678832008-12-10 19:26:22 +0000730 if( p->mode==MODE_Explain && azArg[i] &&
drh4f21c4a2008-12-10 22:15:00 +0000731 strlen30(azArg[i])>w ){
732 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000733 }
drhc61053b2000-06-04 12:58:36 +0000734 fprintf(p->out,"%-*.*s%s",w,w,
persicom7e2dfdd2002-04-18 02:46:52 +0000735 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
drh75897232000-05-29 14:26:00 +0000736 }
737 break;
738 }
drhe3710332000-09-29 13:30:53 +0000739 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000740 case MODE_List: {
741 if( p->cnt++==0 && p->showHeader ){
742 for(i=0; i<nArg; i++){
743 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
744 }
745 }
drh6a535342001-10-19 16:44:56 +0000746 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000747 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000748 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000749 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000750 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000751 if( i<nArg-1 ){
752 fprintf(p->out, "%s", p->separator);
753 }else if( p->mode==MODE_Semi ){
754 fprintf(p->out, ";\n");
755 }else{
756 fprintf(p->out, "\n");
757 }
drh75897232000-05-29 14:26:00 +0000758 }
759 break;
760 }
drh1e5d0e92000-05-31 23:33:17 +0000761 case MODE_Html: {
762 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000763 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000764 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000765 fprintf(p->out,"<TH>");
766 output_html_string(p->out, azCol[i]);
767 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000768 }
mihailim57c591a2008-06-23 21:26:05 +0000769 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000770 }
drh6a535342001-10-19 16:44:56 +0000771 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000772 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000773 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000774 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000775 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000776 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000777 }
mihailim57c591a2008-06-23 21:26:05 +0000778 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000779 break;
780 }
drhfeac5f82004-08-01 00:10:45 +0000781 case MODE_Tcl: {
782 if( p->cnt++==0 && p->showHeader ){
783 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000784 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhfeac5f82004-08-01 00:10:45 +0000785 fprintf(p->out, "%s", p->separator);
786 }
787 fprintf(p->out,"\n");
788 }
789 if( azArg==0 ) break;
790 for(i=0; i<nArg; i++){
791 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
792 fprintf(p->out, "%s", p->separator);
793 }
794 fprintf(p->out,"\n");
795 break;
796 }
drh8e64d1c2004-10-07 00:32:39 +0000797 case MODE_Csv: {
798 if( p->cnt++==0 && p->showHeader ){
799 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000800 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000801 }
802 fprintf(p->out,"\n");
803 }
804 if( azArg==0 ) break;
805 for(i=0; i<nArg; i++){
806 output_csv(p, azArg[i], i<nArg-1);
807 }
808 fprintf(p->out,"\n");
809 break;
810 }
drh28bd4bc2000-06-15 15:57:22 +0000811 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000812 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000813 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000814 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000815 for(i=0; i<nArg; i++){
816 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000817 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000818 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000819 }else if( aiType && aiType[i]==SQLITE_TEXT ){
820 if( zSep[0] ) fprintf(p->out,"%s",zSep);
821 output_quoted_string(p->out, azArg[i]);
822 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
823 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000824 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
825 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
826 int nBlob = sqlite3_column_bytes(p->pStmt, i);
827 if( zSep[0] ) fprintf(p->out,"%s",zSep);
828 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000829 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000830 fprintf(p->out,"%s%s",zSep, azArg[i]);
831 }else{
832 if( zSep[0] ) fprintf(p->out,"%s",zSep);
833 output_quoted_string(p->out, azArg[i]);
834 }
835 }
836 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000837 break;
drh28bd4bc2000-06-15 15:57:22 +0000838 }
persicom1d0b8722002-04-18 02:53:04 +0000839 }
drh75897232000-05-29 14:26:00 +0000840 return 0;
841}
842
843/*
shane626a6e42009-10-22 17:30:15 +0000844** This is the callback routine that the SQLite library
845** invokes for each row of a query result.
846*/
847static int callback(void *pArg, int nArg, char **azArg, char **azCol){
848 /* since we don't have type info, call the shell_callback with a NULL value */
849 return shell_callback(pArg, nArg, azArg, azCol, NULL);
850}
851
852/*
drh33048c02001-10-01 14:29:22 +0000853** Set the destination table field of the callback_data structure to
854** the name of the table given. Escape any quote characters in the
855** table name.
856*/
857static void set_table_name(struct callback_data *p, const char *zName){
858 int i, n;
859 int needQuote;
860 char *z;
861
862 if( p->zDestTable ){
863 free(p->zDestTable);
864 p->zDestTable = 0;
865 }
866 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000867 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000868 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000869 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000870 needQuote = 1;
871 if( zName[i]=='\'' ) n++;
872 }
873 }
874 if( needQuote ) n += 2;
875 z = p->zDestTable = malloc( n+1 );
876 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000877 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000878 exit(1);
879 }
880 n = 0;
881 if( needQuote ) z[n++] = '\'';
882 for(i=0; zName[i]; i++){
883 z[n++] = zName[i];
884 if( zName[i]=='\'' ) z[n++] = '\'';
885 }
886 if( needQuote ) z[n++] = '\'';
887 z[n] = 0;
888}
889
danielk19772a02e332004-06-05 08:04:36 +0000890/* zIn is either a pointer to a NULL-terminated string in memory obtained
891** from malloc(), or a NULL pointer. The string pointed to by zAppend is
892** added to zIn, and the result returned in memory obtained from malloc().
893** zIn, if it was not NULL, is freed.
894**
895** If the third argument, quote, is not '\0', then it is used as a
896** quote character for zAppend.
897*/
drhc28490c2006-10-26 14:25:58 +0000898static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000899 int len;
900 int i;
drh4f21c4a2008-12-10 22:15:00 +0000901 int nAppend = strlen30(zAppend);
902 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000903
904 len = nAppend+nIn+1;
905 if( quote ){
906 len += 2;
907 for(i=0; i<nAppend; i++){
908 if( zAppend[i]==quote ) len++;
909 }
910 }
911
912 zIn = (char *)realloc(zIn, len);
913 if( !zIn ){
914 return 0;
915 }
916
917 if( quote ){
918 char *zCsr = &zIn[nIn];
919 *zCsr++ = quote;
920 for(i=0; i<nAppend; i++){
921 *zCsr++ = zAppend[i];
922 if( zAppend[i]==quote ) *zCsr++ = quote;
923 }
924 *zCsr++ = quote;
925 *zCsr++ = '\0';
926 assert( (zCsr-zIn)==len );
927 }else{
928 memcpy(&zIn[nIn], zAppend, nAppend);
929 zIn[len-1] = '\0';
930 }
931
932 return zIn;
933}
934
drhdd3d4592004-08-30 01:54:05 +0000935
936/*
937** Execute a query statement that has a single result column. Print
938** that result column on a line by itself with a semicolon terminator.
drh45e29d82006-11-20 16:21:10 +0000939**
940** This is used, for example, to show the schema of the database by
941** querying the SQLITE_MASTER table.
drhdd3d4592004-08-30 01:54:05 +0000942*/
drh157e29a2009-05-21 15:15:00 +0000943static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000944 struct callback_data *p, /* Query context */
945 const char *zSelect, /* SELECT statement to extract content */
946 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +0000947){
drhdd3d4592004-08-30 01:54:05 +0000948 sqlite3_stmt *pSelect;
949 int rc;
drh2f464a02011-10-13 00:41:49 +0000950 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +0000951 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +0000952 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
953 p->nErr++;
drhdd3d4592004-08-30 01:54:05 +0000954 return rc;
955 }
956 rc = sqlite3_step(pSelect);
957 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +0000958 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +0000959 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +0000960 zFirstRow = 0;
961 }
drh2f464a02011-10-13 00:41:49 +0000962 fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0));
drhdd3d4592004-08-30 01:54:05 +0000963 rc = sqlite3_step(pSelect);
964 }
drh2f464a02011-10-13 00:41:49 +0000965 rc = sqlite3_finalize(pSelect);
966 if( rc!=SQLITE_OK ){
967 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
968 p->nErr++;
969 }
970 return rc;
drhdd3d4592004-08-30 01:54:05 +0000971}
972
shane626a6e42009-10-22 17:30:15 +0000973/*
974** Allocate space and save off current error string.
975*/
976static char *save_err_msg(
977 sqlite3 *db /* Database to query */
978){
979 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
980 char *zErrMsg = sqlite3_malloc(nErrMsg);
981 if( zErrMsg ){
982 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
983 }
984 return zErrMsg;
985}
986
987/*
shaneh642d8b82010-07-28 16:05:34 +0000988** Display memory stats.
989*/
990static int display_stats(
991 sqlite3 *db, /* Database to query */
992 struct callback_data *pArg, /* Pointer to struct callback_data */
993 int bReset /* True to reset the stats */
994){
995 int iCur;
996 int iHiwtr;
997
998 if( pArg && pArg->out ){
999
1000 iHiwtr = iCur = -1;
1001 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001002 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001003 iHiwtr = iCur = -1;
1004 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001005 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001006/*
1007** Not currently used by the CLI.
1008** iHiwtr = iCur = -1;
1009** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1010** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1011*/
1012 iHiwtr = iCur = -1;
1013 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1014 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1015/*
1016** Not currently used by the CLI.
1017** iHiwtr = iCur = -1;
1018** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1019** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1020*/
1021 iHiwtr = iCur = -1;
1022 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1023 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1024 iHiwtr = iCur = -1;
1025 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1026 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1027 iHiwtr = iCur = -1;
1028 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1029 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1030 iHiwtr = iCur = -1;
1031 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1032 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1033#ifdef YYTRACKMAXSTACKDEPTH
1034 iHiwtr = iCur = -1;
1035 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1036 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1037#endif
1038 }
1039
1040 if( pArg && pArg->out && db ){
1041 iHiwtr = iCur = -1;
1042 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1043 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001044 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1045 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1046 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1047 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1048 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1049 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001050 iHiwtr = iCur = -1;
1051 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001052 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1053 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1054 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1055 iHiwtr = iCur = -1;
1056 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1057 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001058 iHiwtr = iCur = -1;
1059 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1060 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1061 iHiwtr = iCur = -1;
1062 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1063 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1064 }
1065
1066 if( pArg && pArg->out && db && pArg->pStmt ){
1067 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1068 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1069 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1070 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1071 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1072 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1073 }
1074
1075 return 0;
1076}
1077
1078/*
shane626a6e42009-10-22 17:30:15 +00001079** Execute a statement or set of statements. Print
1080** any result rows/columns depending on the current mode
1081** set via the supplied callback.
1082**
1083** This is very similar to SQLite's built-in sqlite3_exec()
1084** function except it takes a slightly different callback
1085** and callback data argument.
1086*/
1087static int shell_exec(
1088 sqlite3 *db, /* An open database */
1089 const char *zSql, /* SQL to be evaluated */
1090 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1091 /* (not the same as sqlite3_exec) */
1092 struct callback_data *pArg, /* Pointer to struct callback_data */
1093 char **pzErrMsg /* Error msg written here */
1094){
dan4564ced2010-01-05 04:59:56 +00001095 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1096 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001097 int rc2;
dan4564ced2010-01-05 04:59:56 +00001098 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001099
1100 if( pzErrMsg ){
1101 *pzErrMsg = NULL;
1102 }
1103
shaneb9fc17d2009-10-22 21:23:35 +00001104 while( zSql[0] && (SQLITE_OK == rc) ){
1105 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1106 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001107 if( pzErrMsg ){
1108 *pzErrMsg = save_err_msg(db);
1109 }
1110 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001111 if( !pStmt ){
1112 /* this happens for a comment or white-space */
1113 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001114 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001115 continue;
1116 }
shane626a6e42009-10-22 17:30:15 +00001117
shaneh642d8b82010-07-28 16:05:34 +00001118 /* save off the prepared statment handle and reset row count */
1119 if( pArg ){
1120 pArg->pStmt = pStmt;
1121 pArg->cnt = 0;
1122 }
1123
shanehb7977c52010-01-18 18:17:10 +00001124 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001125 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001126 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001127 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001128 }
shanehb7977c52010-01-18 18:17:10 +00001129
shaneb9fc17d2009-10-22 21:23:35 +00001130 /* perform the first step. this will tell us if we
1131 ** have a result set or not and how wide it is.
1132 */
1133 rc = sqlite3_step(pStmt);
1134 /* if we have a result set... */
1135 if( SQLITE_ROW == rc ){
1136 /* if we have a callback... */
1137 if( xCallback ){
1138 /* allocate space for col name ptr, value ptr, and type */
1139 int nCol = sqlite3_column_count(pStmt);
1140 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1141 if( !pData ){
1142 rc = SQLITE_NOMEM;
1143 }else{
1144 char **azCols = (char **)pData; /* Names of result columns */
1145 char **azVals = &azCols[nCol]; /* Results */
1146 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1147 int i;
1148 assert(sizeof(int) <= sizeof(char *));
1149 /* save off ptrs to column names */
1150 for(i=0; i<nCol; i++){
1151 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1152 }
shaneb9fc17d2009-10-22 21:23:35 +00001153 do{
1154 /* extract the data and data types */
1155 for(i=0; i<nCol; i++){
1156 azVals[i] = (char *)sqlite3_column_text(pStmt, i);
1157 aiTypes[i] = sqlite3_column_type(pStmt, i);
1158 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1159 rc = SQLITE_NOMEM;
1160 break; /* from for */
1161 }
1162 } /* end for */
1163
1164 /* if data and types extracted successfully... */
1165 if( SQLITE_ROW == rc ){
1166 /* call the supplied callback with the result row data */
1167 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1168 rc = SQLITE_ABORT;
1169 }else{
1170 rc = sqlite3_step(pStmt);
1171 }
1172 }
1173 } while( SQLITE_ROW == rc );
1174 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001175 }
1176 }else{
1177 do{
1178 rc = sqlite3_step(pStmt);
1179 } while( rc == SQLITE_ROW );
1180 }
1181 }
1182
shaneh642d8b82010-07-28 16:05:34 +00001183 /* print usage stats if stats on */
1184 if( pArg && pArg->statsOn ){
1185 display_stats(db, pArg, 0);
1186 }
1187
dan4564ced2010-01-05 04:59:56 +00001188 /* Finalize the statement just executed. If this fails, save a
1189 ** copy of the error message. Otherwise, set zSql to point to the
1190 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001191 rc2 = sqlite3_finalize(pStmt);
1192 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001193 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001194 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001195 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001196 }else if( pzErrMsg ){
1197 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001198 }
shaneh642d8b82010-07-28 16:05:34 +00001199
1200 /* clear saved stmt handle */
1201 if( pArg ){
1202 pArg->pStmt = NULL;
1203 }
shane626a6e42009-10-22 17:30:15 +00001204 }
shaneb9fc17d2009-10-22 21:23:35 +00001205 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001206
1207 return rc;
1208}
1209
drhdd3d4592004-08-30 01:54:05 +00001210
drh33048c02001-10-01 14:29:22 +00001211/*
drh4c653a02000-06-07 01:27:47 +00001212** This is a different callback routine used for dumping the database.
1213** Each row received by this callback consists of a table name,
1214** the table type ("index" or "table") and SQL to create the table.
1215** This routine should print text sufficient to recreate the table.
1216*/
1217static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001218 int rc;
1219 const char *zTable;
1220 const char *zType;
1221 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001222 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001223 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001224
drh902b9ee2008-12-05 17:17:07 +00001225 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001226 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001227 zTable = azArg[0];
1228 zType = azArg[1];
1229 zSql = azArg[2];
1230
drh00b950d2005-09-11 02:03:03 +00001231 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001232 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh00b950d2005-09-11 02:03:03 +00001233 }else if( strcmp(zTable, "sqlite_stat1")==0 ){
1234 fprintf(p->out, "ANALYZE sqlite_master;\n");
1235 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1236 return 0;
drh45e29d82006-11-20 16:21:10 +00001237 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1238 char *zIns;
1239 if( !p->writableSchema ){
1240 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1241 p->writableSchema = 1;
1242 }
1243 zIns = sqlite3_mprintf(
1244 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1245 "VALUES('table','%q','%q',0,'%q');",
1246 zTable, zTable, zSql);
1247 fprintf(p->out, "%s\n", zIns);
1248 sqlite3_free(zIns);
1249 return 0;
drh00b950d2005-09-11 02:03:03 +00001250 }else{
1251 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001252 }
danielk19772a02e332004-06-05 08:04:36 +00001253
1254 if( strcmp(zType, "table")==0 ){
1255 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001256 char *zSelect = 0;
1257 char *zTableInfo = 0;
1258 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001259 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001260
1261 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1262 zTableInfo = appendText(zTableInfo, zTable, '"');
1263 zTableInfo = appendText(zTableInfo, ");", 0);
1264
1265 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001266 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001267 if( rc!=SQLITE_OK || !pTableInfo ){
1268 return 1;
1269 }
1270
1271 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1272 zTmp = appendText(zTmp, zTable, '"');
1273 if( zTmp ){
1274 zSelect = appendText(zSelect, zTmp, '\'');
1275 }
1276 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1277 rc = sqlite3_step(pTableInfo);
1278 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001279 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001280 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001281 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001282 rc = sqlite3_step(pTableInfo);
1283 if( rc==SQLITE_ROW ){
drh45e29d82006-11-20 16:21:10 +00001284 zSelect = appendText(zSelect, ") || ',' || ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001285 }else{
1286 zSelect = appendText(zSelect, ") ", 0);
1287 }
drh157e29a2009-05-21 15:15:00 +00001288 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001289 }
1290 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001291 if( rc!=SQLITE_OK || nRow==0 ){
1292 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001293 return 1;
1294 }
1295 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1296 zSelect = appendText(zSelect, zTable, '"');
1297
drh2f464a02011-10-13 00:41:49 +00001298 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001299 if( rc==SQLITE_CORRUPT ){
1300 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001301 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001302 }
danielk19772a02e332004-06-05 08:04:36 +00001303 if( zSelect ) free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001304 }
drh4c653a02000-06-07 01:27:47 +00001305 return 0;
1306}
1307
1308/*
drh45e29d82006-11-20 16:21:10 +00001309** Run zQuery. Use dump_callback() as the callback routine so that
1310** the contents of the query are output as SQL statements.
1311**
drhdd3d4592004-08-30 01:54:05 +00001312** If we get a SQLITE_CORRUPT error, rerun the query after appending
1313** "ORDER BY rowid DESC" to the end.
1314*/
1315static int run_schema_dump_query(
1316 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001317 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001318){
1319 int rc;
drh2f464a02011-10-13 00:41:49 +00001320 char *zErr = 0;
1321 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001322 if( rc==SQLITE_CORRUPT ){
1323 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001324 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001325 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1326 if( zErr ){
1327 fprintf(p->out, "/****** %s ******/\n", zErr);
1328 sqlite3_free(zErr);
1329 zErr = 0;
1330 }
drhdd3d4592004-08-30 01:54:05 +00001331 zQ2 = malloc( len+100 );
1332 if( zQ2==0 ) return rc;
drh5bb3eb92007-05-04 13:15:55 +00001333 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001334 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1335 if( rc ){
1336 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1337 }else{
1338 rc = SQLITE_CORRUPT;
1339 }
1340 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001341 free(zQ2);
1342 }
1343 return rc;
1344}
1345
1346/*
drh75897232000-05-29 14:26:00 +00001347** Text of a help message
1348*/
persicom1d0b8722002-04-18 02:53:04 +00001349static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001350 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001351 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001352 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001353 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001354 " If TABLE specified, only dump tables matching\n"
1355 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001356 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001357 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001358 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1359 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001360 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001361 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001362 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001363 ".indices ?TABLE? Show names of all indices\n"
1364 " If TABLE specified, only show indices for tables\n"
1365 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001366#ifdef SQLITE_ENABLE_IOTRACE
1367 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1368#endif
drh70df4fe2006-06-13 15:12:21 +00001369#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001370 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001371#endif
drh127f9d72010-02-23 01:47:00 +00001372 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001373 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001374 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001375 " column Left-aligned columns. (See .width)\n"
1376 " html HTML <table> code\n"
1377 " insert SQL insert statements for TABLE\n"
1378 " line One value per line\n"
1379 " list Values delimited by .separator string\n"
1380 " tabs Tab-separated values\n"
1381 " tcl TCL list elements\n"
1382 ".nullvalue STRING Print STRING in place of NULL values\n"
drh75897232000-05-29 14:26:00 +00001383 ".output FILENAME Send output to FILENAME\n"
1384 ".output stdout Send output to the screen\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001385 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001386 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001387 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001388 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001389 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001390 " If TABLE specified, only show tables matching\n"
1391 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001392 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001393 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001394 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001395 ".tables ?TABLE? List names of tables\n"
1396 " If TABLE specified, only list tables matching\n"
1397 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001398 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhde60fc22011-12-14 17:53:36 +00001399 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001400 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh75897232000-05-29 14:26:00 +00001401;
1402
shaneb320ccd2009-10-21 03:42:58 +00001403static char zTimerHelp[] =
1404 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1405;
1406
drhdaffd0e2001-04-11 14:28:42 +00001407/* Forward reference */
drhc28490c2006-10-26 14:25:58 +00001408static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +00001409
drh75897232000-05-29 14:26:00 +00001410/*
drh44c2eb12003-04-30 11:38:26 +00001411** Make sure the database is open. If it is not, then open it. If
1412** the database fails to open, print an error message and exit.
1413*/
1414static void open_db(struct callback_data *p){
1415 if( p->db==0 ){
danielk19774f057f92004-06-08 00:02:33 +00001416 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +00001417 db = p->db;
drh4cea5ba2008-05-05 16:27:24 +00001418 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1419 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1420 shellstaticFunc, 0, 0);
1421 }
1422 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
shane86f5bdb2009-10-24 02:00:07 +00001423 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
danielk197780290862004-05-22 09:21:21 +00001424 p->zDbFilename, sqlite3_errmsg(db));
drh22fbcb82004-02-01 01:22:50 +00001425 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001426 }
drhc2e87a32006-06-27 15:16:14 +00001427#ifndef SQLITE_OMIT_LOAD_EXTENSION
1428 sqlite3_enable_load_extension(p->db, 1);
1429#endif
drh44c2eb12003-04-30 11:38:26 +00001430 }
1431}
1432
1433/*
drhfeac5f82004-08-01 00:10:45 +00001434** Do C-language style dequoting.
1435**
1436** \t -> tab
1437** \n -> newline
1438** \r -> carriage return
1439** \NNN -> ascii character NNN in octal
1440** \\ -> backslash
1441*/
1442static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001443 int i, j;
1444 char c;
drhfeac5f82004-08-01 00:10:45 +00001445 for(i=j=0; (c = z[i])!=0; i++, j++){
1446 if( c=='\\' ){
1447 c = z[++i];
1448 if( c=='n' ){
1449 c = '\n';
1450 }else if( c=='t' ){
1451 c = '\t';
1452 }else if( c=='r' ){
1453 c = '\r';
1454 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001455 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001456 if( z[i+1]>='0' && z[i+1]<='7' ){
1457 i++;
1458 c = (c<<3) + z[i] - '0';
1459 if( z[i+1]>='0' && z[i+1]<='7' ){
1460 i++;
1461 c = (c<<3) + z[i] - '0';
1462 }
1463 }
1464 }
1465 }
1466 z[j] = c;
1467 }
1468 z[j] = 0;
1469}
1470
1471/*
drhc28490c2006-10-26 14:25:58 +00001472** Interpret zArg as a boolean value. Return either 0 or 1.
1473*/
1474static int booleanValue(char *zArg){
1475 int val = atoi(zArg);
1476 int j;
1477 for(j=0; zArg[j]; j++){
drhf0693c82011-10-11 20:41:54 +00001478 zArg[j] = ToLower(zArg[j]);
drhc28490c2006-10-26 14:25:58 +00001479 }
1480 if( strcmp(zArg,"on")==0 ){
1481 val = 1;
1482 }else if( strcmp(zArg,"yes")==0 ){
1483 val = 1;
1484 }
1485 return val;
1486}
1487
1488/*
drh75897232000-05-29 14:26:00 +00001489** If an input line begins with "." then invoke this routine to
1490** process that line.
drh67505e72002-04-19 12:34:06 +00001491**
drh47ad6842006-11-08 12:25:42 +00001492** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00001493*/
drh44c2eb12003-04-30 11:38:26 +00001494static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00001495 int i = 1;
1496 int nArg = 0;
1497 int n, c;
drh67505e72002-04-19 12:34:06 +00001498 int rc = 0;
drh75897232000-05-29 14:26:00 +00001499 char *azArg[50];
1500
1501 /* Parse the input line into tokens.
1502 */
1503 while( zLine[i] && nArg<ArraySize(azArg) ){
drhf0693c82011-10-11 20:41:54 +00001504 while( IsSpace(zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00001505 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00001506 if( zLine[i]=='\'' || zLine[i]=='"' ){
1507 int delim = zLine[i++];
1508 azArg[nArg++] = &zLine[i];
1509 while( zLine[i] && zLine[i]!=delim ){ i++; }
1510 if( zLine[i]==delim ){
1511 zLine[i++] = 0;
1512 }
drhfeac5f82004-08-01 00:10:45 +00001513 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001514 }else{
1515 azArg[nArg++] = &zLine[i];
drhf0693c82011-10-11 20:41:54 +00001516 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00001517 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00001518 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001519 }
1520 }
1521
1522 /* Process the input line.
1523 */
shane9bd1b442009-10-23 01:27:39 +00001524 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00001525 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00001526 c = azArg[0][0];
shanehe2aa9d72009-11-06 17:20:17 +00001527 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00001528 const char *zDestFile;
1529 const char *zDb;
1530 sqlite3 *pDest;
1531 sqlite3_backup *pBackup;
drh9ff849f2009-02-04 20:55:57 +00001532 if( nArg==2 ){
1533 zDestFile = azArg[1];
1534 zDb = "main";
1535 }else{
1536 zDestFile = azArg[2];
1537 zDb = azArg[1];
1538 }
1539 rc = sqlite3_open(zDestFile, &pDest);
1540 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001541 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00001542 sqlite3_close(pDest);
1543 return 1;
1544 }
drhdc2c4912009-02-04 22:46:47 +00001545 open_db(p);
drh9ff849f2009-02-04 20:55:57 +00001546 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
1547 if( pBackup==0 ){
1548 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1549 sqlite3_close(pDest);
1550 return 1;
1551 }
1552 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
1553 sqlite3_backup_finish(pBackup);
1554 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00001555 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00001556 }else{
1557 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00001558 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00001559 }
1560 sqlite3_close(pDest);
1561 }else
1562
shanehe2aa9d72009-11-06 17:20:17 +00001563 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){
drhc49f44e2006-10-26 18:15:42 +00001564 bail_on_error = booleanValue(azArg[1]);
1565 }else
1566
shanehe2aa9d72009-11-06 17:20:17 +00001567 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
jplyon672a1ed2003-05-11 20:07:05 +00001568 struct callback_data data;
1569 char *zErrMsg = 0;
jplyon6a65bb32003-05-04 07:25:57 +00001570 open_db(p);
jplyon672a1ed2003-05-11 20:07:05 +00001571 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00001572 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00001573 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00001574 data.colWidth[0] = 3;
1575 data.colWidth[1] = 15;
1576 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00001577 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00001578 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00001579 if( zErrMsg ){
1580 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001581 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00001582 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00001583 }
1584 }else
1585
shanehe2aa9d72009-11-06 17:20:17 +00001586 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
drh44c2eb12003-04-30 11:38:26 +00001587 open_db(p);
drhf1dfc4f2009-09-23 15:51:35 +00001588 /* When playing back a "dump", the content might appear in an order
1589 ** which causes immediate foreign key constraints to be violated.
1590 ** So disable foreign-key constraint enforcement to prevent problems. */
1591 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00001592 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00001593 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00001594 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00001595 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00001596 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00001597 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00001598 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00001599 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00001600 );
1601 run_schema_dump_query(p,
1602 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00001603 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00001604 );
drh2f464a02011-10-13 00:41:49 +00001605 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00001606 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00001607 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00001608 );
drh4c653a02000-06-07 01:27:47 +00001609 }else{
1610 int i;
drhdd3d4592004-08-30 01:54:05 +00001611 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00001612 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00001613 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00001614 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00001615 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00001616 " AND sql NOT NULL");
1617 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00001618 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00001619 "WHERE sql NOT NULL"
1620 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00001621 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00001622 );
danielk1977bc6ada42004-06-30 08:20:16 +00001623 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00001624 }
1625 }
drh45e29d82006-11-20 16:21:10 +00001626 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00001627 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00001628 p->writableSchema = 0;
1629 }
drh56197952011-10-13 16:30:13 +00001630 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
1631 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00001632 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00001633 }else
drh75897232000-05-29 14:26:00 +00001634
shanehe2aa9d72009-11-06 17:20:17 +00001635 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00001636 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00001637 }else
1638
shanehe2aa9d72009-11-06 17:20:17 +00001639 if( c=='e' && strncmp(azArg[0], "exit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00001640 rc = 2;
drh75897232000-05-29 14:26:00 +00001641 }else
1642
shanehe2aa9d72009-11-06 17:20:17 +00001643 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00001644 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00001645 if(val == 1) {
1646 if(!p->explainPrev.valid) {
1647 p->explainPrev.valid = 1;
1648 p->explainPrev.mode = p->mode;
1649 p->explainPrev.showHeader = p->showHeader;
1650 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
1651 }
1652 /* We could put this code under the !p->explainValid
1653 ** condition so that it does not execute if we are already in
1654 ** explain mode. However, always executing it allows us an easy
1655 ** was to reset to explain mode in case the user previously
1656 ** did an .explain followed by a .width, .mode or .header
1657 ** command.
1658 */
danielk19770d78bae2008-01-03 07:09:48 +00001659 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00001660 p->showHeader = 1;
1661 memset(p->colWidth,0,ArraySize(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00001662 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00001663 p->colWidth[1] = 13; /* opcode */
1664 p->colWidth[2] = 4; /* P1 */
1665 p->colWidth[3] = 4; /* P2 */
1666 p->colWidth[4] = 4; /* P3 */
1667 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00001668 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00001669 p->colWidth[7] = 13; /* Comment */
persicom7e2dfdd2002-04-18 02:46:52 +00001670 }else if (p->explainPrev.valid) {
1671 p->explainPrev.valid = 0;
1672 p->mode = p->explainPrev.mode;
1673 p->showHeader = p->explainPrev.showHeader;
1674 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
1675 }
drh75897232000-05-29 14:26:00 +00001676 }else
1677
drhc28490c2006-10-26 14:25:58 +00001678 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
shanehe2aa9d72009-11-06 17:20:17 +00001679 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){
drhc28490c2006-10-26 14:25:58 +00001680 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00001681 }else
1682
1683 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
drha81c64a2009-01-14 23:38:02 +00001684 fprintf(stderr,"%s",zHelp);
shaneb320ccd2009-10-21 03:42:58 +00001685 if( HAS_TIMER ){
1686 fprintf(stderr,"%s",zTimerHelp);
1687 }
drh75897232000-05-29 14:26:00 +00001688 }else
1689
shanehe2aa9d72009-11-06 17:20:17 +00001690 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){
drhfeac5f82004-08-01 00:10:45 +00001691 char *zTable = azArg[2]; /* Insert data into this table */
1692 char *zFile = azArg[1]; /* The file from which to extract data */
shane916f9612009-10-23 00:37:15 +00001693 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00001694 int nCol; /* Number of columns in the table */
1695 int nByte; /* Number of bytes in an SQL string */
1696 int i, j; /* Loop counters */
1697 int nSep; /* Number of bytes in p->separator[] */
1698 char *zSql; /* An SQL statement */
1699 char *zLine; /* A single line of input from the file */
1700 char **azCol; /* zLine[] broken up into columns */
1701 char *zCommit; /* How to commit changes */
drhb860bc92004-08-04 15:16:55 +00001702 FILE *in; /* The input file */
1703 int lineno = 0; /* Line number of input file */
drhfeac5f82004-08-01 00:10:45 +00001704
drha543c822006-06-08 16:10:14 +00001705 open_db(p);
drh4f21c4a2008-12-10 22:15:00 +00001706 nSep = strlen30(p->separator);
drhfeac5f82004-08-01 00:10:45 +00001707 if( nSep==0 ){
shane916f9612009-10-23 00:37:15 +00001708 fprintf(stderr, "Error: non-null separator required for import\n");
1709 return 1;
drhfeac5f82004-08-01 00:10:45 +00001710 }
drh7b075e32011-09-28 01:10:00 +00001711 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00001712 if( zSql==0 ){
1713 fprintf(stderr, "Error: out of memory\n");
1714 return 1;
1715 }
drh4f21c4a2008-12-10 22:15:00 +00001716 nByte = strlen30(zSql);
drh5e6078b2006-01-31 19:07:22 +00001717 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00001718 sqlite3_free(zSql);
1719 if( rc ){
shane916f9612009-10-23 00:37:15 +00001720 if (pStmt) sqlite3_finalize(pStmt);
drhfeac5f82004-08-01 00:10:45 +00001721 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00001722 return 1;
drhfeac5f82004-08-01 00:10:45 +00001723 }
shane916f9612009-10-23 00:37:15 +00001724 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00001725 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00001726 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00001727 if( nCol==0 ) return 0; /* no columns, no error */
drhfeac5f82004-08-01 00:10:45 +00001728 zSql = malloc( nByte + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00001729 if( zSql==0 ){
1730 fprintf(stderr, "Error: out of memory\n");
1731 return 1;
1732 }
drh7b075e32011-09-28 01:10:00 +00001733 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00001734 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00001735 for(i=1; i<nCol; i++){
1736 zSql[j++] = ',';
1737 zSql[j++] = '?';
1738 }
1739 zSql[j++] = ')';
1740 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00001741 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00001742 free(zSql);
1743 if( rc ){
1744 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
shane916f9612009-10-23 00:37:15 +00001745 if (pStmt) sqlite3_finalize(pStmt);
drh47ad6842006-11-08 12:25:42 +00001746 return 1;
drhfeac5f82004-08-01 00:10:45 +00001747 }
1748 in = fopen(zFile, "rb");
1749 if( in==0 ){
shane9bd1b442009-10-23 01:27:39 +00001750 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhfeac5f82004-08-01 00:10:45 +00001751 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00001752 return 1;
drhfeac5f82004-08-01 00:10:45 +00001753 }
1754 azCol = malloc( sizeof(azCol[0])*(nCol+1) );
drh43617e92006-03-06 20:55:46 +00001755 if( azCol==0 ){
shane916f9612009-10-23 00:37:15 +00001756 fprintf(stderr, "Error: out of memory\n");
drh43617e92006-03-06 20:55:46 +00001757 fclose(in);
shane916f9612009-10-23 00:37:15 +00001758 sqlite3_finalize(pStmt);
1759 return 1;
drh43617e92006-03-06 20:55:46 +00001760 }
drhfeac5f82004-08-01 00:10:45 +00001761 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1762 zCommit = "COMMIT";
1763 while( (zLine = local_getline(0, in))!=0 ){
1764 char *z;
drhb860bc92004-08-04 15:16:55 +00001765 lineno++;
drhfeac5f82004-08-01 00:10:45 +00001766 azCol[0] = zLine;
drh36d4e972004-10-06 14:39:06 +00001767 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
drhfeac5f82004-08-01 00:10:45 +00001768 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1769 *z = 0;
1770 i++;
drhb860bc92004-08-04 15:16:55 +00001771 if( i<nCol ){
1772 azCol[i] = &z[nSep];
1773 z += nSep-1;
1774 }
drhfeac5f82004-08-01 00:10:45 +00001775 }
shane916f9612009-10-23 00:37:15 +00001776 } /* end for */
drh1cd7f832005-08-05 18:50:51 +00001777 *z = 0;
drhb860bc92004-08-04 15:16:55 +00001778 if( i+1!=nCol ){
shane916f9612009-10-23 00:37:15 +00001779 fprintf(stderr,
1780 "Error: %s line %d: expected %d columns of data but found %d\n",
1781 zFile, lineno, nCol, i+1);
drhb860bc92004-08-04 15:16:55 +00001782 zCommit = "ROLLBACK";
drh1822eee2008-12-04 12:26:00 +00001783 free(zLine);
shane916f9612009-10-23 00:37:15 +00001784 rc = 1;
1785 break; /* from while */
drhb860bc92004-08-04 15:16:55 +00001786 }
drhfeac5f82004-08-01 00:10:45 +00001787 for(i=0; i<nCol; i++){
1788 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
1789 }
1790 sqlite3_step(pStmt);
1791 rc = sqlite3_reset(pStmt);
1792 free(zLine);
1793 if( rc!=SQLITE_OK ){
1794 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1795 zCommit = "ROLLBACK";
drh47ad6842006-11-08 12:25:42 +00001796 rc = 1;
shane916f9612009-10-23 00:37:15 +00001797 break; /* from while */
drhfeac5f82004-08-01 00:10:45 +00001798 }
shane916f9612009-10-23 00:37:15 +00001799 } /* end while */
drhfeac5f82004-08-01 00:10:45 +00001800 free(azCol);
1801 fclose(in);
1802 sqlite3_finalize(pStmt);
drhb860bc92004-08-04 15:16:55 +00001803 sqlite3_exec(p->db, zCommit, 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00001804 }else
1805
shanehe2aa9d72009-11-06 17:20:17 +00001806 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00001807 struct callback_data data;
1808 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00001809 open_db(p);
drh75897232000-05-29 14:26:00 +00001810 memcpy(&data, p, sizeof(data));
1811 data.showHeader = 0;
1812 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00001813 if( nArg==1 ){
1814 rc = sqlite3_exec(p->db,
1815 "SELECT name FROM sqlite_master "
1816 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
1817 "UNION ALL "
1818 "SELECT name FROM sqlite_temp_master "
1819 "WHERE type='index' "
1820 "ORDER BY 1",
1821 callback, &data, &zErrMsg
1822 );
1823 }else{
1824 zShellStatic = azArg[1];
1825 rc = sqlite3_exec(p->db,
1826 "SELECT name FROM sqlite_master "
1827 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1828 "UNION ALL "
1829 "SELECT name FROM sqlite_temp_master "
1830 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1831 "ORDER BY 1",
1832 callback, &data, &zErrMsg
1833 );
1834 zShellStatic = 0;
1835 }
drh75897232000-05-29 14:26:00 +00001836 if( zErrMsg ){
1837 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001838 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00001839 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00001840 }else if( rc != SQLITE_OK ){
1841 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
1842 rc = 1;
drh75897232000-05-29 14:26:00 +00001843 }
1844 }else
1845
drhae5e4452007-05-03 17:18:36 +00001846#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00001847 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00001848 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00001849 if( iotrace && iotrace!=stdout ) fclose(iotrace);
1850 iotrace = 0;
1851 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00001852 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00001853 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00001854 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00001855 iotrace = stdout;
1856 }else{
1857 iotrace = fopen(azArg[1], "w");
1858 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00001859 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00001860 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00001861 rc = 1;
drhb0603412007-02-28 04:47:26 +00001862 }else{
mlcreech3a00f902008-03-04 17:45:01 +00001863 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00001864 }
1865 }
1866 }else
drhae5e4452007-05-03 17:18:36 +00001867#endif
drhb0603412007-02-28 04:47:26 +00001868
drh70df4fe2006-06-13 15:12:21 +00001869#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001870 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
1871 const char *zFile, *zProc;
1872 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00001873 zFile = azArg[1];
1874 zProc = nArg>=3 ? azArg[2] : 0;
1875 open_db(p);
1876 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
1877 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001878 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00001879 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00001880 rc = 1;
drh1e397f82006-06-08 15:28:43 +00001881 }
1882 }else
drh70df4fe2006-06-13 15:12:21 +00001883#endif
drh1e397f82006-06-08 15:28:43 +00001884
drhc8ba2122011-03-23 11:16:22 +00001885 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00001886 const char *zFile = azArg[1];
1887 if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){
1888 fclose(p->pLog);
1889 p->pLog = 0;
1890 }
1891 if( strcmp(zFile,"stdout")==0 ){
1892 p->pLog = stdout;
1893 }else if( strcmp(zFile, "stderr")==0 ){
1894 p->pLog = stderr;
1895 }else if( strcmp(zFile, "off")==0 ){
1896 p->pLog = 0;
1897 }else{
1898 p->pLog = fopen(zFile, "w");
1899 if( p->pLog==0 ){
1900 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1901 }
1902 }
1903 }else
1904
shanehe2aa9d72009-11-06 17:20:17 +00001905 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00001906 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00001907 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00001908 ||
shanehe2aa9d72009-11-06 17:20:17 +00001909 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00001910 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00001911 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00001912 ||
shanehe2aa9d72009-11-06 17:20:17 +00001913 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00001914 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00001915 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00001916 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00001917 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00001918 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00001919 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00001920 p->mode = MODE_Tcl;
shanehe2aa9d72009-11-06 17:20:17 +00001921 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00001922 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00001923 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00001924 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00001925 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00001926 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00001927 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00001928 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00001929 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00001930 }else {
shane9bd1b442009-10-23 01:27:39 +00001931 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00001932 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00001933 rc = 1;
drh75897232000-05-29 14:26:00 +00001934 }
1935 }else
1936
shanehe2aa9d72009-11-06 17:20:17 +00001937 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
1938 int n2 = strlen30(azArg[1]);
1939 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
1940 p->mode = MODE_Insert;
1941 set_table_name(p, azArg[2]);
1942 }else {
1943 fprintf(stderr, "Error: invalid arguments: "
1944 " \"%s\". Enter \".help\" for help\n", azArg[2]);
1945 rc = 1;
1946 }
1947 }else
1948
persicom7e2dfdd2002-04-18 02:46:52 +00001949 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00001950 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
1951 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00001952 }else
1953
drh75897232000-05-29 14:26:00 +00001954 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
1955 if( p->out!=stdout ){
1956 fclose(p->out);
1957 }
1958 if( strcmp(azArg[1],"stdout")==0 ){
1959 p->out = stdout;
drh5bb3eb92007-05-04 13:15:55 +00001960 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
drh75897232000-05-29 14:26:00 +00001961 }else{
drha1f9b5e2004-02-14 16:31:02 +00001962 p->out = fopen(azArg[1], "wb");
drh75897232000-05-29 14:26:00 +00001963 if( p->out==0 ){
shane9bd1b442009-10-23 01:27:39 +00001964 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
drh75897232000-05-29 14:26:00 +00001965 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00001966 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00001967 } else {
drh5bb3eb92007-05-04 13:15:55 +00001968 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00001969 }
1970 }
1971 }else
1972
drhdd45df82002-04-18 12:39:03 +00001973 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00001974 if( nArg >= 2) {
1975 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
1976 }
1977 if( nArg >= 3) {
1978 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
1979 }
1980 }else
1981
shanehe2aa9d72009-11-06 17:20:17 +00001982 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00001983 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00001984 }else
1985
drh9ff849f2009-02-04 20:55:57 +00001986 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00001987 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00001988 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00001989 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
1990 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00001991 }else{
shane9bd1b442009-10-23 01:27:39 +00001992 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00001993 fclose(alt);
1994 }
1995 }else
1996
shanehe2aa9d72009-11-06 17:20:17 +00001997 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00001998 const char *zSrcFile;
1999 const char *zDb;
2000 sqlite3 *pSrc;
2001 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002002 int nTimeout = 0;
2003
drh9ff849f2009-02-04 20:55:57 +00002004 if( nArg==2 ){
2005 zSrcFile = azArg[1];
2006 zDb = "main";
2007 }else{
2008 zSrcFile = azArg[2];
2009 zDb = azArg[1];
2010 }
2011 rc = sqlite3_open(zSrcFile, &pSrc);
2012 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002013 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002014 sqlite3_close(pSrc);
2015 return 1;
2016 }
drhdc2c4912009-02-04 22:46:47 +00002017 open_db(p);
drh9ff849f2009-02-04 20:55:57 +00002018 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2019 if( pBackup==0 ){
2020 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2021 sqlite3_close(pSrc);
2022 return 1;
2023 }
drhdc2c4912009-02-04 22:46:47 +00002024 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2025 || rc==SQLITE_BUSY ){
2026 if( rc==SQLITE_BUSY ){
2027 if( nTimeout++ >= 3 ) break;
2028 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002029 }
2030 }
2031 sqlite3_backup_finish(pBackup);
2032 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002033 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002034 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002035 fprintf(stderr, "Error: source database is busy\n");
2036 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002037 }else{
2038 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002039 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002040 }
2041 sqlite3_close(pSrc);
2042 }else
2043
shanehe2aa9d72009-11-06 17:20:17 +00002044 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002045 struct callback_data data;
2046 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00002047 open_db(p);
drh75897232000-05-29 14:26:00 +00002048 memcpy(&data, p, sizeof(data));
2049 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002050 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002051 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002052 int i;
drhf0693c82011-10-11 20:41:54 +00002053 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002054 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002055 char *new_argv[2], *new_colv[2];
2056 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2057 " type text,\n"
2058 " name text,\n"
2059 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002060 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002061 " sql text\n"
2062 ")";
2063 new_argv[1] = 0;
2064 new_colv[0] = "sql";
2065 new_colv[1] = 0;
2066 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002067 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002068 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002069 char *new_argv[2], *new_colv[2];
2070 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2071 " type text,\n"
2072 " name text,\n"
2073 " tbl_name text,\n"
2074 " rootpage integer,\n"
2075 " sql text\n"
2076 ")";
2077 new_argv[1] = 0;
2078 new_colv[0] = "sql";
2079 new_colv[1] = 0;
2080 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002081 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002082 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002083 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002084 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002085 "SELECT sql FROM "
drh8f800a72009-01-14 23:17:55 +00002086 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2087 " FROM sqlite_master UNION ALL"
2088 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00002089 "WHERE lower(tbl_name) LIKE shellstatic()"
2090 " AND type!='meta' AND sql NOTNULL "
drhe0bc4042002-06-25 01:09:11 +00002091 "ORDER BY substr(type,2,1), name",
danielk1977bc6ada42004-06-30 08:20:16 +00002092 callback, &data, &zErrMsg);
2093 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00002094 }
drh75897232000-05-29 14:26:00 +00002095 }else{
shane9bd1b442009-10-23 01:27:39 +00002096 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002097 "SELECT sql FROM "
drh8f800a72009-01-14 23:17:55 +00002098 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2099 " FROM sqlite_master UNION ALL"
2100 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00002101 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drhe0bc4042002-06-25 01:09:11 +00002102 "ORDER BY substr(type,2,1), name",
drha18c5682000-10-08 22:20:57 +00002103 callback, &data, &zErrMsg
2104 );
drh75897232000-05-29 14:26:00 +00002105 }
drh75897232000-05-29 14:26:00 +00002106 if( zErrMsg ){
2107 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002108 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002109 rc = 1;
2110 }else if( rc != SQLITE_OK ){
2111 fprintf(stderr,"Error: querying schema information\n");
2112 rc = 1;
2113 }else{
2114 rc = 0;
drh75897232000-05-29 14:26:00 +00002115 }
2116 }else
2117
2118 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00002119 sqlite3_snprintf(sizeof(p->separator), p->separator,
2120 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00002121 }else
2122
shanehe2aa9d72009-11-06 17:20:17 +00002123 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){
persicom7e2dfdd2002-04-18 02:46:52 +00002124 int i;
2125 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00002126 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00002127 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002128 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00002129 fprintf(p->out,"%9.9s: ", "nullvalue");
2130 output_c_string(p->out, p->nullvalue);
2131 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00002132 fprintf(p->out,"%9.9s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00002133 strlen30(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00002134 fprintf(p->out,"%9.9s: ", "separator");
2135 output_c_string(p->out, p->separator);
2136 fprintf(p->out, "\n");
shaneh642d8b82010-07-28 16:05:34 +00002137 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00002138 fprintf(p->out,"%9.9s: ","width");
2139 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00002140 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00002141 }
drhfeac5f82004-08-01 00:10:45 +00002142 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00002143 }else
2144
shaneh642d8b82010-07-28 16:05:34 +00002145 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){
2146 p->statsOn = booleanValue(azArg[1]);
2147 }else
2148
shanehe2aa9d72009-11-06 17:20:17 +00002149 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){
drhe3710332000-09-29 13:30:53 +00002150 char **azResult;
shane9bd1b442009-10-23 01:27:39 +00002151 int nRow;
drhe3710332000-09-29 13:30:53 +00002152 char *zErrMsg;
drh44c2eb12003-04-30 11:38:26 +00002153 open_db(p);
drha50da102000-08-08 20:19:09 +00002154 if( nArg==1 ){
danielk19776f8a5032004-05-10 10:34:51 +00002155 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00002156 "SELECT name FROM sqlite_master "
shane86f5bdb2009-10-24 02:00:07 +00002157 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' "
drhe0bc4042002-06-25 01:09:11 +00002158 "UNION ALL "
2159 "SELECT name FROM sqlite_temp_master "
2160 "WHERE type IN ('table','view') "
2161 "ORDER BY 1",
drha18c5682000-10-08 22:20:57 +00002162 &azResult, &nRow, 0, &zErrMsg
2163 );
drha50da102000-08-08 20:19:09 +00002164 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002165 zShellStatic = azArg[1];
2166 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00002167 "SELECT name FROM sqlite_master "
shane86f5bdb2009-10-24 02:00:07 +00002168 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00002169 "UNION ALL "
2170 "SELECT name FROM sqlite_temp_master "
shane86f5bdb2009-10-24 02:00:07 +00002171 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00002172 "ORDER BY 1",
danielk1977bc6ada42004-06-30 08:20:16 +00002173 &azResult, &nRow, 0, &zErrMsg
drha18c5682000-10-08 22:20:57 +00002174 );
danielk1977bc6ada42004-06-30 08:20:16 +00002175 zShellStatic = 0;
drha50da102000-08-08 20:19:09 +00002176 }
drh75897232000-05-29 14:26:00 +00002177 if( zErrMsg ){
2178 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002179 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002180 rc = 1;
2181 }else if( rc != SQLITE_OK ){
2182 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
2183 rc = 1;
2184 }else{
drhe3710332000-09-29 13:30:53 +00002185 int len, maxlen = 0;
2186 int i, j;
2187 int nPrintCol, nPrintRow;
2188 for(i=1; i<=nRow; i++){
2189 if( azResult[i]==0 ) continue;
drh4f21c4a2008-12-10 22:15:00 +00002190 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00002191 if( len>maxlen ) maxlen = len;
2192 }
2193 nPrintCol = 80/(maxlen+2);
2194 if( nPrintCol<1 ) nPrintCol = 1;
2195 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2196 for(i=0; i<nPrintRow; i++){
2197 for(j=i+1; j<=nRow; j+=nPrintRow){
2198 char *zSp = j<=nPrintRow ? "" : " ";
2199 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
2200 }
2201 printf("\n");
2202 }
2203 }
danielk19776f8a5032004-05-10 10:34:51 +00002204 sqlite3_free_table(azResult);
drh75897232000-05-29 14:26:00 +00002205 }else
2206
shaneh96887e12011-02-10 21:08:58 +00002207 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00002208 static const struct {
2209 const char *zCtrlName; /* Name of a test-control option */
2210 int ctrlCode; /* Integer code for that option */
2211 } aCtrl[] = {
2212 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2213 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2214 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2215 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2216 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2217 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2218 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2219 { "assert", SQLITE_TESTCTRL_ASSERT },
2220 { "always", SQLITE_TESTCTRL_ALWAYS },
2221 { "reserve", SQLITE_TESTCTRL_RESERVE },
2222 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2223 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00002224 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2225 };
shaneh96887e12011-02-10 21:08:58 +00002226 int testctrl = -1;
2227 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002228 int i, n;
shaneh96887e12011-02-10 21:08:58 +00002229 open_db(p);
2230
drhd416fe72011-03-17 16:45:50 +00002231 /* convert testctrl text option to value. allow any unique prefix
2232 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002233 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002234 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002235 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2236 if( testctrl<0 ){
2237 testctrl = aCtrl[i].ctrlCode;
2238 }else{
drhb07028f2011-10-14 21:49:18 +00002239 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00002240 testctrl = -1;
2241 break;
2242 }
2243 }
2244 }
2245 if( testctrl<0 ) testctrl = atoi(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002246 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2247 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2248 }else{
2249 switch(testctrl){
2250
2251 /* sqlite3_test_control(int, db, int) */
2252 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2253 case SQLITE_TESTCTRL_RESERVE:
2254 if( nArg==3 ){
2255 int opt = (int)strtol(azArg[2], 0, 0);
2256 rc = sqlite3_test_control(testctrl, p->db, opt);
2257 printf("%d (0x%08x)\n", rc, rc);
2258 } else {
drhd416fe72011-03-17 16:45:50 +00002259 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2260 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002261 }
2262 break;
2263
2264 /* sqlite3_test_control(int) */
2265 case SQLITE_TESTCTRL_PRNG_SAVE:
2266 case SQLITE_TESTCTRL_PRNG_RESTORE:
2267 case SQLITE_TESTCTRL_PRNG_RESET:
shaneh96887e12011-02-10 21:08:58 +00002268 if( nArg==2 ){
2269 rc = sqlite3_test_control(testctrl);
2270 printf("%d (0x%08x)\n", rc, rc);
2271 } else {
2272 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2273 }
2274 break;
2275
2276 /* sqlite3_test_control(int, uint) */
2277 case SQLITE_TESTCTRL_PENDING_BYTE:
2278 if( nArg==3 ){
2279 unsigned int opt = (unsigned int)atoi(azArg[2]);
2280 rc = sqlite3_test_control(testctrl, opt);
2281 printf("%d (0x%08x)\n", rc, rc);
2282 } else {
drhd416fe72011-03-17 16:45:50 +00002283 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2284 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002285 }
2286 break;
2287
2288 /* sqlite3_test_control(int, int) */
2289 case SQLITE_TESTCTRL_ASSERT:
2290 case SQLITE_TESTCTRL_ALWAYS:
2291 if( nArg==3 ){
2292 int opt = atoi(azArg[2]);
2293 rc = sqlite3_test_control(testctrl, opt);
2294 printf("%d (0x%08x)\n", rc, rc);
2295 } else {
drhd416fe72011-03-17 16:45:50 +00002296 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2297 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002298 }
2299 break;
2300
2301 /* sqlite3_test_control(int, char *) */
2302#ifdef SQLITE_N_KEYWORD
2303 case SQLITE_TESTCTRL_ISKEYWORD:
2304 if( nArg==3 ){
2305 const char *opt = azArg[2];
2306 rc = sqlite3_test_control(testctrl, opt);
2307 printf("%d (0x%08x)\n", rc, rc);
2308 } else {
drhd416fe72011-03-17 16:45:50 +00002309 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2310 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002311 }
2312 break;
2313#endif
2314
2315 case SQLITE_TESTCTRL_BITVEC_TEST:
2316 case SQLITE_TESTCTRL_FAULT_INSTALL:
2317 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2318 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2319 default:
drhd416fe72011-03-17 16:45:50 +00002320 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2321 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002322 break;
2323 }
2324 }
2325 }else
2326
shanehe2aa9d72009-11-06 17:20:17 +00002327 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh44c2eb12003-04-30 11:38:26 +00002328 open_db(p);
danielk19776f8a5032004-05-10 10:34:51 +00002329 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00002330 }else
2331
drhd416fe72011-03-17 16:45:50 +00002332 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2333 && nArg==2
2334 ){
drh3b1a9882007-11-02 12:53:03 +00002335 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002336 }else
2337
drh9fd301b2011-06-03 13:28:22 +00002338 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh73795be2011-12-12 20:01:12 +00002339 printf("SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00002340 sqlite3_libversion(), sqlite3_sourceid());
2341 }else
2342
drhde60fc22011-12-14 17:53:36 +00002343 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
2344 const char *zDbName = nArg==2 ? azArg[1] : "main";
2345 char *zVfsName = 0;
2346 if( p->db ){
2347 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
2348 if( zVfsName ){
2349 printf("%s\n", zVfsName);
2350 sqlite3_free(zVfsName);
2351 }
2352 }
2353 }else
2354
shanehe2aa9d72009-11-06 17:20:17 +00002355 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00002356 int j;
drh43617e92006-03-06 20:55:46 +00002357 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002358 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
2359 p->colWidth[j-1] = atoi(azArg[j]);
2360 }
2361 }else
2362
2363 {
shane9bd1b442009-10-23 01:27:39 +00002364 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00002365 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00002366 rc = 1;
drh75897232000-05-29 14:26:00 +00002367 }
drh67505e72002-04-19 12:34:06 +00002368
2369 return rc;
drh75897232000-05-29 14:26:00 +00002370}
2371
drh67505e72002-04-19 12:34:06 +00002372/*
drh91a66392007-09-07 01:12:32 +00002373** Return TRUE if a semicolon occurs anywhere in the first N characters
2374** of string z[].
drh324ccef2003-02-05 14:06:20 +00002375*/
drh91a66392007-09-07 01:12:32 +00002376static int _contains_semicolon(const char *z, int N){
2377 int i;
2378 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2379 return 0;
drh324ccef2003-02-05 14:06:20 +00002380}
2381
2382/*
drh70c7a4b2003-04-26 03:03:06 +00002383** Test to see if a line consists entirely of whitespace.
2384*/
2385static int _all_whitespace(const char *z){
2386 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00002387 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002388 if( *z=='/' && z[1]=='*' ){
2389 z += 2;
2390 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2391 if( *z==0 ) return 0;
2392 z++;
2393 continue;
2394 }
2395 if( *z=='-' && z[1]=='-' ){
2396 z += 2;
2397 while( *z && *z!='\n' ){ z++; }
2398 if( *z==0 ) return 1;
2399 continue;
2400 }
2401 return 0;
2402 }
2403 return 1;
2404}
2405
2406/*
drha9b17162003-04-29 18:01:28 +00002407** Return TRUE if the line typed in is an SQL command terminator other
2408** than a semi-colon. The SQL Server style "go" command is understood
2409** as is the Oracle "/".
2410*/
2411static int _is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00002412 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002413 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2414 return 1; /* Oracle */
2415 }
drhf0693c82011-10-11 20:41:54 +00002416 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00002417 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002418 return 1; /* SQL Server */
2419 }
2420 return 0;
2421}
2422
2423/*
drh233a5312008-12-18 22:25:13 +00002424** Return true if zSql is a complete SQL statement. Return false if it
2425** ends in the middle of a string literal or C-style comment.
2426*/
2427static int _is_complete(char *zSql, int nSql){
2428 int rc;
2429 if( zSql==0 ) return 1;
2430 zSql[nSql] = ';';
2431 zSql[nSql+1] = 0;
2432 rc = sqlite3_complete(zSql);
2433 zSql[nSql] = 0;
2434 return rc;
2435}
2436
2437/*
drh67505e72002-04-19 12:34:06 +00002438** Read input from *in and process it. If *in==0 then input
2439** is interactive - the user is typing it it. Otherwise, input
2440** is coming from a file or device. A prompt is issued and history
2441** is saved only if input is interactive. An interrupt signal will
2442** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00002443**
2444** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00002445*/
drhc28490c2006-10-26 14:25:58 +00002446static int process_input(struct callback_data *p, FILE *in){
danielk19772ac27622007-07-03 05:31:16 +00002447 char *zLine = 0;
drhdaffd0e2001-04-11 14:28:42 +00002448 char *zSql = 0;
2449 int nSql = 0;
drh91a66392007-09-07 01:12:32 +00002450 int nSqlPrior = 0;
drhdaffd0e2001-04-11 14:28:42 +00002451 char *zErrMsg;
drhc49f44e2006-10-26 18:15:42 +00002452 int rc;
2453 int errCnt = 0;
drhc28490c2006-10-26 14:25:58 +00002454 int lineno = 0;
2455 int startline = 0;
drhc49f44e2006-10-26 18:15:42 +00002456
2457 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
2458 fflush(p->out);
danielk19772ac27622007-07-03 05:31:16 +00002459 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002460 zLine = one_input_line(zSql, in);
2461 if( zLine==0 ){
2462 break; /* We have reached EOF */
2463 }
drh67505e72002-04-19 12:34:06 +00002464 if( seenInterrupt ){
2465 if( in!=0 ) break;
2466 seenInterrupt = 0;
2467 }
drhc28490c2006-10-26 14:25:58 +00002468 lineno++;
drhf817b6b2003-06-16 00:16:41 +00002469 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00002470 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00002471 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00002472 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00002473 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00002474 break;
2475 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00002476 errCnt++;
2477 }
drhdaffd0e2001-04-11 14:28:42 +00002478 continue;
2479 }
drh233a5312008-12-18 22:25:13 +00002480 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00002481 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00002482 }
drh91a66392007-09-07 01:12:32 +00002483 nSqlPrior = nSql;
drhdaffd0e2001-04-11 14:28:42 +00002484 if( zSql==0 ){
2485 int i;
drhf0693c82011-10-11 20:41:54 +00002486 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drhdaffd0e2001-04-11 14:28:42 +00002487 if( zLine[i]!=0 ){
drh4f21c4a2008-12-10 22:15:00 +00002488 nSql = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002489 zSql = malloc( nSql+3 );
drhc1f44942006-05-10 14:39:13 +00002490 if( zSql==0 ){
shane9bd1b442009-10-23 01:27:39 +00002491 fprintf(stderr, "Error: out of memory\n");
drhc1f44942006-05-10 14:39:13 +00002492 exit(1);
2493 }
drh5bb3eb92007-05-04 13:15:55 +00002494 memcpy(zSql, zLine, nSql+1);
drhc28490c2006-10-26 14:25:58 +00002495 startline = lineno;
drhdaffd0e2001-04-11 14:28:42 +00002496 }
2497 }else{
drh4f21c4a2008-12-10 22:15:00 +00002498 int len = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002499 zSql = realloc( zSql, nSql + len + 4 );
drhdaffd0e2001-04-11 14:28:42 +00002500 if( zSql==0 ){
shane9bd1b442009-10-23 01:27:39 +00002501 fprintf(stderr,"Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00002502 exit(1);
2503 }
drh5bb3eb92007-05-04 13:15:55 +00002504 zSql[nSql++] = '\n';
2505 memcpy(&zSql[nSql], zLine, len+1);
drhdaffd0e2001-04-11 14:28:42 +00002506 nSql += len;
2507 }
drh91a66392007-09-07 01:12:32 +00002508 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
2509 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00002510 p->cnt = 0;
drh44c2eb12003-04-30 11:38:26 +00002511 open_db(p);
drh3b1a9882007-11-02 12:53:03 +00002512 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00002513 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00002514 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00002515 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00002516 char zPrefix[100];
2517 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00002518 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00002519 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00002520 }else{
shane9bd1b442009-10-23 01:27:39 +00002521 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00002522 }
drh7f953e22002-07-13 17:33:45 +00002523 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00002524 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002525 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00002526 zErrMsg = 0;
2527 }else{
shaned2bed1c2009-10-21 03:56:54 +00002528 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00002529 }
drhc49f44e2006-10-26 18:15:42 +00002530 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00002531 }
2532 free(zSql);
2533 zSql = 0;
2534 nSql = 0;
2535 }
2536 }
2537 if( zSql ){
drhd416fe72011-03-17 16:45:50 +00002538 if( !_all_whitespace(zSql) ){
2539 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
2540 }
drhdaffd0e2001-04-11 14:28:42 +00002541 free(zSql);
2542 }
danielk19772ac27622007-07-03 05:31:16 +00002543 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002544 return errCnt;
drhdaffd0e2001-04-11 14:28:42 +00002545}
2546
drh67505e72002-04-19 12:34:06 +00002547/*
2548** Return a pathname which is the user's home directory. A
2549** 0 return indicates an error of some kind. Space to hold the
2550** resulting string is obtained from malloc(). The calling
2551** function should free the result.
2552*/
2553static char *find_home_dir(void){
2554 char *home_dir = NULL;
persicom7e2dfdd2002-04-18 02:46:52 +00002555
chw97185482008-11-17 08:05:31 +00002556#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
drh67505e72002-04-19 12:34:06 +00002557 struct passwd *pwent;
2558 uid_t uid = getuid();
drhbd842ba2002-08-21 11:26:41 +00002559 if( (pwent=getpwuid(uid)) != NULL) {
2560 home_dir = pwent->pw_dir;
drh67505e72002-04-19 12:34:06 +00002561 }
2562#endif
2563
chw65d3c132007-11-12 21:09:10 +00002564#if defined(_WIN32_WCE)
2565 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
2566 */
2567 home_dir = strdup("/");
2568#else
2569
drh164a1b62006-08-19 11:15:20 +00002570#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
2571 if (!home_dir) {
2572 home_dir = getenv("USERPROFILE");
2573 }
2574#endif
2575
drh67505e72002-04-19 12:34:06 +00002576 if (!home_dir) {
2577 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00002578 }
2579
drhcdb36b72006-06-12 12:57:45 +00002580#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
drhe98d4fa2002-04-21 19:06:22 +00002581 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00002582 char *zDrive, *zPath;
2583 int n;
2584 zDrive = getenv("HOMEDRIVE");
2585 zPath = getenv("HOMEPATH");
2586 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00002587 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00002588 home_dir = malloc( n );
2589 if( home_dir==0 ) return 0;
2590 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
2591 return home_dir;
2592 }
2593 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00002594 }
2595#endif
2596
chw65d3c132007-11-12 21:09:10 +00002597#endif /* !_WIN32_WCE */
2598
drh67505e72002-04-19 12:34:06 +00002599 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00002600 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00002601 char *z = malloc( n );
2602 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00002603 home_dir = z;
2604 }
drhe98d4fa2002-04-21 19:06:22 +00002605
drh67505e72002-04-19 12:34:06 +00002606 return home_dir;
2607}
2608
2609/*
2610** Read input from the file given by sqliterc_override. Or if that
2611** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00002612**
2613** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00002614*/
shane9bd1b442009-10-23 01:27:39 +00002615static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00002616 struct callback_data *p, /* Configuration data */
2617 const char *sqliterc_override /* Name of config file. NULL to use default */
2618){
persicom7e2dfdd2002-04-18 02:46:52 +00002619 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00002620 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00002621 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00002622 FILE *in = NULL;
drha959ac42007-06-20 13:10:00 +00002623 int nBuf;
shane9bd1b442009-10-23 01:27:39 +00002624 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00002625
2626 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00002627 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00002628 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00002629#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00002630 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00002631#endif
shane9bd1b442009-10-23 01:27:39 +00002632 return 1;
drhe98d4fa2002-04-21 19:06:22 +00002633 }
drh4f21c4a2008-12-10 22:15:00 +00002634 nBuf = strlen30(home_dir) + 16;
drha959ac42007-06-20 13:10:00 +00002635 zBuf = malloc( nBuf );
drh22fbcb82004-02-01 01:22:50 +00002636 if( zBuf==0 ){
shane86f5bdb2009-10-24 02:00:07 +00002637 fprintf(stderr,"%s: Error: out of memory\n",Argv0);
2638 return 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002639 }
drha959ac42007-06-20 13:10:00 +00002640 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
drh67505e72002-04-19 12:34:06 +00002641 free(home_dir);
drh22fbcb82004-02-01 01:22:50 +00002642 sqliterc = (const char*)zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00002643 }
drha1f9b5e2004-02-14 16:31:02 +00002644 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00002645 if( in ){
drhc28490c2006-10-26 14:25:58 +00002646 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00002647 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00002648 }
shane9bd1b442009-10-23 01:27:39 +00002649 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00002650 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00002651 }
drh43617e92006-03-06 20:55:46 +00002652 free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00002653 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00002654}
2655
drh67505e72002-04-19 12:34:06 +00002656/*
drhe1e38c42003-05-04 18:30:59 +00002657** Show available command line options
2658*/
2659static const char zOptions[] =
shaneh5fc25012009-11-11 04:17:07 +00002660 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00002661 " -init filename read/process named file\n"
2662 " -echo print commands before execution\n"
2663 " -[no]header turn headers on or off\n"
drhc49f44e2006-10-26 18:15:42 +00002664 " -bail stop after hitting an error\n"
2665 " -interactive force interactive I/O\n"
2666 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00002667 " -column set output mode to 'column'\n"
drhc49f44e2006-10-26 18:15:42 +00002668 " -csv set output mode to 'csv'\n"
drhe1e38c42003-05-04 18:30:59 +00002669 " -html set output mode to HTML\n"
2670 " -line set output mode to 'line'\n"
2671 " -list set output mode to 'list'\n"
2672 " -separator 'x' set output field separator (|)\n"
shaneh642d8b82010-07-28 16:05:34 +00002673 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00002674 " -nullvalue 'text' set text string for NULL values\n"
2675 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00002676 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00002677#ifdef SQLITE_ENABLE_VFSTRACE
2678 " -vfstrace enable tracing of all VFS calls\n"
2679#endif
drh6f25e892011-07-08 17:02:57 +00002680#ifdef SQLITE_ENABLE_MULTIPLEX
2681 " -multiplex enable the multiplexor VFS\n"
2682#endif
drhe1e38c42003-05-04 18:30:59 +00002683;
2684static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00002685 fprintf(stderr,
2686 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
2687 "FILENAME is the name of an SQLite database. A new database is created\n"
2688 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00002689 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00002690 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00002691 }else{
2692 fprintf(stderr, "Use the -help option for additional information\n");
2693 }
2694 exit(1);
2695}
2696
2697/*
drh67505e72002-04-19 12:34:06 +00002698** Initialize the state information in data
2699*/
drh0850b532006-01-31 19:31:43 +00002700static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00002701 memset(data, 0, sizeof(*data));
2702 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002703 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00002704 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00002705 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00002706 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00002707 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
2708 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00002709 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00002710}
2711
drh75897232000-05-29 14:26:00 +00002712int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00002713 char *zErrMsg = 0;
2714 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00002715 const char *zInitFile = 0;
2716 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00002717 int i;
drhc28490c2006-10-26 14:25:58 +00002718 int rc = 0;
drh75897232000-05-29 14:26:00 +00002719
drh52784bd2011-05-18 17:15:06 +00002720 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
2721 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
2722 sqlite3_sourceid(), SQLITE_SOURCE_ID);
2723 exit(1);
2724 }
drhdaffd0e2001-04-11 14:28:42 +00002725 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00002726 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00002727 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00002728
drh44c2eb12003-04-30 11:38:26 +00002729 /* Make sure we have a valid signal handler early, before anything
2730 ** else is done.
2731 */
drh4c504392000-10-16 22:06:40 +00002732#ifdef SIGINT
2733 signal(SIGINT, interrupt_handler);
2734#endif
drh44c2eb12003-04-30 11:38:26 +00002735
drh22fbcb82004-02-01 01:22:50 +00002736 /* Do an initial pass through the command-line argument to locate
2737 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00002738 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00002739 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00002740 */
drh22fbcb82004-02-01 01:22:50 +00002741 for(i=1; i<argc-1; i++){
drhc28490c2006-10-26 14:25:58 +00002742 char *z;
drh44c2eb12003-04-30 11:38:26 +00002743 if( argv[i][0]!='-' ) break;
drhc28490c2006-10-26 14:25:58 +00002744 z = argv[i];
2745 if( z[0]=='-' && z[1]=='-' ) z++;
drh44c2eb12003-04-30 11:38:26 +00002746 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
2747 i++;
drh22fbcb82004-02-01 01:22:50 +00002748 }else if( strcmp(argv[i],"-init")==0 ){
2749 i++;
2750 zInitFile = argv[i];
shanef69573d2009-10-24 02:06:14 +00002751 /* Need to check for batch mode here to so we can avoid printing
2752 ** informational messages (like from process_sqliterc) before
2753 ** we do the actual processing of arguments later in a second pass.
2754 */
2755 }else if( strcmp(argv[i],"-batch")==0 ){
shanef69573d2009-10-24 02:06:14 +00002756 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00002757 }else if( strcmp(argv[i],"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00002758#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00002759 int j, c;
2760 const char *zSize;
2761 sqlite3_int64 szHeap;
2762
2763 zSize = argv[++i];
2764 szHeap = atoi(zSize);
2765 for(j=0; (c = zSize[j])!=0; j++){
2766 if( c=='M' ){ szHeap *= 1000000; break; }
2767 if( c=='K' ){ szHeap *= 1000; break; }
2768 if( c=='G' ){ szHeap *= 1000000000; break; }
2769 }
2770 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00002771 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2772#endif
drh97ae8ff2011-03-16 16:56:29 +00002773#ifdef SQLITE_ENABLE_VFSTRACE
2774 }else if( strcmp(argv[i],"-vfstrace")==0 ){
2775 extern int vfstrace_register(
2776 const char *zTraceName,
2777 const char *zOldVfsName,
2778 int (*xOut)(const char*,void*),
2779 void *pOutArg,
2780 int makeDefault
2781 );
drh2b625e22011-03-16 17:05:28 +00002782 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00002783#endif
drh6f25e892011-07-08 17:02:57 +00002784#ifdef SQLITE_ENABLE_MULTIPLEX
2785 }else if( strcmp(argv[i],"-multiplex")==0 ){
2786 extern int sqlite3_multiple_initialize(const char*,int);
2787 sqlite3_multiplex_initialize(0, 1);
2788#endif
drha7e61d82011-03-12 17:02:57 +00002789 }else if( strcmp(argv[i],"-vfs")==0 ){
drh77ec9ba2011-03-15 18:35:44 +00002790 sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]);
drha7e61d82011-03-12 17:02:57 +00002791 if( pVfs ){
2792 sqlite3_vfs_register(pVfs, 1);
2793 }else{
2794 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
2795 exit(1);
2796 }
drh44c2eb12003-04-30 11:38:26 +00002797 }
2798 }
drh22fbcb82004-02-01 01:22:50 +00002799 if( i<argc ){
danielk197729bafea2008-06-26 10:41:19 +00002800#if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
pweilbacherd190be82008-04-15 18:50:02 +00002801 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
2802#else
drh22fbcb82004-02-01 01:22:50 +00002803 data.zDbFilename = argv[i++];
pweilbacherd190be82008-04-15 18:50:02 +00002804#endif
drh22fbcb82004-02-01 01:22:50 +00002805 }else{
danielk197703aded42004-11-22 05:26:27 +00002806#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00002807 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00002808#else
2809 data.zDbFilename = 0;
2810#endif
drh22fbcb82004-02-01 01:22:50 +00002811 }
2812 if( i<argc ){
2813 zFirstCmd = argv[i++];
2814 }
shaneh5fc25012009-11-11 04:17:07 +00002815 if( i<argc ){
2816 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
2817 fprintf(stderr,"Use -help for a list of options.\n");
2818 return 1;
2819 }
drh44c2eb12003-04-30 11:38:26 +00002820 data.out = stdout;
2821
drh01b41712005-08-29 23:06:23 +00002822#ifdef SQLITE_OMIT_MEMORYDB
2823 if( data.zDbFilename==0 ){
shane86f5bdb2009-10-24 02:00:07 +00002824 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
2825 return 1;
drh01b41712005-08-29 23:06:23 +00002826 }
2827#endif
2828
drh44c2eb12003-04-30 11:38:26 +00002829 /* Go ahead and open the database file if it already exists. If the
2830 ** file does not exist, delay opening it. This prevents empty database
2831 ** files from being created if a user mistypes the database name argument
2832 ** to the sqlite command-line tool.
2833 */
drhc8d74412004-08-31 23:41:26 +00002834 if( access(data.zDbFilename, 0)==0 ){
drh44c2eb12003-04-30 11:38:26 +00002835 open_db(&data);
2836 }
2837
drh22fbcb82004-02-01 01:22:50 +00002838 /* Process the initialization file if there is one. If no -init option
2839 ** is given on the command line, look for a file named ~/.sqliterc and
2840 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00002841 */
shane86f5bdb2009-10-24 02:00:07 +00002842 rc = process_sqliterc(&data,zInitFile);
2843 if( rc>0 ){
2844 return rc;
2845 }
drh44c2eb12003-04-30 11:38:26 +00002846
drh22fbcb82004-02-01 01:22:50 +00002847 /* Make a second pass through the command-line argument and set
2848 ** options. This second pass is delayed until after the initialization
2849 ** file is processed so that the command-line arguments will override
2850 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00002851 */
drh22fbcb82004-02-01 01:22:50 +00002852 for(i=1; i<argc && argv[i][0]=='-'; i++){
2853 char *z = argv[i];
drhc28490c2006-10-26 14:25:58 +00002854 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00002855 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00002856 i++;
2857 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002858 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00002859 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002860 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00002861 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002862 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00002863 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00002864 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00002865 }else if( strcmp(z,"-csv")==0 ){
2866 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002867 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00002868 }else if( strcmp(z,"-separator")==0 ){
2869 i++;
shaneh5fc25012009-11-11 04:17:07 +00002870 if(i>=argc){
2871 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
2872 fprintf(stderr,"Use -help for a list of options.\n");
2873 return 1;
2874 }
drh5bb3eb92007-05-04 13:15:55 +00002875 sqlite3_snprintf(sizeof(data.separator), data.separator,
2876 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00002877 }else if( strcmp(z,"-nullvalue")==0 ){
2878 i++;
shaneh5fc25012009-11-11 04:17:07 +00002879 if(i>=argc){
2880 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
2881 fprintf(stderr,"Use -help for a list of options.\n");
2882 return 1;
2883 }
drh5bb3eb92007-05-04 13:15:55 +00002884 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
2885 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00002886 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002887 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00002888 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002889 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00002890 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00002891 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00002892 }else if( strcmp(z,"-stats")==0 ){
2893 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00002894 }else if( strcmp(z,"-bail")==0 ){
2895 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00002896 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00002897 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00002898 return 0;
drhc28490c2006-10-26 14:25:58 +00002899 }else if( strcmp(z,"-interactive")==0 ){
2900 stdin_is_interactive = 1;
2901 }else if( strcmp(z,"-batch")==0 ){
2902 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00002903 }else if( strcmp(z,"-heap")==0 ){
2904 i++;
drha7e61d82011-03-12 17:02:57 +00002905 }else if( strcmp(z,"-vfs")==0 ){
2906 i++;
drh6f25e892011-07-08 17:02:57 +00002907#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00002908 }else if( strcmp(z,"-vfstrace")==0 ){
2909 i++;
drh6f25e892011-07-08 17:02:57 +00002910#endif
2911#ifdef SQLITE_ENABLE_MULTIPLEX
2912 }else if( strcmp(z,"-multiplex")==0 ){
2913 i++;
2914#endif
drh80e8be92006-08-29 12:04:19 +00002915 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00002916 usage(1);
drh1e5d0e92000-05-31 23:33:17 +00002917 }else{
shane86f5bdb2009-10-24 02:00:07 +00002918 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00002919 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00002920 return 1;
2921 }
2922 }
drh44c2eb12003-04-30 11:38:26 +00002923
drh22fbcb82004-02-01 01:22:50 +00002924 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00002925 /* Run just the command that follows the database name
2926 */
drh22fbcb82004-02-01 01:22:50 +00002927 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00002928 rc = do_meta_command(zFirstCmd, &data);
drh6ff13852001-11-25 13:18:23 +00002929 }else{
drh44c2eb12003-04-30 11:38:26 +00002930 open_db(&data);
shane626a6e42009-10-22 17:30:15 +00002931 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00002932 if( zErrMsg!=0 ){
2933 fprintf(stderr,"Error: %s\n", zErrMsg);
2934 return rc!=0 ? rc : 1;
2935 }else if( rc!=0 ){
2936 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
2937 return rc;
drh6ff13852001-11-25 13:18:23 +00002938 }
drh75897232000-05-29 14:26:00 +00002939 }
2940 }else{
drh44c2eb12003-04-30 11:38:26 +00002941 /* Run commands received from standard input
2942 */
drhc28490c2006-10-26 14:25:58 +00002943 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00002944 char *zHome;
2945 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00002946 int nHistory;
drh75897232000-05-29 14:26:00 +00002947 printf(
drh73795be2011-12-12 20:01:12 +00002948 "SQLite version %s %.19s\n" /*extra-version-info*/
mihailim65df9db2008-06-28 11:29:22 +00002949 "Enter \".help\" for instructions\n"
2950 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00002951 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00002952 );
drh67505e72002-04-19 12:34:06 +00002953 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00002954 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00002955 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00002956 if( (zHistory = malloc(nHistory))!=0 ){
2957 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
2958 }
drh67505e72002-04-19 12:34:06 +00002959 }
danielk19774af00c62005-01-23 23:43:21 +00002960#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00002961 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00002962#endif
drhc28490c2006-10-26 14:25:58 +00002963 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00002964 if( zHistory ){
2965 stifle_history(100);
2966 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00002967 free(zHistory);
drh67505e72002-04-19 12:34:06 +00002968 }
adamd0a3daa32006-07-28 20:16:14 +00002969 free(zHome);
drhdaffd0e2001-04-11 14:28:42 +00002970 }else{
drhc28490c2006-10-26 14:25:58 +00002971 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00002972 }
2973 }
drh33048c02001-10-01 14:29:22 +00002974 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00002975 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00002976 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00002977 }
drhc28490c2006-10-26 14:25:58 +00002978 return rc;
drh75897232000-05-29 14:26:00 +00002979}