blob: 58a48db1231b491db5545c3fdf60b50b63dc69a2 [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;
341 int eol;
342
343 if( zPrompt && *zPrompt ){
344 printf("%s",zPrompt);
345 fflush(stdout);
346 }
347 nLine = 100;
348 zLine = malloc( nLine );
349 if( zLine==0 ) return 0;
350 n = 0;
351 eol = 0;
352 while( !eol ){
353 if( n+100>nLine ){
354 nLine = nLine*2 + 100;
355 zLine = realloc(zLine, nLine);
356 if( zLine==0 ) return 0;
357 }
drhdaffd0e2001-04-11 14:28:42 +0000358 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000359 if( n==0 ){
360 free(zLine);
361 return 0;
362 }
363 zLine[n] = 0;
364 eol = 1;
365 break;
366 }
367 while( zLine[n] ){ n++; }
368 if( n>0 && zLine[n-1]=='\n' ){
369 n--;
shaneh13b36022009-12-17 21:07:15 +0000370 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000371 zLine[n] = 0;
372 eol = 1;
373 }
374 }
375 zLine = realloc( zLine, n+1 );
376 return zLine;
377}
378
379/*
drhc28490c2006-10-26 14:25:58 +0000380** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000381**
382** zPrior is a string of prior text retrieved. If not the empty
383** string, then issue a continuation prompt.
384*/
drhdaffd0e2001-04-11 14:28:42 +0000385static char *one_input_line(const char *zPrior, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +0000386 char *zPrompt;
387 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000388 if( in!=0 ){
drh9347b202003-07-18 01:30:59 +0000389 return local_getline(0, in);
drh8e7e7a22000-05-30 18:45:23 +0000390 }
391 if( zPrior && zPrior[0] ){
persicom7e2dfdd2002-04-18 02:46:52 +0000392 zPrompt = continuePrompt;
drh8e7e7a22000-05-30 18:45:23 +0000393 }else{
persicom7e2dfdd2002-04-18 02:46:52 +0000394 zPrompt = mainPrompt;
drh8e7e7a22000-05-30 18:45:23 +0000395 }
396 zResult = readline(zPrompt);
danielk19774af00c62005-01-23 23:43:21 +0000397#if defined(HAVE_READLINE) && HAVE_READLINE==1
drheb741d52006-06-03 17:37:25 +0000398 if( zResult && *zResult ) add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000399#endif
drh8e7e7a22000-05-30 18:45:23 +0000400 return zResult;
401}
402
persicom7e2dfdd2002-04-18 02:46:52 +0000403struct previous_mode_data {
404 int valid; /* Is there legit data in here? */
405 int mode;
406 int showHeader;
407 int colWidth[100];
408};
drh45e29d82006-11-20 16:21:10 +0000409
drh8e7e7a22000-05-30 18:45:23 +0000410/*
drh75897232000-05-29 14:26:00 +0000411** An pointer to an instance of this structure is passed from
412** the main program to the callback. This is used to communicate
413** state and mode information.
414*/
415struct callback_data {
shane626a6e42009-10-22 17:30:15 +0000416 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000417 int echoOn; /* True to echo input commands */
shaneh642d8b82010-07-28 16:05:34 +0000418 int statsOn; /* True to display memory stats before each finalize */
drh28bd4bc2000-06-15 15:57:22 +0000419 int cnt; /* Number of records displayed so far */
420 FILE *out; /* Write results here */
drh2f464a02011-10-13 00:41:49 +0000421 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000422 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000423 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000424 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000425 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000426 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000427 int colWidth[100]; /* Requested width of each column when in column mode*/
428 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000429 char nullvalue[20]; /* The text to print when a NULL comes back from
430 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000431 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000432 /* Holds the mode information just before
433 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000434 char outfile[FILENAME_MAX]; /* Filename for *out */
435 const char *zDbFilename; /* name of the database file */
drha7e61d82011-03-12 17:02:57 +0000436 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000437 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000438 FILE *pLog; /* Write log output here */
drh75897232000-05-29 14:26:00 +0000439};
440
441/*
442** These are the allowed modes.
443*/
drh967e8b72000-06-21 13:59:10 +0000444#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000445#define MODE_Column 1 /* One record per line in neat columns */
446#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000447#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
448#define MODE_Html 4 /* Generate an XHTML table */
449#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000450#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000451#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000452#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
persicom7e2dfdd2002-04-18 02:46:52 +0000453
drh66ce4d02008-02-15 17:38:06 +0000454static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000455 "line",
456 "column",
457 "list",
458 "semi",
459 "html",
drhfeac5f82004-08-01 00:10:45 +0000460 "insert",
461 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000462 "csv",
drh66ce4d02008-02-15 17:38:06 +0000463 "explain",
persicom7e2dfdd2002-04-18 02:46:52 +0000464};
drh75897232000-05-29 14:26:00 +0000465
466/*
467** Number of elements in an array
468*/
drh902b9ee2008-12-05 17:17:07 +0000469#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000470
471/*
drhea678832008-12-10 19:26:22 +0000472** Compute a string length that is limited to what can be stored in
473** lower 30 bits of a 32-bit signed integer.
474*/
drh4f21c4a2008-12-10 22:15:00 +0000475static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000476 const char *z2 = z;
477 while( *z2 ){ z2++; }
478 return 0x3fffffff & (int)(z2 - z);
479}
480
481/*
drh127f9d72010-02-23 01:47:00 +0000482** A callback for the sqlite3_log() interface.
483*/
484static void shellLog(void *pArg, int iErrCode, const char *zMsg){
485 struct callback_data *p = (struct callback_data*)pArg;
486 if( p->pLog==0 ) return;
487 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
488 fflush(p->pLog);
489}
490
491/*
shane626a6e42009-10-22 17:30:15 +0000492** Output the given string as a hex-encoded blob (eg. X'1234' )
493*/
494static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
495 int i;
496 char *zBlob = (char *)pBlob;
497 fprintf(out,"X'");
498 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); }
499 fprintf(out,"'");
500}
501
502/*
drh28bd4bc2000-06-15 15:57:22 +0000503** Output the given string as a quoted string using SQL quoting conventions.
504*/
505static void output_quoted_string(FILE *out, const char *z){
506 int i;
507 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000508 for(i=0; z[i]; i++){
509 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000510 }
511 if( nSingle==0 ){
512 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000513 }else{
514 fprintf(out,"'");
515 while( *z ){
516 for(i=0; z[i] && z[i]!='\''; i++){}
517 if( i==0 ){
518 fprintf(out,"''");
519 z++;
520 }else if( z[i]=='\'' ){
521 fprintf(out,"%.*s''",i,z);
522 z += i+1;
523 }else{
drhcd7d2732002-02-26 23:24:26 +0000524 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000525 break;
526 }
527 }
drhcd7d2732002-02-26 23:24:26 +0000528 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000529 }
530}
531
532/*
drhfeac5f82004-08-01 00:10:45 +0000533** Output the given string as a quoted according to C or TCL quoting rules.
534*/
535static void output_c_string(FILE *out, const char *z){
536 unsigned int c;
537 fputc('"', out);
538 while( (c = *(z++))!=0 ){
539 if( c=='\\' ){
540 fputc(c, out);
541 fputc(c, out);
542 }else if( c=='\t' ){
543 fputc('\\', out);
544 fputc('t', out);
545 }else if( c=='\n' ){
546 fputc('\\', out);
547 fputc('n', out);
548 }else if( c=='\r' ){
549 fputc('\\', out);
550 fputc('r', out);
551 }else if( !isprint(c) ){
drh0a8640d2005-08-30 20:12:02 +0000552 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000553 }else{
554 fputc(c, out);
555 }
556 }
557 fputc('"', out);
558}
559
560/*
drhc08a4f12000-06-15 16:49:48 +0000561** Output the given string with characters that are special to
562** HTML escaped.
563*/
564static void output_html_string(FILE *out, const char *z){
565 int i;
566 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000567 for(i=0; z[i]
568 && z[i]!='<'
569 && z[i]!='&'
570 && z[i]!='>'
571 && z[i]!='\"'
572 && z[i]!='\'';
573 i++){}
drhc08a4f12000-06-15 16:49:48 +0000574 if( i>0 ){
575 fprintf(out,"%.*s",i,z);
576 }
577 if( z[i]=='<' ){
578 fprintf(out,"&lt;");
579 }else if( z[i]=='&' ){
580 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000581 }else if( z[i]=='>' ){
582 fprintf(out,"&gt;");
583 }else if( z[i]=='\"' ){
584 fprintf(out,"&quot;");
585 }else if( z[i]=='\'' ){
586 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000587 }else{
588 break;
589 }
590 z += i + 1;
591 }
592}
593
594/*
drhc49f44e2006-10-26 18:15:42 +0000595** If a field contains any character identified by a 1 in the following
596** array, then the string must be quoted for CSV.
597*/
598static const char needCsvQuote[] = {
599 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
600 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
601 1, 0, 1, 0, 0, 0, 0, 1, 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, 0,
604 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
605 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
606 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
613 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
614 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
615};
616
617/*
drh8e64d1c2004-10-07 00:32:39 +0000618** Output a single term of CSV. Actually, p->separator is used for
619** the separator, which may or may not be a comma. p->nullvalue is
620** the null value. Strings are quoted using ANSI-C rules. Numbers
621** appear outside of quotes.
622*/
623static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000624 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000625 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000626 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000627 }else{
drhc49f44e2006-10-26 18:15:42 +0000628 int i;
drh4f21c4a2008-12-10 22:15:00 +0000629 int nSep = strlen30(p->separator);
drhc49f44e2006-10-26 18:15:42 +0000630 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000631 if( needCsvQuote[((unsigned char*)z)[i]]
632 || (z[i]==p->separator[0] &&
633 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000634 i = 0;
635 break;
636 }
637 }
638 if( i==0 ){
639 putc('"', out);
640 for(i=0; z[i]; i++){
641 if( z[i]=='"' ) putc('"', out);
642 putc(z[i], out);
643 }
644 putc('"', out);
645 }else{
646 fprintf(out, "%s", z);
647 }
drh8e64d1c2004-10-07 00:32:39 +0000648 }
649 if( bSep ){
drhd0e77882008-01-14 15:20:08 +0000650 fprintf(p->out, "%s", p->separator);
drh8e64d1c2004-10-07 00:32:39 +0000651 }
652}
653
danielk19774af00c62005-01-23 23:43:21 +0000654#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000655/*
drh4c504392000-10-16 22:06:40 +0000656** This routine runs when the user presses Ctrl-C
657*/
658static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000659 UNUSED_PARAMETER(NotUsed);
drh67505e72002-04-19 12:34:06 +0000660 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000661 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000662}
danielk19774af00c62005-01-23 23:43:21 +0000663#endif
drh4c504392000-10-16 22:06:40 +0000664
665/*
shane626a6e42009-10-22 17:30:15 +0000666** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000667** invokes for each row of a query result.
668*/
shane626a6e42009-10-22 17:30:15 +0000669static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
drh75897232000-05-29 14:26:00 +0000670 int i;
671 struct callback_data *p = (struct callback_data*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000672
drh75897232000-05-29 14:26:00 +0000673 switch( p->mode ){
674 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000675 int w = 5;
drh6a535342001-10-19 16:44:56 +0000676 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000677 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000678 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000679 if( len>w ) w = len;
680 }
drh75897232000-05-29 14:26:00 +0000681 if( p->cnt++>0 ) fprintf(p->out,"\n");
682 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000683 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000684 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000685 }
686 break;
687 }
danielk19770d78bae2008-01-03 07:09:48 +0000688 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000689 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000690 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000691 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000692 int w, n;
693 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000694 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000695 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000696 w = 0;
drh75897232000-05-29 14:26:00 +0000697 }
drha0c66f52000-07-29 13:20:21 +0000698 if( w<=0 ){
drh4f21c4a2008-12-10 22:15:00 +0000699 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000700 if( w<10 ) w = 10;
drh4f21c4a2008-12-10 22:15:00 +0000701 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000702 if( w<n ) w = n;
703 }
704 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000705 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000706 }
707 if( p->showHeader ){
708 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
709 }
710 }
711 if( p->showHeader ){
712 for(i=0; i<nArg; i++){
713 int w;
714 if( i<ArraySize(p->actualWidth) ){
715 w = p->actualWidth[i];
716 }else{
717 w = 10;
718 }
719 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
720 "----------------------------------------------------------",
721 i==nArg-1 ? "\n": " ");
722 }
drh75897232000-05-29 14:26:00 +0000723 }
724 }
drh6a535342001-10-19 16:44:56 +0000725 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000726 for(i=0; i<nArg; i++){
727 int w;
drha0c66f52000-07-29 13:20:21 +0000728 if( i<ArraySize(p->actualWidth) ){
729 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000730 }else{
731 w = 10;
732 }
drhea678832008-12-10 19:26:22 +0000733 if( p->mode==MODE_Explain && azArg[i] &&
drh4f21c4a2008-12-10 22:15:00 +0000734 strlen30(azArg[i])>w ){
735 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000736 }
drhc61053b2000-06-04 12:58:36 +0000737 fprintf(p->out,"%-*.*s%s",w,w,
persicom7e2dfdd2002-04-18 02:46:52 +0000738 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
drh75897232000-05-29 14:26:00 +0000739 }
740 break;
741 }
drhe3710332000-09-29 13:30:53 +0000742 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000743 case MODE_List: {
744 if( p->cnt++==0 && p->showHeader ){
745 for(i=0; i<nArg; i++){
746 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
747 }
748 }
drh6a535342001-10-19 16:44:56 +0000749 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000750 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000751 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000752 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000753 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000754 if( i<nArg-1 ){
755 fprintf(p->out, "%s", p->separator);
756 }else if( p->mode==MODE_Semi ){
757 fprintf(p->out, ";\n");
758 }else{
759 fprintf(p->out, "\n");
760 }
drh75897232000-05-29 14:26:00 +0000761 }
762 break;
763 }
drh1e5d0e92000-05-31 23:33:17 +0000764 case MODE_Html: {
765 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000766 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000767 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000768 fprintf(p->out,"<TH>");
769 output_html_string(p->out, azCol[i]);
770 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000771 }
mihailim57c591a2008-06-23 21:26:05 +0000772 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000773 }
drh6a535342001-10-19 16:44:56 +0000774 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000775 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000776 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000777 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000778 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
mihailim57c591a2008-06-23 21:26:05 +0000779 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000780 }
mihailim57c591a2008-06-23 21:26:05 +0000781 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000782 break;
783 }
drhfeac5f82004-08-01 00:10:45 +0000784 case MODE_Tcl: {
785 if( p->cnt++==0 && p->showHeader ){
786 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000787 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhfeac5f82004-08-01 00:10:45 +0000788 fprintf(p->out, "%s", p->separator);
789 }
790 fprintf(p->out,"\n");
791 }
792 if( azArg==0 ) break;
793 for(i=0; i<nArg; i++){
794 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
795 fprintf(p->out, "%s", p->separator);
796 }
797 fprintf(p->out,"\n");
798 break;
799 }
drh8e64d1c2004-10-07 00:32:39 +0000800 case MODE_Csv: {
801 if( p->cnt++==0 && p->showHeader ){
802 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000803 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000804 }
805 fprintf(p->out,"\n");
806 }
807 if( azArg==0 ) break;
808 for(i=0; i<nArg; i++){
809 output_csv(p, azArg[i], i<nArg-1);
810 }
811 fprintf(p->out,"\n");
812 break;
813 }
drh28bd4bc2000-06-15 15:57:22 +0000814 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000815 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000816 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000817 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000818 for(i=0; i<nArg; i++){
819 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000820 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000821 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000822 }else if( aiType && aiType[i]==SQLITE_TEXT ){
823 if( zSep[0] ) fprintf(p->out,"%s",zSep);
824 output_quoted_string(p->out, azArg[i]);
825 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){
826 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +0000827 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
828 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
829 int nBlob = sqlite3_column_bytes(p->pStmt, i);
830 if( zSep[0] ) fprintf(p->out,"%s",zSep);
831 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +0000832 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000833 fprintf(p->out,"%s%s",zSep, azArg[i]);
834 }else{
835 if( zSep[0] ) fprintf(p->out,"%s",zSep);
836 output_quoted_string(p->out, azArg[i]);
837 }
838 }
839 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000840 break;
drh28bd4bc2000-06-15 15:57:22 +0000841 }
persicom1d0b8722002-04-18 02:53:04 +0000842 }
drh75897232000-05-29 14:26:00 +0000843 return 0;
844}
845
846/*
shane626a6e42009-10-22 17:30:15 +0000847** This is the callback routine that the SQLite library
848** invokes for each row of a query result.
849*/
850static int callback(void *pArg, int nArg, char **azArg, char **azCol){
851 /* since we don't have type info, call the shell_callback with a NULL value */
852 return shell_callback(pArg, nArg, azArg, azCol, NULL);
853}
854
855/*
drh33048c02001-10-01 14:29:22 +0000856** Set the destination table field of the callback_data structure to
857** the name of the table given. Escape any quote characters in the
858** table name.
859*/
860static void set_table_name(struct callback_data *p, const char *zName){
861 int i, n;
862 int needQuote;
863 char *z;
864
865 if( p->zDestTable ){
866 free(p->zDestTable);
867 p->zDestTable = 0;
868 }
869 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000870 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000871 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000872 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000873 needQuote = 1;
874 if( zName[i]=='\'' ) n++;
875 }
876 }
877 if( needQuote ) n += 2;
878 z = p->zDestTable = malloc( n+1 );
879 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +0000880 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +0000881 exit(1);
882 }
883 n = 0;
884 if( needQuote ) z[n++] = '\'';
885 for(i=0; zName[i]; i++){
886 z[n++] = zName[i];
887 if( zName[i]=='\'' ) z[n++] = '\'';
888 }
889 if( needQuote ) z[n++] = '\'';
890 z[n] = 0;
891}
892
danielk19772a02e332004-06-05 08:04:36 +0000893/* zIn is either a pointer to a NULL-terminated string in memory obtained
894** from malloc(), or a NULL pointer. The string pointed to by zAppend is
895** added to zIn, and the result returned in memory obtained from malloc().
896** zIn, if it was not NULL, is freed.
897**
898** If the third argument, quote, is not '\0', then it is used as a
899** quote character for zAppend.
900*/
drhc28490c2006-10-26 14:25:58 +0000901static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000902 int len;
903 int i;
drh4f21c4a2008-12-10 22:15:00 +0000904 int nAppend = strlen30(zAppend);
905 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +0000906
907 len = nAppend+nIn+1;
908 if( quote ){
909 len += 2;
910 for(i=0; i<nAppend; i++){
911 if( zAppend[i]==quote ) len++;
912 }
913 }
914
915 zIn = (char *)realloc(zIn, len);
916 if( !zIn ){
917 return 0;
918 }
919
920 if( quote ){
921 char *zCsr = &zIn[nIn];
922 *zCsr++ = quote;
923 for(i=0; i<nAppend; i++){
924 *zCsr++ = zAppend[i];
925 if( zAppend[i]==quote ) *zCsr++ = quote;
926 }
927 *zCsr++ = quote;
928 *zCsr++ = '\0';
929 assert( (zCsr-zIn)==len );
930 }else{
931 memcpy(&zIn[nIn], zAppend, nAppend);
932 zIn[len-1] = '\0';
933 }
934
935 return zIn;
936}
937
drhdd3d4592004-08-30 01:54:05 +0000938
939/*
940** Execute a query statement that has a single result column. Print
941** that result column on a line by itself with a semicolon terminator.
drh45e29d82006-11-20 16:21:10 +0000942**
943** This is used, for example, to show the schema of the database by
944** querying the SQLITE_MASTER table.
drhdd3d4592004-08-30 01:54:05 +0000945*/
drh157e29a2009-05-21 15:15:00 +0000946static int run_table_dump_query(
drh2f464a02011-10-13 00:41:49 +0000947 struct callback_data *p, /* Query context */
948 const char *zSelect, /* SELECT statement to extract content */
949 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +0000950){
drhdd3d4592004-08-30 01:54:05 +0000951 sqlite3_stmt *pSelect;
952 int rc;
drh2f464a02011-10-13 00:41:49 +0000953 rc = sqlite3_prepare(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +0000954 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +0000955 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
956 p->nErr++;
drhdd3d4592004-08-30 01:54:05 +0000957 return rc;
958 }
959 rc = sqlite3_step(pSelect);
960 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +0000961 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +0000962 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +0000963 zFirstRow = 0;
964 }
drh2f464a02011-10-13 00:41:49 +0000965 fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0));
drhdd3d4592004-08-30 01:54:05 +0000966 rc = sqlite3_step(pSelect);
967 }
drh2f464a02011-10-13 00:41:49 +0000968 rc = sqlite3_finalize(pSelect);
969 if( rc!=SQLITE_OK ){
970 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
971 p->nErr++;
972 }
973 return rc;
drhdd3d4592004-08-30 01:54:05 +0000974}
975
shane626a6e42009-10-22 17:30:15 +0000976/*
977** Allocate space and save off current error string.
978*/
979static char *save_err_msg(
980 sqlite3 *db /* Database to query */
981){
982 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
983 char *zErrMsg = sqlite3_malloc(nErrMsg);
984 if( zErrMsg ){
985 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
986 }
987 return zErrMsg;
988}
989
990/*
shaneh642d8b82010-07-28 16:05:34 +0000991** Display memory stats.
992*/
993static int display_stats(
994 sqlite3 *db, /* Database to query */
995 struct callback_data *pArg, /* Pointer to struct callback_data */
996 int bReset /* True to reset the stats */
997){
998 int iCur;
999 int iHiwtr;
1000
1001 if( pArg && pArg->out ){
1002
1003 iHiwtr = iCur = -1;
1004 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh29dfbe32010-07-28 17:01:24 +00001005 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001006 iHiwtr = iCur = -1;
1007 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh2a58e9c2010-12-21 21:28:38 +00001008 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001009/*
1010** Not currently used by the CLI.
1011** iHiwtr = iCur = -1;
1012** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1013** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr);
1014*/
1015 iHiwtr = iCur = -1;
1016 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1017 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1018/*
1019** Not currently used by the CLI.
1020** iHiwtr = iCur = -1;
1021** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1022** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr);
1023*/
1024 iHiwtr = iCur = -1;
1025 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1026 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr);
1027 iHiwtr = iCur = -1;
1028 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1029 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr);
1030 iHiwtr = iCur = -1;
1031 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1032 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr);
1033 iHiwtr = iCur = -1;
1034 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1035 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr);
1036#ifdef YYTRACKMAXSTACKDEPTH
1037 iHiwtr = iCur = -1;
1038 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1039 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr);
1040#endif
1041 }
1042
1043 if( pArg && pArg->out && db ){
1044 iHiwtr = iCur = -1;
1045 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset);
1046 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
drh2a58e9c2010-12-21 21:28:38 +00001047 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset);
1048 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1049 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1050 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1051 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1052 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001053 iHiwtr = iCur = -1;
1054 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drhc78e6e42011-09-23 18:58:23 +00001055 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1056 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1057 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1058 iHiwtr = iCur = -1;
1059 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1060 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001061 iHiwtr = iCur = -1;
1062 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1063 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1064 iHiwtr = iCur = -1;
1065 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1066 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1067 }
1068
1069 if( pArg && pArg->out && db && pArg->pStmt ){
1070 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset);
1071 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1072 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1073 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1074 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset);
1075 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1076 }
1077
1078 return 0;
1079}
1080
1081/*
shane626a6e42009-10-22 17:30:15 +00001082** Execute a statement or set of statements. Print
1083** any result rows/columns depending on the current mode
1084** set via the supplied callback.
1085**
1086** This is very similar to SQLite's built-in sqlite3_exec()
1087** function except it takes a slightly different callback
1088** and callback data argument.
1089*/
1090static int shell_exec(
1091 sqlite3 *db, /* An open database */
1092 const char *zSql, /* SQL to be evaluated */
1093 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1094 /* (not the same as sqlite3_exec) */
1095 struct callback_data *pArg, /* Pointer to struct callback_data */
1096 char **pzErrMsg /* Error msg written here */
1097){
dan4564ced2010-01-05 04:59:56 +00001098 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1099 int rc = SQLITE_OK; /* Return Code */
1100 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001101
1102 if( pzErrMsg ){
1103 *pzErrMsg = NULL;
1104 }
1105
shaneb9fc17d2009-10-22 21:23:35 +00001106 while( zSql[0] && (SQLITE_OK == rc) ){
1107 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1108 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001109 if( pzErrMsg ){
1110 *pzErrMsg = save_err_msg(db);
1111 }
1112 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001113 if( !pStmt ){
1114 /* this happens for a comment or white-space */
1115 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001116 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001117 continue;
1118 }
shane626a6e42009-10-22 17:30:15 +00001119
shaneh642d8b82010-07-28 16:05:34 +00001120 /* save off the prepared statment handle and reset row count */
1121 if( pArg ){
1122 pArg->pStmt = pStmt;
1123 pArg->cnt = 0;
1124 }
1125
shanehb7977c52010-01-18 18:17:10 +00001126 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001127 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001128 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001129 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001130 }
shanehb7977c52010-01-18 18:17:10 +00001131
shaneb9fc17d2009-10-22 21:23:35 +00001132 /* perform the first step. this will tell us if we
1133 ** have a result set or not and how wide it is.
1134 */
1135 rc = sqlite3_step(pStmt);
1136 /* if we have a result set... */
1137 if( SQLITE_ROW == rc ){
1138 /* if we have a callback... */
1139 if( xCallback ){
1140 /* allocate space for col name ptr, value ptr, and type */
1141 int nCol = sqlite3_column_count(pStmt);
1142 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1143 if( !pData ){
1144 rc = SQLITE_NOMEM;
1145 }else{
1146 char **azCols = (char **)pData; /* Names of result columns */
1147 char **azVals = &azCols[nCol]; /* Results */
1148 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1149 int i;
1150 assert(sizeof(int) <= sizeof(char *));
1151 /* save off ptrs to column names */
1152 for(i=0; i<nCol; i++){
1153 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1154 }
shaneb9fc17d2009-10-22 21:23:35 +00001155 do{
1156 /* extract the data and data types */
1157 for(i=0; i<nCol; i++){
1158 azVals[i] = (char *)sqlite3_column_text(pStmt, i);
1159 aiTypes[i] = sqlite3_column_type(pStmt, i);
1160 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1161 rc = SQLITE_NOMEM;
1162 break; /* from for */
1163 }
1164 } /* end for */
1165
1166 /* if data and types extracted successfully... */
1167 if( SQLITE_ROW == rc ){
1168 /* call the supplied callback with the result row data */
1169 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1170 rc = SQLITE_ABORT;
1171 }else{
1172 rc = sqlite3_step(pStmt);
1173 }
1174 }
1175 } while( SQLITE_ROW == rc );
1176 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001177 }
1178 }else{
1179 do{
1180 rc = sqlite3_step(pStmt);
1181 } while( rc == SQLITE_ROW );
1182 }
1183 }
1184
shaneh642d8b82010-07-28 16:05:34 +00001185 /* print usage stats if stats on */
1186 if( pArg && pArg->statsOn ){
1187 display_stats(db, pArg, 0);
1188 }
1189
dan4564ced2010-01-05 04:59:56 +00001190 /* Finalize the statement just executed. If this fails, save a
1191 ** copy of the error message. Otherwise, set zSql to point to the
1192 ** next statement to execute. */
1193 rc = sqlite3_finalize(pStmt);
1194 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001195 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001196 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001197 }else if( pzErrMsg ){
1198 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001199 }
shaneh642d8b82010-07-28 16:05:34 +00001200
1201 /* clear saved stmt handle */
1202 if( pArg ){
1203 pArg->pStmt = NULL;
1204 }
shane626a6e42009-10-22 17:30:15 +00001205 }
shaneb9fc17d2009-10-22 21:23:35 +00001206 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001207
1208 return rc;
1209}
1210
drhdd3d4592004-08-30 01:54:05 +00001211
drh33048c02001-10-01 14:29:22 +00001212/*
drh4c653a02000-06-07 01:27:47 +00001213** This is a different callback routine used for dumping the database.
1214** Each row received by this callback consists of a table name,
1215** the table type ("index" or "table") and SQL to create the table.
1216** This routine should print text sufficient to recreate the table.
1217*/
1218static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001219 int rc;
1220 const char *zTable;
1221 const char *zType;
1222 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001223 const char *zPrepStmt = 0;
drhdaffd0e2001-04-11 14:28:42 +00001224 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001225
drh902b9ee2008-12-05 17:17:07 +00001226 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001227 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001228 zTable = azArg[0];
1229 zType = azArg[1];
1230 zSql = azArg[2];
1231
drh00b950d2005-09-11 02:03:03 +00001232 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001233 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh00b950d2005-09-11 02:03:03 +00001234 }else if( strcmp(zTable, "sqlite_stat1")==0 ){
1235 fprintf(p->out, "ANALYZE sqlite_master;\n");
1236 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1237 return 0;
drh45e29d82006-11-20 16:21:10 +00001238 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1239 char *zIns;
1240 if( !p->writableSchema ){
1241 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1242 p->writableSchema = 1;
1243 }
1244 zIns = sqlite3_mprintf(
1245 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1246 "VALUES('table','%q','%q',0,'%q');",
1247 zTable, zTable, zSql);
1248 fprintf(p->out, "%s\n", zIns);
1249 sqlite3_free(zIns);
1250 return 0;
drh00b950d2005-09-11 02:03:03 +00001251 }else{
1252 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001253 }
danielk19772a02e332004-06-05 08:04:36 +00001254
1255 if( strcmp(zType, "table")==0 ){
1256 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001257 char *zSelect = 0;
1258 char *zTableInfo = 0;
1259 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001260 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001261
1262 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1263 zTableInfo = appendText(zTableInfo, zTable, '"');
1264 zTableInfo = appendText(zTableInfo, ");", 0);
1265
1266 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001267 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001268 if( rc!=SQLITE_OK || !pTableInfo ){
1269 return 1;
1270 }
1271
1272 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1273 zTmp = appendText(zTmp, zTable, '"');
1274 if( zTmp ){
1275 zSelect = appendText(zSelect, zTmp, '\'');
1276 }
1277 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1278 rc = sqlite3_step(pTableInfo);
1279 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001280 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001281 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001282 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001283 rc = sqlite3_step(pTableInfo);
1284 if( rc==SQLITE_ROW ){
drh45e29d82006-11-20 16:21:10 +00001285 zSelect = appendText(zSelect, ") || ',' || ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001286 }else{
1287 zSelect = appendText(zSelect, ") ", 0);
1288 }
drh157e29a2009-05-21 15:15:00 +00001289 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001290 }
1291 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001292 if( rc!=SQLITE_OK || nRow==0 ){
1293 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001294 return 1;
1295 }
1296 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1297 zSelect = appendText(zSelect, zTable, '"');
1298
drh2f464a02011-10-13 00:41:49 +00001299 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001300 if( rc==SQLITE_CORRUPT ){
1301 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001302 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001303 }
danielk19772a02e332004-06-05 08:04:36 +00001304 if( zSelect ) free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001305 }
drh4c653a02000-06-07 01:27:47 +00001306 return 0;
1307}
1308
1309/*
drh45e29d82006-11-20 16:21:10 +00001310** Run zQuery. Use dump_callback() as the callback routine so that
1311** the contents of the query are output as SQL statements.
1312**
drhdd3d4592004-08-30 01:54:05 +00001313** If we get a SQLITE_CORRUPT error, rerun the query after appending
1314** "ORDER BY rowid DESC" to the end.
1315*/
1316static int run_schema_dump_query(
1317 struct callback_data *p,
drh2f464a02011-10-13 00:41:49 +00001318 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001319){
1320 int rc;
drh2f464a02011-10-13 00:41:49 +00001321 char *zErr = 0;
1322 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001323 if( rc==SQLITE_CORRUPT ){
1324 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001325 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001326 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1327 if( zErr ){
1328 fprintf(p->out, "/****** %s ******/\n", zErr);
1329 sqlite3_free(zErr);
1330 zErr = 0;
1331 }
drhdd3d4592004-08-30 01:54:05 +00001332 zQ2 = malloc( len+100 );
1333 if( zQ2==0 ) return rc;
drh5bb3eb92007-05-04 13:15:55 +00001334 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001335 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1336 if( rc ){
1337 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1338 }else{
1339 rc = SQLITE_CORRUPT;
1340 }
1341 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001342 free(zQ2);
1343 }
1344 return rc;
1345}
1346
1347/*
drh75897232000-05-29 14:26:00 +00001348** Text of a help message
1349*/
persicom1d0b8722002-04-18 02:53:04 +00001350static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001351 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh20f99c42007-01-08 14:31:35 +00001352 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +00001353 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +00001354 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001355 " If TABLE specified, only dump tables matching\n"
1356 " LIKE pattern TABLE.\n"
drhdaffd0e2001-04-11 14:28:42 +00001357 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +00001358 ".exit Exit this program\n"
shanehe2aa9d72009-11-06 17:20:17 +00001359 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n"
1360 " With no args, it turns EXPLAIN on.\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001361 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001362 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001363 ".import FILE TABLE Import data from FILE into TABLE\n"
shane86f5bdb2009-10-24 02:00:07 +00001364 ".indices ?TABLE? Show names of all indices\n"
1365 " If TABLE specified, only show indices for tables\n"
1366 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001367#ifdef SQLITE_ENABLE_IOTRACE
1368 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1369#endif
drh70df4fe2006-06-13 15:12:21 +00001370#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001371 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001372#endif
drh127f9d72010-02-23 01:47:00 +00001373 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001374 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +00001375 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001376 " column Left-aligned columns. (See .width)\n"
1377 " html HTML <table> code\n"
1378 " insert SQL insert statements for TABLE\n"
1379 " line One value per line\n"
1380 " list Values delimited by .separator string\n"
1381 " tabs Tab-separated values\n"
1382 " tcl TCL list elements\n"
1383 ".nullvalue STRING Print STRING in place of NULL values\n"
drh75897232000-05-29 14:26:00 +00001384 ".output FILENAME Send output to FILENAME\n"
1385 ".output stdout Send output to the screen\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001386 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001387 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001388 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001389 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh75897232000-05-29 14:26:00 +00001390 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001391 " If TABLE specified, only show tables matching\n"
1392 " LIKE pattern TABLE.\n"
drhb860bc92004-08-04 15:16:55 +00001393 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +00001394 ".show Show the current values for various settings\n"
shaneh642d8b82010-07-28 16:05:34 +00001395 ".stats ON|OFF Turn stats on or off\n"
shane86f5bdb2009-10-24 02:00:07 +00001396 ".tables ?TABLE? List names of tables\n"
1397 " If TABLE specified, only list tables matching\n"
1398 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001399 ".timeout MS Try opening locked tables for MS milliseconds\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;
1765 i = 0;
drhb860bc92004-08-04 15:16:55 +00001766 lineno++;
drhfeac5f82004-08-01 00:10:45 +00001767 azCol[0] = zLine;
drh36d4e972004-10-06 14:39:06 +00001768 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
drhfeac5f82004-08-01 00:10:45 +00001769 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1770 *z = 0;
1771 i++;
drhb860bc92004-08-04 15:16:55 +00001772 if( i<nCol ){
1773 azCol[i] = &z[nSep];
1774 z += nSep-1;
1775 }
drhfeac5f82004-08-01 00:10:45 +00001776 }
shane916f9612009-10-23 00:37:15 +00001777 } /* end for */
drh1cd7f832005-08-05 18:50:51 +00001778 *z = 0;
drhb860bc92004-08-04 15:16:55 +00001779 if( i+1!=nCol ){
shane916f9612009-10-23 00:37:15 +00001780 fprintf(stderr,
1781 "Error: %s line %d: expected %d columns of data but found %d\n",
1782 zFile, lineno, nCol, i+1);
drhb860bc92004-08-04 15:16:55 +00001783 zCommit = "ROLLBACK";
drh1822eee2008-12-04 12:26:00 +00001784 free(zLine);
shane916f9612009-10-23 00:37:15 +00001785 rc = 1;
1786 break; /* from while */
drhb860bc92004-08-04 15:16:55 +00001787 }
drhfeac5f82004-08-01 00:10:45 +00001788 for(i=0; i<nCol; i++){
1789 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
1790 }
1791 sqlite3_step(pStmt);
1792 rc = sqlite3_reset(pStmt);
1793 free(zLine);
1794 if( rc!=SQLITE_OK ){
1795 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1796 zCommit = "ROLLBACK";
drh47ad6842006-11-08 12:25:42 +00001797 rc = 1;
shane916f9612009-10-23 00:37:15 +00001798 break; /* from while */
drhfeac5f82004-08-01 00:10:45 +00001799 }
shane916f9612009-10-23 00:37:15 +00001800 } /* end while */
drhfeac5f82004-08-01 00:10:45 +00001801 free(azCol);
1802 fclose(in);
1803 sqlite3_finalize(pStmt);
drhb860bc92004-08-04 15:16:55 +00001804 sqlite3_exec(p->db, zCommit, 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00001805 }else
1806
shanehe2aa9d72009-11-06 17:20:17 +00001807 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00001808 struct callback_data data;
1809 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00001810 open_db(p);
drh75897232000-05-29 14:26:00 +00001811 memcpy(&data, p, sizeof(data));
1812 data.showHeader = 0;
1813 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00001814 if( nArg==1 ){
1815 rc = sqlite3_exec(p->db,
1816 "SELECT name FROM sqlite_master "
1817 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
1818 "UNION ALL "
1819 "SELECT name FROM sqlite_temp_master "
1820 "WHERE type='index' "
1821 "ORDER BY 1",
1822 callback, &data, &zErrMsg
1823 );
1824 }else{
1825 zShellStatic = azArg[1];
1826 rc = sqlite3_exec(p->db,
1827 "SELECT name FROM sqlite_master "
1828 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1829 "UNION ALL "
1830 "SELECT name FROM sqlite_temp_master "
1831 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1832 "ORDER BY 1",
1833 callback, &data, &zErrMsg
1834 );
1835 zShellStatic = 0;
1836 }
drh75897232000-05-29 14:26:00 +00001837 if( zErrMsg ){
1838 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001839 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00001840 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00001841 }else if( rc != SQLITE_OK ){
1842 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
1843 rc = 1;
drh75897232000-05-29 14:26:00 +00001844 }
1845 }else
1846
drhae5e4452007-05-03 17:18:36 +00001847#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00001848 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00001849 extern void (*sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00001850 if( iotrace && iotrace!=stdout ) fclose(iotrace);
1851 iotrace = 0;
1852 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00001853 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00001854 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00001855 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00001856 iotrace = stdout;
1857 }else{
1858 iotrace = fopen(azArg[1], "w");
1859 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00001860 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00001861 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00001862 rc = 1;
drhb0603412007-02-28 04:47:26 +00001863 }else{
mlcreech3a00f902008-03-04 17:45:01 +00001864 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00001865 }
1866 }
1867 }else
drhae5e4452007-05-03 17:18:36 +00001868#endif
drhb0603412007-02-28 04:47:26 +00001869
drh70df4fe2006-06-13 15:12:21 +00001870#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001871 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
1872 const char *zFile, *zProc;
1873 char *zErrMsg = 0;
drh1e397f82006-06-08 15:28:43 +00001874 zFile = azArg[1];
1875 zProc = nArg>=3 ? azArg[2] : 0;
1876 open_db(p);
1877 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
1878 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00001879 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00001880 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00001881 rc = 1;
drh1e397f82006-06-08 15:28:43 +00001882 }
1883 }else
drh70df4fe2006-06-13 15:12:21 +00001884#endif
drh1e397f82006-06-08 15:28:43 +00001885
drhc8ba2122011-03-23 11:16:22 +00001886 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){
drh127f9d72010-02-23 01:47:00 +00001887 const char *zFile = azArg[1];
1888 if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){
1889 fclose(p->pLog);
1890 p->pLog = 0;
1891 }
1892 if( strcmp(zFile,"stdout")==0 ){
1893 p->pLog = stdout;
1894 }else if( strcmp(zFile, "stderr")==0 ){
1895 p->pLog = stderr;
1896 }else if( strcmp(zFile, "off")==0 ){
1897 p->pLog = 0;
1898 }else{
1899 p->pLog = fopen(zFile, "w");
1900 if( p->pLog==0 ){
1901 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1902 }
1903 }
1904 }else
1905
shanehe2aa9d72009-11-06 17:20:17 +00001906 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){
drh4f21c4a2008-12-10 22:15:00 +00001907 int n2 = strlen30(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00001908 if( (n2==4 && strncmp(azArg[1],"line",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00001909 ||
shanehe2aa9d72009-11-06 17:20:17 +00001910 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){
drh75897232000-05-29 14:26:00 +00001911 p->mode = MODE_Line;
shanehe2aa9d72009-11-06 17:20:17 +00001912 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0)
persicom7e2dfdd2002-04-18 02:46:52 +00001913 ||
shanehe2aa9d72009-11-06 17:20:17 +00001914 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
drh75897232000-05-29 14:26:00 +00001915 p->mode = MODE_Column;
shanehe2aa9d72009-11-06 17:20:17 +00001916 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00001917 p->mode = MODE_List;
shanehe2aa9d72009-11-06 17:20:17 +00001918 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00001919 p->mode = MODE_Html;
shanehe2aa9d72009-11-06 17:20:17 +00001920 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00001921 p->mode = MODE_Tcl;
shanehe2aa9d72009-11-06 17:20:17 +00001922 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00001923 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00001924 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
shanehe2aa9d72009-11-06 17:20:17 +00001925 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00001926 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00001927 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
shanehe2aa9d72009-11-06 17:20:17 +00001928 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00001929 p->mode = MODE_Insert;
shanehe2aa9d72009-11-06 17:20:17 +00001930 set_table_name(p, "table");
drhdaffd0e2001-04-11 14:28:42 +00001931 }else {
shane9bd1b442009-10-23 01:27:39 +00001932 fprintf(stderr,"Error: mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00001933 "column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00001934 rc = 1;
drh75897232000-05-29 14:26:00 +00001935 }
1936 }else
1937
shanehe2aa9d72009-11-06 17:20:17 +00001938 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){
1939 int n2 = strlen30(azArg[1]);
1940 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){
1941 p->mode = MODE_Insert;
1942 set_table_name(p, azArg[2]);
1943 }else {
1944 fprintf(stderr, "Error: invalid arguments: "
1945 " \"%s\". Enter \".help\" for help\n", azArg[2]);
1946 rc = 1;
1947 }
1948 }else
1949
persicom7e2dfdd2002-04-18 02:46:52 +00001950 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00001951 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
1952 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00001953 }else
1954
drh75897232000-05-29 14:26:00 +00001955 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
1956 if( p->out!=stdout ){
1957 fclose(p->out);
1958 }
1959 if( strcmp(azArg[1],"stdout")==0 ){
1960 p->out = stdout;
drh5bb3eb92007-05-04 13:15:55 +00001961 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
drh75897232000-05-29 14:26:00 +00001962 }else{
drha1f9b5e2004-02-14 16:31:02 +00001963 p->out = fopen(azArg[1], "wb");
drh75897232000-05-29 14:26:00 +00001964 if( p->out==0 ){
shane9bd1b442009-10-23 01:27:39 +00001965 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]);
drh75897232000-05-29 14:26:00 +00001966 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00001967 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00001968 } else {
drh5bb3eb92007-05-04 13:15:55 +00001969 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00001970 }
1971 }
1972 }else
1973
drhdd45df82002-04-18 12:39:03 +00001974 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00001975 if( nArg >= 2) {
1976 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
1977 }
1978 if( nArg >= 3) {
1979 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
1980 }
1981 }else
1982
shanehe2aa9d72009-11-06 17:20:17 +00001983 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){
drh47ad6842006-11-08 12:25:42 +00001984 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00001985 }else
1986
drh9ff849f2009-02-04 20:55:57 +00001987 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00001988 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00001989 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00001990 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
1991 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00001992 }else{
shane9bd1b442009-10-23 01:27:39 +00001993 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00001994 fclose(alt);
1995 }
1996 }else
1997
shanehe2aa9d72009-11-06 17:20:17 +00001998 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){
drh9ff849f2009-02-04 20:55:57 +00001999 const char *zSrcFile;
2000 const char *zDb;
2001 sqlite3 *pSrc;
2002 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00002003 int nTimeout = 0;
2004
drh9ff849f2009-02-04 20:55:57 +00002005 if( nArg==2 ){
2006 zSrcFile = azArg[1];
2007 zDb = "main";
2008 }else{
2009 zSrcFile = azArg[2];
2010 zDb = azArg[1];
2011 }
2012 rc = sqlite3_open(zSrcFile, &pSrc);
2013 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002014 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00002015 sqlite3_close(pSrc);
2016 return 1;
2017 }
drhdc2c4912009-02-04 22:46:47 +00002018 open_db(p);
drh9ff849f2009-02-04 20:55:57 +00002019 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
2020 if( pBackup==0 ){
2021 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2022 sqlite3_close(pSrc);
2023 return 1;
2024 }
drhdc2c4912009-02-04 22:46:47 +00002025 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
2026 || rc==SQLITE_BUSY ){
2027 if( rc==SQLITE_BUSY ){
2028 if( nTimeout++ >= 3 ) break;
2029 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00002030 }
2031 }
2032 sqlite3_backup_finish(pBackup);
2033 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002034 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00002035 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00002036 fprintf(stderr, "Error: source database is busy\n");
2037 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002038 }else{
2039 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00002040 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002041 }
2042 sqlite3_close(pSrc);
2043 }else
2044
shanehe2aa9d72009-11-06 17:20:17 +00002045 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
drh75897232000-05-29 14:26:00 +00002046 struct callback_data data;
2047 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00002048 open_db(p);
drh75897232000-05-29 14:26:00 +00002049 memcpy(&data, p, sizeof(data));
2050 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00002051 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00002052 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00002053 int i;
drhf0693c82011-10-11 20:41:54 +00002054 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00002055 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00002056 char *new_argv[2], *new_colv[2];
2057 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2058 " type text,\n"
2059 " name text,\n"
2060 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00002061 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00002062 " sql text\n"
2063 ")";
2064 new_argv[1] = 0;
2065 new_colv[0] = "sql";
2066 new_colv[1] = 0;
2067 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002068 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00002069 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00002070 char *new_argv[2], *new_colv[2];
2071 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
2072 " type text,\n"
2073 " name text,\n"
2074 " tbl_name text,\n"
2075 " rootpage integer,\n"
2076 " sql text\n"
2077 ")";
2078 new_argv[1] = 0;
2079 new_colv[0] = "sql";
2080 new_colv[1] = 0;
2081 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00002082 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00002083 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00002084 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00002085 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00002086 "SELECT sql FROM "
drh8f800a72009-01-14 23:17:55 +00002087 " (SELECT sql sql, type type, tbl_name tbl_name, name name"
2088 " FROM sqlite_master UNION ALL"
2089 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) "
danielk1977bc6ada42004-06-30 08:20:16 +00002090 "WHERE tbl_name LIKE shellstatic() 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 },
2224 { "pghdrsz", SQLITE_TESTCTRL_PGHDRSZ },
2225 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
2226 };
shaneh96887e12011-02-10 21:08:58 +00002227 int testctrl = -1;
2228 int rc = 0;
drhd416fe72011-03-17 16:45:50 +00002229 int i, n;
shaneh96887e12011-02-10 21:08:58 +00002230 open_db(p);
2231
drhd416fe72011-03-17 16:45:50 +00002232 /* convert testctrl text option to value. allow any unique prefix
2233 ** of the option name, or a numerical value. */
shanehcef83682011-04-07 03:41:01 +00002234 n = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00002235 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
drhd416fe72011-03-17 16:45:50 +00002236 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2237 if( testctrl<0 ){
2238 testctrl = aCtrl[i].ctrlCode;
2239 }else{
2240 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[i]);
2241 testctrl = -1;
2242 break;
2243 }
2244 }
2245 }
2246 if( testctrl<0 ) testctrl = atoi(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002247 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2248 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2249 }else{
2250 switch(testctrl){
2251
2252 /* sqlite3_test_control(int, db, int) */
2253 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2254 case SQLITE_TESTCTRL_RESERVE:
2255 if( nArg==3 ){
2256 int opt = (int)strtol(azArg[2], 0, 0);
2257 rc = sqlite3_test_control(testctrl, p->db, opt);
2258 printf("%d (0x%08x)\n", rc, rc);
2259 } else {
drhd416fe72011-03-17 16:45:50 +00002260 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2261 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002262 }
2263 break;
2264
2265 /* sqlite3_test_control(int) */
2266 case SQLITE_TESTCTRL_PRNG_SAVE:
2267 case SQLITE_TESTCTRL_PRNG_RESTORE:
2268 case SQLITE_TESTCTRL_PRNG_RESET:
2269 case SQLITE_TESTCTRL_PGHDRSZ:
2270 if( nArg==2 ){
2271 rc = sqlite3_test_control(testctrl);
2272 printf("%d (0x%08x)\n", rc, rc);
2273 } else {
2274 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2275 }
2276 break;
2277
2278 /* sqlite3_test_control(int, uint) */
2279 case SQLITE_TESTCTRL_PENDING_BYTE:
2280 if( nArg==3 ){
2281 unsigned int opt = (unsigned int)atoi(azArg[2]);
2282 rc = sqlite3_test_control(testctrl, opt);
2283 printf("%d (0x%08x)\n", rc, rc);
2284 } else {
drhd416fe72011-03-17 16:45:50 +00002285 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2286 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002287 }
2288 break;
2289
2290 /* sqlite3_test_control(int, int) */
2291 case SQLITE_TESTCTRL_ASSERT:
2292 case SQLITE_TESTCTRL_ALWAYS:
2293 if( nArg==3 ){
2294 int opt = atoi(azArg[2]);
2295 rc = sqlite3_test_control(testctrl, opt);
2296 printf("%d (0x%08x)\n", rc, rc);
2297 } else {
drhd416fe72011-03-17 16:45:50 +00002298 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2299 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002300 }
2301 break;
2302
2303 /* sqlite3_test_control(int, char *) */
2304#ifdef SQLITE_N_KEYWORD
2305 case SQLITE_TESTCTRL_ISKEYWORD:
2306 if( nArg==3 ){
2307 const char *opt = azArg[2];
2308 rc = sqlite3_test_control(testctrl, opt);
2309 printf("%d (0x%08x)\n", rc, rc);
2310 } else {
drhd416fe72011-03-17 16:45:50 +00002311 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2312 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002313 }
2314 break;
2315#endif
2316
2317 case SQLITE_TESTCTRL_BITVEC_TEST:
2318 case SQLITE_TESTCTRL_FAULT_INSTALL:
2319 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2320 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2321 default:
drhd416fe72011-03-17 16:45:50 +00002322 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2323 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00002324 break;
2325 }
2326 }
2327 }else
2328
shanehe2aa9d72009-11-06 17:20:17 +00002329 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
drh44c2eb12003-04-30 11:38:26 +00002330 open_db(p);
danielk19776f8a5032004-05-10 10:34:51 +00002331 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
shanehe2aa9d72009-11-06 17:20:17 +00002332 }else
2333
drhd416fe72011-03-17 16:45:50 +00002334 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0
2335 && nArg==2
2336 ){
drh3b1a9882007-11-02 12:53:03 +00002337 enableTimer = booleanValue(azArg[1]);
shanehe2aa9d72009-11-06 17:20:17 +00002338 }else
2339
drh9fd301b2011-06-03 13:28:22 +00002340 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
2341 printf("SQLite %s %s\n",
2342 sqlite3_libversion(), sqlite3_sourceid());
2343 }else
2344
shanehe2aa9d72009-11-06 17:20:17 +00002345 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){
drh75897232000-05-29 14:26:00 +00002346 int j;
drh43617e92006-03-06 20:55:46 +00002347 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00002348 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
2349 p->colWidth[j-1] = atoi(azArg[j]);
2350 }
2351 }else
2352
2353 {
shane9bd1b442009-10-23 01:27:39 +00002354 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00002355 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00002356 rc = 1;
drh75897232000-05-29 14:26:00 +00002357 }
drh67505e72002-04-19 12:34:06 +00002358
2359 return rc;
drh75897232000-05-29 14:26:00 +00002360}
2361
drh67505e72002-04-19 12:34:06 +00002362/*
drh91a66392007-09-07 01:12:32 +00002363** Return TRUE if a semicolon occurs anywhere in the first N characters
2364** of string z[].
drh324ccef2003-02-05 14:06:20 +00002365*/
drh91a66392007-09-07 01:12:32 +00002366static int _contains_semicolon(const char *z, int N){
2367 int i;
2368 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2369 return 0;
drh324ccef2003-02-05 14:06:20 +00002370}
2371
2372/*
drh70c7a4b2003-04-26 03:03:06 +00002373** Test to see if a line consists entirely of whitespace.
2374*/
2375static int _all_whitespace(const char *z){
2376 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00002377 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00002378 if( *z=='/' && z[1]=='*' ){
2379 z += 2;
2380 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2381 if( *z==0 ) return 0;
2382 z++;
2383 continue;
2384 }
2385 if( *z=='-' && z[1]=='-' ){
2386 z += 2;
2387 while( *z && *z!='\n' ){ z++; }
2388 if( *z==0 ) return 1;
2389 continue;
2390 }
2391 return 0;
2392 }
2393 return 1;
2394}
2395
2396/*
drha9b17162003-04-29 18:01:28 +00002397** Return TRUE if the line typed in is an SQL command terminator other
2398** than a semi-colon. The SQL Server style "go" command is understood
2399** as is the Oracle "/".
2400*/
2401static int _is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00002402 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00002403 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2404 return 1; /* Oracle */
2405 }
drhf0693c82011-10-11 20:41:54 +00002406 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00002407 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00002408 return 1; /* SQL Server */
2409 }
2410 return 0;
2411}
2412
2413/*
drh233a5312008-12-18 22:25:13 +00002414** Return true if zSql is a complete SQL statement. Return false if it
2415** ends in the middle of a string literal or C-style comment.
2416*/
2417static int _is_complete(char *zSql, int nSql){
2418 int rc;
2419 if( zSql==0 ) return 1;
2420 zSql[nSql] = ';';
2421 zSql[nSql+1] = 0;
2422 rc = sqlite3_complete(zSql);
2423 zSql[nSql] = 0;
2424 return rc;
2425}
2426
2427/*
drh67505e72002-04-19 12:34:06 +00002428** Read input from *in and process it. If *in==0 then input
2429** is interactive - the user is typing it it. Otherwise, input
2430** is coming from a file or device. A prompt is issued and history
2431** is saved only if input is interactive. An interrupt signal will
2432** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00002433**
2434** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00002435*/
drhc28490c2006-10-26 14:25:58 +00002436static int process_input(struct callback_data *p, FILE *in){
danielk19772ac27622007-07-03 05:31:16 +00002437 char *zLine = 0;
drhdaffd0e2001-04-11 14:28:42 +00002438 char *zSql = 0;
2439 int nSql = 0;
drh91a66392007-09-07 01:12:32 +00002440 int nSqlPrior = 0;
drhdaffd0e2001-04-11 14:28:42 +00002441 char *zErrMsg;
drhc49f44e2006-10-26 18:15:42 +00002442 int rc;
2443 int errCnt = 0;
drhc28490c2006-10-26 14:25:58 +00002444 int lineno = 0;
2445 int startline = 0;
drhc49f44e2006-10-26 18:15:42 +00002446
2447 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
2448 fflush(p->out);
danielk19772ac27622007-07-03 05:31:16 +00002449 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002450 zLine = one_input_line(zSql, in);
2451 if( zLine==0 ){
2452 break; /* We have reached EOF */
2453 }
drh67505e72002-04-19 12:34:06 +00002454 if( seenInterrupt ){
2455 if( in!=0 ) break;
2456 seenInterrupt = 0;
2457 }
drhc28490c2006-10-26 14:25:58 +00002458 lineno++;
drhf817b6b2003-06-16 00:16:41 +00002459 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00002460 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00002461 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00002462 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00002463 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00002464 break;
2465 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00002466 errCnt++;
2467 }
drhdaffd0e2001-04-11 14:28:42 +00002468 continue;
2469 }
drh233a5312008-12-18 22:25:13 +00002470 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00002471 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00002472 }
drh91a66392007-09-07 01:12:32 +00002473 nSqlPrior = nSql;
drhdaffd0e2001-04-11 14:28:42 +00002474 if( zSql==0 ){
2475 int i;
drhf0693c82011-10-11 20:41:54 +00002476 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drhdaffd0e2001-04-11 14:28:42 +00002477 if( zLine[i]!=0 ){
drh4f21c4a2008-12-10 22:15:00 +00002478 nSql = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002479 zSql = malloc( nSql+3 );
drhc1f44942006-05-10 14:39:13 +00002480 if( zSql==0 ){
shane9bd1b442009-10-23 01:27:39 +00002481 fprintf(stderr, "Error: out of memory\n");
drhc1f44942006-05-10 14:39:13 +00002482 exit(1);
2483 }
drh5bb3eb92007-05-04 13:15:55 +00002484 memcpy(zSql, zLine, nSql+1);
drhc28490c2006-10-26 14:25:58 +00002485 startline = lineno;
drhdaffd0e2001-04-11 14:28:42 +00002486 }
2487 }else{
drh4f21c4a2008-12-10 22:15:00 +00002488 int len = strlen30(zLine);
drh233a5312008-12-18 22:25:13 +00002489 zSql = realloc( zSql, nSql + len + 4 );
drhdaffd0e2001-04-11 14:28:42 +00002490 if( zSql==0 ){
shane9bd1b442009-10-23 01:27:39 +00002491 fprintf(stderr,"Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00002492 exit(1);
2493 }
drh5bb3eb92007-05-04 13:15:55 +00002494 zSql[nSql++] = '\n';
2495 memcpy(&zSql[nSql], zLine, len+1);
drhdaffd0e2001-04-11 14:28:42 +00002496 nSql += len;
2497 }
drh91a66392007-09-07 01:12:32 +00002498 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
2499 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00002500 p->cnt = 0;
drh44c2eb12003-04-30 11:38:26 +00002501 open_db(p);
drh3b1a9882007-11-02 12:53:03 +00002502 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00002503 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00002504 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00002505 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00002506 char zPrefix[100];
2507 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00002508 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00002509 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00002510 }else{
shane9bd1b442009-10-23 01:27:39 +00002511 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00002512 }
drh7f953e22002-07-13 17:33:45 +00002513 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00002514 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002515 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00002516 zErrMsg = 0;
2517 }else{
shaned2bed1c2009-10-21 03:56:54 +00002518 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00002519 }
drhc49f44e2006-10-26 18:15:42 +00002520 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00002521 }
2522 free(zSql);
2523 zSql = 0;
2524 nSql = 0;
2525 }
2526 }
2527 if( zSql ){
drhd416fe72011-03-17 16:45:50 +00002528 if( !_all_whitespace(zSql) ){
2529 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
2530 }
drhdaffd0e2001-04-11 14:28:42 +00002531 free(zSql);
2532 }
danielk19772ac27622007-07-03 05:31:16 +00002533 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00002534 return errCnt;
drhdaffd0e2001-04-11 14:28:42 +00002535}
2536
drh67505e72002-04-19 12:34:06 +00002537/*
2538** Return a pathname which is the user's home directory. A
2539** 0 return indicates an error of some kind. Space to hold the
2540** resulting string is obtained from malloc(). The calling
2541** function should free the result.
2542*/
2543static char *find_home_dir(void){
2544 char *home_dir = NULL;
persicom7e2dfdd2002-04-18 02:46:52 +00002545
chw97185482008-11-17 08:05:31 +00002546#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL)
drh67505e72002-04-19 12:34:06 +00002547 struct passwd *pwent;
2548 uid_t uid = getuid();
drhbd842ba2002-08-21 11:26:41 +00002549 if( (pwent=getpwuid(uid)) != NULL) {
2550 home_dir = pwent->pw_dir;
drh67505e72002-04-19 12:34:06 +00002551 }
2552#endif
2553
chw65d3c132007-11-12 21:09:10 +00002554#if defined(_WIN32_WCE)
2555 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
2556 */
2557 home_dir = strdup("/");
2558#else
2559
drh164a1b62006-08-19 11:15:20 +00002560#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
2561 if (!home_dir) {
2562 home_dir = getenv("USERPROFILE");
2563 }
2564#endif
2565
drh67505e72002-04-19 12:34:06 +00002566 if (!home_dir) {
2567 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00002568 }
2569
drhcdb36b72006-06-12 12:57:45 +00002570#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
drhe98d4fa2002-04-21 19:06:22 +00002571 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00002572 char *zDrive, *zPath;
2573 int n;
2574 zDrive = getenv("HOMEDRIVE");
2575 zPath = getenv("HOMEPATH");
2576 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00002577 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00002578 home_dir = malloc( n );
2579 if( home_dir==0 ) return 0;
2580 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
2581 return home_dir;
2582 }
2583 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00002584 }
2585#endif
2586
chw65d3c132007-11-12 21:09:10 +00002587#endif /* !_WIN32_WCE */
2588
drh67505e72002-04-19 12:34:06 +00002589 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00002590 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00002591 char *z = malloc( n );
2592 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00002593 home_dir = z;
2594 }
drhe98d4fa2002-04-21 19:06:22 +00002595
drh67505e72002-04-19 12:34:06 +00002596 return home_dir;
2597}
2598
2599/*
2600** Read input from the file given by sqliterc_override. Or if that
2601** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00002602**
2603** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00002604*/
shane9bd1b442009-10-23 01:27:39 +00002605static int process_sqliterc(
drh22fbcb82004-02-01 01:22:50 +00002606 struct callback_data *p, /* Configuration data */
2607 const char *sqliterc_override /* Name of config file. NULL to use default */
2608){
persicom7e2dfdd2002-04-18 02:46:52 +00002609 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00002610 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00002611 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00002612 FILE *in = NULL;
drha959ac42007-06-20 13:10:00 +00002613 int nBuf;
shane9bd1b442009-10-23 01:27:39 +00002614 int rc = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00002615
2616 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00002617 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00002618 if( home_dir==0 ){
chw97185482008-11-17 08:05:31 +00002619#if !defined(__RTP__) && !defined(_WRS_KERNEL)
shane86f5bdb2009-10-24 02:00:07 +00002620 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
chw97185482008-11-17 08:05:31 +00002621#endif
shane9bd1b442009-10-23 01:27:39 +00002622 return 1;
drhe98d4fa2002-04-21 19:06:22 +00002623 }
drh4f21c4a2008-12-10 22:15:00 +00002624 nBuf = strlen30(home_dir) + 16;
drha959ac42007-06-20 13:10:00 +00002625 zBuf = malloc( nBuf );
drh22fbcb82004-02-01 01:22:50 +00002626 if( zBuf==0 ){
shane86f5bdb2009-10-24 02:00:07 +00002627 fprintf(stderr,"%s: Error: out of memory\n",Argv0);
2628 return 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002629 }
drha959ac42007-06-20 13:10:00 +00002630 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
drh67505e72002-04-19 12:34:06 +00002631 free(home_dir);
drh22fbcb82004-02-01 01:22:50 +00002632 sqliterc = (const char*)zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00002633 }
drha1f9b5e2004-02-14 16:31:02 +00002634 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00002635 if( in ){
drhc28490c2006-10-26 14:25:58 +00002636 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00002637 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00002638 }
shane9bd1b442009-10-23 01:27:39 +00002639 rc = process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00002640 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00002641 }
drh43617e92006-03-06 20:55:46 +00002642 free(zBuf);
shane9bd1b442009-10-23 01:27:39 +00002643 return rc;
persicom7e2dfdd2002-04-18 02:46:52 +00002644}
2645
drh67505e72002-04-19 12:34:06 +00002646/*
drhe1e38c42003-05-04 18:30:59 +00002647** Show available command line options
2648*/
2649static const char zOptions[] =
shaneh5fc25012009-11-11 04:17:07 +00002650 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00002651 " -init filename read/process named file\n"
2652 " -echo print commands before execution\n"
2653 " -[no]header turn headers on or off\n"
drhc49f44e2006-10-26 18:15:42 +00002654 " -bail stop after hitting an error\n"
2655 " -interactive force interactive I/O\n"
2656 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00002657 " -column set output mode to 'column'\n"
drhc49f44e2006-10-26 18:15:42 +00002658 " -csv set output mode to 'csv'\n"
drhe1e38c42003-05-04 18:30:59 +00002659 " -html set output mode to HTML\n"
2660 " -line set output mode to 'line'\n"
2661 " -list set output mode to 'list'\n"
2662 " -separator 'x' set output field separator (|)\n"
shaneh642d8b82010-07-28 16:05:34 +00002663 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00002664 " -nullvalue 'text' set text string for NULL values\n"
2665 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00002666 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00002667#ifdef SQLITE_ENABLE_VFSTRACE
2668 " -vfstrace enable tracing of all VFS calls\n"
2669#endif
drh6f25e892011-07-08 17:02:57 +00002670#ifdef SQLITE_ENABLE_MULTIPLEX
2671 " -multiplex enable the multiplexor VFS\n"
2672#endif
drhe1e38c42003-05-04 18:30:59 +00002673;
2674static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00002675 fprintf(stderr,
2676 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
2677 "FILENAME is the name of an SQLite database. A new database is created\n"
2678 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00002679 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00002680 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00002681 }else{
2682 fprintf(stderr, "Use the -help option for additional information\n");
2683 }
2684 exit(1);
2685}
2686
2687/*
drh67505e72002-04-19 12:34:06 +00002688** Initialize the state information in data
2689*/
drh0850b532006-01-31 19:31:43 +00002690static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00002691 memset(data, 0, sizeof(*data));
2692 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00002693 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00002694 data->showHeader = 0;
drh52784bd2011-05-18 17:15:06 +00002695 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00002696 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh5bb3eb92007-05-04 13:15:55 +00002697 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
2698 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
dan0f831772010-03-03 07:23:12 +00002699 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
persicom7e2dfdd2002-04-18 02:46:52 +00002700}
2701
drh75897232000-05-29 14:26:00 +00002702int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00002703 char *zErrMsg = 0;
2704 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00002705 const char *zInitFile = 0;
2706 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00002707 int i;
drhc28490c2006-10-26 14:25:58 +00002708 int rc = 0;
drh75897232000-05-29 14:26:00 +00002709
drh52784bd2011-05-18 17:15:06 +00002710 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
2711 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
2712 sqlite3_sourceid(), SQLITE_SOURCE_ID);
2713 exit(1);
2714 }
drhdaffd0e2001-04-11 14:28:42 +00002715 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00002716 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00002717 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00002718
drh44c2eb12003-04-30 11:38:26 +00002719 /* Make sure we have a valid signal handler early, before anything
2720 ** else is done.
2721 */
drh4c504392000-10-16 22:06:40 +00002722#ifdef SIGINT
2723 signal(SIGINT, interrupt_handler);
2724#endif
drh44c2eb12003-04-30 11:38:26 +00002725
drh22fbcb82004-02-01 01:22:50 +00002726 /* Do an initial pass through the command-line argument to locate
2727 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00002728 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00002729 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00002730 */
drh22fbcb82004-02-01 01:22:50 +00002731 for(i=1; i<argc-1; i++){
drhc28490c2006-10-26 14:25:58 +00002732 char *z;
drh44c2eb12003-04-30 11:38:26 +00002733 if( argv[i][0]!='-' ) break;
drhc28490c2006-10-26 14:25:58 +00002734 z = argv[i];
2735 if( z[0]=='-' && z[1]=='-' ) z++;
drh44c2eb12003-04-30 11:38:26 +00002736 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
2737 i++;
drh22fbcb82004-02-01 01:22:50 +00002738 }else if( strcmp(argv[i],"-init")==0 ){
2739 i++;
2740 zInitFile = argv[i];
shanef69573d2009-10-24 02:06:14 +00002741 /* Need to check for batch mode here to so we can avoid printing
2742 ** informational messages (like from process_sqliterc) before
2743 ** we do the actual processing of arguments later in a second pass.
2744 */
2745 }else if( strcmp(argv[i],"-batch")==0 ){
shanef69573d2009-10-24 02:06:14 +00002746 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00002747 }else if( strcmp(argv[i],"-heap")==0 ){
2748 int j, c;
2749 const char *zSize;
2750 sqlite3_int64 szHeap;
2751
2752 zSize = argv[++i];
2753 szHeap = atoi(zSize);
2754 for(j=0; (c = zSize[j])!=0; j++){
2755 if( c=='M' ){ szHeap *= 1000000; break; }
2756 if( c=='K' ){ szHeap *= 1000; break; }
2757 if( c=='G' ){ szHeap *= 1000000000; break; }
2758 }
2759 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
2760#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2761 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2762#endif
drh97ae8ff2011-03-16 16:56:29 +00002763#ifdef SQLITE_ENABLE_VFSTRACE
2764 }else if( strcmp(argv[i],"-vfstrace")==0 ){
2765 extern int vfstrace_register(
2766 const char *zTraceName,
2767 const char *zOldVfsName,
2768 int (*xOut)(const char*,void*),
2769 void *pOutArg,
2770 int makeDefault
2771 );
drh2b625e22011-03-16 17:05:28 +00002772 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00002773#endif
drh6f25e892011-07-08 17:02:57 +00002774#ifdef SQLITE_ENABLE_MULTIPLEX
2775 }else if( strcmp(argv[i],"-multiplex")==0 ){
2776 extern int sqlite3_multiple_initialize(const char*,int);
2777 sqlite3_multiplex_initialize(0, 1);
2778#endif
drha7e61d82011-03-12 17:02:57 +00002779 }else if( strcmp(argv[i],"-vfs")==0 ){
drh77ec9ba2011-03-15 18:35:44 +00002780 sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]);
drha7e61d82011-03-12 17:02:57 +00002781 if( pVfs ){
2782 sqlite3_vfs_register(pVfs, 1);
2783 }else{
2784 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
2785 exit(1);
2786 }
drh44c2eb12003-04-30 11:38:26 +00002787 }
2788 }
drh22fbcb82004-02-01 01:22:50 +00002789 if( i<argc ){
danielk197729bafea2008-06-26 10:41:19 +00002790#if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
pweilbacherd190be82008-04-15 18:50:02 +00002791 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
2792#else
drh22fbcb82004-02-01 01:22:50 +00002793 data.zDbFilename = argv[i++];
pweilbacherd190be82008-04-15 18:50:02 +00002794#endif
drh22fbcb82004-02-01 01:22:50 +00002795 }else{
danielk197703aded42004-11-22 05:26:27 +00002796#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00002797 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00002798#else
2799 data.zDbFilename = 0;
2800#endif
drh22fbcb82004-02-01 01:22:50 +00002801 }
2802 if( i<argc ){
2803 zFirstCmd = argv[i++];
2804 }
shaneh5fc25012009-11-11 04:17:07 +00002805 if( i<argc ){
2806 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
2807 fprintf(stderr,"Use -help for a list of options.\n");
2808 return 1;
2809 }
drh44c2eb12003-04-30 11:38:26 +00002810 data.out = stdout;
2811
drh01b41712005-08-29 23:06:23 +00002812#ifdef SQLITE_OMIT_MEMORYDB
2813 if( data.zDbFilename==0 ){
shane86f5bdb2009-10-24 02:00:07 +00002814 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
2815 return 1;
drh01b41712005-08-29 23:06:23 +00002816 }
2817#endif
2818
drh44c2eb12003-04-30 11:38:26 +00002819 /* Go ahead and open the database file if it already exists. If the
2820 ** file does not exist, delay opening it. This prevents empty database
2821 ** files from being created if a user mistypes the database name argument
2822 ** to the sqlite command-line tool.
2823 */
drhc8d74412004-08-31 23:41:26 +00002824 if( access(data.zDbFilename, 0)==0 ){
drh44c2eb12003-04-30 11:38:26 +00002825 open_db(&data);
2826 }
2827
drh22fbcb82004-02-01 01:22:50 +00002828 /* Process the initialization file if there is one. If no -init option
2829 ** is given on the command line, look for a file named ~/.sqliterc and
2830 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00002831 */
shane86f5bdb2009-10-24 02:00:07 +00002832 rc = process_sqliterc(&data,zInitFile);
2833 if( rc>0 ){
2834 return rc;
2835 }
drh44c2eb12003-04-30 11:38:26 +00002836
drh22fbcb82004-02-01 01:22:50 +00002837 /* Make a second pass through the command-line argument and set
2838 ** options. This second pass is delayed until after the initialization
2839 ** file is processed so that the command-line arguments will override
2840 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00002841 */
drh22fbcb82004-02-01 01:22:50 +00002842 for(i=1; i<argc && argv[i][0]=='-'; i++){
2843 char *z = argv[i];
drhc28490c2006-10-26 14:25:58 +00002844 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00002845 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00002846 i++;
2847 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002848 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00002849 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002850 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00002851 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002852 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00002853 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00002854 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00002855 }else if( strcmp(z,"-csv")==0 ){
2856 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00002857 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00002858 }else if( strcmp(z,"-separator")==0 ){
2859 i++;
shaneh5fc25012009-11-11 04:17:07 +00002860 if(i>=argc){
2861 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
2862 fprintf(stderr,"Use -help for a list of options.\n");
2863 return 1;
2864 }
drh5bb3eb92007-05-04 13:15:55 +00002865 sqlite3_snprintf(sizeof(data.separator), data.separator,
2866 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00002867 }else if( strcmp(z,"-nullvalue")==0 ){
2868 i++;
shaneh5fc25012009-11-11 04:17:07 +00002869 if(i>=argc){
2870 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z);
2871 fprintf(stderr,"Use -help for a list of options.\n");
2872 return 1;
2873 }
drh5bb3eb92007-05-04 13:15:55 +00002874 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
2875 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00002876 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002877 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00002878 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002879 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00002880 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00002881 data.echoOn = 1;
shaneh642d8b82010-07-28 16:05:34 +00002882 }else if( strcmp(z,"-stats")==0 ){
2883 data.statsOn = 1;
drhc49f44e2006-10-26 18:15:42 +00002884 }else if( strcmp(z,"-bail")==0 ){
2885 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00002886 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00002887 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00002888 return 0;
drhc28490c2006-10-26 14:25:58 +00002889 }else if( strcmp(z,"-interactive")==0 ){
2890 stdin_is_interactive = 1;
2891 }else if( strcmp(z,"-batch")==0 ){
2892 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00002893 }else if( strcmp(z,"-heap")==0 ){
2894 i++;
drha7e61d82011-03-12 17:02:57 +00002895 }else if( strcmp(z,"-vfs")==0 ){
2896 i++;
drh6f25e892011-07-08 17:02:57 +00002897#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00002898 }else if( strcmp(z,"-vfstrace")==0 ){
2899 i++;
drh6f25e892011-07-08 17:02:57 +00002900#endif
2901#ifdef SQLITE_ENABLE_MULTIPLEX
2902 }else if( strcmp(z,"-multiplex")==0 ){
2903 i++;
2904#endif
drh80e8be92006-08-29 12:04:19 +00002905 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00002906 usage(1);
drh1e5d0e92000-05-31 23:33:17 +00002907 }else{
shane86f5bdb2009-10-24 02:00:07 +00002908 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00002909 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00002910 return 1;
2911 }
2912 }
drh44c2eb12003-04-30 11:38:26 +00002913
drh22fbcb82004-02-01 01:22:50 +00002914 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00002915 /* Run just the command that follows the database name
2916 */
drh22fbcb82004-02-01 01:22:50 +00002917 if( zFirstCmd[0]=='.' ){
shane916f9612009-10-23 00:37:15 +00002918 rc = do_meta_command(zFirstCmd, &data);
drh6ff13852001-11-25 13:18:23 +00002919 }else{
drh44c2eb12003-04-30 11:38:26 +00002920 open_db(&data);
shane626a6e42009-10-22 17:30:15 +00002921 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
shane86f5bdb2009-10-24 02:00:07 +00002922 if( zErrMsg!=0 ){
2923 fprintf(stderr,"Error: %s\n", zErrMsg);
2924 return rc!=0 ? rc : 1;
2925 }else if( rc!=0 ){
2926 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
2927 return rc;
drh6ff13852001-11-25 13:18:23 +00002928 }
drh75897232000-05-29 14:26:00 +00002929 }
2930 }else{
drh44c2eb12003-04-30 11:38:26 +00002931 /* Run commands received from standard input
2932 */
drhc28490c2006-10-26 14:25:58 +00002933 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00002934 char *zHome;
2935 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00002936 int nHistory;
drh75897232000-05-29 14:26:00 +00002937 printf(
drh9fd301b2011-06-03 13:28:22 +00002938 "SQLite version %s %.19s\n"
mihailim65df9db2008-06-28 11:29:22 +00002939 "Enter \".help\" for instructions\n"
2940 "Enter SQL statements terminated with a \";\"\n",
drh9fd301b2011-06-03 13:28:22 +00002941 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00002942 );
drh67505e72002-04-19 12:34:06 +00002943 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00002944 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00002945 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00002946 if( (zHistory = malloc(nHistory))!=0 ){
2947 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
2948 }
drh67505e72002-04-19 12:34:06 +00002949 }
danielk19774af00c62005-01-23 23:43:21 +00002950#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00002951 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00002952#endif
drhc28490c2006-10-26 14:25:58 +00002953 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00002954 if( zHistory ){
2955 stifle_history(100);
2956 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00002957 free(zHistory);
drh67505e72002-04-19 12:34:06 +00002958 }
adamd0a3daa32006-07-28 20:16:14 +00002959 free(zHome);
drhdaffd0e2001-04-11 14:28:42 +00002960 }else{
drhc28490c2006-10-26 14:25:58 +00002961 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00002962 }
2963 }
drh33048c02001-10-01 14:29:22 +00002964 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00002965 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00002966 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00002967 }
drhc28490c2006-10-26 14:25:58 +00002968 return rc;
drh75897232000-05-29 14:26:00 +00002969}