blob: a4b76f0f6599dc9bac60dd3281c1d7e8b375974d [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.
14**
drh454ad582007-11-26 22:54:27 +000015** $Id: shell.c,v 1.170 2007/11/26 22:54:27 drh Exp $
drh75897232000-05-29 14:26:00 +000016*/
17#include <stdlib.h>
18#include <string.h>
19#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000020#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000021#include "sqlite3.h"
drh75897232000-05-29 14:26:00 +000022#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000023#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000024
drh454ad582007-11-26 22:54:27 +000025#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
drh4c504392000-10-16 22:06:40 +000026# include <signal.h>
drhdd45df82002-04-18 12:39:03 +000027# include <pwd.h>
28# include <unistd.h>
29# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000030#endif
drh75897232000-05-29 14:26:00 +000031
drhcdb36b72006-06-12 12:57:45 +000032#ifdef __OS2__
33# include <unistd.h>
34#endif
35
drh16e59552000-07-31 11:57:37 +000036#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh8e7e7a22000-05-30 18:45:23 +000037# include <readline/readline.h>
38# include <readline/history.h>
39#else
drh9347b202003-07-18 01:30:59 +000040# define readline(p) local_getline(p,stdin)
persicom1d0b8722002-04-18 02:53:04 +000041# define add_history(X)
drh67505e72002-04-19 12:34:06 +000042# define read_history(X)
43# define write_history(X)
44# define stifle_history(X)
drh75897232000-05-29 14:26:00 +000045#endif
46
adamd2e8464a2006-09-06 21:39:40 +000047#if defined(_WIN32) || defined(WIN32)
48# include <io.h>
49#else
drh4328c8b2003-04-26 02:50:11 +000050/* Make sure isatty() has a prototype.
51*/
52extern int isatty();
adamd2e8464a2006-09-06 21:39:40 +000053#endif
drh4328c8b2003-04-26 02:50:11 +000054
chw65d3c132007-11-12 21:09:10 +000055#if defined(_WIN32_WCE)
56/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
57 * thus we always assume that we have a console. That can be
58 * overridden with the -batch command line option.
59 */
60#define isatty(x) 1
61#endif
62
drh3b1a9882007-11-02 12:53:03 +000063#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__)
64#include <sys/time.h>
65#include <sys/resource.h>
66
67/* Saved resource information for the beginning of an operation */
68static struct rusage sBegin;
69
70/* True if the timer is enabled */
71static int enableTimer = 0;
72
73/*
74** Begin timing an operation
75*/
76static void beginTimer(void){
77 if( enableTimer ){
78 getrusage(RUSAGE_SELF, &sBegin);
79 }
80}
81
82/* Return the difference of two time_structs in microseconds */
83static int timeDiff(struct timeval *pStart, struct timeval *pEnd){
84 return (pEnd->tv_usec - pStart->tv_usec) +
85 1000000*(pEnd->tv_sec - pStart->tv_sec);
86}
87
88/*
89** Print the timing results.
90*/
91static void endTimer(void){
92 if( enableTimer ){
93 struct rusage sEnd;
94 getrusage(RUSAGE_SELF, &sEnd);
95 printf("CPU Time: user %f sys %f\n",
96 0.000001*timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
97 0.000001*timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
98 }
99}
100#define BEGIN_TIMER beginTimer()
101#define END_TIMER endTimer()
102#define HAS_TIMER 1
103#else
104#define BEGIN_TIMER
105#define END_TIMER
106#define HAS_TIMER 0
107#endif
108
109
drh75897232000-05-29 14:26:00 +0000110/*
drhc49f44e2006-10-26 18:15:42 +0000111** If the following flag is set, then command execution stops
112** at an error if we are not interactive.
113*/
114static int bail_on_error = 0;
115
116/*
drhc28490c2006-10-26 14:25:58 +0000117** Threat stdin as an interactive input if the following variable
118** is true. Otherwise, assume stdin is connected to a file or pipe.
119*/
120static int stdin_is_interactive = 1;
121
122/*
drh4c504392000-10-16 22:06:40 +0000123** The following is the open SQLite database. We make a pointer
124** to this database a static variable so that it can be accessed
125** by the SIGINT handler to interrupt database processing.
126*/
danielk197792f9a1b2004-06-19 09:08:16 +0000127static sqlite3 *db = 0;
drh4c504392000-10-16 22:06:40 +0000128
129/*
drh67505e72002-04-19 12:34:06 +0000130** True if an interrupt (Control-C) has been received.
131*/
drh43617e92006-03-06 20:55:46 +0000132static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000133
134/*
persicom7e2dfdd2002-04-18 02:46:52 +0000135** This is the name of our program. It is set in main(), used
136** in a number of other places, mostly for error messages.
137*/
138static char *Argv0;
139
140/*
141** Prompt strings. Initialized in main. Settable with
142** .prompt main continue
143*/
144static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
145static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
146
drhb0603412007-02-28 04:47:26 +0000147/*
148** Write I/O traces to the following stream.
149*/
rsebe0a9092007-07-30 18:24:38 +0000150#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000151static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000152#endif
drhb0603412007-02-28 04:47:26 +0000153
154/*
155** This routine works like printf in that its first argument is a
156** format string and subsequent arguments are values to be substituted
157** in place of % fields. The result of formatting this string
158** is written to iotrace.
159*/
rsebe0a9092007-07-30 18:24:38 +0000160#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000161static void iotracePrintf(const char *zFormat, ...){
162 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000163 char *z;
drhb0603412007-02-28 04:47:26 +0000164 if( iotrace==0 ) return;
165 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000166 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000167 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000168 fprintf(iotrace, "%s", z);
169 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000170}
rsebe0a9092007-07-30 18:24:38 +0000171#endif
drhb0603412007-02-28 04:47:26 +0000172
drh44c2eb12003-04-30 11:38:26 +0000173
persicom7e2dfdd2002-04-18 02:46:52 +0000174/*
drh83965662003-04-17 02:54:13 +0000175** Determines if a string is a number of not.
176*/
danielk19772e588c72005-12-09 14:25:08 +0000177static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000178 if( *z=='-' || *z=='+' ) z++;
179 if( !isdigit(*z) ){
180 return 0;
181 }
182 z++;
183 if( realnum ) *realnum = 0;
184 while( isdigit(*z) ){ z++; }
185 if( *z=='.' ){
186 z++;
187 if( !isdigit(*z) ) return 0;
188 while( isdigit(*z) ){ z++; }
189 if( realnum ) *realnum = 1;
190 }
191 if( *z=='e' || *z=='E' ){
192 z++;
193 if( *z=='+' || *z=='-' ) z++;
194 if( !isdigit(*z) ) return 0;
195 while( isdigit(*z) ){ z++; }
196 if( realnum ) *realnum = 1;
197 }
198 return *z==0;
199}
drh83965662003-04-17 02:54:13 +0000200
201/*
danielk1977bc6ada42004-06-30 08:20:16 +0000202** A global char* and an SQL function to access its current value
203** from within an SQL statement. This program used to use the
204** sqlite_exec_printf() API to substitue a string into an SQL statement.
205** The correct way to do this with sqlite3 is to use the bind API, but
206** since the shell is built around the callback paradigm it would be a lot
207** of work. Instead just use this hack, which is quite harmless.
208*/
209static const char *zShellStatic = 0;
210static void shellstaticFunc(
211 sqlite3_context *context,
212 int argc,
213 sqlite3_value **argv
214){
215 assert( 0==argc );
216 assert( zShellStatic );
217 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
218}
219
220
221/*
drhfeac5f82004-08-01 00:10:45 +0000222** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000223** the text in memory obtained from malloc() and returns a pointer
224** to the text. NULL is returned at end of file, or if malloc()
225** fails.
226**
227** The interface is like "readline" but no command-line editing
228** is done.
229*/
drh9347b202003-07-18 01:30:59 +0000230static char *local_getline(char *zPrompt, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +0000231 char *zLine;
232 int nLine;
drh8e7e7a22000-05-30 18:45:23 +0000233 int n;
234 int eol;
235
236 if( zPrompt && *zPrompt ){
237 printf("%s",zPrompt);
238 fflush(stdout);
239 }
240 nLine = 100;
241 zLine = malloc( nLine );
242 if( zLine==0 ) return 0;
243 n = 0;
244 eol = 0;
245 while( !eol ){
246 if( n+100>nLine ){
247 nLine = nLine*2 + 100;
248 zLine = realloc(zLine, nLine);
249 if( zLine==0 ) return 0;
250 }
drhdaffd0e2001-04-11 14:28:42 +0000251 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000252 if( n==0 ){
253 free(zLine);
254 return 0;
255 }
256 zLine[n] = 0;
257 eol = 1;
258 break;
259 }
260 while( zLine[n] ){ n++; }
261 if( n>0 && zLine[n-1]=='\n' ){
262 n--;
263 zLine[n] = 0;
264 eol = 1;
265 }
266 }
267 zLine = realloc( zLine, n+1 );
268 return zLine;
269}
270
271/*
drhc28490c2006-10-26 14:25:58 +0000272** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000273**
274** zPrior is a string of prior text retrieved. If not the empty
275** string, then issue a continuation prompt.
276*/
drhdaffd0e2001-04-11 14:28:42 +0000277static char *one_input_line(const char *zPrior, FILE *in){
drh8e7e7a22000-05-30 18:45:23 +0000278 char *zPrompt;
279 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000280 if( in!=0 ){
drh9347b202003-07-18 01:30:59 +0000281 return local_getline(0, in);
drh8e7e7a22000-05-30 18:45:23 +0000282 }
283 if( zPrior && zPrior[0] ){
persicom7e2dfdd2002-04-18 02:46:52 +0000284 zPrompt = continuePrompt;
drh8e7e7a22000-05-30 18:45:23 +0000285 }else{
persicom7e2dfdd2002-04-18 02:46:52 +0000286 zPrompt = mainPrompt;
drh8e7e7a22000-05-30 18:45:23 +0000287 }
288 zResult = readline(zPrompt);
danielk19774af00c62005-01-23 23:43:21 +0000289#if defined(HAVE_READLINE) && HAVE_READLINE==1
drheb741d52006-06-03 17:37:25 +0000290 if( zResult && *zResult ) add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000291#endif
drh8e7e7a22000-05-30 18:45:23 +0000292 return zResult;
293}
294
persicom7e2dfdd2002-04-18 02:46:52 +0000295struct previous_mode_data {
296 int valid; /* Is there legit data in here? */
297 int mode;
298 int showHeader;
299 int colWidth[100];
300};
drh45e29d82006-11-20 16:21:10 +0000301
drh8e7e7a22000-05-30 18:45:23 +0000302/*
drh75897232000-05-29 14:26:00 +0000303** An pointer to an instance of this structure is passed from
304** the main program to the callback. This is used to communicate
305** state and mode information.
306*/
307struct callback_data {
danielk197792f9a1b2004-06-19 09:08:16 +0000308 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000309 int echoOn; /* True to echo input commands */
drh28bd4bc2000-06-15 15:57:22 +0000310 int cnt; /* Number of records displayed so far */
311 FILE *out; /* Write results here */
312 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000313 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000314 int showHeader; /* True to show column names in List or Column mode */
drh33048c02001-10-01 14:29:22 +0000315 char *zDestTable; /* Name of destination table when MODE_Insert */
drh28bd4bc2000-06-15 15:57:22 +0000316 char separator[20]; /* Separator character for MODE_List */
drha0c66f52000-07-29 13:20:21 +0000317 int colWidth[100]; /* Requested width of each column when in column mode*/
318 int actualWidth[100]; /* Actual width of each column */
drh83965662003-04-17 02:54:13 +0000319 char nullvalue[20]; /* The text to print when a NULL comes back from
320 ** the database */
persicom7e2dfdd2002-04-18 02:46:52 +0000321 struct previous_mode_data explainPrev;
drh83965662003-04-17 02:54:13 +0000322 /* Holds the mode information just before
323 ** .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000324 char outfile[FILENAME_MAX]; /* Filename for *out */
325 const char *zDbFilename; /* name of the database file */
drh75897232000-05-29 14:26:00 +0000326};
327
328/*
329** These are the allowed modes.
330*/
drh967e8b72000-06-21 13:59:10 +0000331#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000332#define MODE_Column 1 /* One record per line in neat columns */
333#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000334#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
335#define MODE_Html 4 /* Generate an XHTML table */
336#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000337#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000338#define MODE_Csv 7 /* Quote strings, numbers are plain */
339#define MODE_NUM_OF 8 /* The number of modes (not a mode itself) */
persicom7e2dfdd2002-04-18 02:46:52 +0000340
drh0850b532006-01-31 19:31:43 +0000341static const char *modeDescr[MODE_NUM_OF] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000342 "line",
343 "column",
344 "list",
345 "semi",
346 "html",
drhfeac5f82004-08-01 00:10:45 +0000347 "insert",
348 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000349 "csv",
persicom7e2dfdd2002-04-18 02:46:52 +0000350};
drh75897232000-05-29 14:26:00 +0000351
352/*
353** Number of elements in an array
354*/
355#define ArraySize(X) (sizeof(X)/sizeof(X[0]))
356
357/*
drh28bd4bc2000-06-15 15:57:22 +0000358** Output the given string as a quoted string using SQL quoting conventions.
359*/
360static void output_quoted_string(FILE *out, const char *z){
361 int i;
362 int nSingle = 0;
drh28bd4bc2000-06-15 15:57:22 +0000363 for(i=0; z[i]; i++){
364 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000365 }
366 if( nSingle==0 ){
367 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000368 }else{
369 fprintf(out,"'");
370 while( *z ){
371 for(i=0; z[i] && z[i]!='\''; i++){}
372 if( i==0 ){
373 fprintf(out,"''");
374 z++;
375 }else if( z[i]=='\'' ){
376 fprintf(out,"%.*s''",i,z);
377 z += i+1;
378 }else{
drhcd7d2732002-02-26 23:24:26 +0000379 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000380 break;
381 }
382 }
drhcd7d2732002-02-26 23:24:26 +0000383 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000384 }
385}
386
387/*
drhfeac5f82004-08-01 00:10:45 +0000388** Output the given string as a quoted according to C or TCL quoting rules.
389*/
390static void output_c_string(FILE *out, const char *z){
391 unsigned int c;
392 fputc('"', out);
393 while( (c = *(z++))!=0 ){
394 if( c=='\\' ){
395 fputc(c, out);
396 fputc(c, out);
397 }else if( c=='\t' ){
398 fputc('\\', out);
399 fputc('t', out);
400 }else if( c=='\n' ){
401 fputc('\\', out);
402 fputc('n', out);
403 }else if( c=='\r' ){
404 fputc('\\', out);
405 fputc('r', out);
406 }else if( !isprint(c) ){
drh0a8640d2005-08-30 20:12:02 +0000407 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000408 }else{
409 fputc(c, out);
410 }
411 }
412 fputc('"', out);
413}
414
415/*
drhc08a4f12000-06-15 16:49:48 +0000416** Output the given string with characters that are special to
417** HTML escaped.
418*/
419static void output_html_string(FILE *out, const char *z){
420 int i;
421 while( *z ){
422 for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){}
423 if( i>0 ){
424 fprintf(out,"%.*s",i,z);
425 }
426 if( z[i]=='<' ){
427 fprintf(out,"&lt;");
428 }else if( z[i]=='&' ){
429 fprintf(out,"&amp;");
430 }else{
431 break;
432 }
433 z += i + 1;
434 }
435}
436
437/*
drhc49f44e2006-10-26 18:15:42 +0000438** If a field contains any character identified by a 1 in the following
439** array, then the string must be quoted for CSV.
440*/
441static const char needCsvQuote[] = {
442 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
443 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
444 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
449 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
450 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
451 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
452 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
453 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
454 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
455 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
456 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
457 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
458};
459
460/*
drh8e64d1c2004-10-07 00:32:39 +0000461** Output a single term of CSV. Actually, p->separator is used for
462** the separator, which may or may not be a comma. p->nullvalue is
463** the null value. Strings are quoted using ANSI-C rules. Numbers
464** appear outside of quotes.
465*/
466static void output_csv(struct callback_data *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000467 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000468 if( z==0 ){
drhc49f44e2006-10-26 18:15:42 +0000469 fprintf(out,"%s",p->nullvalue);
drh8e64d1c2004-10-07 00:32:39 +0000470 }else{
drhc49f44e2006-10-26 18:15:42 +0000471 int i;
472 for(i=0; z[i]; i++){
473 if( needCsvQuote[((unsigned char*)z)[i]] ){
474 i = 0;
475 break;
476 }
477 }
478 if( i==0 ){
479 putc('"', out);
480 for(i=0; z[i]; i++){
481 if( z[i]=='"' ) putc('"', out);
482 putc(z[i], out);
483 }
484 putc('"', out);
485 }else{
486 fprintf(out, "%s", z);
487 }
drh8e64d1c2004-10-07 00:32:39 +0000488 }
489 if( bSep ){
490 fprintf(p->out, p->separator);
491 }
492}
493
danielk19774af00c62005-01-23 23:43:21 +0000494#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000495/*
drh4c504392000-10-16 22:06:40 +0000496** This routine runs when the user presses Ctrl-C
497*/
498static void interrupt_handler(int NotUsed){
drh67505e72002-04-19 12:34:06 +0000499 seenInterrupt = 1;
danielk19776f8a5032004-05-10 10:34:51 +0000500 if( db ) sqlite3_interrupt(db);
drh4c504392000-10-16 22:06:40 +0000501}
danielk19774af00c62005-01-23 23:43:21 +0000502#endif
drh4c504392000-10-16 22:06:40 +0000503
504/*
drh75897232000-05-29 14:26:00 +0000505** This is the callback routine that the SQLite library
506** invokes for each row of a query result.
507*/
508static int callback(void *pArg, int nArg, char **azArg, char **azCol){
509 int i;
510 struct callback_data *p = (struct callback_data*)pArg;
511 switch( p->mode ){
512 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000513 int w = 5;
drh6a535342001-10-19 16:44:56 +0000514 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000515 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000516 int len = strlen(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000517 if( len>w ) w = len;
518 }
drh75897232000-05-29 14:26:00 +0000519 if( p->cnt++>0 ) fprintf(p->out,"\n");
520 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000521 fprintf(p->out,"%*s = %s\n", w, azCol[i],
drha69d9162003-04-17 22:57:53 +0000522 azArg[i] ? azArg[i] : p->nullvalue);
drh75897232000-05-29 14:26:00 +0000523 }
524 break;
525 }
526 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000527 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000528 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000529 int w, n;
530 if( i<ArraySize(p->colWidth) ){
drh75897232000-05-29 14:26:00 +0000531 w = p->colWidth[i];
532 }else{
drha0c66f52000-07-29 13:20:21 +0000533 w = 0;
drh75897232000-05-29 14:26:00 +0000534 }
drha0c66f52000-07-29 13:20:21 +0000535 if( w<=0 ){
drhff6e9112000-08-28 16:21:58 +0000536 w = strlen(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000537 if( w<10 ) w = 10;
persicom7e2dfdd2002-04-18 02:46:52 +0000538 n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue);
drha0c66f52000-07-29 13:20:21 +0000539 if( w<n ) w = n;
540 }
541 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000542 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000543 }
544 if( p->showHeader ){
545 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
546 }
547 }
548 if( p->showHeader ){
549 for(i=0; i<nArg; i++){
550 int w;
551 if( i<ArraySize(p->actualWidth) ){
552 w = p->actualWidth[i];
553 }else{
554 w = 10;
555 }
556 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
557 "----------------------------------------------------------",
558 i==nArg-1 ? "\n": " ");
559 }
drh75897232000-05-29 14:26:00 +0000560 }
561 }
drh6a535342001-10-19 16:44:56 +0000562 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000563 for(i=0; i<nArg; i++){
564 int w;
drha0c66f52000-07-29 13:20:21 +0000565 if( i<ArraySize(p->actualWidth) ){
566 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000567 }else{
568 w = 10;
569 }
drhc61053b2000-06-04 12:58:36 +0000570 fprintf(p->out,"%-*.*s%s",w,w,
persicom7e2dfdd2002-04-18 02:46:52 +0000571 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
drh75897232000-05-29 14:26:00 +0000572 }
573 break;
574 }
drhe3710332000-09-29 13:30:53 +0000575 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000576 case MODE_List: {
577 if( p->cnt++==0 && p->showHeader ){
578 for(i=0; i<nArg; i++){
579 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
580 }
581 }
drh6a535342001-10-19 16:44:56 +0000582 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000583 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000584 char *z = azArg[i];
persicom7e2dfdd2002-04-18 02:46:52 +0000585 if( z==0 ) z = p->nullvalue;
drh71172c52002-01-24 00:00:21 +0000586 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000587 if( i<nArg-1 ){
588 fprintf(p->out, "%s", p->separator);
589 }else if( p->mode==MODE_Semi ){
590 fprintf(p->out, ";\n");
591 }else{
592 fprintf(p->out, "\n");
593 }
drh75897232000-05-29 14:26:00 +0000594 }
595 break;
596 }
drh1e5d0e92000-05-31 23:33:17 +0000597 case MODE_Html: {
598 if( p->cnt++==0 && p->showHeader ){
599 fprintf(p->out,"<TR>");
600 for(i=0; i<nArg; i++){
601 fprintf(p->out,"<TH>%s</TH>",azCol[i]);
602 }
603 fprintf(p->out,"</TR>\n");
604 }
drh6a535342001-10-19 16:44:56 +0000605 if( azArg==0 ) break;
drh28bd4bc2000-06-15 15:57:22 +0000606 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000607 for(i=0; i<nArg; i++){
drhc08a4f12000-06-15 16:49:48 +0000608 fprintf(p->out,"<TD>");
persicom7e2dfdd2002-04-18 02:46:52 +0000609 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
drhc08a4f12000-06-15 16:49:48 +0000610 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000611 }
drh7d686b22002-11-11 13:56:47 +0000612 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000613 break;
614 }
drhfeac5f82004-08-01 00:10:45 +0000615 case MODE_Tcl: {
616 if( p->cnt++==0 && p->showHeader ){
617 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000618 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhfeac5f82004-08-01 00:10:45 +0000619 fprintf(p->out, "%s", p->separator);
620 }
621 fprintf(p->out,"\n");
622 }
623 if( azArg==0 ) break;
624 for(i=0; i<nArg; i++){
625 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
626 fprintf(p->out, "%s", p->separator);
627 }
628 fprintf(p->out,"\n");
629 break;
630 }
drh8e64d1c2004-10-07 00:32:39 +0000631 case MODE_Csv: {
632 if( p->cnt++==0 && p->showHeader ){
633 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000634 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000635 }
636 fprintf(p->out,"\n");
637 }
638 if( azArg==0 ) break;
639 for(i=0; i<nArg; i++){
640 output_csv(p, azArg[i], i<nArg-1);
641 }
642 fprintf(p->out,"\n");
643 break;
644 }
drh28bd4bc2000-06-15 15:57:22 +0000645 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +0000646 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000647 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000648 for(i=0; i<nArg; i++){
649 char *zSep = i>0 ? ",": "";
650 if( azArg[i]==0 ){
651 fprintf(p->out,"%sNULL",zSep);
drhc8d74412004-08-31 23:41:26 +0000652 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +0000653 fprintf(p->out,"%s%s",zSep, azArg[i]);
654 }else{
655 if( zSep[0] ) fprintf(p->out,"%s",zSep);
656 output_quoted_string(p->out, azArg[i]);
657 }
658 }
659 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +0000660 break;
drh28bd4bc2000-06-15 15:57:22 +0000661 }
persicom1d0b8722002-04-18 02:53:04 +0000662 }
drh75897232000-05-29 14:26:00 +0000663 return 0;
664}
665
666/*
drh33048c02001-10-01 14:29:22 +0000667** Set the destination table field of the callback_data structure to
668** the name of the table given. Escape any quote characters in the
669** table name.
670*/
671static void set_table_name(struct callback_data *p, const char *zName){
672 int i, n;
673 int needQuote;
674 char *z;
675
676 if( p->zDestTable ){
677 free(p->zDestTable);
678 p->zDestTable = 0;
679 }
680 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +0000681 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +0000682 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +0000683 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +0000684 needQuote = 1;
685 if( zName[i]=='\'' ) n++;
686 }
687 }
688 if( needQuote ) n += 2;
689 z = p->zDestTable = malloc( n+1 );
690 if( z==0 ){
691 fprintf(stderr,"Out of memory!\n");
692 exit(1);
693 }
694 n = 0;
695 if( needQuote ) z[n++] = '\'';
696 for(i=0; zName[i]; i++){
697 z[n++] = zName[i];
698 if( zName[i]=='\'' ) z[n++] = '\'';
699 }
700 if( needQuote ) z[n++] = '\'';
701 z[n] = 0;
702}
703
danielk19772a02e332004-06-05 08:04:36 +0000704/* zIn is either a pointer to a NULL-terminated string in memory obtained
705** from malloc(), or a NULL pointer. The string pointed to by zAppend is
706** added to zIn, and the result returned in memory obtained from malloc().
707** zIn, if it was not NULL, is freed.
708**
709** If the third argument, quote, is not '\0', then it is used as a
710** quote character for zAppend.
711*/
drhc28490c2006-10-26 14:25:58 +0000712static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +0000713 int len;
714 int i;
715 int nAppend = strlen(zAppend);
716 int nIn = (zIn?strlen(zIn):0);
717
718 len = nAppend+nIn+1;
719 if( quote ){
720 len += 2;
721 for(i=0; i<nAppend; i++){
722 if( zAppend[i]==quote ) len++;
723 }
724 }
725
726 zIn = (char *)realloc(zIn, len);
727 if( !zIn ){
728 return 0;
729 }
730
731 if( quote ){
732 char *zCsr = &zIn[nIn];
733 *zCsr++ = quote;
734 for(i=0; i<nAppend; i++){
735 *zCsr++ = zAppend[i];
736 if( zAppend[i]==quote ) *zCsr++ = quote;
737 }
738 *zCsr++ = quote;
739 *zCsr++ = '\0';
740 assert( (zCsr-zIn)==len );
741 }else{
742 memcpy(&zIn[nIn], zAppend, nAppend);
743 zIn[len-1] = '\0';
744 }
745
746 return zIn;
747}
748
drhdd3d4592004-08-30 01:54:05 +0000749
750/*
751** Execute a query statement that has a single result column. Print
752** that result column on a line by itself with a semicolon terminator.
drh45e29d82006-11-20 16:21:10 +0000753**
754** This is used, for example, to show the schema of the database by
755** querying the SQLITE_MASTER table.
drhdd3d4592004-08-30 01:54:05 +0000756*/
757static int run_table_dump_query(FILE *out, sqlite3 *db, const char *zSelect){
758 sqlite3_stmt *pSelect;
759 int rc;
760 rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0);
761 if( rc!=SQLITE_OK || !pSelect ){
762 return rc;
763 }
764 rc = sqlite3_step(pSelect);
765 while( rc==SQLITE_ROW ){
766 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0));
767 rc = sqlite3_step(pSelect);
768 }
769 return sqlite3_finalize(pSelect);
770}
771
772
drh33048c02001-10-01 14:29:22 +0000773/*
drh4c653a02000-06-07 01:27:47 +0000774** This is a different callback routine used for dumping the database.
775** Each row received by this callback consists of a table name,
776** the table type ("index" or "table") and SQL to create the table.
777** This routine should print text sufficient to recreate the table.
778*/
779static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +0000780 int rc;
781 const char *zTable;
782 const char *zType;
783 const char *zSql;
drhdaffd0e2001-04-11 14:28:42 +0000784 struct callback_data *p = (struct callback_data *)pArg;
danielk19772a02e332004-06-05 08:04:36 +0000785
drh4c653a02000-06-07 01:27:47 +0000786 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +0000787 zTable = azArg[0];
788 zType = azArg[1];
789 zSql = azArg[2];
790
drh00b950d2005-09-11 02:03:03 +0000791 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhf8eb96a2005-02-03 00:42:34 +0000792 fprintf(p->out, "DELETE FROM sqlite_sequence;\n");
drh00b950d2005-09-11 02:03:03 +0000793 }else if( strcmp(zTable, "sqlite_stat1")==0 ){
794 fprintf(p->out, "ANALYZE sqlite_master;\n");
795 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
796 return 0;
drh45e29d82006-11-20 16:21:10 +0000797 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
798 char *zIns;
799 if( !p->writableSchema ){
800 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
801 p->writableSchema = 1;
802 }
803 zIns = sqlite3_mprintf(
804 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
805 "VALUES('table','%q','%q',0,'%q');",
806 zTable, zTable, zSql);
807 fprintf(p->out, "%s\n", zIns);
808 sqlite3_free(zIns);
809 return 0;
drh00b950d2005-09-11 02:03:03 +0000810 }else{
811 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +0000812 }
danielk19772a02e332004-06-05 08:04:36 +0000813
814 if( strcmp(zType, "table")==0 ){
815 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +0000816 char *zSelect = 0;
817 char *zTableInfo = 0;
818 char *zTmp = 0;
819
820 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
821 zTableInfo = appendText(zTableInfo, zTable, '"');
822 zTableInfo = appendText(zTableInfo, ");", 0);
823
824 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0);
825 if( zTableInfo ) free(zTableInfo);
826 if( rc!=SQLITE_OK || !pTableInfo ){
827 return 1;
828 }
829
830 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
831 zTmp = appendText(zTmp, zTable, '"');
832 if( zTmp ){
833 zSelect = appendText(zSelect, zTmp, '\'');
834 }
835 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
836 rc = sqlite3_step(pTableInfo);
837 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +0000838 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +0000839 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +0000840 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +0000841 rc = sqlite3_step(pTableInfo);
842 if( rc==SQLITE_ROW ){
drh45e29d82006-11-20 16:21:10 +0000843 zSelect = appendText(zSelect, ") || ',' || ", 0);
danielk19772a02e332004-06-05 08:04:36 +0000844 }else{
845 zSelect = appendText(zSelect, ") ", 0);
846 }
847 }
848 rc = sqlite3_finalize(pTableInfo);
849 if( rc!=SQLITE_OK ){
850 if( zSelect ) free(zSelect);
851 return 1;
852 }
853 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
854 zSelect = appendText(zSelect, zTable, '"');
855
drhdd3d4592004-08-30 01:54:05 +0000856 rc = run_table_dump_query(p->out, p->db, zSelect);
857 if( rc==SQLITE_CORRUPT ){
858 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
859 rc = run_table_dump_query(p->out, p->db, zSelect);
860 }
danielk19772a02e332004-06-05 08:04:36 +0000861 if( zSelect ) free(zSelect);
drh4c653a02000-06-07 01:27:47 +0000862 }
drh4c653a02000-06-07 01:27:47 +0000863 return 0;
864}
865
866/*
drh45e29d82006-11-20 16:21:10 +0000867** Run zQuery. Use dump_callback() as the callback routine so that
868** the contents of the query are output as SQL statements.
869**
drhdd3d4592004-08-30 01:54:05 +0000870** If we get a SQLITE_CORRUPT error, rerun the query after appending
871** "ORDER BY rowid DESC" to the end.
872*/
873static int run_schema_dump_query(
874 struct callback_data *p,
875 const char *zQuery,
876 char **pzErrMsg
877){
878 int rc;
879 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg);
880 if( rc==SQLITE_CORRUPT ){
881 char *zQ2;
882 int len = strlen(zQuery);
883 if( pzErrMsg ) sqlite3_free(*pzErrMsg);
884 zQ2 = malloc( len+100 );
885 if( zQ2==0 ) return rc;
drh5bb3eb92007-05-04 13:15:55 +0000886 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery);
drhdd3d4592004-08-30 01:54:05 +0000887 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg);
888 free(zQ2);
889 }
890 return rc;
891}
892
893/*
drh75897232000-05-29 14:26:00 +0000894** Text of a help message
895*/
persicom1d0b8722002-04-18 02:53:04 +0000896static char zHelp[] =
drh20f99c42007-01-08 14:31:35 +0000897 ".bail ON|OFF Stop after hitting an error. Default OFF\n"
jplyon6a65bb32003-05-04 07:25:57 +0000898 ".databases List names and files of attached databases\n"
drhb860bc92004-08-04 15:16:55 +0000899 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
drhdaffd0e2001-04-11 14:28:42 +0000900 ".echo ON|OFF Turn command echo on or off\n"
drh75897232000-05-29 14:26:00 +0000901 ".exit Exit this program\n"
persicom7e2dfdd2002-04-18 02:46:52 +0000902 ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n"
persicom7e2dfdd2002-04-18 02:46:52 +0000903 ".header(s) ON|OFF Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +0000904 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +0000905 ".import FILE TABLE Import data from FILE into TABLE\n"
drh75897232000-05-29 14:26:00 +0000906 ".indices TABLE Show names of all indices on TABLE\n"
drhae5e4452007-05-03 17:18:36 +0000907#ifdef SQLITE_ENABLE_IOTRACE
908 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
909#endif
drh70df4fe2006-06-13 15:12:21 +0000910#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +0000911 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +0000912#endif
danielk19776b77a362005-01-13 11:10:25 +0000913 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
drh3b584fa2004-09-24 12:50:03 +0000914 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +0000915 " column Left-aligned columns. (See .width)\n"
916 " html HTML <table> code\n"
917 " insert SQL insert statements for TABLE\n"
918 " line One value per line\n"
919 " list Values delimited by .separator string\n"
920 " tabs Tab-separated values\n"
921 " tcl TCL list elements\n"
922 ".nullvalue STRING Print STRING in place of NULL values\n"
drh75897232000-05-29 14:26:00 +0000923 ".output FILENAME Send output to FILENAME\n"
924 ".output stdout Send output to the screen\n"
persicom7e2dfdd2002-04-18 02:46:52 +0000925 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +0000926 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +0000927 ".read FILENAME Execute SQL in FILENAME\n"
drh75897232000-05-29 14:26:00 +0000928 ".schema ?TABLE? Show the CREATE statements\n"
drhb860bc92004-08-04 15:16:55 +0000929 ".separator STRING Change separator used by output mode and .import\n"
drhdd45df82002-04-18 12:39:03 +0000930 ".show Show the current values for various settings\n"
drhfeac5f82004-08-01 00:10:45 +0000931 ".tables ?PATTERN? List names of tables matching a LIKE pattern\n"
drh2dfbbca2000-07-28 14:32:48 +0000932 ".timeout MS Try opening locked tables for MS milliseconds\n"
drh3b1a9882007-11-02 12:53:03 +0000933#if HAS_TIMER
934 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
935#endif
drh75897232000-05-29 14:26:00 +0000936 ".width NUM NUM ... Set column widths for \"column\" mode\n"
937;
938
drhdaffd0e2001-04-11 14:28:42 +0000939/* Forward reference */
drhc28490c2006-10-26 14:25:58 +0000940static int process_input(struct callback_data *p, FILE *in);
drhdaffd0e2001-04-11 14:28:42 +0000941
drh75897232000-05-29 14:26:00 +0000942/*
drh44c2eb12003-04-30 11:38:26 +0000943** Make sure the database is open. If it is not, then open it. If
944** the database fails to open, print an error message and exit.
945*/
946static void open_db(struct callback_data *p){
947 if( p->db==0 ){
danielk19774f057f92004-06-08 00:02:33 +0000948 sqlite3_open(p->zDbFilename, &p->db);
danielk197780290862004-05-22 09:21:21 +0000949 db = p->db;
danielk1977bc6ada42004-06-30 08:20:16 +0000950 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
951 shellstaticFunc, 0, 0);
danielk197780290862004-05-22 09:21:21 +0000952 if( SQLITE_OK!=sqlite3_errcode(db) ){
953 fprintf(stderr,"Unable to open database \"%s\": %s\n",
954 p->zDbFilename, sqlite3_errmsg(db));
drh22fbcb82004-02-01 01:22:50 +0000955 exit(1);
drh44c2eb12003-04-30 11:38:26 +0000956 }
drhc2e87a32006-06-27 15:16:14 +0000957#ifndef SQLITE_OMIT_LOAD_EXTENSION
958 sqlite3_enable_load_extension(p->db, 1);
959#endif
drh44c2eb12003-04-30 11:38:26 +0000960 }
961}
962
963/*
drhfeac5f82004-08-01 00:10:45 +0000964** Do C-language style dequoting.
965**
966** \t -> tab
967** \n -> newline
968** \r -> carriage return
969** \NNN -> ascii character NNN in octal
970** \\ -> backslash
971*/
972static void resolve_backslashes(char *z){
973 int i, j, c;
974 for(i=j=0; (c = z[i])!=0; i++, j++){
975 if( c=='\\' ){
976 c = z[++i];
977 if( c=='n' ){
978 c = '\n';
979 }else if( c=='t' ){
980 c = '\t';
981 }else if( c=='r' ){
982 c = '\r';
983 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +0000984 c -= '0';
drhfeac5f82004-08-01 00:10:45 +0000985 if( z[i+1]>='0' && z[i+1]<='7' ){
986 i++;
987 c = (c<<3) + z[i] - '0';
988 if( z[i+1]>='0' && z[i+1]<='7' ){
989 i++;
990 c = (c<<3) + z[i] - '0';
991 }
992 }
993 }
994 }
995 z[j] = c;
996 }
997 z[j] = 0;
998}
999
1000/*
drhc28490c2006-10-26 14:25:58 +00001001** Interpret zArg as a boolean value. Return either 0 or 1.
1002*/
1003static int booleanValue(char *zArg){
1004 int val = atoi(zArg);
1005 int j;
1006 for(j=0; zArg[j]; j++){
1007 zArg[j] = tolower(zArg[j]);
1008 }
1009 if( strcmp(zArg,"on")==0 ){
1010 val = 1;
1011 }else if( strcmp(zArg,"yes")==0 ){
1012 val = 1;
1013 }
1014 return val;
1015}
1016
1017/*
drh75897232000-05-29 14:26:00 +00001018** If an input line begins with "." then invoke this routine to
1019** process that line.
drh67505e72002-04-19 12:34:06 +00001020**
drh47ad6842006-11-08 12:25:42 +00001021** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00001022*/
drh44c2eb12003-04-30 11:38:26 +00001023static int do_meta_command(char *zLine, struct callback_data *p){
drh75897232000-05-29 14:26:00 +00001024 int i = 1;
1025 int nArg = 0;
1026 int n, c;
drh67505e72002-04-19 12:34:06 +00001027 int rc = 0;
drh75897232000-05-29 14:26:00 +00001028 char *azArg[50];
1029
1030 /* Parse the input line into tokens.
1031 */
1032 while( zLine[i] && nArg<ArraySize(azArg) ){
drh4c755c02004-08-08 20:22:17 +00001033 while( isspace((unsigned char)zLine[i]) ){ i++; }
drh06333682004-03-09 13:37:45 +00001034 if( zLine[i]==0 ) break;
drh75897232000-05-29 14:26:00 +00001035 if( zLine[i]=='\'' || zLine[i]=='"' ){
1036 int delim = zLine[i++];
1037 azArg[nArg++] = &zLine[i];
1038 while( zLine[i] && zLine[i]!=delim ){ i++; }
1039 if( zLine[i]==delim ){
1040 zLine[i++] = 0;
1041 }
drhfeac5f82004-08-01 00:10:45 +00001042 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001043 }else{
1044 azArg[nArg++] = &zLine[i];
drh4c755c02004-08-08 20:22:17 +00001045 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; }
drh75897232000-05-29 14:26:00 +00001046 if( zLine[i] ) zLine[i++] = 0;
drhfeac5f82004-08-01 00:10:45 +00001047 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00001048 }
1049 }
1050
1051 /* Process the input line.
1052 */
drh67505e72002-04-19 12:34:06 +00001053 if( nArg==0 ) return rc;
drh75897232000-05-29 14:26:00 +00001054 n = strlen(azArg[0]);
1055 c = azArg[0][0];
drhc49f44e2006-10-26 18:15:42 +00001056 if( c=='b' && n>1 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){
1057 bail_on_error = booleanValue(azArg[1]);
1058 }else
1059
jplyon6a65bb32003-05-04 07:25:57 +00001060 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
jplyon672a1ed2003-05-11 20:07:05 +00001061 struct callback_data data;
1062 char *zErrMsg = 0;
jplyon6a65bb32003-05-04 07:25:57 +00001063 open_db(p);
jplyon672a1ed2003-05-11 20:07:05 +00001064 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00001065 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00001066 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00001067 data.colWidth[0] = 3;
1068 data.colWidth[1] = 15;
1069 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00001070 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00001071 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00001072 if( zErrMsg ){
1073 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001074 sqlite3_free(zErrMsg);
jplyon6a65bb32003-05-04 07:25:57 +00001075 }
1076 }else
1077
drh4c653a02000-06-07 01:27:47 +00001078 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
1079 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00001080 open_db(p);
drh33048c02001-10-01 14:29:22 +00001081 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00001082 p->writableSchema = 0;
drh4c653a02000-06-07 01:27:47 +00001083 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00001084 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00001085 "SELECT name, type, sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00001086 "WHERE sql NOT NULL AND type=='table'", 0
drh0b9a5942006-09-13 20:22:02 +00001087 );
1088 run_table_dump_query(p->out, p->db,
1089 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00001090 "WHERE sql NOT NULL AND type IN ('index','trigger','view')"
drha18c5682000-10-08 22:20:57 +00001091 );
drh4c653a02000-06-07 01:27:47 +00001092 }else{
1093 int i;
drhdd3d4592004-08-30 01:54:05 +00001094 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00001095 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00001096 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00001097 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00001098 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh45e29d82006-11-20 16:21:10 +00001099 " AND sql NOT NULL", 0);
drh0b9a5942006-09-13 20:22:02 +00001100 run_table_dump_query(p->out, p->db,
1101 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00001102 "WHERE sql NOT NULL"
1103 " AND type IN ('index','trigger','view')"
drh0b9a5942006-09-13 20:22:02 +00001104 " AND tbl_name LIKE shellstatic()"
1105 );
danielk1977bc6ada42004-06-30 08:20:16 +00001106 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00001107 }
1108 }
drh45e29d82006-11-20 16:21:10 +00001109 if( p->writableSchema ){
1110 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
1111 p->writableSchema = 0;
1112 }
drh4c653a02000-06-07 01:27:47 +00001113 if( zErrMsg ){
1114 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001115 sqlite3_free(zErrMsg);
drh33048c02001-10-01 14:29:22 +00001116 }else{
1117 fprintf(p->out, "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00001118 }
1119 }else
drh75897232000-05-29 14:26:00 +00001120
drhdaffd0e2001-04-11 14:28:42 +00001121 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){
drhc28490c2006-10-26 14:25:58 +00001122 p->echoOn = booleanValue(azArg[1]);
drhdaffd0e2001-04-11 14:28:42 +00001123 }else
1124
drh75897232000-05-29 14:26:00 +00001125 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00001126 rc = 2;
drh75897232000-05-29 14:26:00 +00001127 }else
1128
drhdd45df82002-04-18 12:39:03 +00001129 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00001130 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00001131 if(val == 1) {
1132 if(!p->explainPrev.valid) {
1133 p->explainPrev.valid = 1;
1134 p->explainPrev.mode = p->mode;
1135 p->explainPrev.showHeader = p->showHeader;
1136 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth));
1137 }
1138 /* We could put this code under the !p->explainValid
1139 ** condition so that it does not execute if we are already in
1140 ** explain mode. However, always executing it allows us an easy
1141 ** was to reset to explain mode in case the user previously
1142 ** did an .explain followed by a .width, .mode or .header
1143 ** command.
1144 */
1145 p->mode = MODE_Column;
1146 p->showHeader = 1;
1147 memset(p->colWidth,0,ArraySize(p->colWidth));
1148 p->colWidth[0] = 4;
drhe69cc5b2005-08-27 01:50:53 +00001149 p->colWidth[1] = 14;
persicom7e2dfdd2002-04-18 02:46:52 +00001150 p->colWidth[2] = 10;
1151 p->colWidth[3] = 10;
drhe69cc5b2005-08-27 01:50:53 +00001152 p->colWidth[4] = 33;
persicom7e2dfdd2002-04-18 02:46:52 +00001153 }else if (p->explainPrev.valid) {
1154 p->explainPrev.valid = 0;
1155 p->mode = p->explainPrev.mode;
1156 p->showHeader = p->explainPrev.showHeader;
1157 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth));
1158 }
drh75897232000-05-29 14:26:00 +00001159 }else
1160
drhc28490c2006-10-26 14:25:58 +00001161 if( c=='h' && (strncmp(azArg[0], "header", n)==0 ||
persicom7e2dfdd2002-04-18 02:46:52 +00001162 strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){
drhc28490c2006-10-26 14:25:58 +00001163 p->showHeader = booleanValue(azArg[1]);
drh75897232000-05-29 14:26:00 +00001164 }else
1165
1166 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
1167 fprintf(stderr,zHelp);
1168 }else
1169
drhfeac5f82004-08-01 00:10:45 +00001170 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){
1171 char *zTable = azArg[2]; /* Insert data into this table */
1172 char *zFile = azArg[1]; /* The file from which to extract data */
1173 sqlite3_stmt *pStmt; /* A statement */
1174 int rc; /* Result code */
1175 int nCol; /* Number of columns in the table */
1176 int nByte; /* Number of bytes in an SQL string */
1177 int i, j; /* Loop counters */
1178 int nSep; /* Number of bytes in p->separator[] */
1179 char *zSql; /* An SQL statement */
1180 char *zLine; /* A single line of input from the file */
1181 char **azCol; /* zLine[] broken up into columns */
1182 char *zCommit; /* How to commit changes */
drhb860bc92004-08-04 15:16:55 +00001183 FILE *in; /* The input file */
1184 int lineno = 0; /* Line number of input file */
drhfeac5f82004-08-01 00:10:45 +00001185
drha543c822006-06-08 16:10:14 +00001186 open_db(p);
drhfeac5f82004-08-01 00:10:45 +00001187 nSep = strlen(p->separator);
1188 if( nSep==0 ){
1189 fprintf(stderr, "non-null separator required for import\n");
1190 return 0;
1191 }
1192 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable);
1193 if( zSql==0 ) return 0;
1194 nByte = strlen(zSql);
drh5e6078b2006-01-31 19:07:22 +00001195 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00001196 sqlite3_free(zSql);
1197 if( rc ){
1198 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1199 nCol = 0;
drh47ad6842006-11-08 12:25:42 +00001200 rc = 1;
drhfeac5f82004-08-01 00:10:45 +00001201 }else{
1202 nCol = sqlite3_column_count(pStmt);
1203 }
1204 sqlite3_finalize(pStmt);
1205 if( nCol==0 ) return 0;
1206 zSql = malloc( nByte + 20 + nCol*2 );
1207 if( zSql==0 ) return 0;
1208 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable);
1209 j = strlen(zSql);
1210 for(i=1; i<nCol; i++){
1211 zSql[j++] = ',';
1212 zSql[j++] = '?';
1213 }
1214 zSql[j++] = ')';
1215 zSql[j] = 0;
drh5e6078b2006-01-31 19:07:22 +00001216 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
drhfeac5f82004-08-01 00:10:45 +00001217 free(zSql);
1218 if( rc ){
1219 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
1220 sqlite3_finalize(pStmt);
drh47ad6842006-11-08 12:25:42 +00001221 return 1;
drhfeac5f82004-08-01 00:10:45 +00001222 }
1223 in = fopen(zFile, "rb");
1224 if( in==0 ){
1225 fprintf(stderr, "cannot open file: %s\n", zFile);
1226 sqlite3_finalize(pStmt);
1227 return 0;
1228 }
1229 azCol = malloc( sizeof(azCol[0])*(nCol+1) );
drh43617e92006-03-06 20:55:46 +00001230 if( azCol==0 ){
1231 fclose(in);
1232 return 0;
1233 }
drhfeac5f82004-08-01 00:10:45 +00001234 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1235 zCommit = "COMMIT";
1236 while( (zLine = local_getline(0, in))!=0 ){
1237 char *z;
1238 i = 0;
drhb860bc92004-08-04 15:16:55 +00001239 lineno++;
drhfeac5f82004-08-01 00:10:45 +00001240 azCol[0] = zLine;
drh36d4e972004-10-06 14:39:06 +00001241 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
drhfeac5f82004-08-01 00:10:45 +00001242 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1243 *z = 0;
1244 i++;
drhb860bc92004-08-04 15:16:55 +00001245 if( i<nCol ){
1246 azCol[i] = &z[nSep];
1247 z += nSep-1;
1248 }
drhfeac5f82004-08-01 00:10:45 +00001249 }
1250 }
drh1cd7f832005-08-05 18:50:51 +00001251 *z = 0;
drhb860bc92004-08-04 15:16:55 +00001252 if( i+1!=nCol ){
1253 fprintf(stderr,"%s line %d: expected %d columns of data but found %d\n",
1254 zFile, lineno, nCol, i+1);
1255 zCommit = "ROLLBACK";
1256 break;
1257 }
drhfeac5f82004-08-01 00:10:45 +00001258 for(i=0; i<nCol; i++){
1259 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC);
1260 }
1261 sqlite3_step(pStmt);
1262 rc = sqlite3_reset(pStmt);
1263 free(zLine);
1264 if( rc!=SQLITE_OK ){
1265 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
1266 zCommit = "ROLLBACK";
drh47ad6842006-11-08 12:25:42 +00001267 rc = 1;
drhfeac5f82004-08-01 00:10:45 +00001268 break;
1269 }
1270 }
1271 free(azCol);
1272 fclose(in);
1273 sqlite3_finalize(pStmt);
drhb860bc92004-08-04 15:16:55 +00001274 sqlite3_exec(p->db, zCommit, 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00001275 }else
1276
drh75897232000-05-29 14:26:00 +00001277 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){
1278 struct callback_data data;
1279 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00001280 open_db(p);
drh75897232000-05-29 14:26:00 +00001281 memcpy(&data, p, sizeof(data));
1282 data.showHeader = 0;
1283 data.mode = MODE_List;
danielk1977bc6ada42004-06-30 08:20:16 +00001284 zShellStatic = azArg[1];
1285 sqlite3_exec(p->db,
drha18c5682000-10-08 22:20:57 +00001286 "SELECT name FROM sqlite_master "
danielk1977bc6ada42004-06-30 08:20:16 +00001287 "WHERE type='index' AND tbl_name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00001288 "UNION ALL "
1289 "SELECT name FROM sqlite_temp_master "
danielk1977bc6ada42004-06-30 08:20:16 +00001290 "WHERE type='index' AND tbl_name LIKE shellstatic() "
drhe0bc4042002-06-25 01:09:11 +00001291 "ORDER BY 1",
danielk1977bc6ada42004-06-30 08:20:16 +00001292 callback, &data, &zErrMsg
drha18c5682000-10-08 22:20:57 +00001293 );
danielk1977bc6ada42004-06-30 08:20:16 +00001294 zShellStatic = 0;
drh75897232000-05-29 14:26:00 +00001295 if( zErrMsg ){
1296 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001297 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00001298 }
1299 }else
1300
drhae5e4452007-05-03 17:18:36 +00001301#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00001302 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
1303 extern void (*sqlite3_io_trace)(const char*, ...);
1304 if( iotrace && iotrace!=stdout ) fclose(iotrace);
1305 iotrace = 0;
1306 if( nArg<2 ){
1307 sqlite3_io_trace = 0;
1308 }else if( strcmp(azArg[1], "-")==0 ){
1309 sqlite3_io_trace = iotracePrintf;
1310 iotrace = stdout;
1311 }else{
1312 iotrace = fopen(azArg[1], "w");
1313 if( iotrace==0 ){
1314 fprintf(stderr, "cannot open \"%s\"\n", azArg[1]);
1315 sqlite3_io_trace = 0;
1316 }else{
1317 sqlite3_io_trace = iotracePrintf;
1318 }
1319 }
1320 }else
drhae5e4452007-05-03 17:18:36 +00001321#endif
drhb0603412007-02-28 04:47:26 +00001322
drh70df4fe2006-06-13 15:12:21 +00001323#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001324 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){
1325 const char *zFile, *zProc;
1326 char *zErrMsg = 0;
1327 int rc;
1328 zFile = azArg[1];
1329 zProc = nArg>=3 ? azArg[2] : 0;
1330 open_db(p);
1331 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
1332 if( rc!=SQLITE_OK ){
1333 fprintf(stderr, "%s\n", zErrMsg);
1334 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00001335 rc = 1;
drh1e397f82006-06-08 15:28:43 +00001336 }
1337 }else
drh70df4fe2006-06-13 15:12:21 +00001338#endif
drh1e397f82006-06-08 15:28:43 +00001339
drh28bd4bc2000-06-15 15:57:22 +00001340 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){
drh75897232000-05-29 14:26:00 +00001341 int n2 = strlen(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00001342 if( strncmp(azArg[1],"line",n2)==0
1343 ||
1344 strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00001345 p->mode = MODE_Line;
persicom7e2dfdd2002-04-18 02:46:52 +00001346 }else if( strncmp(azArg[1],"column",n2)==0
1347 ||
1348 strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00001349 p->mode = MODE_Column;
1350 }else if( strncmp(azArg[1],"list",n2)==0 ){
1351 p->mode = MODE_List;
drh1e5d0e92000-05-31 23:33:17 +00001352 }else if( strncmp(azArg[1],"html",n2)==0 ){
1353 p->mode = MODE_Html;
drhfeac5f82004-08-01 00:10:45 +00001354 }else if( strncmp(azArg[1],"tcl",n2)==0 ){
1355 p->mode = MODE_Tcl;
1356 }else if( strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00001357 p->mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00001358 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
drhfeac5f82004-08-01 00:10:45 +00001359 }else if( strncmp(azArg[1],"tabs",n2)==0 ){
1360 p->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00001361 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
drh28bd4bc2000-06-15 15:57:22 +00001362 }else if( strncmp(azArg[1],"insert",n2)==0 ){
1363 p->mode = MODE_Insert;
1364 if( nArg>=3 ){
drh33048c02001-10-01 14:29:22 +00001365 set_table_name(p, azArg[2]);
drh28bd4bc2000-06-15 15:57:22 +00001366 }else{
drh33048c02001-10-01 14:29:22 +00001367 set_table_name(p, "table");
drh28bd4bc2000-06-15 15:57:22 +00001368 }
drhdaffd0e2001-04-11 14:28:42 +00001369 }else {
drhcf68ae92006-12-19 18:47:41 +00001370 fprintf(stderr,"mode should be one of: "
drhfeac5f82004-08-01 00:10:45 +00001371 "column csv html insert line list tabs tcl\n");
drh75897232000-05-29 14:26:00 +00001372 }
1373 }else
1374
persicom7e2dfdd2002-04-18 02:46:52 +00001375 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) {
drh5bb3eb92007-05-04 13:15:55 +00001376 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
1377 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00001378 }else
1379
drh75897232000-05-29 14:26:00 +00001380 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
1381 if( p->out!=stdout ){
1382 fclose(p->out);
1383 }
1384 if( strcmp(azArg[1],"stdout")==0 ){
1385 p->out = stdout;
drh5bb3eb92007-05-04 13:15:55 +00001386 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout");
drh75897232000-05-29 14:26:00 +00001387 }else{
drha1f9b5e2004-02-14 16:31:02 +00001388 p->out = fopen(azArg[1], "wb");
drh75897232000-05-29 14:26:00 +00001389 if( p->out==0 ){
1390 fprintf(stderr,"can't write to \"%s\"\n", azArg[1]);
1391 p->out = stdout;
persicom7e2dfdd2002-04-18 02:46:52 +00001392 } else {
drh5bb3eb92007-05-04 13:15:55 +00001393 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]);
drh75897232000-05-29 14:26:00 +00001394 }
1395 }
1396 }else
1397
drhdd45df82002-04-18 12:39:03 +00001398 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){
persicom7e2dfdd2002-04-18 02:46:52 +00001399 if( nArg >= 2) {
1400 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
1401 }
1402 if( nArg >= 3) {
1403 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
1404 }
1405 }else
1406
1407 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00001408 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00001409 }else
1410
drhdaffd0e2001-04-11 14:28:42 +00001411 if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){
drha1f9b5e2004-02-14 16:31:02 +00001412 FILE *alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00001413 if( alt==0 ){
1414 fprintf(stderr,"can't open \"%s\"\n", azArg[1]);
1415 }else{
1416 process_input(p, alt);
1417 fclose(alt);
1418 }
1419 }else
1420
drh75897232000-05-29 14:26:00 +00001421 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
1422 struct callback_data data;
1423 char *zErrMsg = 0;
drh44c2eb12003-04-30 11:38:26 +00001424 open_db(p);
drh75897232000-05-29 14:26:00 +00001425 memcpy(&data, p, sizeof(data));
1426 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00001427 data.mode = MODE_Semi;
drh75897232000-05-29 14:26:00 +00001428 if( nArg>1 ){
drhc8d74412004-08-31 23:41:26 +00001429 int i;
1430 for(i=0; azArg[1][i]; i++) azArg[1][i] = tolower(azArg[1][i]);
1431 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00001432 char *new_argv[2], *new_colv[2];
1433 new_argv[0] = "CREATE TABLE sqlite_master (\n"
1434 " type text,\n"
1435 " name text,\n"
1436 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00001437 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00001438 " sql text\n"
1439 ")";
1440 new_argv[1] = 0;
1441 new_colv[0] = "sql";
1442 new_colv[1] = 0;
1443 callback(&data, 1, new_argv, new_colv);
drhc8d74412004-08-31 23:41:26 +00001444 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00001445 char *new_argv[2], *new_colv[2];
1446 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
1447 " type text,\n"
1448 " name text,\n"
1449 " tbl_name text,\n"
1450 " rootpage integer,\n"
1451 " sql text\n"
1452 ")";
1453 new_argv[1] = 0;
1454 new_colv[0] = "sql";
1455 new_colv[1] = 0;
1456 callback(&data, 1, new_argv, new_colv);
drha18c5682000-10-08 22:20:57 +00001457 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00001458 zShellStatic = azArg[1];
1459 sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00001460 "SELECT sql FROM "
1461 " (SELECT * FROM sqlite_master UNION ALL"
1462 " SELECT * FROM sqlite_temp_master) "
danielk1977bc6ada42004-06-30 08:20:16 +00001463 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL "
drhe0bc4042002-06-25 01:09:11 +00001464 "ORDER BY substr(type,2,1), name",
danielk1977bc6ada42004-06-30 08:20:16 +00001465 callback, &data, &zErrMsg);
1466 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00001467 }
drh75897232000-05-29 14:26:00 +00001468 }else{
danielk19776f8a5032004-05-10 10:34:51 +00001469 sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00001470 "SELECT sql FROM "
1471 " (SELECT * FROM sqlite_master UNION ALL"
1472 " SELECT * FROM sqlite_temp_master) "
drh0c356672005-09-10 22:40:53 +00001473 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'"
drhe0bc4042002-06-25 01:09:11 +00001474 "ORDER BY substr(type,2,1), name",
drha18c5682000-10-08 22:20:57 +00001475 callback, &data, &zErrMsg
1476 );
drh75897232000-05-29 14:26:00 +00001477 }
drh75897232000-05-29 14:26:00 +00001478 if( zErrMsg ){
1479 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001480 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00001481 }
1482 }else
1483
1484 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){
drh5bb3eb92007-05-04 13:15:55 +00001485 sqlite3_snprintf(sizeof(p->separator), p->separator,
1486 "%.*s", (int)sizeof(p->separator)-1, azArg[1]);
drh75897232000-05-29 14:26:00 +00001487 }else
1488
persicom7e2dfdd2002-04-18 02:46:52 +00001489 if( c=='s' && strncmp(azArg[0], "show", n)==0){
1490 int i;
1491 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
drh67505e72002-04-19 12:34:06 +00001492 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off");
drhdd45df82002-04-18 12:39:03 +00001493 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
persicom7e2dfdd2002-04-18 02:46:52 +00001494 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
drhfeac5f82004-08-01 00:10:45 +00001495 fprintf(p->out,"%9.9s: ", "nullvalue");
1496 output_c_string(p->out, p->nullvalue);
1497 fprintf(p->out, "\n");
drh67505e72002-04-19 12:34:06 +00001498 fprintf(p->out,"%9.9s: %s\n","output",
1499 strlen(p->outfile) ? p->outfile : "stdout");
drhfeac5f82004-08-01 00:10:45 +00001500 fprintf(p->out,"%9.9s: ", "separator");
1501 output_c_string(p->out, p->separator);
1502 fprintf(p->out, "\n");
persicom7e2dfdd2002-04-18 02:46:52 +00001503 fprintf(p->out,"%9.9s: ","width");
1504 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00001505 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00001506 }
drhfeac5f82004-08-01 00:10:45 +00001507 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00001508 }else
1509
drh2dfbbca2000-07-28 14:32:48 +00001510 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drhe3710332000-09-29 13:30:53 +00001511 char **azResult;
1512 int nRow, rc;
1513 char *zErrMsg;
drh44c2eb12003-04-30 11:38:26 +00001514 open_db(p);
drha50da102000-08-08 20:19:09 +00001515 if( nArg==1 ){
danielk19776f8a5032004-05-10 10:34:51 +00001516 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00001517 "SELECT name FROM sqlite_master "
drh0c356672005-09-10 22:40:53 +00001518 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'"
drhe0bc4042002-06-25 01:09:11 +00001519 "UNION ALL "
1520 "SELECT name FROM sqlite_temp_master "
1521 "WHERE type IN ('table','view') "
1522 "ORDER BY 1",
drha18c5682000-10-08 22:20:57 +00001523 &azResult, &nRow, 0, &zErrMsg
1524 );
drha50da102000-08-08 20:19:09 +00001525 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00001526 zShellStatic = azArg[1];
1527 rc = sqlite3_get_table(p->db,
drha50da102000-08-08 20:19:09 +00001528 "SELECT name FROM sqlite_master "
danielk1977bc6ada42004-06-30 08:20:16 +00001529 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
drhe0bc4042002-06-25 01:09:11 +00001530 "UNION ALL "
1531 "SELECT name FROM sqlite_temp_master "
danielk1977bc6ada42004-06-30 08:20:16 +00001532 "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' "
drhe0bc4042002-06-25 01:09:11 +00001533 "ORDER BY 1",
danielk1977bc6ada42004-06-30 08:20:16 +00001534 &azResult, &nRow, 0, &zErrMsg
drha18c5682000-10-08 22:20:57 +00001535 );
danielk1977bc6ada42004-06-30 08:20:16 +00001536 zShellStatic = 0;
drha50da102000-08-08 20:19:09 +00001537 }
drh75897232000-05-29 14:26:00 +00001538 if( zErrMsg ){
1539 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001540 sqlite3_free(zErrMsg);
drh75897232000-05-29 14:26:00 +00001541 }
drhe3710332000-09-29 13:30:53 +00001542 if( rc==SQLITE_OK ){
1543 int len, maxlen = 0;
1544 int i, j;
1545 int nPrintCol, nPrintRow;
1546 for(i=1; i<=nRow; i++){
1547 if( azResult[i]==0 ) continue;
1548 len = strlen(azResult[i]);
1549 if( len>maxlen ) maxlen = len;
1550 }
1551 nPrintCol = 80/(maxlen+2);
1552 if( nPrintCol<1 ) nPrintCol = 1;
1553 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
1554 for(i=0; i<nPrintRow; i++){
1555 for(j=i+1; j<=nRow; j+=nPrintRow){
1556 char *zSp = j<=nPrintRow ? "" : " ";
1557 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "");
1558 }
1559 printf("\n");
1560 }
drh47ad6842006-11-08 12:25:42 +00001561 }else{
1562 rc = 1;
drhe3710332000-09-29 13:30:53 +00001563 }
danielk19776f8a5032004-05-10 10:34:51 +00001564 sqlite3_free_table(azResult);
drh75897232000-05-29 14:26:00 +00001565 }else
1566
drh3b1a9882007-11-02 12:53:03 +00001567 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){
drh44c2eb12003-04-30 11:38:26 +00001568 open_db(p);
danielk19776f8a5032004-05-10 10:34:51 +00001569 sqlite3_busy_timeout(p->db, atoi(azArg[1]));
drh2dfbbca2000-07-28 14:32:48 +00001570 }else
drh3b1a9882007-11-02 12:53:03 +00001571
1572#if HAS_TIMER
1573 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){
1574 enableTimer = booleanValue(azArg[1]);
1575 }else
1576#endif
drh2dfbbca2000-07-28 14:32:48 +00001577
drh75897232000-05-29 14:26:00 +00001578 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
1579 int j;
drh43617e92006-03-06 20:55:46 +00001580 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00001581 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
1582 p->colWidth[j-1] = atoi(azArg[j]);
1583 }
1584 }else
1585
drh3b1a9882007-11-02 12:53:03 +00001586
drh75897232000-05-29 14:26:00 +00001587 {
drh67505e72002-04-19 12:34:06 +00001588 fprintf(stderr, "unknown command or invalid arguments: "
1589 " \"%s\". Enter \".help\" for help\n", azArg[0]);
drh75897232000-05-29 14:26:00 +00001590 }
drh67505e72002-04-19 12:34:06 +00001591
1592 return rc;
drh75897232000-05-29 14:26:00 +00001593}
1594
drh67505e72002-04-19 12:34:06 +00001595/*
drh91a66392007-09-07 01:12:32 +00001596** Return TRUE if a semicolon occurs anywhere in the first N characters
1597** of string z[].
drh324ccef2003-02-05 14:06:20 +00001598*/
drh91a66392007-09-07 01:12:32 +00001599static int _contains_semicolon(const char *z, int N){
1600 int i;
1601 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
1602 return 0;
drh324ccef2003-02-05 14:06:20 +00001603}
1604
1605/*
drh70c7a4b2003-04-26 03:03:06 +00001606** Test to see if a line consists entirely of whitespace.
1607*/
1608static int _all_whitespace(const char *z){
1609 for(; *z; z++){
drh4c755c02004-08-08 20:22:17 +00001610 if( isspace(*(unsigned char*)z) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00001611 if( *z=='/' && z[1]=='*' ){
1612 z += 2;
1613 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
1614 if( *z==0 ) return 0;
1615 z++;
1616 continue;
1617 }
1618 if( *z=='-' && z[1]=='-' ){
1619 z += 2;
1620 while( *z && *z!='\n' ){ z++; }
1621 if( *z==0 ) return 1;
1622 continue;
1623 }
1624 return 0;
1625 }
1626 return 1;
1627}
1628
1629/*
drha9b17162003-04-29 18:01:28 +00001630** Return TRUE if the line typed in is an SQL command terminator other
1631** than a semi-colon. The SQL Server style "go" command is understood
1632** as is the Oracle "/".
1633*/
1634static int _is_command_terminator(const char *zLine){
drh4c755c02004-08-08 20:22:17 +00001635 while( isspace(*(unsigned char*)zLine) ){ zLine++; };
drha9b17162003-04-29 18:01:28 +00001636 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ) return 1; /* Oracle */
drhc8d74412004-08-31 23:41:26 +00001637 if( tolower(zLine[0])=='g' && tolower(zLine[1])=='o'
1638 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00001639 return 1; /* SQL Server */
1640 }
1641 return 0;
1642}
1643
1644/*
drh67505e72002-04-19 12:34:06 +00001645** Read input from *in and process it. If *in==0 then input
1646** is interactive - the user is typing it it. Otherwise, input
1647** is coming from a file or device. A prompt is issued and history
1648** is saved only if input is interactive. An interrupt signal will
1649** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00001650**
1651** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00001652*/
drhc28490c2006-10-26 14:25:58 +00001653static int process_input(struct callback_data *p, FILE *in){
danielk19772ac27622007-07-03 05:31:16 +00001654 char *zLine = 0;
drhdaffd0e2001-04-11 14:28:42 +00001655 char *zSql = 0;
1656 int nSql = 0;
drh91a66392007-09-07 01:12:32 +00001657 int nSqlPrior = 0;
drhdaffd0e2001-04-11 14:28:42 +00001658 char *zErrMsg;
drhc49f44e2006-10-26 18:15:42 +00001659 int rc;
1660 int errCnt = 0;
drhc28490c2006-10-26 14:25:58 +00001661 int lineno = 0;
1662 int startline = 0;
drhc49f44e2006-10-26 18:15:42 +00001663
1664 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
1665 fflush(p->out);
danielk19772ac27622007-07-03 05:31:16 +00001666 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00001667 zLine = one_input_line(zSql, in);
1668 if( zLine==0 ){
1669 break; /* We have reached EOF */
1670 }
drh67505e72002-04-19 12:34:06 +00001671 if( seenInterrupt ){
1672 if( in!=0 ) break;
1673 seenInterrupt = 0;
1674 }
drhc28490c2006-10-26 14:25:58 +00001675 lineno++;
drhdaffd0e2001-04-11 14:28:42 +00001676 if( p->echoOn ) printf("%s\n", zLine);
drhf817b6b2003-06-16 00:16:41 +00001677 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue;
drh2af0b2d2002-02-21 02:25:02 +00001678 if( zLine && zLine[0]=='.' && nSql==0 ){
drhc49f44e2006-10-26 18:15:42 +00001679 rc = do_meta_command(zLine, p);
drh47ad6842006-11-08 12:25:42 +00001680 if( rc==2 ){
1681 break;
1682 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00001683 errCnt++;
1684 }
drhdaffd0e2001-04-11 14:28:42 +00001685 continue;
1686 }
drha9b17162003-04-29 18:01:28 +00001687 if( _is_command_terminator(zLine) ){
drh5bb3eb92007-05-04 13:15:55 +00001688 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00001689 }
drh91a66392007-09-07 01:12:32 +00001690 nSqlPrior = nSql;
drhdaffd0e2001-04-11 14:28:42 +00001691 if( zSql==0 ){
1692 int i;
drh4c755c02004-08-08 20:22:17 +00001693 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){}
drhdaffd0e2001-04-11 14:28:42 +00001694 if( zLine[i]!=0 ){
1695 nSql = strlen(zLine);
1696 zSql = malloc( nSql+1 );
drhc1f44942006-05-10 14:39:13 +00001697 if( zSql==0 ){
1698 fprintf(stderr, "out of memory\n");
1699 exit(1);
1700 }
drh5bb3eb92007-05-04 13:15:55 +00001701 memcpy(zSql, zLine, nSql+1);
drhc28490c2006-10-26 14:25:58 +00001702 startline = lineno;
drhdaffd0e2001-04-11 14:28:42 +00001703 }
1704 }else{
1705 int len = strlen(zLine);
1706 zSql = realloc( zSql, nSql + len + 2 );
1707 if( zSql==0 ){
1708 fprintf(stderr,"%s: out of memory!\n", Argv0);
1709 exit(1);
1710 }
drh5bb3eb92007-05-04 13:15:55 +00001711 zSql[nSql++] = '\n';
1712 memcpy(&zSql[nSql], zLine, len+1);
drhdaffd0e2001-04-11 14:28:42 +00001713 nSql += len;
1714 }
drh91a66392007-09-07 01:12:32 +00001715 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
1716 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00001717 p->cnt = 0;
drh44c2eb12003-04-30 11:38:26 +00001718 open_db(p);
drh3b1a9882007-11-02 12:53:03 +00001719 BEGIN_TIMER;
danielk19776f8a5032004-05-10 10:34:51 +00001720 rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00001721 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00001722 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00001723 char zPrefix[100];
1724 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00001725 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
1726 "SQL error near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00001727 }else{
drh5bb3eb92007-05-04 13:15:55 +00001728 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:");
drhc28490c2006-10-26 14:25:58 +00001729 }
drh7f953e22002-07-13 17:33:45 +00001730 if( zErrMsg!=0 ){
drhc28490c2006-10-26 14:25:58 +00001731 printf("%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00001732 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00001733 zErrMsg = 0;
1734 }else{
drhc28490c2006-10-26 14:25:58 +00001735 printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00001736 }
drhc49f44e2006-10-26 18:15:42 +00001737 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00001738 }
1739 free(zSql);
1740 zSql = 0;
1741 nSql = 0;
1742 }
1743 }
1744 if( zSql ){
drh70c7a4b2003-04-26 03:03:06 +00001745 if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql);
drhdaffd0e2001-04-11 14:28:42 +00001746 free(zSql);
1747 }
danielk19772ac27622007-07-03 05:31:16 +00001748 free(zLine);
drhc49f44e2006-10-26 18:15:42 +00001749 return errCnt;
drhdaffd0e2001-04-11 14:28:42 +00001750}
1751
drh67505e72002-04-19 12:34:06 +00001752/*
1753** Return a pathname which is the user's home directory. A
1754** 0 return indicates an error of some kind. Space to hold the
1755** resulting string is obtained from malloc(). The calling
1756** function should free the result.
1757*/
1758static char *find_home_dir(void){
1759 char *home_dir = NULL;
persicom7e2dfdd2002-04-18 02:46:52 +00001760
drh454ad582007-11-26 22:54:27 +00001761#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE)
drh67505e72002-04-19 12:34:06 +00001762 struct passwd *pwent;
1763 uid_t uid = getuid();
drhbd842ba2002-08-21 11:26:41 +00001764 if( (pwent=getpwuid(uid)) != NULL) {
1765 home_dir = pwent->pw_dir;
drh67505e72002-04-19 12:34:06 +00001766 }
1767#endif
1768
chw65d3c132007-11-12 21:09:10 +00001769#if defined(_WIN32_WCE)
1770 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
1771 */
1772 home_dir = strdup("/");
1773#else
1774
drh164a1b62006-08-19 11:15:20 +00001775#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
1776 if (!home_dir) {
1777 home_dir = getenv("USERPROFILE");
1778 }
1779#endif
1780
drh67505e72002-04-19 12:34:06 +00001781 if (!home_dir) {
1782 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00001783 }
1784
drhcdb36b72006-06-12 12:57:45 +00001785#if defined(_WIN32) || defined(WIN32) || defined(__OS2__)
drhe98d4fa2002-04-21 19:06:22 +00001786 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00001787 char *zDrive, *zPath;
1788 int n;
1789 zDrive = getenv("HOMEDRIVE");
1790 zPath = getenv("HOMEPATH");
1791 if( zDrive && zPath ){
1792 n = strlen(zDrive) + strlen(zPath) + 1;
1793 home_dir = malloc( n );
1794 if( home_dir==0 ) return 0;
1795 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
1796 return home_dir;
1797 }
1798 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00001799 }
1800#endif
1801
chw65d3c132007-11-12 21:09:10 +00001802#endif /* !_WIN32_WCE */
1803
drh67505e72002-04-19 12:34:06 +00001804 if( home_dir ){
drh5bb3eb92007-05-04 13:15:55 +00001805 int n = strlen(home_dir) + 1;
1806 char *z = malloc( n );
1807 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00001808 home_dir = z;
1809 }
drhe98d4fa2002-04-21 19:06:22 +00001810
drh67505e72002-04-19 12:34:06 +00001811 return home_dir;
1812}
1813
1814/*
1815** Read input from the file given by sqliterc_override. Or if that
1816** parameter is NULL, take input from ~/.sqliterc
1817*/
drh22fbcb82004-02-01 01:22:50 +00001818static void process_sqliterc(
1819 struct callback_data *p, /* Configuration data */
1820 const char *sqliterc_override /* Name of config file. NULL to use default */
1821){
persicom7e2dfdd2002-04-18 02:46:52 +00001822 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00001823 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00001824 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00001825 FILE *in = NULL;
drha959ac42007-06-20 13:10:00 +00001826 int nBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00001827
1828 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00001829 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00001830 if( home_dir==0 ){
1831 fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0);
1832 return;
1833 }
drha959ac42007-06-20 13:10:00 +00001834 nBuf = strlen(home_dir) + 16;
1835 zBuf = malloc( nBuf );
drh22fbcb82004-02-01 01:22:50 +00001836 if( zBuf==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00001837 fprintf(stderr,"%s: out of memory!\n", Argv0);
1838 exit(1);
1839 }
drha959ac42007-06-20 13:10:00 +00001840 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
drh67505e72002-04-19 12:34:06 +00001841 free(home_dir);
drh22fbcb82004-02-01 01:22:50 +00001842 sqliterc = (const char*)zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00001843 }
drha1f9b5e2004-02-14 16:31:02 +00001844 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00001845 if( in ){
drhc28490c2006-10-26 14:25:58 +00001846 if( stdin_is_interactive ){
drhb695aca2007-07-30 20:41:52 +00001847 printf("-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00001848 }
persicom7e2dfdd2002-04-18 02:46:52 +00001849 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00001850 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00001851 }
drh43617e92006-03-06 20:55:46 +00001852 free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00001853 return;
1854}
1855
drh67505e72002-04-19 12:34:06 +00001856/*
drhe1e38c42003-05-04 18:30:59 +00001857** Show available command line options
1858*/
1859static const char zOptions[] =
1860 " -init filename read/process named file\n"
1861 " -echo print commands before execution\n"
1862 " -[no]header turn headers on or off\n"
drhc49f44e2006-10-26 18:15:42 +00001863 " -bail stop after hitting an error\n"
1864 " -interactive force interactive I/O\n"
1865 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00001866 " -column set output mode to 'column'\n"
drhc49f44e2006-10-26 18:15:42 +00001867 " -csv set output mode to 'csv'\n"
drhe1e38c42003-05-04 18:30:59 +00001868 " -html set output mode to HTML\n"
1869 " -line set output mode to 'line'\n"
1870 " -list set output mode to 'list'\n"
1871 " -separator 'x' set output field separator (|)\n"
1872 " -nullvalue 'text' set text string for NULL values\n"
1873 " -version show SQLite version\n"
drhe1e38c42003-05-04 18:30:59 +00001874;
1875static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00001876 fprintf(stderr,
1877 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
1878 "FILENAME is the name of an SQLite database. A new database is created\n"
1879 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00001880 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00001881 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00001882 }else{
1883 fprintf(stderr, "Use the -help option for additional information\n");
1884 }
1885 exit(1);
1886}
1887
1888/*
drh67505e72002-04-19 12:34:06 +00001889** Initialize the state information in data
1890*/
drh0850b532006-01-31 19:31:43 +00001891static void main_init(struct callback_data *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00001892 memset(data, 0, sizeof(*data));
1893 data->mode = MODE_List;
drh5bb3eb92007-05-04 13:15:55 +00001894 memcpy(data->separator,"|", 2);
persicom7e2dfdd2002-04-18 02:46:52 +00001895 data->showHeader = 0;
drh5bb3eb92007-05-04 13:15:55 +00001896 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
1897 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00001898}
1899
drh75897232000-05-29 14:26:00 +00001900int main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00001901 char *zErrMsg = 0;
1902 struct callback_data data;
drh22fbcb82004-02-01 01:22:50 +00001903 const char *zInitFile = 0;
1904 char *zFirstCmd = 0;
drh44c2eb12003-04-30 11:38:26 +00001905 int i;
drhc28490c2006-10-26 14:25:58 +00001906 int rc = 0;
drh75897232000-05-29 14:26:00 +00001907
drhdaffd0e2001-04-11 14:28:42 +00001908 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00001909 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00001910 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00001911
drh44c2eb12003-04-30 11:38:26 +00001912 /* Make sure we have a valid signal handler early, before anything
1913 ** else is done.
1914 */
drh4c504392000-10-16 22:06:40 +00001915#ifdef SIGINT
1916 signal(SIGINT, interrupt_handler);
1917#endif
drh44c2eb12003-04-30 11:38:26 +00001918
drh22fbcb82004-02-01 01:22:50 +00001919 /* Do an initial pass through the command-line argument to locate
1920 ** the name of the database file, the name of the initialization file,
1921 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00001922 */
drh22fbcb82004-02-01 01:22:50 +00001923 for(i=1; i<argc-1; i++){
drhc28490c2006-10-26 14:25:58 +00001924 char *z;
drh44c2eb12003-04-30 11:38:26 +00001925 if( argv[i][0]!='-' ) break;
drhc28490c2006-10-26 14:25:58 +00001926 z = argv[i];
1927 if( z[0]=='-' && z[1]=='-' ) z++;
drh44c2eb12003-04-30 11:38:26 +00001928 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){
1929 i++;
drh22fbcb82004-02-01 01:22:50 +00001930 }else if( strcmp(argv[i],"-init")==0 ){
1931 i++;
1932 zInitFile = argv[i];
drh44c2eb12003-04-30 11:38:26 +00001933 }
1934 }
drh22fbcb82004-02-01 01:22:50 +00001935 if( i<argc ){
1936 data.zDbFilename = argv[i++];
1937 }else{
danielk197703aded42004-11-22 05:26:27 +00001938#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00001939 data.zDbFilename = ":memory:";
danielk197703aded42004-11-22 05:26:27 +00001940#else
1941 data.zDbFilename = 0;
1942#endif
drh22fbcb82004-02-01 01:22:50 +00001943 }
1944 if( i<argc ){
1945 zFirstCmd = argv[i++];
1946 }
drh44c2eb12003-04-30 11:38:26 +00001947 data.out = stdout;
1948
drh01b41712005-08-29 23:06:23 +00001949#ifdef SQLITE_OMIT_MEMORYDB
1950 if( data.zDbFilename==0 ){
1951 fprintf(stderr,"%s: no database filename specified\n", argv[0]);
1952 exit(1);
1953 }
1954#endif
1955
drh44c2eb12003-04-30 11:38:26 +00001956 /* Go ahead and open the database file if it already exists. If the
1957 ** file does not exist, delay opening it. This prevents empty database
1958 ** files from being created if a user mistypes the database name argument
1959 ** to the sqlite command-line tool.
1960 */
drhc8d74412004-08-31 23:41:26 +00001961 if( access(data.zDbFilename, 0)==0 ){
drh44c2eb12003-04-30 11:38:26 +00001962 open_db(&data);
1963 }
1964
drh22fbcb82004-02-01 01:22:50 +00001965 /* Process the initialization file if there is one. If no -init option
1966 ** is given on the command line, look for a file named ~/.sqliterc and
1967 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00001968 */
drh22fbcb82004-02-01 01:22:50 +00001969 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00001970
drh22fbcb82004-02-01 01:22:50 +00001971 /* Make a second pass through the command-line argument and set
1972 ** options. This second pass is delayed until after the initialization
1973 ** file is processed so that the command-line arguments will override
1974 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00001975 */
drh22fbcb82004-02-01 01:22:50 +00001976 for(i=1; i<argc && argv[i][0]=='-'; i++){
1977 char *z = argv[i];
drhc28490c2006-10-26 14:25:58 +00001978 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00001979 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00001980 i++;
1981 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00001982 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00001983 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00001984 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00001985 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00001986 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00001987 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00001988 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00001989 }else if( strcmp(z,"-csv")==0 ){
1990 data.mode = MODE_Csv;
drh5bb3eb92007-05-04 13:15:55 +00001991 memcpy(data.separator,",",2);
drh22fbcb82004-02-01 01:22:50 +00001992 }else if( strcmp(z,"-separator")==0 ){
1993 i++;
drh5bb3eb92007-05-04 13:15:55 +00001994 sqlite3_snprintf(sizeof(data.separator), data.separator,
1995 "%.*s",(int)sizeof(data.separator)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00001996 }else if( strcmp(z,"-nullvalue")==0 ){
1997 i++;
drh5bb3eb92007-05-04 13:15:55 +00001998 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
1999 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]);
drh22fbcb82004-02-01 01:22:50 +00002000 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002001 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00002002 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00002003 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00002004 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00002005 data.echoOn = 1;
drhc49f44e2006-10-26 18:15:42 +00002006 }else if( strcmp(z,"-bail")==0 ){
2007 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00002008 }else if( strcmp(z,"-version")==0 ){
drhc8d74412004-08-31 23:41:26 +00002009 printf("%s\n", sqlite3_libversion());
drh151e3e12006-06-06 12:32:21 +00002010 return 0;
drhc28490c2006-10-26 14:25:58 +00002011 }else if( strcmp(z,"-interactive")==0 ){
2012 stdin_is_interactive = 1;
2013 }else if( strcmp(z,"-batch")==0 ){
2014 stdin_is_interactive = 0;
drh80e8be92006-08-29 12:04:19 +00002015 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00002016 usage(1);
drh1e5d0e92000-05-31 23:33:17 +00002017 }else{
drh22fbcb82004-02-01 01:22:50 +00002018 fprintf(stderr,"%s: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00002019 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00002020 return 1;
2021 }
2022 }
drh44c2eb12003-04-30 11:38:26 +00002023
drh22fbcb82004-02-01 01:22:50 +00002024 if( zFirstCmd ){
drh44c2eb12003-04-30 11:38:26 +00002025 /* Run just the command that follows the database name
2026 */
drh22fbcb82004-02-01 01:22:50 +00002027 if( zFirstCmd[0]=='.' ){
2028 do_meta_command(zFirstCmd, &data);
drh6ff13852001-11-25 13:18:23 +00002029 exit(0);
2030 }else{
2031 int rc;
drh44c2eb12003-04-30 11:38:26 +00002032 open_db(&data);
danielk19776f8a5032004-05-10 10:34:51 +00002033 rc = sqlite3_exec(data.db, zFirstCmd, callback, &data, &zErrMsg);
drh6ff13852001-11-25 13:18:23 +00002034 if( rc!=0 && zErrMsg!=0 ){
2035 fprintf(stderr,"SQL error: %s\n", zErrMsg);
2036 exit(1);
2037 }
drh75897232000-05-29 14:26:00 +00002038 }
2039 }else{
drh44c2eb12003-04-30 11:38:26 +00002040 /* Run commands received from standard input
2041 */
drhc28490c2006-10-26 14:25:58 +00002042 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00002043 char *zHome;
2044 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00002045 int nHistory;
drh75897232000-05-29 14:26:00 +00002046 printf(
drhb217a572000-08-22 13:40:18 +00002047 "SQLite version %s\n"
2048 "Enter \".help\" for instructions\n",
drhc8d74412004-08-31 23:41:26 +00002049 sqlite3_libversion()
drh75897232000-05-29 14:26:00 +00002050 );
drh67505e72002-04-19 12:34:06 +00002051 zHome = find_home_dir();
drh5bb3eb92007-05-04 13:15:55 +00002052 if( zHome && (zHistory = malloc(nHistory = strlen(zHome)+20))!=0 ){
2053 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
drh67505e72002-04-19 12:34:06 +00002054 }
danielk19774af00c62005-01-23 23:43:21 +00002055#if defined(HAVE_READLINE) && HAVE_READLINE==1
drh67505e72002-04-19 12:34:06 +00002056 if( zHistory ) read_history(zHistory);
danielk19774af00c62005-01-23 23:43:21 +00002057#endif
drhc28490c2006-10-26 14:25:58 +00002058 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00002059 if( zHistory ){
2060 stifle_history(100);
2061 write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00002062 free(zHistory);
drh67505e72002-04-19 12:34:06 +00002063 }
adamd0a3daa32006-07-28 20:16:14 +00002064 free(zHome);
drhdaffd0e2001-04-11 14:28:42 +00002065 }else{
drhc28490c2006-10-26 14:25:58 +00002066 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00002067 }
2068 }
drh33048c02001-10-01 14:29:22 +00002069 set_table_name(&data, 0);
adamd0a3daa32006-07-28 20:16:14 +00002070 if( db ){
2071 if( sqlite3_close(db)!=SQLITE_OK ){
2072 fprintf(stderr,"error closing database: %s\n", sqlite3_errmsg(db));
2073 }
2074 }
drhc28490c2006-10-26 14:25:58 +00002075 return rc;
drh75897232000-05-29 14:26:00 +00002076}