Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: third_party/sqlite/sqlite-src-3080704/src/shell.c

Issue 883353008: [sql] Import reference version of SQLite 3.8.7.4. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Hold back encoding change which is messing up patch. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
11 ************************************************************************* 11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line 12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases. 13 ** utility for accessing SQLite databases.
14 */ 14 */
15 #if defined(_WIN32) || defined(WIN32) 15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */ 16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS 17 #define _CRT_SECURE_NO_WARNINGS
18 #endif 18 #endif
19 19
20 /*
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
20 #include <stdlib.h> 31 #include <stdlib.h>
21 #include <string.h> 32 #include <string.h>
22 #include <stdio.h> 33 #include <stdio.h>
23 #include <assert.h> 34 #include <assert.h>
24 #include "sqlite3.h" 35 #include "sqlite3.h"
36 #if SQLITE_USER_AUTHENTICATION
37 # include "sqlite3userauth.h"
38 #endif
25 #include <ctype.h> 39 #include <ctype.h>
26 #include <stdarg.h> 40 #include <stdarg.h>
27 41
28 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) 42 #if !defined(_WIN32) && !defined(WIN32)
29 # include <signal.h> 43 # include <signal.h>
30 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 44 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
31 # include <pwd.h> 45 # include <pwd.h>
32 # endif 46 # endif
33 # include <unistd.h> 47 # include <unistd.h>
34 # include <sys/types.h> 48 # include <sys/types.h>
35 #endif 49 #endif
36 50
37 #ifdef __OS2__ 51 #if defined(HAVE_READLINE) && HAVE_READLINE!=0
38 # include <unistd.h>
39 #endif
40
41 #ifdef HAVE_EDITLINE
42 # include <editline/editline.h>
43 #endif
44 #if defined(HAVE_READLINE) && HAVE_READLINE==1
45 # include <readline/readline.h> 52 # include <readline/readline.h>
46 # include <readline/history.h> 53 # include <readline/history.h>
54 #else
55 # undef HAVE_READLINE
47 #endif 56 #endif
48 #if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1) 57 #if defined(HAVE_EDITLINE) && !defined(HAVE_READLINE)
49 # define readline(p) local_getline(p,stdin) 58 # define HAVE_READLINE 1
59 # include <editline/readline.h>
60 #endif
61 #if !defined(HAVE_READLINE)
50 # define add_history(X) 62 # define add_history(X)
51 # define read_history(X) 63 # define read_history(X)
52 # define write_history(X) 64 # define write_history(X)
53 # define stifle_history(X) 65 # define stifle_history(X)
54 #endif 66 #endif
55 67
56 #if defined(_WIN32) || defined(WIN32) 68 #if defined(_WIN32) || defined(WIN32)
57 # include <io.h> 69 # include <io.h>
70 # include <fcntl.h>
58 #define isatty(h) _isatty(h) 71 #define isatty(h) _isatty(h)
59 #define access(f,m) _access((f),(m)) 72 #ifndef access
73 # define access(f,m) _access((f),(m))
74 #endif
75 #undef popen
76 #define popen _popen
77 #undef pclose
78 #define pclose _pclose
60 #else 79 #else
61 /* Make sure isatty() has a prototype. 80 /* Make sure isatty() has a prototype.
62 */ 81 */
63 extern int isatty(); 82 extern int isatty(int);
83
84 /* popen and pclose are not C89 functions and so are sometimes omitted from
85 ** the <stdio.h> header */
86 extern FILE *popen(const char*,const char*);
87 extern int pclose(FILE*);
64 #endif 88 #endif
65 89
66 #if defined(_WIN32_WCE) 90 #if defined(_WIN32_WCE)
67 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 91 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
68 * thus we always assume that we have a console. That can be 92 * thus we always assume that we have a console. That can be
69 * overridden with the -batch command line option. 93 * overridden with the -batch command line option.
70 */ 94 */
71 #define isatty(x) 1 95 #define isatty(x) 1
72 #endif 96 #endif
73 97
98 /* ctype macros that work with signed characters */
99 #define IsSpace(X) isspace((unsigned char)X)
100 #define IsDigit(X) isdigit((unsigned char)X)
101 #define ToLower(X) (char)tolower((unsigned char)X)
102
103
74 /* True if the timer is enabled */ 104 /* True if the timer is enabled */
75 static int enableTimer = 0; 105 static int enableTimer = 0;
76 106
77 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__ ) && !defined(_WRS_KERNEL) 107 /* Return the current wall-clock time */
108 static sqlite3_int64 timeOfDay(void){
109 static sqlite3_vfs *clockVfs = 0;
110 sqlite3_int64 t;
111 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
112 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
113 clockVfs->xCurrentTimeInt64(clockVfs, &t);
114 }else{
115 double r;
116 clockVfs->xCurrentTime(clockVfs, &r);
117 t = (sqlite3_int64)(r*86400000.0);
118 }
119 return t;
120 }
121
122 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \
123 && !defined(__minux)
78 #include <sys/time.h> 124 #include <sys/time.h>
79 #include <sys/resource.h> 125 #include <sys/resource.h>
80 126
81 /* Saved resource information for the beginning of an operation */ 127 /* Saved resource information for the beginning of an operation */
82 static struct rusage sBegin; 128 static struct rusage sBegin; /* CPU time at start */
129 static sqlite3_int64 iBegin; /* Wall-clock time at start */
83 130
84 /* 131 /*
85 ** Begin timing an operation 132 ** Begin timing an operation
86 */ 133 */
87 static void beginTimer(void){ 134 static void beginTimer(void){
88 if( enableTimer ){ 135 if( enableTimer ){
89 getrusage(RUSAGE_SELF, &sBegin); 136 getrusage(RUSAGE_SELF, &sBegin);
137 iBegin = timeOfDay();
90 } 138 }
91 } 139 }
92 140
93 /* Return the difference of two time_structs in seconds */ 141 /* Return the difference of two time_structs in seconds */
94 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 142 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
95 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 143 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
96 (double)(pEnd->tv_sec - pStart->tv_sec); 144 (double)(pEnd->tv_sec - pStart->tv_sec);
97 } 145 }
98 146
99 /* 147 /*
100 ** Print the timing results. 148 ** Print the timing results.
101 */ 149 */
102 static void endTimer(void){ 150 static void endTimer(void){
103 if( enableTimer ){ 151 if( enableTimer ){
104 struct rusage sEnd; 152 struct rusage sEnd;
153 sqlite3_int64 iEnd = timeOfDay();
105 getrusage(RUSAGE_SELF, &sEnd); 154 getrusage(RUSAGE_SELF, &sEnd);
106 printf("CPU Time: user %f sys %f\n", 155 printf("Run Time: real %.3f user %f sys %f\n",
156 (iEnd - iBegin)*0.001,
107 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 157 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
108 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 158 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
109 } 159 }
110 } 160 }
111 161
112 #define BEGIN_TIMER beginTimer() 162 #define BEGIN_TIMER beginTimer()
113 #define END_TIMER endTimer() 163 #define END_TIMER endTimer()
114 #define HAS_TIMER 1 164 #define HAS_TIMER 1
115 165
116 #elif (defined(_WIN32) || defined(WIN32)) 166 #elif (defined(_WIN32) || defined(WIN32))
117 167
118 #include <windows.h> 168 #include <windows.h>
119 169
120 /* Saved resource information for the beginning of an operation */ 170 /* Saved resource information for the beginning of an operation */
121 static HANDLE hProcess; 171 static HANDLE hProcess;
122 static FILETIME ftKernelBegin; 172 static FILETIME ftKernelBegin;
123 static FILETIME ftUserBegin; 173 static FILETIME ftUserBegin;
174 static sqlite3_int64 ftWallBegin;
124 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME); 175 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
125 static GETPROCTIMES getProcessTimesAddr = NULL; 176 static GETPROCTIMES getProcessTimesAddr = NULL;
126 177
127 /* 178 /*
128 ** Check to see if we have timer support. Return 1 if necessary 179 ** Check to see if we have timer support. Return 1 if necessary
129 ** support found (or found previously). 180 ** support found (or found previously).
130 */ 181 */
131 static int hasTimer(void){ 182 static int hasTimer(void){
132 if( getProcessTimesAddr ){ 183 if( getProcessTimesAddr ){
133 return 1; 184 return 1;
(...skipping 17 matching lines...) Expand all
151 return 0; 202 return 0;
152 } 203 }
153 204
154 /* 205 /*
155 ** Begin timing an operation 206 ** Begin timing an operation
156 */ 207 */
157 static void beginTimer(void){ 208 static void beginTimer(void){
158 if( enableTimer && getProcessTimesAddr ){ 209 if( enableTimer && getProcessTimesAddr ){
159 FILETIME ftCreation, ftExit; 210 FILETIME ftCreation, ftExit;
160 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserB egin); 211 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserB egin);
212 ftWallBegin = timeOfDay();
161 } 213 }
162 } 214 }
163 215
164 /* Return the difference of two FILETIME structs in seconds */ 216 /* Return the difference of two FILETIME structs in seconds */
165 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 217 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
166 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 218 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
167 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 219 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
168 return (double) ((i64End - i64Start) / 10000000.0); 220 return (double) ((i64End - i64Start) / 10000000.0);
169 } 221 }
170 222
171 /* 223 /*
172 ** Print the timing results. 224 ** Print the timing results.
173 */ 225 */
174 static void endTimer(void){ 226 static void endTimer(void){
175 if( enableTimer && getProcessTimesAddr){ 227 if( enableTimer && getProcessTimesAddr){
176 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 228 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
229 sqlite3_int64 ftWallEnd = timeOfDay();
177 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd ); 230 getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd );
178 printf("CPU Time: user %f sys %f\n", 231 printf("Run Time: real %.3f user %f sys %f\n",
232 (ftWallEnd - ftWallBegin)*0.001,
179 timeDiff(&ftUserBegin, &ftUserEnd), 233 timeDiff(&ftUserBegin, &ftUserEnd),
180 timeDiff(&ftKernelBegin, &ftKernelEnd)); 234 timeDiff(&ftKernelBegin, &ftKernelEnd));
181 } 235 }
182 } 236 }
183 237
184 #define BEGIN_TIMER beginTimer() 238 #define BEGIN_TIMER beginTimer()
185 #define END_TIMER endTimer() 239 #define END_TIMER endTimer()
186 #define HAS_TIMER hasTimer() 240 #define HAS_TIMER hasTimer()
187 241
188 #else 242 #else
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 sqlite3_free(z); 312 sqlite3_free(z);
259 } 313 }
260 #endif 314 #endif
261 315
262 316
263 /* 317 /*
264 ** Determines if a string is a number of not. 318 ** Determines if a string is a number of not.
265 */ 319 */
266 static int isNumber(const char *z, int *realnum){ 320 static int isNumber(const char *z, int *realnum){
267 if( *z=='-' || *z=='+' ) z++; 321 if( *z=='-' || *z=='+' ) z++;
268 if( !isdigit(*z) ){ 322 if( !IsDigit(*z) ){
269 return 0; 323 return 0;
270 } 324 }
271 z++; 325 z++;
272 if( realnum ) *realnum = 0; 326 if( realnum ) *realnum = 0;
273 while( isdigit(*z) ){ z++; } 327 while( IsDigit(*z) ){ z++; }
274 if( *z=='.' ){ 328 if( *z=='.' ){
275 z++; 329 z++;
276 if( !isdigit(*z) ) return 0; 330 if( !IsDigit(*z) ) return 0;
277 while( isdigit(*z) ){ z++; } 331 while( IsDigit(*z) ){ z++; }
278 if( realnum ) *realnum = 1; 332 if( realnum ) *realnum = 1;
279 } 333 }
280 if( *z=='e' || *z=='E' ){ 334 if( *z=='e' || *z=='E' ){
281 z++; 335 z++;
282 if( *z=='+' || *z=='-' ) z++; 336 if( *z=='+' || *z=='-' ) z++;
283 if( !isdigit(*z) ) return 0; 337 if( !IsDigit(*z) ) return 0;
284 while( isdigit(*z) ){ z++; } 338 while( IsDigit(*z) ){ z++; }
285 if( realnum ) *realnum = 1; 339 if( realnum ) *realnum = 1;
286 } 340 }
287 return *z==0; 341 return *z==0;
288 } 342 }
289 343
290 /* 344 /*
291 ** A global char* and an SQL function to access its current value 345 ** A global char* and an SQL function to access its current value
292 ** from within an SQL statement. This program used to use the 346 ** from within an SQL statement. This program used to use the
293 ** sqlite_exec_printf() API to substitue a string into an SQL statement. 347 ** sqlite_exec_printf() API to substitue a string into an SQL statement.
294 ** The correct way to do this with sqlite3 is to use the bind API, but 348 ** The correct way to do this with sqlite3 is to use the bind API, but
(...skipping 13 matching lines...) Expand all
308 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC); 362 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
309 } 363 }
310 364
311 365
312 /* 366 /*
313 ** This routine reads a line of text from FILE in, stores 367 ** This routine reads a line of text from FILE in, stores
314 ** the text in memory obtained from malloc() and returns a pointer 368 ** the text in memory obtained from malloc() and returns a pointer
315 ** to the text. NULL is returned at end of file, or if malloc() 369 ** to the text. NULL is returned at end of file, or if malloc()
316 ** fails. 370 ** fails.
317 ** 371 **
318 ** The interface is like "readline" but no command-line editing 372 ** If zLine is not NULL then it is a malloced buffer returned from
319 ** is done. 373 ** a previous call to this routine that may be reused.
320 */ 374 */
321 static char *local_getline(char *zPrompt, FILE *in){ 375 static char *local_getline(char *zLine, FILE *in){
322 char *zLine; 376 int nLine = zLine==0 ? 0 : 100;
323 int nLine; 377 int n = 0;
324 int n;
325 int eol;
326 378
327 if( zPrompt && *zPrompt ){ 379 while( 1 ){
328 printf("%s",zPrompt);
329 fflush(stdout);
330 }
331 nLine = 100;
332 zLine = malloc( nLine );
333 if( zLine==0 ) return 0;
334 n = 0;
335 eol = 0;
336 while( !eol ){
337 if( n+100>nLine ){ 380 if( n+100>nLine ){
338 nLine = nLine*2 + 100; 381 nLine = nLine*2 + 100;
339 zLine = realloc(zLine, nLine); 382 zLine = realloc(zLine, nLine);
340 if( zLine==0 ) return 0; 383 if( zLine==0 ) return 0;
341 } 384 }
342 if( fgets(&zLine[n], nLine - n, in)==0 ){ 385 if( fgets(&zLine[n], nLine - n, in)==0 ){
343 if( n==0 ){ 386 if( n==0 ){
344 free(zLine); 387 free(zLine);
345 return 0; 388 return 0;
346 } 389 }
347 zLine[n] = 0; 390 zLine[n] = 0;
348 eol = 1;
349 break; 391 break;
350 } 392 }
351 while( zLine[n] ){ n++; } 393 while( zLine[n] ) n++;
352 if( n>0 && zLine[n-1]=='\n' ){ 394 if( n>0 && zLine[n-1]=='\n' ){
353 n--; 395 n--;
354 if( n>0 && zLine[n-1]=='\r' ) n--; 396 if( n>0 && zLine[n-1]=='\r' ) n--;
355 zLine[n] = 0; 397 zLine[n] = 0;
356 eol = 1; 398 break;
357 } 399 }
358 } 400 }
359 zLine = realloc( zLine, n+1 );
360 return zLine; 401 return zLine;
361 } 402 }
362 403
363 /* 404 /*
364 ** Retrieve a single line of input text. 405 ** Retrieve a single line of input text.
365 ** 406 **
366 ** zPrior is a string of prior text retrieved. If not the empty 407 ** If in==0 then read from standard input and prompt before each line.
367 ** string, then issue a continuation prompt. 408 ** If isContinuation is true, then a continuation prompt is appropriate.
409 ** If isContinuation is zero, then the main prompt should be used.
410 **
411 ** If zPrior is not NULL then it is a buffer from a prior call to this
412 ** routine that can be reused.
413 **
414 ** The result is stored in space obtained from malloc() and must either
415 ** be freed by the caller or else passed back into this routine via the
416 ** zPrior argument for reuse.
368 */ 417 */
369 static char *one_input_line(const char *zPrior, FILE *in){ 418 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
370 char *zPrompt; 419 char *zPrompt;
371 char *zResult; 420 char *zResult;
372 if( in!=0 ){ 421 if( in!=0 ){
373 return local_getline(0, in); 422 zResult = local_getline(zPrior, in);
423 }else{
424 zPrompt = isContinuation ? continuePrompt : mainPrompt;
425 #if defined(HAVE_READLINE)
426 free(zPrior);
427 zResult = readline(zPrompt);
428 if( zResult && *zResult ) add_history(zResult);
429 #else
430 printf("%s", zPrompt);
431 fflush(stdout);
432 zResult = local_getline(zPrior, stdin);
433 #endif
374 } 434 }
375 if( zPrior && zPrior[0] ){
376 zPrompt = continuePrompt;
377 }else{
378 zPrompt = mainPrompt;
379 }
380 zResult = readline(zPrompt);
381 #if defined(HAVE_READLINE) && HAVE_READLINE==1
382 if( zResult && *zResult ) add_history(zResult);
383 #endif
384 return zResult; 435 return zResult;
385 } 436 }
386 437
387 struct previous_mode_data { 438 /*
388 int valid; /* Is there legit data in here? */ 439 ** Shell output mode information from before ".explain on",
389 int mode; 440 ** saved so that it can be restored by ".explain off"
390 int showHeader; 441 */
391 int colWidth[100]; 442 typedef struct SavedModeInfo SavedModeInfo;
443 struct SavedModeInfo {
444 int valid; /* Is there legit data in here? */
445 int mode; /* Mode prior to ".explain on" */
446 int showHeader; /* The ".header" setting prior to ".explain on" */
447 int colWidth[100]; /* Column widths prior to ".explain on" */
392 }; 448 };
393 449
394 /* 450 /*
395 ** An pointer to an instance of this structure is passed from 451 ** State information about the database connection is contained in an
396 ** the main program to the callback. This is used to communicate 452 ** instance of the following structure.
397 ** state and mode information.
398 */ 453 */
399 struct callback_data { 454 typedef struct ShellState ShellState;
455 struct ShellState {
400 sqlite3 *db; /* The database */ 456 sqlite3 *db; /* The database */
401 int echoOn; /* True to echo input commands */ 457 int echoOn; /* True to echo input commands */
458 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
402 int statsOn; /* True to display memory stats before each finalize */ 459 int statsOn; /* True to display memory stats before each finalize */
460 int outCount; /* Revert to stdout when reaching zero */
403 int cnt; /* Number of records displayed so far */ 461 int cnt; /* Number of records displayed so far */
404 FILE *out; /* Write results here */ 462 FILE *out; /* Write results here */
463 FILE *traceOut; /* Output for sqlite3_trace() */
464 int nErr; /* Number of errors seen */
405 int mode; /* An output mode setting */ 465 int mode; /* An output mode setting */
406 int writableSchema; /* True if PRAGMA writable_schema=ON */ 466 int writableSchema; /* True if PRAGMA writable_schema=ON */
407 int showHeader; /* True to show column names in List or Column mode */ 467 int showHeader; /* True to show column names in List or Column mode */
468 unsigned shellFlgs; /* Various flags */
408 char *zDestTable; /* Name of destination table when MODE_Insert */ 469 char *zDestTable; /* Name of destination table when MODE_Insert */
409 char separator[20]; /* Separator character for MODE_List */ 470 char separator[20]; /* Separator character for MODE_List */
471 char newline[20]; /* Record separator in MODE_Csv */
410 int colWidth[100]; /* Requested width of each column when in column mode*/ 472 int colWidth[100]; /* Requested width of each column when in column mode*/
411 int actualWidth[100]; /* Actual width of each column */ 473 int actualWidth[100]; /* Actual width of each column */
412 char nullvalue[20]; /* The text to print when a NULL comes back from 474 char nullvalue[20]; /* The text to print when a NULL comes back from
413 ** the database */ 475 ** the database */
414 struct previous_mode_data explainPrev; 476 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
415 /* Holds the mode information just before
416 ** .explain ON */
417 char outfile[FILENAME_MAX]; /* Filename for *out */ 477 char outfile[FILENAME_MAX]; /* Filename for *out */
418 const char *zDbFilename; /* name of the database file */ 478 const char *zDbFilename; /* name of the database file */
479 char *zFreeOnClose; /* Filename to free when closing */
419 const char *zVfs; /* Name of VFS to use */ 480 const char *zVfs; /* Name of VFS to use */
420 sqlite3_stmt *pStmt; /* Current statement if any. */ 481 sqlite3_stmt *pStmt; /* Current statement if any. */
421 FILE *pLog; /* Write log output here */ 482 FILE *pLog; /* Write log output here */
483 int *aiIndent; /* Array of indents used in MODE_Explain */
484 int nIndent; /* Size of array aiIndent[] */
485 int iIndent; /* Index of current op in aiIndent[] */
422 }; 486 };
423 487
424 /* 488 /*
489 ** These are the allowed shellFlgs values
490 */
491 #define SHFLG_Scratch 0x00001 /* The --scratch option is used */
492 #define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
493 #define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
494
495 /*
425 ** These are the allowed modes. 496 ** These are the allowed modes.
426 */ 497 */
427 #define MODE_Line 0 /* One column per line. Blank line between records */ 498 #define MODE_Line 0 /* One column per line. Blank line between records */
428 #define MODE_Column 1 /* One record per line in neat columns */ 499 #define MODE_Column 1 /* One record per line in neat columns */
429 #define MODE_List 2 /* One record per line with a separator */ 500 #define MODE_List 2 /* One record per line with a separator */
430 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 501 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
431 #define MODE_Html 4 /* Generate an XHTML table */ 502 #define MODE_Html 4 /* Generate an XHTML table */
432 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 503 #define MODE_Insert 5 /* Generate SQL "insert" statements */
433 #define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ 504 #define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
434 #define MODE_Csv 7 /* Quote strings, numbers are plain */ 505 #define MODE_Csv 7 /* Quote strings, numbers are plain */
(...skipping 23 matching lines...) Expand all
458 static int strlen30(const char *z){ 529 static int strlen30(const char *z){
459 const char *z2 = z; 530 const char *z2 = z;
460 while( *z2 ){ z2++; } 531 while( *z2 ){ z2++; }
461 return 0x3fffffff & (int)(z2 - z); 532 return 0x3fffffff & (int)(z2 - z);
462 } 533 }
463 534
464 /* 535 /*
465 ** A callback for the sqlite3_log() interface. 536 ** A callback for the sqlite3_log() interface.
466 */ 537 */
467 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 538 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
468 struct callback_data *p = (struct callback_data*)pArg; 539 ShellState *p = (ShellState*)pArg;
469 if( p->pLog==0 ) return; 540 if( p->pLog==0 ) return;
470 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 541 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
471 fflush(p->pLog); 542 fflush(p->pLog);
472 } 543 }
473 544
474 /* 545 /*
475 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 546 ** Output the given string as a hex-encoded blob (eg. X'1234' )
476 */ 547 */
477 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 548 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
478 int i; 549 int i;
479 char *zBlob = (char *)pBlob; 550 char *zBlob = (char *)pBlob;
480 fprintf(out,"X'"); 551 fprintf(out,"X'");
481 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); } 552 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
482 fprintf(out,"'"); 553 fprintf(out,"'");
483 } 554 }
484 555
485 /* 556 /*
486 ** Output the given string as a quoted string using SQL quoting conventions. 557 ** Output the given string as a quoted string using SQL quoting conventions.
487 */ 558 */
488 static void output_quoted_string(FILE *out, const char *z){ 559 static void output_quoted_string(FILE *out, const char *z){
489 int i; 560 int i;
490 int nSingle = 0; 561 int nSingle = 0;
491 for(i=0; z[i]; i++){ 562 for(i=0; z[i]; i++){
(...skipping 23 matching lines...) Expand all
515 /* 586 /*
516 ** Output the given string as a quoted according to C or TCL quoting rules. 587 ** Output the given string as a quoted according to C or TCL quoting rules.
517 */ 588 */
518 static void output_c_string(FILE *out, const char *z){ 589 static void output_c_string(FILE *out, const char *z){
519 unsigned int c; 590 unsigned int c;
520 fputc('"', out); 591 fputc('"', out);
521 while( (c = *(z++))!=0 ){ 592 while( (c = *(z++))!=0 ){
522 if( c=='\\' ){ 593 if( c=='\\' ){
523 fputc(c, out); 594 fputc(c, out);
524 fputc(c, out); 595 fputc(c, out);
596 }else if( c=='"' ){
597 fputc('\\', out);
598 fputc('"', out);
525 }else if( c=='\t' ){ 599 }else if( c=='\t' ){
526 fputc('\\', out); 600 fputc('\\', out);
527 fputc('t', out); 601 fputc('t', out);
528 }else if( c=='\n' ){ 602 }else if( c=='\n' ){
529 fputc('\\', out); 603 fputc('\\', out);
530 fputc('n', out); 604 fputc('n', out);
531 }else if( c=='\r' ){ 605 }else if( c=='\r' ){
532 fputc('\\', out); 606 fputc('\\', out);
533 fputc('r', out); 607 fputc('r', out);
534 }else if( !isprint(c) ){ 608 }else if( !isprint(c&0xff) ){
535 fprintf(out, "\\%03o", c&0xff); 609 fprintf(out, "\\%03o", c&0xff);
536 }else{ 610 }else{
537 fputc(c, out); 611 fputc(c, out);
538 } 612 }
539 } 613 }
540 fputc('"', out); 614 fputc('"', out);
541 } 615 }
542 616
543 /* 617 /*
544 ** Output the given string with characters that are special to 618 ** Output the given string with characters that are special to
545 ** HTML escaped. 619 ** HTML escaped.
546 */ 620 */
547 static void output_html_string(FILE *out, const char *z){ 621 static void output_html_string(FILE *out, const char *z){
548 int i; 622 int i;
623 if( z==0 ) z = "";
549 while( *z ){ 624 while( *z ){
550 for(i=0; z[i] 625 for(i=0; z[i]
551 && z[i]!='<' 626 && z[i]!='<'
552 && z[i]!='&' 627 && z[i]!='&'
553 && z[i]!='>' 628 && z[i]!='>'
554 && z[i]!='\"' 629 && z[i]!='\"'
555 && z[i]!='\''; 630 && z[i]!='\'';
556 i++){} 631 i++){}
557 if( i>0 ){ 632 if( i>0 ){
558 fprintf(out,"%.*s",i,z); 633 fprintf(out,"%.*s",i,z);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 668 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
594 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 669 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
595 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 670 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
596 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 671 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
597 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 672 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
598 }; 673 };
599 674
600 /* 675 /*
601 ** Output a single term of CSV. Actually, p->separator is used for 676 ** Output a single term of CSV. Actually, p->separator is used for
602 ** the separator, which may or may not be a comma. p->nullvalue is 677 ** the separator, which may or may not be a comma. p->nullvalue is
603 ** the null value. Strings are quoted using ANSI-C rules. Numbers 678 ** the null value. Strings are quoted if necessary. The separator
604 ** appear outside of quotes. 679 ** is only issued if bSep is true.
605 */ 680 */
606 static void output_csv(struct callback_data *p, const char *z, int bSep){ 681 static void output_csv(ShellState *p, const char *z, int bSep){
607 FILE *out = p->out; 682 FILE *out = p->out;
608 if( z==0 ){ 683 if( z==0 ){
609 fprintf(out,"%s",p->nullvalue); 684 fprintf(out,"%s",p->nullvalue);
610 }else{ 685 }else{
611 int i; 686 int i;
612 int nSep = strlen30(p->separator); 687 int nSep = strlen30(p->separator);
613 for(i=0; z[i]; i++){ 688 for(i=0; z[i]; i++){
614 if( needCsvQuote[((unsigned char*)z)[i]] 689 if( needCsvQuote[((unsigned char*)z)[i]]
615 || (z[i]==p->separator[0] && 690 || (z[i]==p->separator[0] &&
616 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){ 691 (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){
(...skipping 16 matching lines...) Expand all
633 fprintf(p->out, "%s", p->separator); 708 fprintf(p->out, "%s", p->separator);
634 } 709 }
635 } 710 }
636 711
637 #ifdef SIGINT 712 #ifdef SIGINT
638 /* 713 /*
639 ** This routine runs when the user presses Ctrl-C 714 ** This routine runs when the user presses Ctrl-C
640 */ 715 */
641 static void interrupt_handler(int NotUsed){ 716 static void interrupt_handler(int NotUsed){
642 UNUSED_PARAMETER(NotUsed); 717 UNUSED_PARAMETER(NotUsed);
643 seenInterrupt = 1; 718 seenInterrupt++;
719 if( seenInterrupt>2 ) exit(1);
644 if( db ) sqlite3_interrupt(db); 720 if( db ) sqlite3_interrupt(db);
645 } 721 }
646 #endif 722 #endif
647 723
648 /* 724 /*
649 ** This is the callback routine that the shell 725 ** This is the callback routine that the shell
650 ** invokes for each row of a query result. 726 ** invokes for each row of a query result.
651 */ 727 */
652 static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){ 728 static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){
653 int i; 729 int i;
654 struct callback_data *p = (struct callback_data*)pArg; 730 ShellState *p = (ShellState*)pArg;
655 731
656 switch( p->mode ){ 732 switch( p->mode ){
657 case MODE_Line: { 733 case MODE_Line: {
658 int w = 5; 734 int w = 5;
659 if( azArg==0 ) break; 735 if( azArg==0 ) break;
660 for(i=0; i<nArg; i++){ 736 for(i=0; i<nArg; i++){
661 int len = strlen30(azCol[i] ? azCol[i] : ""); 737 int len = strlen30(azCol[i] ? azCol[i] : "");
662 if( len>w ) w = len; 738 if( len>w ) w = len;
663 } 739 }
664 if( p->cnt++>0 ) fprintf(p->out,"\n"); 740 if( p->cnt++>0 ) fprintf(p->out,"\n");
665 for(i=0; i<nArg; i++){ 741 for(i=0; i<nArg; i++){
666 fprintf(p->out,"%*s = %s\n", w, azCol[i], 742 fprintf(p->out,"%*s = %s\n", w, azCol[i],
667 azArg[i] ? azArg[i] : p->nullvalue); 743 azArg[i] ? azArg[i] : p->nullvalue);
668 } 744 }
669 break; 745 break;
670 } 746 }
671 case MODE_Explain: 747 case MODE_Explain:
672 case MODE_Column: { 748 case MODE_Column: {
673 if( p->cnt++==0 ){ 749 if( p->cnt++==0 ){
674 for(i=0; i<nArg; i++){ 750 for(i=0; i<nArg; i++){
675 int w, n; 751 int w, n;
676 if( i<ArraySize(p->colWidth) ){ 752 if( i<ArraySize(p->colWidth) ){
677 w = p->colWidth[i]; 753 w = p->colWidth[i];
678 }else{ 754 }else{
679 w = 0; 755 w = 0;
680 } 756 }
681 if( w<=0 ){ 757 if( w==0 ){
682 w = strlen30(azCol[i] ? azCol[i] : ""); 758 w = strlen30(azCol[i] ? azCol[i] : "");
683 if( w<10 ) w = 10; 759 if( w<10 ) w = 10;
684 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue); 760 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue);
685 if( w<n ) w = n; 761 if( w<n ) w = n;
686 } 762 }
687 if( i<ArraySize(p->actualWidth) ){ 763 if( i<ArraySize(p->actualWidth) ){
688 p->actualWidth[i] = w; 764 p->actualWidth[i] = w;
689 } 765 }
690 if( p->showHeader ){ 766 if( p->showHeader ){
691 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); 767 if( w<0 ){
768 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i], i==nArg-1 ? "\n": " ");
769 }else{
770 fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " ");
771 }
692 } 772 }
693 } 773 }
694 if( p->showHeader ){ 774 if( p->showHeader ){
695 for(i=0; i<nArg; i++){ 775 for(i=0; i<nArg; i++){
696 int w; 776 int w;
697 if( i<ArraySize(p->actualWidth) ){ 777 if( i<ArraySize(p->actualWidth) ){
698 w = p->actualWidth[i]; 778 w = p->actualWidth[i];
779 if( w<0 ) w = -w;
699 }else{ 780 }else{
700 w = 10; 781 w = 10;
701 } 782 }
702 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------" 783 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
703 "----------------------------------------------------------", 784 "----------------------------------------------------------",
704 i==nArg-1 ? "\n": " "); 785 i==nArg-1 ? "\n": " ");
705 } 786 }
706 } 787 }
707 } 788 }
708 if( azArg==0 ) break; 789 if( azArg==0 ) break;
709 for(i=0; i<nArg; i++){ 790 for(i=0; i<nArg; i++){
710 int w; 791 int w;
711 if( i<ArraySize(p->actualWidth) ){ 792 if( i<ArraySize(p->actualWidth) ){
712 w = p->actualWidth[i]; 793 w = p->actualWidth[i];
713 }else{ 794 }else{
714 w = 10; 795 w = 10;
715 } 796 }
716 if( p->mode==MODE_Explain && azArg[i] && 797 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
717 strlen30(azArg[i])>w ){
718 w = strlen30(azArg[i]); 798 w = strlen30(azArg[i]);
719 } 799 }
720 fprintf(p->out,"%-*.*s%s",w,w, 800 if( i==1 && p->aiIndent && p->pStmt ){
721 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); 801 if( p->iIndent<p->nIndent ){
802 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
803 }
804 p->iIndent++;
805 }
806 if( w<0 ){
807 fprintf(p->out,"%*.*s%s",-w,-w,
808 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
809 }else{
810 fprintf(p->out,"%-*.*s%s",w,w,
811 azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " ");
812 }
722 } 813 }
723 break; 814 break;
724 } 815 }
725 case MODE_Semi: 816 case MODE_Semi:
726 case MODE_List: { 817 case MODE_List: {
727 if( p->cnt++==0 && p->showHeader ){ 818 if( p->cnt++==0 && p->showHeader ){
728 for(i=0; i<nArg; i++){ 819 for(i=0; i<nArg; i++){
729 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); 820 fprintf(p->out,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator);
730 } 821 }
731 } 822 }
(...skipping 29 matching lines...) Expand all
761 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); 852 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
762 fprintf(p->out,"</TD>\n"); 853 fprintf(p->out,"</TD>\n");
763 } 854 }
764 fprintf(p->out,"</TR>\n"); 855 fprintf(p->out,"</TR>\n");
765 break; 856 break;
766 } 857 }
767 case MODE_Tcl: { 858 case MODE_Tcl: {
768 if( p->cnt++==0 && p->showHeader ){ 859 if( p->cnt++==0 && p->showHeader ){
769 for(i=0; i<nArg; i++){ 860 for(i=0; i<nArg; i++){
770 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 861 output_c_string(p->out,azCol[i] ? azCol[i] : "");
771 fprintf(p->out, "%s", p->separator); 862 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
772 } 863 }
773 fprintf(p->out,"\n"); 864 fprintf(p->out,"\n");
774 } 865 }
775 if( azArg==0 ) break; 866 if( azArg==0 ) break;
776 for(i=0; i<nArg; i++){ 867 for(i=0; i<nArg; i++){
777 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); 868 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullvalue);
778 fprintf(p->out, "%s", p->separator); 869 if(i<nArg-1) fprintf(p->out, "%s", p->separator);
779 } 870 }
780 fprintf(p->out,"\n"); 871 fprintf(p->out,"\n");
781 break; 872 break;
782 } 873 }
783 case MODE_Csv: { 874 case MODE_Csv: {
875 #if defined(WIN32) || defined(_WIN32)
876 fflush(p->out);
877 _setmode(_fileno(p->out), _O_BINARY);
878 #endif
784 if( p->cnt++==0 && p->showHeader ){ 879 if( p->cnt++==0 && p->showHeader ){
785 for(i=0; i<nArg; i++){ 880 for(i=0; i<nArg; i++){
786 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 881 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
787 } 882 }
788 fprintf(p->out,"\n"); 883 fprintf(p->out,"%s",p->newline);
789 } 884 }
790 if( azArg==0 ) break; 885 if( azArg>0 ){
791 for(i=0; i<nArg; i++){ 886 for(i=0; i<nArg; i++){
792 output_csv(p, azArg[i], i<nArg-1); 887 output_csv(p, azArg[i], i<nArg-1);
888 }
889 fprintf(p->out,"%s",p->newline);
793 } 890 }
794 fprintf(p->out,"\n"); 891 #if defined(WIN32) || defined(_WIN32)
892 fflush(p->out);
893 _setmode(_fileno(p->out), _O_TEXT);
894 #endif
795 break; 895 break;
796 } 896 }
797 case MODE_Insert: { 897 case MODE_Insert: {
798 p->cnt++; 898 p->cnt++;
799 if( azArg==0 ) break; 899 if( azArg==0 ) break;
800 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); 900 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
801 for(i=0; i<nArg; i++){ 901 for(i=0; i<nArg; i++){
802 char *zSep = i>0 ? ",": ""; 902 char *zSep = i>0 ? ",": "";
803 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 903 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
804 fprintf(p->out,"%sNULL",zSep); 904 fprintf(p->out,"%sNULL",zSep);
805 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 905 }else if( aiType && aiType[i]==SQLITE_TEXT ){
806 if( zSep[0] ) fprintf(p->out,"%s",zSep); 906 if( zSep[0] ) fprintf(p->out,"%s",zSep);
807 output_quoted_string(p->out, azArg[i]); 907 output_quoted_string(p->out, azArg[i]);
808 }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOA T) ){ 908 }else if( aiType && (aiType[i]==SQLITE_INTEGER
909 || aiType[i]==SQLITE_FLOAT) ){
809 fprintf(p->out,"%s%s",zSep, azArg[i]); 910 fprintf(p->out,"%s%s",zSep, azArg[i]);
810 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 911 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
811 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 912 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
812 int nBlob = sqlite3_column_bytes(p->pStmt, i); 913 int nBlob = sqlite3_column_bytes(p->pStmt, i);
813 if( zSep[0] ) fprintf(p->out,"%s",zSep); 914 if( zSep[0] ) fprintf(p->out,"%s",zSep);
814 output_hex_blob(p->out, pBlob, nBlob); 915 output_hex_blob(p->out, pBlob, nBlob);
815 }else if( isNumber(azArg[i], 0) ){ 916 }else if( isNumber(azArg[i], 0) ){
816 fprintf(p->out,"%s%s",zSep, azArg[i]); 917 fprintf(p->out,"%s%s",zSep, azArg[i]);
817 }else{ 918 }else{
818 if( zSep[0] ) fprintf(p->out,"%s",zSep); 919 if( zSep[0] ) fprintf(p->out,"%s",zSep);
(...skipping 10 matching lines...) Expand all
829 /* 930 /*
830 ** This is the callback routine that the SQLite library 931 ** This is the callback routine that the SQLite library
831 ** invokes for each row of a query result. 932 ** invokes for each row of a query result.
832 */ 933 */
833 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 934 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
834 /* since we don't have type info, call the shell_callback with a NULL value */ 935 /* since we don't have type info, call the shell_callback with a NULL value */
835 return shell_callback(pArg, nArg, azArg, azCol, NULL); 936 return shell_callback(pArg, nArg, azArg, azCol, NULL);
836 } 937 }
837 938
838 /* 939 /*
839 ** Set the destination table field of the callback_data structure to 940 ** Set the destination table field of the ShellState structure to
840 ** the name of the table given. Escape any quote characters in the 941 ** the name of the table given. Escape any quote characters in the
841 ** table name. 942 ** table name.
842 */ 943 */
843 static void set_table_name(struct callback_data *p, const char *zName){ 944 static void set_table_name(ShellState *p, const char *zName){
844 int i, n; 945 int i, n;
845 int needQuote; 946 int needQuote;
846 char *z; 947 char *z;
847 948
848 if( p->zDestTable ){ 949 if( p->zDestTable ){
849 free(p->zDestTable); 950 free(p->zDestTable);
850 p->zDestTable = 0; 951 p->zDestTable = 0;
851 } 952 }
852 if( zName==0 ) return; 953 if( zName==0 ) return;
853 needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; 954 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 }else{ 1014 }else{
914 memcpy(&zIn[nIn], zAppend, nAppend); 1015 memcpy(&zIn[nIn], zAppend, nAppend);
915 zIn[len-1] = '\0'; 1016 zIn[len-1] = '\0';
916 } 1017 }
917 1018
918 return zIn; 1019 return zIn;
919 } 1020 }
920 1021
921 1022
922 /* 1023 /*
923 ** Execute a query statement that has a single result column. Print 1024 ** Execute a query statement that will generate SQL output. Print
924 ** that result column on a line by itself with a semicolon terminator. 1025 ** the result columns, comma-separated, on a line and then add a
1026 ** semicolon terminator to the end of that line.
925 ** 1027 **
926 ** This is used, for example, to show the schema of the database by 1028 ** If the number of columns is 1 and that column contains text "--"
927 ** querying the SQLITE_MASTER table. 1029 ** then write the semicolon on a separate line. That way, if a
1030 ** "--" comment occurs at the end of the statement, the comment
1031 ** won't consume the semicolon terminator.
928 */ 1032 */
929 static int run_table_dump_query( 1033 static int run_table_dump_query(
930 FILE *out, /* Send output here */ 1034 ShellState *p, /* Query context */
931 sqlite3 *db, /* Database to query */ 1035 const char *zSelect, /* SELECT statement to extract content */
932 const char *zSelect, /* SELECT statement to extract content */ 1036 const char *zFirstRow /* Print before first row, if not NULL */
933 const char *zFirstRow /* Print before first row, if not NULL */
934 ){ 1037 ){
935 sqlite3_stmt *pSelect; 1038 sqlite3_stmt *pSelect;
936 int rc; 1039 int rc;
937 rc = sqlite3_prepare(db, zSelect, -1, &pSelect, 0); 1040 int nResult;
1041 int i;
1042 const char *z;
1043 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
938 if( rc!=SQLITE_OK || !pSelect ){ 1044 if( rc!=SQLITE_OK || !pSelect ){
1045 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1046 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
939 return rc; 1047 return rc;
940 } 1048 }
941 rc = sqlite3_step(pSelect); 1049 rc = sqlite3_step(pSelect);
1050 nResult = sqlite3_column_count(pSelect);
942 while( rc==SQLITE_ROW ){ 1051 while( rc==SQLITE_ROW ){
943 if( zFirstRow ){ 1052 if( zFirstRow ){
944 fprintf(out, "%s", zFirstRow); 1053 fprintf(p->out, "%s", zFirstRow);
945 zFirstRow = 0; 1054 zFirstRow = 0;
946 } 1055 }
947 fprintf(out, "%s;\n", sqlite3_column_text(pSelect, 0)); 1056 z = (const char*)sqlite3_column_text(pSelect, 0);
1057 fprintf(p->out, "%s", z);
1058 for(i=1; i<nResult; i++){
1059 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1060 }
1061 if( z==0 ) z = "";
1062 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1063 if( z[0] ){
1064 fprintf(p->out, "\n;\n");
1065 }else{
1066 fprintf(p->out, ";\n");
1067 }
948 rc = sqlite3_step(pSelect); 1068 rc = sqlite3_step(pSelect);
949 } 1069 }
950 return sqlite3_finalize(pSelect); 1070 rc = sqlite3_finalize(pSelect);
1071 if( rc!=SQLITE_OK ){
1072 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1073 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1074 }
1075 return rc;
951 } 1076 }
952 1077
953 /* 1078 /*
954 ** Allocate space and save off current error string. 1079 ** Allocate space and save off current error string.
955 */ 1080 */
956 static char *save_err_msg( 1081 static char *save_err_msg(
957 sqlite3 *db /* Database to query */ 1082 sqlite3 *db /* Database to query */
958 ){ 1083 ){
959 int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); 1084 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
960 char *zErrMsg = sqlite3_malloc(nErrMsg); 1085 char *zErrMsg = sqlite3_malloc(nErrMsg);
961 if( zErrMsg ){ 1086 if( zErrMsg ){
962 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); 1087 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
963 } 1088 }
964 return zErrMsg; 1089 return zErrMsg;
965 } 1090 }
966 1091
967 /* 1092 /*
968 ** Display memory stats. 1093 ** Display memory stats.
969 */ 1094 */
970 static int display_stats( 1095 static int display_stats(
971 sqlite3 *db, /* Database to query */ 1096 sqlite3 *db, /* Database to query */
972 struct callback_data *pArg, /* Pointer to struct callback_data */ 1097 ShellState *pArg, /* Pointer to ShellState */
973 int bReset /* True to reset the stats */ 1098 int bReset /* True to reset the stats */
974 ){ 1099 ){
975 int iCur; 1100 int iCur;
976 int iHiwtr; 1101 int iHiwtr;
977 1102
978 if( pArg && pArg->out ){ 1103 if( pArg && pArg->out ){
979 1104
980 iHiwtr = iCur = -1; 1105 iHiwtr = iCur = -1;
981 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset); 1106 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
982 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n ", iCur, iHiwtr); 1107 fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n ", iCur, iHiwtr);
983 iHiwtr = iCur = -1; 1108 iHiwtr = iCur = -1;
984 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset); 1109 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
985 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCu r, iHiwtr); 1110 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCu r, iHiwtr);
986 /* 1111 if( pArg->shellFlgs & SHFLG_Pagecache ){
987 ** Not currently used by the CLI. 1112 iHiwtr = iCur = -1;
988 ** iHiwtr = iCur = -1; 1113 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
989 ** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset); 1114 fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages \n", iCur, iHiwtr);
990 ** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages \n", iCur, iHiwtr); 1115 }
991 */
992 iHiwtr = iCur = -1; 1116 iHiwtr = iCur = -1;
993 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset); 1117 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
994 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr); 1118 fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr);
995 /* 1119 if( pArg->shellFlgs & SHFLG_Scratch ){
996 ** Not currently used by the CLI. 1120 iHiwtr = iCur = -1;
997 ** iHiwtr = iCur = -1; 1121 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
998 ** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset); 1122 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", i Cur, iHiwtr);
999 ** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", i Cur, iHiwtr); 1123 }
1000 */
1001 iHiwtr = iCur = -1; 1124 iHiwtr = iCur = -1;
1002 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset); 1125 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1003 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr); 1126 fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n ", iCur, iHiwtr);
1004 iHiwtr = iCur = -1; 1127 iHiwtr = iCur = -1;
1005 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset); 1128 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1006 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr ); 1129 fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr );
1007 iHiwtr = iCur = -1; 1130 iHiwtr = iCur = -1;
1008 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset); 1131 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1009 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr ); 1132 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr );
1010 iHiwtr = iCur = -1; 1133 iHiwtr = iCur = -1;
1011 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset); 1134 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1012 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr ); 1135 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr );
1013 #ifdef YYTRACKMAXSTACKDEPTH 1136 #ifdef YYTRACKMAXSTACKDEPTH
1014 iHiwtr = iCur = -1; 1137 iHiwtr = iCur = -1;
1015 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset); 1138 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1016 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCu r, iHiwtr); 1139 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCu r, iHiwtr);
1017 #endif 1140 #endif
1018 } 1141 }
1019 1142
1020 if( pArg && pArg->out && db ){ 1143 if( pArg && pArg->out && db ){
1021 iHiwtr = iCur = -1; 1144 if( pArg->shellFlgs & SHFLG_Lookaside ){
1022 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset ); 1145 iHiwtr = iCur = -1;
1023 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCu r, iHiwtr); 1146 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bRes et);
1024 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset) ; 1147 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", i Cur, iHiwtr);
1025 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr); 1148 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bRese t);
1026 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, b Reset); 1149 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
1027 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr); 1150 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset);
1028 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, b Reset); 1151 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
1029 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr); 1152 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset);
1153 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1154 }
1030 iHiwtr = iCur = -1; 1155 iHiwtr = iCur = -1;
1031 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 1156 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1032 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); 1157 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1;
1158 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1159 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1160 iHiwtr = iCur = -1;
1161 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1162 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
1163 iHiwtr = iCur = -1;
1164 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1165 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1033 iHiwtr = iCur = -1; 1166 iHiwtr = iCur = -1;
1034 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 1167 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1035 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur); 1168 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur);
1036 iHiwtr = iCur = -1; 1169 iHiwtr = iCur = -1;
1037 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 1170 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1038 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur); 1171 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur);
1039 } 1172 }
1040 1173
1041 if( pArg && pArg->out && db && pArg->pStmt ){ 1174 if( pArg && pArg->out && db && pArg->pStmt ){
1042 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bRe set); 1175 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bRe set);
1043 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur); 1176 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1044 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 1177 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1045 fprintf(pArg->out, "Sort Operations: %d\n", iCur); 1178 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
1046 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset) ; 1179 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset) ;
1047 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur); 1180 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1181 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1182 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
1048 } 1183 }
1049 1184
1050 return 0; 1185 return 0;
1051 } 1186 }
1052 1187
1053 /* 1188 /*
1189 ** Parameter azArray points to a zero-terminated array of strings. zStr
1190 ** points to a single nul-terminated string. Return non-zero if zStr
1191 ** is equal, according to strcmp(), to any of the strings in the array.
1192 ** Otherwise, return zero.
1193 */
1194 static int str_in_array(const char *zStr, const char **azArray){
1195 int i;
1196 for(i=0; azArray[i]; i++){
1197 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1198 }
1199 return 0;
1200 }
1201
1202 /*
1203 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1204 ** and populate the ShellState.aiIndent[] array with the number of
1205 ** spaces each opcode should be indented before it is output.
1206 **
1207 ** The indenting rules are:
1208 **
1209 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1210 ** all opcodes that occur between the p2 jump destination and the opcode
1211 ** itself by 2 spaces.
1212 **
1213 ** * For each "Goto", if the jump destination is earlier in the program
1214 ** and ends on one of:
1215 ** Yield SeekGt SeekLt RowSetRead Rewind
1216 ** or if the P1 parameter is one instead of zero,
1217 ** then indent all opcodes between the earlier instruction
1218 ** and "Goto" by 2 spaces.
1219 */
1220 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
1221 const char *zSql; /* The text of the SQL statement */
1222 const char *z; /* Used to check if this is an EXPLAIN */
1223 int *abYield = 0; /* True if op is an OP_Yield */
1224 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
1225 int iOp; /* Index of operation in p->aiIndent[] */
1226
1227 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1228 "NextIfOpen", "PrevIfOpen", 0 };
1229 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", "Rewind", 0 };
1230 const char *azGoto[] = { "Goto", 0 };
1231
1232 /* Try to figure out if this is really an EXPLAIN statement. If this
1233 ** cannot be verified, return early. */
1234 zSql = sqlite3_sql(pSql);
1235 if( zSql==0 ) return;
1236 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1237 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1238
1239 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1240 int i;
1241 int iAddr = sqlite3_column_int(pSql, 0);
1242 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1243
1244 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1245 ** p2 is an instruction address, set variable p2op to the index of that
1246 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1247 ** the current instruction is part of a sub-program generated by an
1248 ** SQL trigger or foreign key. */
1249 int p2 = sqlite3_column_int(pSql, 3);
1250 int p2op = (p2 + (iOp-iAddr));
1251
1252 /* Grow the p->aiIndent array as required */
1253 if( iOp>=nAlloc ){
1254 nAlloc += 100;
1255 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1256 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1257 }
1258 abYield[iOp] = str_in_array(zOp, azYield);
1259 p->aiIndent[iOp] = 0;
1260 p->nIndent = iOp+1;
1261
1262 if( str_in_array(zOp, azNext) ){
1263 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
1264 }
1265 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1266 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1267 ){
1268 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
1269 }
1270 }
1271
1272 p->iIndent = 0;
1273 sqlite3_free(abYield);
1274 sqlite3_reset(pSql);
1275 }
1276
1277 /*
1278 ** Free the array allocated by explain_data_prepare().
1279 */
1280 static void explain_data_delete(ShellState *p){
1281 sqlite3_free(p->aiIndent);
1282 p->aiIndent = 0;
1283 p->nIndent = 0;
1284 p->iIndent = 0;
1285 }
1286
1287 /*
1054 ** Execute a statement or set of statements. Print 1288 ** Execute a statement or set of statements. Print
1055 ** any result rows/columns depending on the current mode 1289 ** any result rows/columns depending on the current mode
1056 ** set via the supplied callback. 1290 ** set via the supplied callback.
1057 ** 1291 **
1058 ** This is very similar to SQLite's built-in sqlite3_exec() 1292 ** This is very similar to SQLite's built-in sqlite3_exec()
1059 ** function except it takes a slightly different callback 1293 ** function except it takes a slightly different callback
1060 ** and callback data argument. 1294 ** and callback data argument.
1061 */ 1295 */
1062 static int shell_exec( 1296 static int shell_exec(
1063 sqlite3 *db, /* An open database */ 1297 sqlite3 *db, /* An open database */
1064 const char *zSql, /* SQL to be evaluated */ 1298 const char *zSql, /* SQL to be evaluated */
1065 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */ 1299 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1066 /* (not the same as sqlite3_exec) */ 1300 /* (not the same as sqlite3_exec) */
1067 struct callback_data *pArg, /* Pointer to struct callback_data */ 1301 ShellState *pArg, /* Pointer to ShellState */
1068 char **pzErrMsg /* Error msg written here */ 1302 char **pzErrMsg /* Error msg written here */
1069 ){ 1303 ){
1070 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 1304 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1071 int rc = SQLITE_OK; /* Return Code */ 1305 int rc = SQLITE_OK; /* Return Code */
1306 int rc2;
1072 const char *zLeftover; /* Tail of unprocessed SQL */ 1307 const char *zLeftover; /* Tail of unprocessed SQL */
1073 1308
1074 if( pzErrMsg ){ 1309 if( pzErrMsg ){
1075 *pzErrMsg = NULL; 1310 *pzErrMsg = NULL;
1076 } 1311 }
1077 1312
1078 while( zSql[0] && (SQLITE_OK == rc) ){ 1313 while( zSql[0] && (SQLITE_OK == rc) ){
1079 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 1314 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1080 if( SQLITE_OK != rc ){ 1315 if( SQLITE_OK != rc ){
1081 if( pzErrMsg ){ 1316 if( pzErrMsg ){
1082 *pzErrMsg = save_err_msg(db); 1317 *pzErrMsg = save_err_msg(db);
1083 } 1318 }
1084 }else{ 1319 }else{
1085 if( !pStmt ){ 1320 if( !pStmt ){
1086 /* this happens for a comment or white-space */ 1321 /* this happens for a comment or white-space */
1087 zSql = zLeftover; 1322 zSql = zLeftover;
1088 while( isspace(zSql[0]) ) zSql++; 1323 while( IsSpace(zSql[0]) ) zSql++;
1089 continue; 1324 continue;
1090 } 1325 }
1091 1326
1092 /* save off the prepared statment handle and reset row count */ 1327 /* save off the prepared statment handle and reset row count */
1093 if( pArg ){ 1328 if( pArg ){
1094 pArg->pStmt = pStmt; 1329 pArg->pStmt = pStmt;
1095 pArg->cnt = 0; 1330 pArg->cnt = 0;
1096 } 1331 }
1097 1332
1098 /* echo the sql statement if echo on */ 1333 /* echo the sql statement if echo on */
1099 if( pArg && pArg->echoOn ){ 1334 if( pArg && pArg->echoOn ){
1100 const char *zStmtSql = sqlite3_sql(pStmt); 1335 const char *zStmtSql = sqlite3_sql(pStmt);
1101 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 1336 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
1102 } 1337 }
1103 1338
1339 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1340 if( pArg && pArg->autoEQP ){
1341 sqlite3_stmt *pExplain;
1342 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", sqlite3_sql(pStmt) );
1343 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1344 if( rc==SQLITE_OK ){
1345 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1346 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1347 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1348 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1349 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1350 }
1351 }
1352 sqlite3_finalize(pExplain);
1353 sqlite3_free(zEQP);
1354 }
1355
1356 /* If the shell is currently in ".explain" mode, gather the extra
1357 ** data required to add indents to the output.*/
1358 if( pArg && pArg->mode==MODE_Explain ){
1359 explain_data_prepare(pArg, pStmt);
1360 }
1361
1104 /* perform the first step. this will tell us if we 1362 /* perform the first step. this will tell us if we
1105 ** have a result set or not and how wide it is. 1363 ** have a result set or not and how wide it is.
1106 */ 1364 */
1107 rc = sqlite3_step(pStmt); 1365 rc = sqlite3_step(pStmt);
1108 /* if we have a result set... */ 1366 /* if we have a result set... */
1109 if( SQLITE_ROW == rc ){ 1367 if( SQLITE_ROW == rc ){
1110 /* if we have a callback... */ 1368 /* if we have a callback... */
1111 if( xCallback ){ 1369 if( xCallback ){
1112 /* allocate space for col name ptr, value ptr, and type */ 1370 /* allocate space for col name ptr, value ptr, and type */
1113 int nCol = sqlite3_column_count(pStmt); 1371 int nCol = sqlite3_column_count(pStmt);
1114 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1); 1372 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1115 if( !pData ){ 1373 if( !pData ){
1116 rc = SQLITE_NOMEM; 1374 rc = SQLITE_NOMEM;
1117 }else{ 1375 }else{
1118 char **azCols = (char **)pData; /* Names of result columns */ 1376 char **azCols = (char **)pData; /* Names of result columns */
1119 char **azVals = &azCols[nCol]; /* Results */ 1377 char **azVals = &azCols[nCol]; /* Results */
1120 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 1378 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1121 int i; 1379 int i, x;
1122 assert(sizeof(int) <= sizeof(char *)); 1380 assert(sizeof(int) <= sizeof(char *));
1123 /* save off ptrs to column names */ 1381 /* save off ptrs to column names */
1124 for(i=0; i<nCol; i++){ 1382 for(i=0; i<nCol; i++){
1125 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 1383 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1126 } 1384 }
1127 do{ 1385 do{
1128 /* extract the data and data types */ 1386 /* extract the data and data types */
1129 for(i=0; i<nCol; i++){ 1387 for(i=0; i<nCol; i++){
1130 azVals[i] = (char *)sqlite3_column_text(pStmt, i); 1388 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
1131 aiTypes[i] = sqlite3_column_type(pStmt, i); 1389 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
1390 azVals[i] = "";
1391 }else{
1392 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1393 }
1132 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 1394 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1133 rc = SQLITE_NOMEM; 1395 rc = SQLITE_NOMEM;
1134 break; /* from for */ 1396 break; /* from for */
1135 } 1397 }
1136 } /* end for */ 1398 } /* end for */
1137 1399
1138 /* if data and types extracted successfully... */ 1400 /* if data and types extracted successfully... */
1139 if( SQLITE_ROW == rc ){ 1401 if( SQLITE_ROW == rc ){
1140 /* call the supplied callback with the result row data */ 1402 /* call the supplied callback with the result row data */
1141 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){ 1403 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1142 rc = SQLITE_ABORT; 1404 rc = SQLITE_ABORT;
1143 }else{ 1405 }else{
1144 rc = sqlite3_step(pStmt); 1406 rc = sqlite3_step(pStmt);
1145 } 1407 }
1146 } 1408 }
1147 } while( SQLITE_ROW == rc ); 1409 } while( SQLITE_ROW == rc );
1148 sqlite3_free(pData); 1410 sqlite3_free(pData);
1149 } 1411 }
1150 }else{ 1412 }else{
1151 do{ 1413 do{
1152 rc = sqlite3_step(pStmt); 1414 rc = sqlite3_step(pStmt);
1153 } while( rc == SQLITE_ROW ); 1415 } while( rc == SQLITE_ROW );
1154 } 1416 }
1155 } 1417 }
1156 1418
1419 explain_data_delete(pArg);
1420
1157 /* print usage stats if stats on */ 1421 /* print usage stats if stats on */
1158 if( pArg && pArg->statsOn ){ 1422 if( pArg && pArg->statsOn ){
1159 display_stats(db, pArg, 0); 1423 display_stats(db, pArg, 0);
1160 } 1424 }
1161 1425
1162 /* Finalize the statement just executed. If this fails, save a 1426 /* Finalize the statement just executed. If this fails, save a
1163 ** copy of the error message. Otherwise, set zSql to point to the 1427 ** copy of the error message. Otherwise, set zSql to point to the
1164 ** next statement to execute. */ 1428 ** next statement to execute. */
1165 rc = sqlite3_finalize(pStmt); 1429 rc2 = sqlite3_finalize(pStmt);
1430 if( rc!=SQLITE_NOMEM ) rc = rc2;
1166 if( rc==SQLITE_OK ){ 1431 if( rc==SQLITE_OK ){
1167 zSql = zLeftover; 1432 zSql = zLeftover;
1168 while( isspace(zSql[0]) ) zSql++; 1433 while( IsSpace(zSql[0]) ) zSql++;
1169 }else if( pzErrMsg ){ 1434 }else if( pzErrMsg ){
1170 *pzErrMsg = save_err_msg(db); 1435 *pzErrMsg = save_err_msg(db);
1171 } 1436 }
1172 1437
1173 /* clear saved stmt handle */ 1438 /* clear saved stmt handle */
1174 if( pArg ){ 1439 if( pArg ){
1175 pArg->pStmt = NULL; 1440 pArg->pStmt = NULL;
1176 } 1441 }
1177 } 1442 }
1178 } /* end while */ 1443 } /* end while */
1179 1444
1180 return rc; 1445 return rc;
1181 } 1446 }
1182 1447
1183 1448
1184 /* 1449 /*
1185 ** This is a different callback routine used for dumping the database. 1450 ** This is a different callback routine used for dumping the database.
1186 ** Each row received by this callback consists of a table name, 1451 ** Each row received by this callback consists of a table name,
1187 ** the table type ("index" or "table") and SQL to create the table. 1452 ** the table type ("index" or "table") and SQL to create the table.
1188 ** This routine should print text sufficient to recreate the table. 1453 ** This routine should print text sufficient to recreate the table.
1189 */ 1454 */
1190 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){ 1455 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
1191 int rc; 1456 int rc;
1192 const char *zTable; 1457 const char *zTable;
1193 const char *zType; 1458 const char *zType;
1194 const char *zSql; 1459 const char *zSql;
1195 const char *zPrepStmt = 0; 1460 const char *zPrepStmt = 0;
1196 struct callback_data *p = (struct callback_data *)pArg; 1461 ShellState *p = (ShellState *)pArg;
1197 1462
1198 UNUSED_PARAMETER(azCol); 1463 UNUSED_PARAMETER(azCol);
1199 if( nArg!=3 ) return 1; 1464 if( nArg!=3 ) return 1;
1200 zTable = azArg[0]; 1465 zTable = azArg[0];
1201 zType = azArg[1]; 1466 zType = azArg[1];
1202 zSql = azArg[2]; 1467 zSql = azArg[2];
1203 1468
1204 if( strcmp(zTable, "sqlite_sequence")==0 ){ 1469 if( strcmp(zTable, "sqlite_sequence")==0 ){
1205 zPrepStmt = "DELETE FROM sqlite_sequence;\n"; 1470 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
1206 }else if( strcmp(zTable, "sqlite_stat1")==0 ){ 1471 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
1207 fprintf(p->out, "ANALYZE sqlite_master;\n"); 1472 fprintf(p->out, "ANALYZE sqlite_master;\n");
1208 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 1473 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1209 return 0; 1474 return 0;
1210 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 1475 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1211 char *zIns; 1476 char *zIns;
1212 if( !p->writableSchema ){ 1477 if( !p->writableSchema ){
1213 fprintf(p->out, "PRAGMA writable_schema=ON;\n"); 1478 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1214 p->writableSchema = 1; 1479 p->writableSchema = 1;
1215 } 1480 }
1216 zIns = sqlite3_mprintf( 1481 zIns = sqlite3_mprintf(
(...skipping 11 matching lines...) Expand all
1228 sqlite3_stmt *pTableInfo = 0; 1493 sqlite3_stmt *pTableInfo = 0;
1229 char *zSelect = 0; 1494 char *zSelect = 0;
1230 char *zTableInfo = 0; 1495 char *zTableInfo = 0;
1231 char *zTmp = 0; 1496 char *zTmp = 0;
1232 int nRow = 0; 1497 int nRow = 0;
1233 1498
1234 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0); 1499 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1235 zTableInfo = appendText(zTableInfo, zTable, '"'); 1500 zTableInfo = appendText(zTableInfo, zTable, '"');
1236 zTableInfo = appendText(zTableInfo, ");", 0); 1501 zTableInfo = appendText(zTableInfo, ");", 0);
1237 1502
1238 rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0); 1503 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
1239 free(zTableInfo); 1504 free(zTableInfo);
1240 if( rc!=SQLITE_OK || !pTableInfo ){ 1505 if( rc!=SQLITE_OK || !pTableInfo ){
1241 return 1; 1506 return 1;
1242 } 1507 }
1243 1508
1244 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0); 1509 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1510 /* Always quote the table name, even if it appears to be pure ascii,
1511 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1245 zTmp = appendText(zTmp, zTable, '"'); 1512 zTmp = appendText(zTmp, zTable, '"');
1246 if( zTmp ){ 1513 if( zTmp ){
1247 zSelect = appendText(zSelect, zTmp, '\''); 1514 zSelect = appendText(zSelect, zTmp, '\'');
1515 free(zTmp);
1248 } 1516 }
1249 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0); 1517 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1250 rc = sqlite3_step(pTableInfo); 1518 rc = sqlite3_step(pTableInfo);
1251 while( rc==SQLITE_ROW ){ 1519 while( rc==SQLITE_ROW ){
1252 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1); 1520 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
1253 zSelect = appendText(zSelect, "quote(", 0); 1521 zSelect = appendText(zSelect, "quote(", 0);
1254 zSelect = appendText(zSelect, zText, '"'); 1522 zSelect = appendText(zSelect, zText, '"');
1255 rc = sqlite3_step(pTableInfo); 1523 rc = sqlite3_step(pTableInfo);
1256 if( rc==SQLITE_ROW ){ 1524 if( rc==SQLITE_ROW ){
1257 zSelect = appendText(zSelect, ") || ',' || ", 0); 1525 zSelect = appendText(zSelect, "), ", 0);
1258 }else{ 1526 }else{
1259 zSelect = appendText(zSelect, ") ", 0); 1527 zSelect = appendText(zSelect, ") ", 0);
1260 } 1528 }
1261 nRow++; 1529 nRow++;
1262 } 1530 }
1263 rc = sqlite3_finalize(pTableInfo); 1531 rc = sqlite3_finalize(pTableInfo);
1264 if( rc!=SQLITE_OK || nRow==0 ){ 1532 if( rc!=SQLITE_OK || nRow==0 ){
1265 free(zSelect); 1533 free(zSelect);
1266 return 1; 1534 return 1;
1267 } 1535 }
1268 zSelect = appendText(zSelect, "|| ')' FROM ", 0); 1536 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1269 zSelect = appendText(zSelect, zTable, '"'); 1537 zSelect = appendText(zSelect, zTable, '"');
1270 1538
1271 rc = run_table_dump_query(p->out, p->db, zSelect, zPrepStmt); 1539 rc = run_table_dump_query(p, zSelect, zPrepStmt);
1272 if( rc==SQLITE_CORRUPT ){ 1540 if( rc==SQLITE_CORRUPT ){
1273 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0); 1541 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1274 rc = run_table_dump_query(p->out, p->db, zSelect, 0); 1542 run_table_dump_query(p, zSelect, 0);
1275 } 1543 }
1276 if( zSelect ) free(zSelect); 1544 free(zSelect);
1277 } 1545 }
1278 return 0; 1546 return 0;
1279 } 1547 }
1280 1548
1281 /* 1549 /*
1282 ** Run zQuery. Use dump_callback() as the callback routine so that 1550 ** Run zQuery. Use dump_callback() as the callback routine so that
1283 ** the contents of the query are output as SQL statements. 1551 ** the contents of the query are output as SQL statements.
1284 ** 1552 **
1285 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 1553 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
1286 ** "ORDER BY rowid DESC" to the end. 1554 ** "ORDER BY rowid DESC" to the end.
1287 */ 1555 */
1288 static int run_schema_dump_query( 1556 static int run_schema_dump_query(
1289 struct callback_data *p, 1557 ShellState *p,
1290 const char *zQuery, 1558 const char *zQuery
1291 char **pzErrMsg
1292 ){ 1559 ){
1293 int rc; 1560 int rc;
1294 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg); 1561 char *zErr = 0;
1562 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
1295 if( rc==SQLITE_CORRUPT ){ 1563 if( rc==SQLITE_CORRUPT ){
1296 char *zQ2; 1564 char *zQ2;
1297 int len = strlen30(zQuery); 1565 int len = strlen30(zQuery);
1298 if( pzErrMsg ) sqlite3_free(*pzErrMsg); 1566 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1567 if( zErr ){
1568 fprintf(p->out, "/****** %s ******/\n", zErr);
1569 sqlite3_free(zErr);
1570 zErr = 0;
1571 }
1299 zQ2 = malloc( len+100 ); 1572 zQ2 = malloc( len+100 );
1300 if( zQ2==0 ) return rc; 1573 if( zQ2==0 ) return rc;
1301 sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); 1574 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
1302 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg); 1575 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1576 if( rc ){
1577 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1578 }else{
1579 rc = SQLITE_CORRUPT;
1580 }
1581 sqlite3_free(zErr);
1303 free(zQ2); 1582 free(zQ2);
1304 } 1583 }
1305 return rc; 1584 return rc;
1306 } 1585 }
1307 1586
1308 /* 1587 /*
1309 ** Text of a help message 1588 ** Text of a help message
1310 */ 1589 */
1311 static char zHelp[] = 1590 static char zHelp[] =
1312 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" 1591 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
1313 ".bail ON|OFF Stop after hitting an error. Default OFF\n" 1592 ".bail on|off Stop after hitting an error. Default OFF\n"
1593 ".clone NEWDB Clone data into NEWDB from the existing database\n"
1314 ".databases List names and files of attached databases\n" 1594 ".databases List names and files of attached databases\n"
1315 ".dump ?TABLE? ... Dump the database in an SQL text format\n" 1595 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
1316 " If TABLE specified, only dump tables matching\n" 1596 " If TABLE specified, only dump tables matching\n"
1317 " LIKE pattern TABLE.\n" 1597 " LIKE pattern TABLE.\n"
1318 ".echo ON|OFF Turn command echo on or off\n" 1598 ".echo on|off Turn command echo on or off\n"
1599 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
1319 ".exit Exit this program\n" 1600 ".exit Exit this program\n"
1320 ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n" 1601 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
1321 " With no args, it turns EXPLAIN on.\n" 1602 " With no args, it turns EXPLAIN on.\n"
1322 ".header(s) ON|OFF Turn display of headers on or off\n" 1603 ".fullschema Show schema and the content of sqlite_stat tables\n"
1604 ".headers on|off Turn display of headers on or off\n"
1323 ".help Show this message\n" 1605 ".help Show this message\n"
1324 ".import FILE TABLE Import data from FILE into TABLE\n" 1606 ".import FILE TABLE Import data from FILE into TABLE\n"
1325 ".indices ?TABLE? Show names of all indices\n" 1607 ".indices ?TABLE? Show names of all indices\n"
1326 " If TABLE specified, only show indices for tables\n" 1608 " If TABLE specified, only show indices for tables\n"
1327 " matching LIKE pattern TABLE.\n" 1609 " matching LIKE pattern TABLE.\n"
1328 #ifdef SQLITE_ENABLE_IOTRACE 1610 #ifdef SQLITE_ENABLE_IOTRACE
1329 ".iotrace FILE Enable I/O diagnostic logging to FILE\n" 1611 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1330 #endif 1612 #endif
1331 #ifndef SQLITE_OMIT_LOAD_EXTENSION 1613 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1332 ".load FILE ?ENTRY? Load an extension library\n" 1614 ".load FILE ?ENTRY? Load an extension library\n"
1333 #endif 1615 #endif
1334 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n" 1616 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
1335 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" 1617 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
1336 " csv Comma-separated values\n" 1618 " csv Comma-separated values\n"
1337 " column Left-aligned columns. (See .width)\n" 1619 " column Left-aligned columns. (See .width)\n"
1338 " html HTML <table> code\n" 1620 " html HTML <table> code\n"
1339 " insert SQL insert statements for TABLE\n" 1621 " insert SQL insert statements for TABLE\n"
1340 " line One value per line\n" 1622 " line One value per line\n"
1341 " list Values delimited by .separator string\n" 1623 " list Values delimited by .separator string\n"
1342 " tabs Tab-separated values\n" 1624 " tabs Tab-separated values\n"
1343 " tcl TCL list elements\n" 1625 " tcl TCL list elements\n"
1344 ".nullvalue STRING Print STRING in place of NULL values\n" 1626 ".nullvalue STRING Use STRING in place of NULL values\n"
1345 ".output FILENAME Send output to FILENAME\n" 1627 ".once FILENAME Output for the next SQL command only to FILENAME\n"
1346 ".output stdout Send output to the screen\n" 1628 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
1629 ".output ?FILENAME? Send output to FILENAME or stdout\n"
1630 ".print STRING... Print literal STRING\n"
1347 ".prompt MAIN CONTINUE Replace the standard prompts\n" 1631 ".prompt MAIN CONTINUE Replace the standard prompts\n"
1348 ".quit Exit this program\n" 1632 ".quit Exit this program\n"
1349 ".read FILENAME Execute SQL in FILENAME\n" 1633 ".read FILENAME Execute SQL in FILENAME\n"
1350 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" 1634 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
1635 ".save FILE Write in-memory database into FILE\n"
1351 ".schema ?TABLE? Show the CREATE statements\n" 1636 ".schema ?TABLE? Show the CREATE statements\n"
1352 " If TABLE specified, only show tables matching\n" 1637 " If TABLE specified, only show tables matching\n"
1353 " LIKE pattern TABLE.\n" 1638 " LIKE pattern TABLE.\n"
1354 ".separator STRING Change separator used by output mode and .import\n" 1639 ".separator STRING ?NL? Change separator used by output mode and .import\n"
1640 " NL is the end-of-line mark for CSV\n"
1641 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
1355 ".show Show the current values for various settings\n" 1642 ".show Show the current values for various settings\n"
1356 ".stats ON|OFF Turn stats on or off\n" 1643 ".stats on|off Turn stats on or off\n"
1644 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
1357 ".tables ?TABLE? List names of tables\n" 1645 ".tables ?TABLE? List names of tables\n"
1358 " If TABLE specified, only list tables matching\n" 1646 " If TABLE specified, only list tables matching\n"
1359 " LIKE pattern TABLE.\n" 1647 " LIKE pattern TABLE.\n"
1360 ".timeout MS Try opening locked tables for MS milliseconds\n" 1648 ".timeout MS Try opening locked tables for MS milliseconds\n"
1649 ".timer on|off Turn SQL timer on or off\n"
1650 ".trace FILE|off Output each SQL statement as it is run\n"
1651 ".vfsname ?AUX? Print the name of the VFS stack\n"
1361 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" 1652 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
1362 ; 1653 " Negative values right-justify\n"
1363
1364 static char zTimerHelp[] =
1365 ".timer ON|OFF Turn the CPU timer measurement on or off\n"
1366 ; 1654 ;
1367 1655
1368 /* Forward reference */ 1656 /* Forward reference */
1369 static int process_input(struct callback_data *p, FILE *in); 1657 static int process_input(ShellState *p, FILE *in);
1658 /*
1659 ** Implementation of the "readfile(X)" SQL function. The entire content
1660 ** of the file named X is read and returned as a BLOB. NULL is returned
1661 ** if the file does not exist or is unreadable.
1662 */
1663 static void readfileFunc(
1664 sqlite3_context *context,
1665 int argc,
1666 sqlite3_value **argv
1667 ){
1668 const char *zName;
1669 FILE *in;
1670 long nIn;
1671 void *pBuf;
1672
1673 zName = (const char*)sqlite3_value_text(argv[0]);
1674 if( zName==0 ) return;
1675 in = fopen(zName, "rb");
1676 if( in==0 ) return;
1677 fseek(in, 0, SEEK_END);
1678 nIn = ftell(in);
1679 rewind(in);
1680 pBuf = sqlite3_malloc( nIn );
1681 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1682 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1683 }else{
1684 sqlite3_free(pBuf);
1685 }
1686 fclose(in);
1687 }
1688
1689 /*
1690 ** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1691 ** is written into file X. The number of bytes written is returned. Or
1692 ** NULL is returned if something goes wrong, such as being unable to open
1693 ** file X for writing.
1694 */
1695 static void writefileFunc(
1696 sqlite3_context *context,
1697 int argc,
1698 sqlite3_value **argv
1699 ){
1700 FILE *out;
1701 const char *z;
1702 sqlite3_int64 rc;
1703 const char *zFile;
1704
1705 zFile = (const char*)sqlite3_value_text(argv[0]);
1706 if( zFile==0 ) return;
1707 out = fopen(zFile, "wb");
1708 if( out==0 ) return;
1709 z = (const char*)sqlite3_value_blob(argv[1]);
1710 if( z==0 ){
1711 rc = 0;
1712 }else{
1713 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
1714 }
1715 fclose(out);
1716 sqlite3_result_int64(context, rc);
1717 }
1370 1718
1371 /* 1719 /*
1372 ** Make sure the database is open. If it is not, then open it. If 1720 ** Make sure the database is open. If it is not, then open it. If
1373 ** the database fails to open, print an error message and exit. 1721 ** the database fails to open, print an error message and exit.
1374 */ 1722 */
1375 static void open_db(struct callback_data *p){ 1723 static void open_db(ShellState *p, int keepAlive){
1376 if( p->db==0 ){ 1724 if( p->db==0 ){
1725 sqlite3_initialize();
1377 sqlite3_open(p->zDbFilename, &p->db); 1726 sqlite3_open(p->zDbFilename, &p->db);
1378 db = p->db; 1727 db = p->db;
1379 if( db && sqlite3_errcode(db)==SQLITE_OK ){ 1728 if( db && sqlite3_errcode(db)==SQLITE_OK ){
1380 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, 1729 sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0,
1381 shellstaticFunc, 0, 0); 1730 shellstaticFunc, 0, 0);
1382 } 1731 }
1383 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ 1732 if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
1384 fprintf(stderr,"Error: unable to open database \"%s\": %s\n", 1733 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
1385 p->zDbFilename, sqlite3_errmsg(db)); 1734 p->zDbFilename, sqlite3_errmsg(db));
1735 if( keepAlive ) return;
1386 exit(1); 1736 exit(1);
1387 } 1737 }
1388 #ifndef SQLITE_OMIT_LOAD_EXTENSION 1738 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1389 sqlite3_enable_load_extension(p->db, 1); 1739 sqlite3_enable_load_extension(p->db, 1);
1390 #endif 1740 #endif
1741 sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1742 readfileFunc, 0, 0);
1743 sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1744 writefileFunc, 0, 0);
1391 } 1745 }
1392 } 1746 }
1393 1747
1394 /* 1748 /*
1395 ** Do C-language style dequoting. 1749 ** Do C-language style dequoting.
1396 ** 1750 **
1397 ** \t -> tab 1751 ** \t -> tab
1398 ** \n -> newline 1752 ** \n -> newline
1399 ** \r -> carriage return 1753 ** \r -> carriage return
1754 ** \" -> "
1400 ** \NNN -> ascii character NNN in octal 1755 ** \NNN -> ascii character NNN in octal
1401 ** \\ -> backslash 1756 ** \\ -> backslash
1402 */ 1757 */
1403 static void resolve_backslashes(char *z){ 1758 static void resolve_backslashes(char *z){
1404 int i, j; 1759 int i, j;
1405 char c; 1760 char c;
1761 while( *z && *z!='\\' ) z++;
1406 for(i=j=0; (c = z[i])!=0; i++, j++){ 1762 for(i=j=0; (c = z[i])!=0; i++, j++){
1407 if( c=='\\' ){ 1763 if( c=='\\' ){
1408 c = z[++i]; 1764 c = z[++i];
1409 if( c=='n' ){ 1765 if( c=='n' ){
1410 c = '\n'; 1766 c = '\n';
1411 }else if( c=='t' ){ 1767 }else if( c=='t' ){
1412 c = '\t'; 1768 c = '\t';
1413 }else if( c=='r' ){ 1769 }else if( c=='r' ){
1414 c = '\r'; 1770 c = '\r';
1771 }else if( c=='\\' ){
1772 c = '\\';
1415 }else if( c>='0' && c<='7' ){ 1773 }else if( c>='0' && c<='7' ){
1416 c -= '0'; 1774 c -= '0';
1417 if( z[i+1]>='0' && z[i+1]<='7' ){ 1775 if( z[i+1]>='0' && z[i+1]<='7' ){
1418 i++; 1776 i++;
1419 c = (c<<3) + z[i] - '0'; 1777 c = (c<<3) + z[i] - '0';
1420 if( z[i+1]>='0' && z[i+1]<='7' ){ 1778 if( z[i+1]>='0' && z[i+1]<='7' ){
1421 i++; 1779 i++;
1422 c = (c<<3) + z[i] - '0'; 1780 c = (c<<3) + z[i] - '0';
1423 } 1781 }
1424 } 1782 }
1425 } 1783 }
1426 } 1784 }
1427 z[j] = c; 1785 z[j] = c;
1428 } 1786 }
1429 z[j] = 0; 1787 if( j<i ) z[j] = 0;
1430 } 1788 }
1431 1789
1432 /* 1790 /*
1433 ** Interpret zArg as a boolean value. Return either 0 or 1. 1791 ** Return the value of a hexadecimal digit. Return -1 if the input
1792 ** is not a hex digit.
1793 */
1794 static int hexDigitValue(char c){
1795 if( c>='0' && c<='9' ) return c - '0';
1796 if( c>='a' && c<='f' ) return c - 'a' + 10;
1797 if( c>='A' && c<='F' ) return c - 'A' + 10;
1798 return -1;
1799 }
1800
1801 /*
1802 ** Interpret zArg as an integer value, possibly with suffixes.
1803 */
1804 static sqlite3_int64 integerValue(const char *zArg){
1805 sqlite3_int64 v = 0;
1806 static const struct { char *zSuffix; int iMult; } aMult[] = {
1807 { "KiB", 1024 },
1808 { "MiB", 1024*1024 },
1809 { "GiB", 1024*1024*1024 },
1810 { "KB", 1000 },
1811 { "MB", 1000000 },
1812 { "GB", 1000000000 },
1813 { "K", 1000 },
1814 { "M", 1000000 },
1815 { "G", 1000000000 },
1816 };
1817 int i;
1818 int isNeg = 0;
1819 if( zArg[0]=='-' ){
1820 isNeg = 1;
1821 zArg++;
1822 }else if( zArg[0]=='+' ){
1823 zArg++;
1824 }
1825 if( zArg[0]=='0' && zArg[1]=='x' ){
1826 int x;
1827 zArg += 2;
1828 while( (x = hexDigitValue(zArg[0]))>=0 ){
1829 v = (v<<4) + x;
1830 zArg++;
1831 }
1832 }else{
1833 while( IsDigit(zArg[0]) ){
1834 v = v*10 + zArg[0] - '0';
1835 zArg++;
1836 }
1837 }
1838 for(i=0; i<ArraySize(aMult); i++){
1839 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1840 v *= aMult[i].iMult;
1841 break;
1842 }
1843 }
1844 return isNeg? -v : v;
1845 }
1846
1847 /*
1848 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
1849 ** for TRUE and FALSE. Return the integer value if appropriate.
1434 */ 1850 */
1435 static int booleanValue(char *zArg){ 1851 static int booleanValue(char *zArg){
1436 int val = atoi(zArg); 1852 int i;
1437 int j; 1853 if( zArg[0]=='0' && zArg[1]=='x' ){
1438 for(j=0; zArg[j]; j++){ 1854 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
1439 zArg[j] = (char)tolower(zArg[j]); 1855 }else{
1440 } 1856 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
1441 if( strcmp(zArg,"on")==0 ){ 1857 }
1442 val = 1; 1858 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
1443 }else if( strcmp(zArg,"yes")==0 ){ 1859 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
1444 val = 1; 1860 return 1;
1445 } 1861 }
1446 return val; 1862 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
1863 return 0;
1864 }
1865 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
1866 zArg);
1867 return 0;
1868 }
1869
1870 /*
1871 ** Close an output file, assuming it is not stderr or stdout
1872 */
1873 static void output_file_close(FILE *f){
1874 if( f && f!=stdout && f!=stderr ) fclose(f);
1875 }
1876
1877 /*
1878 ** Try to open an output file. The names "stdout" and "stderr" are
1879 ** recognized and do the right thing. NULL is returned if the output
1880 ** filename is "off".
1881 */
1882 static FILE *output_file_open(const char *zFile){
1883 FILE *f;
1884 if( strcmp(zFile,"stdout")==0 ){
1885 f = stdout;
1886 }else if( strcmp(zFile, "stderr")==0 ){
1887 f = stderr;
1888 }else if( strcmp(zFile, "off")==0 ){
1889 f = 0;
1890 }else{
1891 f = fopen(zFile, "wb");
1892 if( f==0 ){
1893 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
1894 }
1895 }
1896 return f;
1897 }
1898
1899 /*
1900 ** A routine for handling output from sqlite3_trace().
1901 */
1902 static void sql_trace_callback(void *pArg, const char *z){
1903 FILE *f = (FILE*)pArg;
1904 if( f ){
1905 int i = (int)strlen(z);
1906 while( i>0 && z[i-1]==';' ){ i--; }
1907 fprintf(f, "%.*s;\n", i, z);
1908 }
1909 }
1910
1911 /*
1912 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
1913 ** a useful spot to set a debugger breakpoint.
1914 */
1915 static void test_breakpoint(void){
1916 static int nCall = 0;
1917 nCall++;
1918 }
1919
1920 /*
1921 ** An object used to read a CSV file
1922 */
1923 typedef struct CSVReader CSVReader;
1924 struct CSVReader {
1925 const char *zFile; /* Name of the input file */
1926 FILE *in; /* Read the CSV text from this input stream */
1927 char *z; /* Accumulated text for a field */
1928 int n; /* Number of bytes in z */
1929 int nAlloc; /* Space allocated for z[] */
1930 int nLine; /* Current line number */
1931 int cTerm; /* Character that terminated the most recent field */
1932 int cSeparator; /* The separator character. (Usually ",") */
1933 };
1934
1935 /* Append a single byte to z[] */
1936 static void csv_append_char(CSVReader *p, int c){
1937 if( p->n+1>=p->nAlloc ){
1938 p->nAlloc += p->nAlloc + 100;
1939 p->z = sqlite3_realloc(p->z, p->nAlloc);
1940 if( p->z==0 ){
1941 fprintf(stderr, "out of memory\n");
1942 exit(1);
1943 }
1944 }
1945 p->z[p->n++] = (char)c;
1946 }
1947
1948 /* Read a single field of CSV text. Compatible with rfc4180 and extended
1949 ** with the option of having a separator other than ",".
1950 **
1951 ** + Input comes from p->in.
1952 ** + Store results in p->z of length p->n. Space to hold p->z comes
1953 ** from sqlite3_malloc().
1954 ** + Use p->cSep as the separator. The default is ",".
1955 ** + Keep track of the line number in p->nLine.
1956 ** + Store the character that terminates the field in p->cTerm. Store
1957 ** EOF on end-of-file.
1958 ** + Report syntax errors on stderr
1959 */
1960 static char *csv_read_one_field(CSVReader *p){
1961 int c, pc, ppc;
1962 int cSep = p->cSeparator;
1963 p->n = 0;
1964 c = fgetc(p->in);
1965 if( c==EOF || seenInterrupt ){
1966 p->cTerm = EOF;
1967 return 0;
1968 }
1969 if( c=='"' ){
1970 int startLine = p->nLine;
1971 int cQuote = c;
1972 pc = ppc = 0;
1973 while( 1 ){
1974 c = fgetc(p->in);
1975 if( c=='\n' ) p->nLine++;
1976 if( c==cQuote ){
1977 if( pc==cQuote ){
1978 pc = 0;
1979 continue;
1980 }
1981 }
1982 if( (c==cSep && pc==cQuote)
1983 || (c=='\n' && pc==cQuote)
1984 || (c=='\n' && pc=='\r' && ppc==cQuote)
1985 || (c==EOF && pc==cQuote)
1986 ){
1987 do{ p->n--; }while( p->z[p->n]!=cQuote );
1988 p->cTerm = c;
1989 break;
1990 }
1991 if( pc==cQuote && c!='\r' ){
1992 fprintf(stderr, "%s:%d: unescaped %c character\n",
1993 p->zFile, p->nLine, cQuote);
1994 }
1995 if( c==EOF ){
1996 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
1997 p->zFile, startLine, cQuote);
1998 p->cTerm = EOF;
1999 break;
2000 }
2001 csv_append_char(p, c);
2002 ppc = pc;
2003 pc = c;
2004 }
2005 }else{
2006 while( c!=EOF && c!=cSep && c!='\n' ){
2007 csv_append_char(p, c);
2008 c = fgetc(p->in);
2009 }
2010 if( c=='\n' ){
2011 p->nLine++;
2012 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
2013 }
2014 p->cTerm = c;
2015 }
2016 if( p->z ) p->z[p->n] = 0;
2017 return p->z;
2018 }
2019
2020 /*
2021 ** Try to transfer data for table zTable. If an error is seen while
2022 ** moving forward, try to go backwards. The backwards movement won't
2023 ** work for WITHOUT ROWID tables.
2024 */
2025 static void tryToCloneData(
2026 ShellState *p,
2027 sqlite3 *newDb,
2028 const char *zTable
2029 ){
2030 sqlite3_stmt *pQuery = 0;
2031 sqlite3_stmt *pInsert = 0;
2032 char *zQuery = 0;
2033 char *zInsert = 0;
2034 int rc;
2035 int i, j, n;
2036 int nTable = (int)strlen(zTable);
2037 int k = 0;
2038 int cnt = 0;
2039 const int spinRate = 10000;
2040
2041 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2042 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2043 if( rc ){
2044 fprintf(stderr, "Error %d: %s on [%s]\n",
2045 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2046 zQuery);
2047 goto end_data_xfer;
2048 }
2049 n = sqlite3_column_count(pQuery);
2050 zInsert = sqlite3_malloc(200 + nTable + n*3);
2051 if( zInsert==0 ){
2052 fprintf(stderr, "out of memory\n");
2053 goto end_data_xfer;
2054 }
2055 sqlite3_snprintf(200+nTable,zInsert,
2056 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2057 i = (int)strlen(zInsert);
2058 for(j=1; j<n; j++){
2059 memcpy(zInsert+i, ",?", 2);
2060 i += 2;
2061 }
2062 memcpy(zInsert+i, ");", 3);
2063 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2064 if( rc ){
2065 fprintf(stderr, "Error %d: %s on [%s]\n",
2066 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2067 zQuery);
2068 goto end_data_xfer;
2069 }
2070 for(k=0; k<2; k++){
2071 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2072 for(i=0; i<n; i++){
2073 switch( sqlite3_column_type(pQuery, i) ){
2074 case SQLITE_NULL: {
2075 sqlite3_bind_null(pInsert, i+1);
2076 break;
2077 }
2078 case SQLITE_INTEGER: {
2079 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2080 break;
2081 }
2082 case SQLITE_FLOAT: {
2083 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2084 break;
2085 }
2086 case SQLITE_TEXT: {
2087 sqlite3_bind_text(pInsert, i+1,
2088 (const char*)sqlite3_column_text(pQuery,i),
2089 -1, SQLITE_STATIC);
2090 break;
2091 }
2092 case SQLITE_BLOB: {
2093 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2094 sqlite3_column_bytes(pQuery,i),
2095 SQLITE_STATIC);
2096 break;
2097 }
2098 }
2099 } /* End for */
2100 rc = sqlite3_step(pInsert);
2101 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2102 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2103 sqlite3_errmsg(newDb));
2104 }
2105 sqlite3_reset(pInsert);
2106 cnt++;
2107 if( (cnt%spinRate)==0 ){
2108 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2109 fflush(stdout);
2110 }
2111 } /* End while */
2112 if( rc==SQLITE_DONE ) break;
2113 sqlite3_finalize(pQuery);
2114 sqlite3_free(zQuery);
2115 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2116 zTable);
2117 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2118 if( rc ){
2119 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2120 break;
2121 }
2122 } /* End for(k=0...) */
2123
2124 end_data_xfer:
2125 sqlite3_finalize(pQuery);
2126 sqlite3_finalize(pInsert);
2127 sqlite3_free(zQuery);
2128 sqlite3_free(zInsert);
2129 }
2130
2131
2132 /*
2133 ** Try to transfer all rows of the schema that match zWhere. For
2134 ** each row, invoke xForEach() on the object defined by that row.
2135 ** If an error is encountered while moving forward through the
2136 ** sqlite_master table, try again moving backwards.
2137 */
2138 static void tryToCloneSchema(
2139 ShellState *p,
2140 sqlite3 *newDb,
2141 const char *zWhere,
2142 void (*xForEach)(ShellState*,sqlite3*,const char*)
2143 ){
2144 sqlite3_stmt *pQuery = 0;
2145 char *zQuery = 0;
2146 int rc;
2147 const unsigned char *zName;
2148 const unsigned char *zSql;
2149 char *zErrMsg = 0;
2150
2151 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2152 " WHERE %s", zWhere);
2153 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2154 if( rc ){
2155 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2156 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2157 zQuery);
2158 goto end_schema_xfer;
2159 }
2160 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2161 zName = sqlite3_column_text(pQuery, 0);
2162 zSql = sqlite3_column_text(pQuery, 1);
2163 printf("%s... ", zName); fflush(stdout);
2164 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2165 if( zErrMsg ){
2166 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2167 sqlite3_free(zErrMsg);
2168 zErrMsg = 0;
2169 }
2170 if( xForEach ){
2171 xForEach(p, newDb, (const char*)zName);
2172 }
2173 printf("done\n");
2174 }
2175 if( rc!=SQLITE_DONE ){
2176 sqlite3_finalize(pQuery);
2177 sqlite3_free(zQuery);
2178 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2179 " WHERE %s ORDER BY rowid DESC", zWhere);
2180 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2181 if( rc ){
2182 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2183 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2184 zQuery);
2185 goto end_schema_xfer;
2186 }
2187 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2188 zName = sqlite3_column_text(pQuery, 0);
2189 zSql = sqlite3_column_text(pQuery, 1);
2190 printf("%s... ", zName); fflush(stdout);
2191 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2192 if( zErrMsg ){
2193 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2194 sqlite3_free(zErrMsg);
2195 zErrMsg = 0;
2196 }
2197 if( xForEach ){
2198 xForEach(p, newDb, (const char*)zName);
2199 }
2200 printf("done\n");
2201 }
2202 }
2203 end_schema_xfer:
2204 sqlite3_finalize(pQuery);
2205 sqlite3_free(zQuery);
2206 }
2207
2208 /*
2209 ** Open a new database file named "zNewDb". Try to recover as much information
2210 ** as possible out of the main database (which might be corrupt) and write it
2211 ** into zNewDb.
2212 */
2213 static void tryToClone(ShellState *p, const char *zNewDb){
2214 int rc;
2215 sqlite3 *newDb = 0;
2216 if( access(zNewDb,0)==0 ){
2217 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2218 return;
2219 }
2220 rc = sqlite3_open(zNewDb, &newDb);
2221 if( rc ){
2222 fprintf(stderr, "Cannot create output database: %s\n",
2223 sqlite3_errmsg(newDb));
2224 }else{
2225 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
2226 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
2227 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2228 tryToCloneSchema(p, newDb, "type!='table'", 0);
2229 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2230 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2231 }
2232 sqlite3_close(newDb);
2233 }
2234
2235 /*
2236 ** Change the output file back to stdout
2237 */
2238 static void output_reset(ShellState *p){
2239 if( p->outfile[0]=='|' ){
2240 pclose(p->out);
2241 }else{
2242 output_file_close(p->out);
2243 }
2244 p->outfile[0] = 0;
2245 p->out = stdout;
1447 } 2246 }
1448 2247
1449 /* 2248 /*
1450 ** If an input line begins with "." then invoke this routine to 2249 ** If an input line begins with "." then invoke this routine to
1451 ** process that line. 2250 ** process that line.
1452 ** 2251 **
1453 ** Return 1 on error, 2 to exit, and 0 otherwise. 2252 ** Return 1 on error, 2 to exit, and 0 otherwise.
1454 */ 2253 */
1455 static int do_meta_command(char *zLine, struct callback_data *p){ 2254 static int do_meta_command(char *zLine, ShellState *p){
1456 int i = 1; 2255 int i = 1;
1457 int nArg = 0; 2256 int nArg = 0;
1458 int n, c; 2257 int n, c;
1459 int rc = 0; 2258 int rc = 0;
1460 char *azArg[50]; 2259 char *azArg[50];
1461 2260
1462 /* Parse the input line into tokens. 2261 /* Parse the input line into tokens.
1463 */ 2262 */
1464 while( zLine[i] && nArg<ArraySize(azArg) ){ 2263 while( zLine[i] && nArg<ArraySize(azArg) ){
1465 while( isspace((unsigned char)zLine[i]) ){ i++; } 2264 while( IsSpace(zLine[i]) ){ i++; }
1466 if( zLine[i]==0 ) break; 2265 if( zLine[i]==0 ) break;
1467 if( zLine[i]=='\'' || zLine[i]=='"' ){ 2266 if( zLine[i]=='\'' || zLine[i]=='"' ){
1468 int delim = zLine[i++]; 2267 int delim = zLine[i++];
1469 azArg[nArg++] = &zLine[i]; 2268 azArg[nArg++] = &zLine[i];
1470 while( zLine[i] && zLine[i]!=delim ){ i++; } 2269 while( zLine[i] && zLine[i]!=delim ){
2270 if( zLine[i]=='\\' && delim=='"' && zLine[i+1]!=0 ) i++;
2271 i++;
2272 }
1471 if( zLine[i]==delim ){ 2273 if( zLine[i]==delim ){
1472 zLine[i++] = 0; 2274 zLine[i++] = 0;
1473 } 2275 }
1474 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 2276 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
1475 }else{ 2277 }else{
1476 azArg[nArg++] = &zLine[i]; 2278 azArg[nArg++] = &zLine[i];
1477 while( zLine[i] && !isspace((unsigned char)zLine[i]) ){ i++; } 2279 while( zLine[i] && !IsSpace(zLine[i]) ){ i++; }
1478 if( zLine[i] ) zLine[i++] = 0; 2280 if( zLine[i] ) zLine[i++] = 0;
1479 resolve_backslashes(azArg[nArg-1]); 2281 resolve_backslashes(azArg[nArg-1]);
1480 } 2282 }
1481 } 2283 }
1482 2284
1483 /* Process the input line. 2285 /* Process the input line.
1484 */ 2286 */
1485 if( nArg==0 ) return 0; /* no tokens, no error */ 2287 if( nArg==0 ) return 0; /* no tokens, no error */
1486 n = strlen30(azArg[0]); 2288 n = strlen30(azArg[0]);
1487 c = azArg[0][0]; 2289 c = azArg[0][0];
1488 if( c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){ 2290 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
1489 const char *zDestFile; 2291 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
1490 const char *zDb; 2292 ){
2293 const char *zDestFile = 0;
2294 const char *zDb = 0;
1491 sqlite3 *pDest; 2295 sqlite3 *pDest;
1492 sqlite3_backup *pBackup; 2296 sqlite3_backup *pBackup;
1493 if( nArg==2 ){ 2297 int j;
1494 zDestFile = azArg[1]; 2298 for(j=1; j<nArg; j++){
1495 zDb = "main"; 2299 const char *z = azArg[j];
1496 }else{ 2300 if( z[0]=='-' ){
1497 zDestFile = azArg[2]; 2301 while( z[0]=='-' ) z++;
1498 zDb = azArg[1]; 2302 /* No options to process at this time */
1499 } 2303 {
2304 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2305 return 1;
2306 }
2307 }else if( zDestFile==0 ){
2308 zDestFile = azArg[j];
2309 }else if( zDb==0 ){
2310 zDb = zDestFile;
2311 zDestFile = azArg[j];
2312 }else{
2313 fprintf(stderr, "too many arguments to .backup\n");
2314 return 1;
2315 }
2316 }
2317 if( zDestFile==0 ){
2318 fprintf(stderr, "missing FILENAME argument on .backup\n");
2319 return 1;
2320 }
2321 if( zDb==0 ) zDb = "main";
1500 rc = sqlite3_open(zDestFile, &pDest); 2322 rc = sqlite3_open(zDestFile, &pDest);
1501 if( rc!=SQLITE_OK ){ 2323 if( rc!=SQLITE_OK ){
1502 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 2324 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
1503 sqlite3_close(pDest); 2325 sqlite3_close(pDest);
1504 return 1; 2326 return 1;
1505 } 2327 }
1506 open_db(p); 2328 open_db(p, 0);
1507 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 2329 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
1508 if( pBackup==0 ){ 2330 if( pBackup==0 ){
1509 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 2331 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1510 sqlite3_close(pDest); 2332 sqlite3_close(pDest);
1511 return 1; 2333 return 1;
1512 } 2334 }
1513 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 2335 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
1514 sqlite3_backup_finish(pBackup); 2336 sqlite3_backup_finish(pBackup);
1515 if( rc==SQLITE_DONE ){ 2337 if( rc==SQLITE_DONE ){
1516 rc = 0; 2338 rc = 0;
1517 }else{ 2339 }else{
1518 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 2340 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
1519 rc = 1; 2341 rc = 1;
1520 } 2342 }
1521 sqlite3_close(pDest); 2343 sqlite3_close(pDest);
1522 }else 2344 }else
1523 2345
1524 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){ 2346 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
1525 bail_on_error = booleanValue(azArg[1]); 2347 if( nArg==2 ){
2348 bail_on_error = booleanValue(azArg[1]);
2349 }else{
2350 fprintf(stderr, "Usage: .bail on|off\n");
2351 rc = 1;
2352 }
1526 }else 2353 }else
1527 2354
1528 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){ 2355 /* The undocumented ".breakpoint" command causes a call to the no-op
1529 struct callback_data data; 2356 ** routine named test_breakpoint().
2357 */
2358 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2359 test_breakpoint();
2360 }else
2361
2362 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2363 if( nArg==2 ){
2364 tryToClone(p, azArg[1]);
2365 }else{
2366 fprintf(stderr, "Usage: .clone FILENAME\n");
2367 rc = 1;
2368 }
2369 }else
2370
2371 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
2372 ShellState data;
1530 char *zErrMsg = 0; 2373 char *zErrMsg = 0;
1531 open_db(p); 2374 open_db(p, 0);
1532 memcpy(&data, p, sizeof(data)); 2375 memcpy(&data, p, sizeof(data));
1533 data.showHeader = 1; 2376 data.showHeader = 1;
1534 data.mode = MODE_Column; 2377 data.mode = MODE_Column;
1535 data.colWidth[0] = 3; 2378 data.colWidth[0] = 3;
1536 data.colWidth[1] = 15; 2379 data.colWidth[1] = 15;
1537 data.colWidth[2] = 58; 2380 data.colWidth[2] = 58;
1538 data.cnt = 0; 2381 data.cnt = 0;
1539 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); 2382 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
1540 if( zErrMsg ){ 2383 if( zErrMsg ){
1541 fprintf(stderr,"Error: %s\n", zErrMsg); 2384 fprintf(stderr,"Error: %s\n", zErrMsg);
1542 sqlite3_free(zErrMsg); 2385 sqlite3_free(zErrMsg);
1543 rc = 1; 2386 rc = 1;
1544 } 2387 }
1545 }else 2388 }else
1546 2389
1547 if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){ 2390 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
1548 char *zErrMsg = 0; 2391 open_db(p, 0);
1549 open_db(p);
1550 /* When playing back a "dump", the content might appear in an order 2392 /* When playing back a "dump", the content might appear in an order
1551 ** which causes immediate foreign key constraints to be violated. 2393 ** which causes immediate foreign key constraints to be violated.
1552 ** So disable foreign-key constraint enforcement to prevent problems. */ 2394 ** So disable foreign-key constraint enforcement to prevent problems. */
2395 if( nArg!=1 && nArg!=2 ){
2396 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2397 rc = 1;
2398 goto meta_command_exit;
2399 }
1553 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n"); 2400 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
1554 fprintf(p->out, "BEGIN TRANSACTION;\n"); 2401 fprintf(p->out, "BEGIN TRANSACTION;\n");
1555 p->writableSchema = 0; 2402 p->writableSchema = 0;
1556 sqlite3_exec(p->db, "PRAGMA writable_schema=ON", 0, 0, 0); 2403 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
2404 p->nErr = 0;
1557 if( nArg==1 ){ 2405 if( nArg==1 ){
1558 run_schema_dump_query(p, 2406 run_schema_dump_query(p,
1559 "SELECT name, type, sql FROM sqlite_master " 2407 "SELECT name, type, sql FROM sqlite_master "
1560 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'", 0 2408 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
1561 ); 2409 );
1562 run_schema_dump_query(p, 2410 run_schema_dump_query(p,
1563 "SELECT name, type, sql FROM sqlite_master " 2411 "SELECT name, type, sql FROM sqlite_master "
1564 "WHERE name=='sqlite_sequence'", 0 2412 "WHERE name=='sqlite_sequence'"
1565 ); 2413 );
1566 run_table_dump_query(p->out, p->db, 2414 run_table_dump_query(p,
1567 "SELECT sql FROM sqlite_master " 2415 "SELECT sql FROM sqlite_master "
1568 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0 2416 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
1569 ); 2417 );
1570 }else{ 2418 }else{
1571 int i; 2419 int i;
1572 for(i=1; i<nArg; i++){ 2420 for(i=1; i<nArg; i++){
1573 zShellStatic = azArg[i]; 2421 zShellStatic = azArg[i];
1574 run_schema_dump_query(p, 2422 run_schema_dump_query(p,
1575 "SELECT name, type, sql FROM sqlite_master " 2423 "SELECT name, type, sql FROM sqlite_master "
1576 "WHERE tbl_name LIKE shellstatic() AND type=='table'" 2424 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
1577 " AND sql NOT NULL", 0); 2425 " AND sql NOT NULL");
1578 run_table_dump_query(p->out, p->db, 2426 run_table_dump_query(p,
1579 "SELECT sql FROM sqlite_master " 2427 "SELECT sql FROM sqlite_master "
1580 "WHERE sql NOT NULL" 2428 "WHERE sql NOT NULL"
1581 " AND type IN ('index','trigger','view')" 2429 " AND type IN ('index','trigger','view')"
1582 " AND tbl_name LIKE shellstatic()", 0 2430 " AND tbl_name LIKE shellstatic()", 0
1583 ); 2431 );
1584 zShellStatic = 0; 2432 zShellStatic = 0;
1585 } 2433 }
1586 } 2434 }
1587 if( p->writableSchema ){ 2435 if( p->writableSchema ){
1588 fprintf(p->out, "PRAGMA writable_schema=OFF;\n"); 2436 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
1589 p->writableSchema = 0; 2437 p->writableSchema = 0;
1590 } 2438 }
1591 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF", 0, 0, 0); 2439 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
1592 if( zErrMsg ){ 2440 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
1593 fprintf(stderr,"Error: %s\n", zErrMsg); 2441 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
1594 sqlite3_free(zErrMsg); 2442 }else
2443
2444 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2445 if( nArg==2 ){
2446 p->echoOn = booleanValue(azArg[1]);
1595 }else{ 2447 }else{
1596 fprintf(p->out, "COMMIT;\n"); 2448 fprintf(stderr, "Usage: .echo on|off\n");
2449 rc = 1;
1597 } 2450 }
1598 }else 2451 }else
1599 2452
1600 if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){ 2453 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
1601 p->echoOn = booleanValue(azArg[1]); 2454 if( nArg==2 ){
2455 p->autoEQP = booleanValue(azArg[1]);
2456 }else{
2457 fprintf(stderr, "Usage: .eqp on|off\n");
2458 rc = 1;
2459 }
1602 }else 2460 }else
1603 2461
1604 if( c=='e' && strncmp(azArg[0], "exit", n)==0 && nArg==1 ){ 2462 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
2463 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
1605 rc = 2; 2464 rc = 2;
1606 }else 2465 }else
1607 2466
1608 if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){ 2467 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
1609 int val = nArg>=2 ? booleanValue(azArg[1]) : 1; 2468 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
1610 if(val == 1) { 2469 if(val == 1) {
1611 if(!p->explainPrev.valid) { 2470 if(!p->normalMode.valid) {
1612 p->explainPrev.valid = 1; 2471 p->normalMode.valid = 1;
1613 p->explainPrev.mode = p->mode; 2472 p->normalMode.mode = p->mode;
1614 p->explainPrev.showHeader = p->showHeader; 2473 p->normalMode.showHeader = p->showHeader;
1615 memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); 2474 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
1616 } 2475 }
1617 /* We could put this code under the !p->explainValid 2476 /* We could put this code under the !p->explainValid
1618 ** condition so that it does not execute if we are already in 2477 ** condition so that it does not execute if we are already in
1619 ** explain mode. However, always executing it allows us an easy 2478 ** explain mode. However, always executing it allows us an easy
1620 ** was to reset to explain mode in case the user previously 2479 ** was to reset to explain mode in case the user previously
1621 ** did an .explain followed by a .width, .mode or .header 2480 ** did an .explain followed by a .width, .mode or .header
1622 ** command. 2481 ** command.
1623 */ 2482 */
1624 p->mode = MODE_Explain; 2483 p->mode = MODE_Explain;
1625 p->showHeader = 1; 2484 p->showHeader = 1;
1626 memset(p->colWidth,0,ArraySize(p->colWidth)); 2485 memset(p->colWidth,0,sizeof(p->colWidth));
1627 p->colWidth[0] = 4; /* addr */ 2486 p->colWidth[0] = 4; /* addr */
1628 p->colWidth[1] = 13; /* opcode */ 2487 p->colWidth[1] = 13; /* opcode */
1629 p->colWidth[2] = 4; /* P1 */ 2488 p->colWidth[2] = 4; /* P1 */
1630 p->colWidth[3] = 4; /* P2 */ 2489 p->colWidth[3] = 4; /* P2 */
1631 p->colWidth[4] = 4; /* P3 */ 2490 p->colWidth[4] = 4; /* P3 */
1632 p->colWidth[5] = 13; /* P4 */ 2491 p->colWidth[5] = 13; /* P4 */
1633 p->colWidth[6] = 2; /* P5 */ 2492 p->colWidth[6] = 2; /* P5 */
1634 p->colWidth[7] = 13; /* Comment */ 2493 p->colWidth[7] = 13; /* Comment */
1635 }else if (p->explainPrev.valid) { 2494 }else if (p->normalMode.valid) {
1636 p->explainPrev.valid = 0; 2495 p->normalMode.valid = 0;
1637 p->mode = p->explainPrev.mode; 2496 p->mode = p->normalMode.mode;
1638 p->showHeader = p->explainPrev.showHeader; 2497 p->showHeader = p->normalMode.showHeader;
1639 memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); 2498 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
1640 } 2499 }
1641 }else 2500 }else
1642 2501
1643 if( c=='h' && (strncmp(azArg[0], "header", n)==0 || 2502 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
1644 strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){ 2503 ShellState data;
1645 p->showHeader = booleanValue(azArg[1]); 2504 char *zErrMsg = 0;
2505 int doStats = 0;
2506 if( nArg!=1 ){
2507 fprintf(stderr, "Usage: .fullschema\n");
2508 rc = 1;
2509 goto meta_command_exit;
2510 }
2511 open_db(p, 0);
2512 memcpy(&data, p, sizeof(data));
2513 data.showHeader = 0;
2514 data.mode = MODE_Semi;
2515 rc = sqlite3_exec(p->db,
2516 "SELECT sql FROM"
2517 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2518 " FROM sqlite_master UNION ALL"
2519 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2520 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
2521 "ORDER BY rowid",
2522 callback, &data, &zErrMsg
2523 );
2524 if( rc==SQLITE_OK ){
2525 sqlite3_stmt *pStmt;
2526 rc = sqlite3_prepare_v2(p->db,
2527 "SELECT rowid FROM sqlite_master"
2528 " WHERE name GLOB 'sqlite_stat[134]'",
2529 -1, &pStmt, 0);
2530 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2531 sqlite3_finalize(pStmt);
2532 }
2533 if( doStats==0 ){
2534 fprintf(p->out, "/* No STAT tables available */\n");
2535 }else{
2536 fprintf(p->out, "ANALYZE sqlite_master;\n");
2537 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2538 callback, &data, &zErrMsg);
2539 data.mode = MODE_Insert;
2540 data.zDestTable = "sqlite_stat1";
2541 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2542 shell_callback, &data,&zErrMsg);
2543 data.zDestTable = "sqlite_stat3";
2544 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2545 shell_callback, &data,&zErrMsg);
2546 data.zDestTable = "sqlite_stat4";
2547 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2548 shell_callback, &data, &zErrMsg);
2549 fprintf(p->out, "ANALYZE sqlite_master;\n");
2550 }
2551 }else
2552
2553 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2554 if( nArg==2 ){
2555 p->showHeader = booleanValue(azArg[1]);
2556 }else{
2557 fprintf(stderr, "Usage: .headers on|off\n");
2558 rc = 1;
2559 }
1646 }else 2560 }else
1647 2561
1648 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 2562 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
1649 fprintf(stderr,"%s",zHelp); 2563 fprintf(p->out, "%s", zHelp);
1650 if( HAS_TIMER ){
1651 fprintf(stderr,"%s",zTimerHelp);
1652 }
1653 }else 2564 }else
1654 2565
1655 if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){ 2566 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
1656 char *zTable = azArg[2]; /* Insert data into this table */ 2567 char *zTable; /* Insert data into this table */
1657 char *zFile = azArg[1]; /* The file from which to extract data */ 2568 char *zFile; /* Name of file to extra content from */
1658 sqlite3_stmt *pStmt = NULL; /* A statement */ 2569 sqlite3_stmt *pStmt = NULL; /* A statement */
1659 int nCol; /* Number of columns in the table */ 2570 int nCol; /* Number of columns in the table */
1660 int nByte; /* Number of bytes in an SQL string */ 2571 int nByte; /* Number of bytes in an SQL string */
1661 int i, j; /* Loop counters */ 2572 int i, j; /* Loop counters */
2573 int needCommit; /* True to COMMIT or ROLLBACK at end */
1662 int nSep; /* Number of bytes in p->separator[] */ 2574 int nSep; /* Number of bytes in p->separator[] */
1663 char *zSql; /* An SQL statement */ 2575 char *zSql; /* An SQL statement */
1664 char *zLine; /* A single line of input from the file */ 2576 CSVReader sCsv; /* Reader context */
1665 char **azCol; /* zLine[] broken up into columns */ 2577 int (*xCloser)(FILE*); /* Procedure to close th3 connection */
1666 char *zCommit; /* How to commit changes */
1667 FILE *in; /* The input file */
1668 int lineno = 0; /* Line number of input file */
1669 2578
1670 open_db(p); 2579 if( nArg!=3 ){
2580 fprintf(stderr, "Usage: .import FILE TABLE\n");
2581 goto meta_command_exit;
2582 }
2583 zFile = azArg[1];
2584 zTable = azArg[2];
2585 seenInterrupt = 0;
2586 memset(&sCsv, 0, sizeof(sCsv));
2587 open_db(p, 0);
1671 nSep = strlen30(p->separator); 2588 nSep = strlen30(p->separator);
1672 if( nSep==0 ){ 2589 if( nSep==0 ){
1673 fprintf(stderr, "Error: non-null separator required for import\n"); 2590 fprintf(stderr, "Error: non-null separator required for import\n");
1674 return 1; 2591 return 1;
1675 } 2592 }
1676 zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); 2593 if( nSep>1 ){
2594 fprintf(stderr, "Error: multi-character separators not allowed"
2595 " for import\n");
2596 return 1;
2597 }
2598 sCsv.zFile = zFile;
2599 sCsv.nLine = 1;
2600 if( sCsv.zFile[0]=='|' ){
2601 sCsv.in = popen(sCsv.zFile+1, "r");
2602 sCsv.zFile = "<pipe>";
2603 xCloser = pclose;
2604 }else{
2605 sCsv.in = fopen(sCsv.zFile, "rb");
2606 xCloser = fclose;
2607 }
2608 if( sCsv.in==0 ){
2609 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2610 return 1;
2611 }
2612 sCsv.cSeparator = p->separator[0];
2613 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
1677 if( zSql==0 ){ 2614 if( zSql==0 ){
1678 fprintf(stderr, "Error: out of memory\n"); 2615 fprintf(stderr, "Error: out of memory\n");
2616 xCloser(sCsv.in);
1679 return 1; 2617 return 1;
1680 } 2618 }
1681 nByte = strlen30(zSql); 2619 nByte = strlen30(zSql);
1682 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); 2620 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2621 csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */
2622 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){
2623 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2624 char cSep = '(';
2625 while( csv_read_one_field(&sCsv) ){
2626 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z);
2627 cSep = ',';
2628 if( sCsv.cTerm!=sCsv.cSeparator ) break;
2629 }
2630 if( cSep=='(' ){
2631 sqlite3_free(zCreate);
2632 sqlite3_free(sCsv.z);
2633 xCloser(sCsv.in);
2634 fprintf(stderr,"%s: empty file\n", sCsv.zFile);
2635 return 1;
2636 }
2637 zCreate = sqlite3_mprintf("%z\n)", zCreate);
2638 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
2639 sqlite3_free(zCreate);
2640 if( rc ){
2641 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
2642 sqlite3_errmsg(db));
2643 sqlite3_free(sCsv.z);
2644 xCloser(sCsv.in);
2645 return 1;
2646 }
2647 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2648 }
1683 sqlite3_free(zSql); 2649 sqlite3_free(zSql);
1684 if( rc ){ 2650 if( rc ){
1685 if (pStmt) sqlite3_finalize(pStmt); 2651 if (pStmt) sqlite3_finalize(pStmt);
1686 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); 2652 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db));
2653 xCloser(sCsv.in);
1687 return 1; 2654 return 1;
1688 } 2655 }
1689 nCol = sqlite3_column_count(pStmt); 2656 nCol = sqlite3_column_count(pStmt);
1690 sqlite3_finalize(pStmt); 2657 sqlite3_finalize(pStmt);
1691 pStmt = 0; 2658 pStmt = 0;
1692 if( nCol==0 ) return 0; /* no columns, no error */ 2659 if( nCol==0 ) return 0; /* no columns, no error */
1693 zSql = malloc( nByte + 20 + nCol*2 ); 2660 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
1694 if( zSql==0 ){ 2661 if( zSql==0 ){
1695 fprintf(stderr, "Error: out of memory\n"); 2662 fprintf(stderr, "Error: out of memory\n");
2663 xCloser(sCsv.in);
1696 return 1; 2664 return 1;
1697 } 2665 }
1698 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable); 2666 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
1699 j = strlen30(zSql); 2667 j = strlen30(zSql);
1700 for(i=1; i<nCol; i++){ 2668 for(i=1; i<nCol; i++){
1701 zSql[j++] = ','; 2669 zSql[j++] = ',';
1702 zSql[j++] = '?'; 2670 zSql[j++] = '?';
1703 } 2671 }
1704 zSql[j++] = ')'; 2672 zSql[j++] = ')';
1705 zSql[j] = 0; 2673 zSql[j] = 0;
1706 rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); 2674 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
1707 free(zSql); 2675 sqlite3_free(zSql);
1708 if( rc ){ 2676 if( rc ){
1709 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); 2677 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
1710 if (pStmt) sqlite3_finalize(pStmt); 2678 if (pStmt) sqlite3_finalize(pStmt);
2679 xCloser(sCsv.in);
1711 return 1; 2680 return 1;
1712 } 2681 }
1713 in = fopen(zFile, "rb"); 2682 needCommit = sqlite3_get_autocommit(db);
1714 if( in==0 ){ 2683 if( needCommit ) sqlite3_exec(db, "BEGIN", 0, 0, 0);
1715 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile); 2684 do{
1716 sqlite3_finalize(pStmt); 2685 int startLine = sCsv.nLine;
1717 return 1; 2686 for(i=0; i<nCol; i++){
1718 } 2687 char *z = csv_read_one_field(&sCsv);
1719 azCol = malloc( sizeof(azCol[0])*(nCol+1) ); 2688 if( z==0 && i==0 ) break;
1720 if( azCol==0 ){ 2689 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
1721 fprintf(stderr, "Error: out of memory\n"); 2690 if( i<nCol-1 && sCsv.cTerm!=sCsv.cSeparator ){
1722 fclose(in); 2691 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
1723 sqlite3_finalize(pStmt); 2692 "filling the rest with NULL\n",
1724 return 1; 2693 sCsv.zFile, startLine, nCol, i+1);
1725 }
1726 sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
1727 zCommit = "COMMIT";
1728 while( (zLine = local_getline(0, in))!=0 ){
1729 char *z;
1730 i = 0;
1731 lineno++;
1732 azCol[0] = zLine;
1733 for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){
1734 if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){
1735 *z = 0;
1736 i++; 2694 i++;
1737 if( i<nCol ){ 2695 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
1738 azCol[i] = &z[nSep];
1739 z += nSep-1;
1740 }
1741 } 2696 }
1742 } /* end for */
1743 *z = 0;
1744 if( i+1!=nCol ){
1745 fprintf(stderr,
1746 "Error: %s line %d: expected %d columns of data but found %d\n",
1747 zFile, lineno, nCol, i+1);
1748 zCommit = "ROLLBACK";
1749 free(zLine);
1750 rc = 1;
1751 break; /* from while */
1752 } 2697 }
1753 for(i=0; i<nCol; i++){ 2698 if( sCsv.cTerm==sCsv.cSeparator ){
1754 sqlite3_bind_text(pStmt, i+1, azCol[i], -1, SQLITE_STATIC); 2699 do{
2700 csv_read_one_field(&sCsv);
2701 i++;
2702 }while( sCsv.cTerm==sCsv.cSeparator );
2703 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
2704 "extras ignored\n",
2705 sCsv.zFile, startLine, nCol, i);
1755 } 2706 }
1756 sqlite3_step(pStmt); 2707 if( i>=nCol ){
1757 rc = sqlite3_reset(pStmt); 2708 sqlite3_step(pStmt);
1758 free(zLine); 2709 rc = sqlite3_reset(pStmt);
1759 if( rc!=SQLITE_OK ){ 2710 if( rc!=SQLITE_OK ){
1760 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); 2711 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCsv.zFile, startLine,
1761 zCommit = "ROLLBACK"; 2712 sqlite3_errmsg(db));
1762 rc = 1; 2713 }
1763 break; /* from while */
1764 } 2714 }
1765 } /* end while */ 2715 }while( sCsv.cTerm!=EOF );
1766 free(azCol); 2716
1767 fclose(in); 2717 xCloser(sCsv.in);
2718 sqlite3_free(sCsv.z);
1768 sqlite3_finalize(pStmt); 2719 sqlite3_finalize(pStmt);
1769 sqlite3_exec(p->db, zCommit, 0, 0, 0); 2720 if( needCommit ) sqlite3_exec(db, "COMMIT", 0, 0, 0);
1770 }else 2721 }else
1771 2722
1772 if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){ 2723 if( c=='i' && strncmp(azArg[0], "indices", n)==0 ){
1773 struct callback_data data; 2724 ShellState data;
1774 char *zErrMsg = 0; 2725 char *zErrMsg = 0;
1775 open_db(p); 2726 open_db(p, 0);
1776 memcpy(&data, p, sizeof(data)); 2727 memcpy(&data, p, sizeof(data));
1777 data.showHeader = 0; 2728 data.showHeader = 0;
1778 data.mode = MODE_List; 2729 data.mode = MODE_List;
1779 if( nArg==1 ){ 2730 if( nArg==1 ){
1780 rc = sqlite3_exec(p->db, 2731 rc = sqlite3_exec(p->db,
1781 "SELECT name FROM sqlite_master " 2732 "SELECT name FROM sqlite_master "
1782 "WHERE type='index' AND name NOT LIKE 'sqlite_%' " 2733 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
1783 "UNION ALL " 2734 "UNION ALL "
1784 "SELECT name FROM sqlite_temp_master " 2735 "SELECT name FROM sqlite_temp_master "
1785 "WHERE type='index' " 2736 "WHERE type='index' "
1786 "ORDER BY 1", 2737 "ORDER BY 1",
1787 callback, &data, &zErrMsg 2738 callback, &data, &zErrMsg
1788 ); 2739 );
1789 }else{ 2740 }else if( nArg==2 ){
1790 zShellStatic = azArg[1]; 2741 zShellStatic = azArg[1];
1791 rc = sqlite3_exec(p->db, 2742 rc = sqlite3_exec(p->db,
1792 "SELECT name FROM sqlite_master " 2743 "SELECT name FROM sqlite_master "
1793 "WHERE type='index' AND tbl_name LIKE shellstatic() " 2744 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1794 "UNION ALL " 2745 "UNION ALL "
1795 "SELECT name FROM sqlite_temp_master " 2746 "SELECT name FROM sqlite_temp_master "
1796 "WHERE type='index' AND tbl_name LIKE shellstatic() " 2747 "WHERE type='index' AND tbl_name LIKE shellstatic() "
1797 "ORDER BY 1", 2748 "ORDER BY 1",
1798 callback, &data, &zErrMsg 2749 callback, &data, &zErrMsg
1799 ); 2750 );
1800 zShellStatic = 0; 2751 zShellStatic = 0;
2752 }else{
2753 fprintf(stderr, "Usage: .indices ?LIKE-PATTERN?\n");
2754 rc = 1;
2755 goto meta_command_exit;
1801 } 2756 }
1802 if( zErrMsg ){ 2757 if( zErrMsg ){
1803 fprintf(stderr,"Error: %s\n", zErrMsg); 2758 fprintf(stderr,"Error: %s\n", zErrMsg);
1804 sqlite3_free(zErrMsg); 2759 sqlite3_free(zErrMsg);
1805 rc = 1; 2760 rc = 1;
1806 }else if( rc != SQLITE_OK ){ 2761 }else if( rc != SQLITE_OK ){
1807 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n"); 2762 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
1808 rc = 1; 2763 rc = 1;
1809 } 2764 }
1810 }else 2765 }else
(...skipping 15 matching lines...) Expand all
1826 sqlite3IoTrace = 0; 2781 sqlite3IoTrace = 0;
1827 rc = 1; 2782 rc = 1;
1828 }else{ 2783 }else{
1829 sqlite3IoTrace = iotracePrintf; 2784 sqlite3IoTrace = iotracePrintf;
1830 } 2785 }
1831 } 2786 }
1832 }else 2787 }else
1833 #endif 2788 #endif
1834 2789
1835 #ifndef SQLITE_OMIT_LOAD_EXTENSION 2790 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1836 if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ 2791 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
1837 const char *zFile, *zProc; 2792 const char *zFile, *zProc;
1838 char *zErrMsg = 0; 2793 char *zErrMsg = 0;
2794 if( nArg<2 ){
2795 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
2796 rc = 1;
2797 goto meta_command_exit;
2798 }
1839 zFile = azArg[1]; 2799 zFile = azArg[1];
1840 zProc = nArg>=3 ? azArg[2] : 0; 2800 zProc = nArg>=3 ? azArg[2] : 0;
1841 open_db(p); 2801 open_db(p, 0);
1842 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 2802 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
1843 if( rc!=SQLITE_OK ){ 2803 if( rc!=SQLITE_OK ){
1844 fprintf(stderr, "Error: %s\n", zErrMsg); 2804 fprintf(stderr, "Error: %s\n", zErrMsg);
1845 sqlite3_free(zErrMsg); 2805 sqlite3_free(zErrMsg);
1846 rc = 1; 2806 rc = 1;
1847 } 2807 }
1848 }else 2808 }else
1849 #endif 2809 #endif
1850 2810
1851 if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){ 2811 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
1852 const char *zFile = azArg[1]; 2812 if( nArg!=2 ){
1853 if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){ 2813 fprintf(stderr, "Usage: .log FILENAME\n");
1854 fclose(p->pLog); 2814 rc = 1;
1855 p->pLog = 0;
1856 }
1857 if( strcmp(zFile,"stdout")==0 ){
1858 p->pLog = stdout;
1859 }else if( strcmp(zFile, "stderr")==0 ){
1860 p->pLog = stderr;
1861 }else if( strcmp(zFile, "off")==0 ){
1862 p->pLog = 0;
1863 }else{ 2815 }else{
1864 p->pLog = fopen(zFile, "w"); 2816 const char *zFile = azArg[1];
1865 if( p->pLog==0 ){ 2817 output_file_close(p->pLog);
1866 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile); 2818 p->pLog = output_file_open(zFile);
1867 }
1868 } 2819 }
1869 }else 2820 }else
1870 2821
1871 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){ 2822 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
1872 int n2 = strlen30(azArg[1]); 2823 const char *zMode = nArg>=2 ? azArg[1] : "";
1873 if( (n2==4 && strncmp(azArg[1],"line",n2)==0) 2824 int n2 = (int)strlen(zMode);
1874 || 2825 int c2 = zMode[0];
1875 (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){ 2826 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
1876 p->mode = MODE_Line; 2827 p->mode = MODE_Line;
1877 }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0) 2828 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
1878 ||
1879 (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){
1880 p->mode = MODE_Column; 2829 p->mode = MODE_Column;
1881 }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){ 2830 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
1882 p->mode = MODE_List; 2831 p->mode = MODE_List;
1883 }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){ 2832 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
1884 p->mode = MODE_Html; 2833 p->mode = MODE_Html;
1885 }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){ 2834 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
1886 p->mode = MODE_Tcl; 2835 p->mode = MODE_Tcl;
1887 }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){ 2836 sqlite3_snprintf(sizeof(p->separator), p->separator, " ");
2837 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
1888 p->mode = MODE_Csv; 2838 p->mode = MODE_Csv;
1889 sqlite3_snprintf(sizeof(p->separator), p->separator, ","); 2839 sqlite3_snprintf(sizeof(p->separator), p->separator, ",");
1890 }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){ 2840 sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n");
2841 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
1891 p->mode = MODE_List; 2842 p->mode = MODE_List;
1892 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); 2843 sqlite3_snprintf(sizeof(p->separator), p->separator, "\t");
1893 }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){ 2844 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
1894 p->mode = MODE_Insert; 2845 p->mode = MODE_Insert;
1895 set_table_name(p, "table"); 2846 set_table_name(p, nArg>=3 ? azArg[2] : "table");
1896 }else { 2847 }else {
1897 fprintf(stderr,"Error: mode should be one of: " 2848 fprintf(stderr,"Error: mode should be one of: "
1898 "column csv html insert line list tabs tcl\n"); 2849 "column csv html insert line list tabs tcl\n");
1899 rc = 1; 2850 rc = 1;
1900 } 2851 }
1901 }else 2852 }else
1902 2853
1903 if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){ 2854 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
1904 int n2 = strlen30(azArg[1]); 2855 if( nArg==2 ){
1905 if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){ 2856 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue,
1906 p->mode = MODE_Insert; 2857 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
1907 set_table_name(p, azArg[2]); 2858 }else{
1908 }else { 2859 fprintf(stderr, "Usage: .nullvalue STRING\n");
1909 fprintf(stderr, "Error: invalid arguments: "
1910 " \"%s\". Enter \".help\" for help\n", azArg[2]);
1911 rc = 1; 2860 rc = 1;
1912 } 2861 }
1913 }else 2862 }else
1914 2863
1915 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { 2864 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
1916 sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, 2865 sqlite3 *savedDb = p->db;
1917 "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); 2866 const char *zSavedFilename = p->zDbFilename;
2867 char *zNewFilename = 0;
2868 p->db = 0;
2869 if( nArg>=2 ){
2870 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
2871 }
2872 open_db(p, 1);
2873 if( p->db!=0 ){
2874 sqlite3_close(savedDb);
2875 sqlite3_free(p->zFreeOnClose);
2876 p->zFreeOnClose = zNewFilename;
2877 }else{
2878 sqlite3_free(zNewFilename);
2879 p->db = savedDb;
2880 p->zDbFilename = zSavedFilename;
2881 }
1918 }else 2882 }else
1919 2883
1920 if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ 2884 if( c=='o'
1921 if( p->out!=stdout ){ 2885 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
1922 fclose(p->out); 2886 ){
2887 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
2888 if( nArg>2 ){
2889 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
2890 rc = 1;
2891 goto meta_command_exit;
1923 } 2892 }
1924 if( strcmp(azArg[1],"stdout")==0 ){ 2893 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
1925 p->out = stdout; 2894 if( nArg<2 ){
1926 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); 2895 fprintf(stderr, "Usage: .once FILE\n");
2896 rc = 1;
2897 goto meta_command_exit;
2898 }
2899 p->outCount = 2;
1927 }else{ 2900 }else{
1928 p->out = fopen(azArg[1], "wb"); 2901 p->outCount = 0;
2902 }
2903 output_reset(p);
2904 if( zFile[0]=='|' ){
2905 p->out = popen(zFile + 1, "w");
1929 if( p->out==0 ){ 2906 if( p->out==0 ){
1930 fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]); 2907 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
2908 p->out = stdout;
2909 rc = 1;
2910 }else{
2911 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
2912 }
2913 }else{
2914 p->out = output_file_open(zFile);
2915 if( p->out==0 ){
2916 if( strcmp(zFile,"off")!=0 ){
2917 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
2918 }
1931 p->out = stdout; 2919 p->out = stdout;
1932 rc = 1; 2920 rc = 1;
1933 } else { 2921 } else {
1934 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); 2922 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
1935 } 2923 }
1936 } 2924 }
1937 }else 2925 }else
1938 2926
1939 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ 2927 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
2928 int i;
2929 for(i=1; i<nArg; i++){
2930 if( i>1 ) fprintf(p->out, " ");
2931 fprintf(p->out, "%s", azArg[i]);
2932 }
2933 fprintf(p->out, "\n");
2934 }else
2935
2936 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
1940 if( nArg >= 2) { 2937 if( nArg >= 2) {
1941 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 2938 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
1942 } 2939 }
1943 if( nArg >= 3) { 2940 if( nArg >= 3) {
1944 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 2941 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
1945 } 2942 }
1946 }else 2943 }else
1947 2944
1948 if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){ 2945 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
1949 rc = 2; 2946 rc = 2;
1950 }else 2947 }else
1951 2948
1952 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ 2949 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
1953 FILE *alt = fopen(azArg[1], "rb"); 2950 FILE *alt;
2951 if( nArg!=2 ){
2952 fprintf(stderr, "Usage: .read FILE\n");
2953 rc = 1;
2954 goto meta_command_exit;
2955 }
2956 alt = fopen(azArg[1], "rb");
1954 if( alt==0 ){ 2957 if( alt==0 ){
1955 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 2958 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
1956 rc = 1; 2959 rc = 1;
1957 }else{ 2960 }else{
1958 rc = process_input(p, alt); 2961 rc = process_input(p, alt);
1959 fclose(alt); 2962 fclose(alt);
1960 } 2963 }
1961 }else 2964 }else
1962 2965
1963 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){ 2966 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
1964 const char *zSrcFile; 2967 const char *zSrcFile;
1965 const char *zDb; 2968 const char *zDb;
1966 sqlite3 *pSrc; 2969 sqlite3 *pSrc;
1967 sqlite3_backup *pBackup; 2970 sqlite3_backup *pBackup;
1968 int nTimeout = 0; 2971 int nTimeout = 0;
1969 2972
1970 if( nArg==2 ){ 2973 if( nArg==2 ){
1971 zSrcFile = azArg[1]; 2974 zSrcFile = azArg[1];
1972 zDb = "main"; 2975 zDb = "main";
1973 }else{ 2976 }else if( nArg==3 ){
1974 zSrcFile = azArg[2]; 2977 zSrcFile = azArg[2];
1975 zDb = azArg[1]; 2978 zDb = azArg[1];
2979 }else{
2980 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
2981 rc = 1;
2982 goto meta_command_exit;
1976 } 2983 }
1977 rc = sqlite3_open(zSrcFile, &pSrc); 2984 rc = sqlite3_open(zSrcFile, &pSrc);
1978 if( rc!=SQLITE_OK ){ 2985 if( rc!=SQLITE_OK ){
1979 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 2986 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
1980 sqlite3_close(pSrc); 2987 sqlite3_close(pSrc);
1981 return 1; 2988 return 1;
1982 } 2989 }
1983 open_db(p); 2990 open_db(p, 0);
1984 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 2991 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
1985 if( pBackup==0 ){ 2992 if( pBackup==0 ){
1986 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 2993 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
1987 sqlite3_close(pSrc); 2994 sqlite3_close(pSrc);
1988 return 1; 2995 return 1;
1989 } 2996 }
1990 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 2997 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
1991 || rc==SQLITE_BUSY ){ 2998 || rc==SQLITE_BUSY ){
1992 if( rc==SQLITE_BUSY ){ 2999 if( rc==SQLITE_BUSY ){
1993 if( nTimeout++ >= 3 ) break; 3000 if( nTimeout++ >= 3 ) break;
1994 sqlite3_sleep(100); 3001 sqlite3_sleep(100);
1995 } 3002 }
1996 } 3003 }
1997 sqlite3_backup_finish(pBackup); 3004 sqlite3_backup_finish(pBackup);
1998 if( rc==SQLITE_DONE ){ 3005 if( rc==SQLITE_DONE ){
1999 rc = 0; 3006 rc = 0;
2000 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 3007 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
2001 fprintf(stderr, "Error: source database is busy\n"); 3008 fprintf(stderr, "Error: source database is busy\n");
2002 rc = 1; 3009 rc = 1;
2003 }else{ 3010 }else{
2004 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 3011 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
2005 rc = 1; 3012 rc = 1;
2006 } 3013 }
2007 sqlite3_close(pSrc); 3014 sqlite3_close(pSrc);
2008 }else 3015 }else
2009 3016
2010 if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){ 3017 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
2011 struct callback_data data; 3018 ShellState data;
2012 char *zErrMsg = 0; 3019 char *zErrMsg = 0;
2013 open_db(p); 3020 open_db(p, 0);
2014 memcpy(&data, p, sizeof(data)); 3021 memcpy(&data, p, sizeof(data));
2015 data.showHeader = 0; 3022 data.showHeader = 0;
2016 data.mode = MODE_Semi; 3023 data.mode = MODE_Semi;
2017 if( nArg>1 ){ 3024 if( nArg==2 ){
2018 int i; 3025 int i;
2019 for(i=0; azArg[1][i]; i++) azArg[1][i] = (char)tolower(azArg[1][i]); 3026 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
2020 if( strcmp(azArg[1],"sqlite_master")==0 ){ 3027 if( strcmp(azArg[1],"sqlite_master")==0 ){
2021 char *new_argv[2], *new_colv[2]; 3028 char *new_argv[2], *new_colv[2];
2022 new_argv[0] = "CREATE TABLE sqlite_master (\n" 3029 new_argv[0] = "CREATE TABLE sqlite_master (\n"
2023 " type text,\n" 3030 " type text,\n"
2024 " name text,\n" 3031 " name text,\n"
2025 " tbl_name text,\n" 3032 " tbl_name text,\n"
2026 " rootpage integer,\n" 3033 " rootpage integer,\n"
2027 " sql text\n" 3034 " sql text\n"
2028 ")"; 3035 ")";
2029 new_argv[1] = 0; 3036 new_argv[1] = 0;
(...skipping 12 matching lines...) Expand all
2042 ")"; 3049 ")";
2043 new_argv[1] = 0; 3050 new_argv[1] = 0;
2044 new_colv[0] = "sql"; 3051 new_colv[0] = "sql";
2045 new_colv[1] = 0; 3052 new_colv[1] = 0;
2046 callback(&data, 1, new_argv, new_colv); 3053 callback(&data, 1, new_argv, new_colv);
2047 rc = SQLITE_OK; 3054 rc = SQLITE_OK;
2048 }else{ 3055 }else{
2049 zShellStatic = azArg[1]; 3056 zShellStatic = azArg[1];
2050 rc = sqlite3_exec(p->db, 3057 rc = sqlite3_exec(p->db,
2051 "SELECT sql FROM " 3058 "SELECT sql FROM "
2052 " (SELECT sql sql, type type, tbl_name tbl_name, name name" 3059 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2053 " FROM sqlite_master UNION ALL" 3060 " FROM sqlite_master UNION ALL"
2054 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " 3061 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2055 "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " 3062 "WHERE lower(tbl_name) LIKE shellstatic()"
2056 "ORDER BY substr(type,2,1), name", 3063 " AND type!='meta' AND sql NOTNULL "
3064 "ORDER BY rowid",
2057 callback, &data, &zErrMsg); 3065 callback, &data, &zErrMsg);
2058 zShellStatic = 0; 3066 zShellStatic = 0;
2059 } 3067 }
2060 }else{ 3068 }else if( nArg==1 ){
2061 rc = sqlite3_exec(p->db, 3069 rc = sqlite3_exec(p->db,
2062 "SELECT sql FROM " 3070 "SELECT sql FROM "
2063 " (SELECT sql sql, type type, tbl_name tbl_name, name name" 3071 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2064 " FROM sqlite_master UNION ALL" 3072 " FROM sqlite_master UNION ALL"
2065 " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " 3073 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2066 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" 3074 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
2067 "ORDER BY substr(type,2,1), name", 3075 "ORDER BY rowid",
2068 callback, &data, &zErrMsg 3076 callback, &data, &zErrMsg
2069 ); 3077 );
3078 }else{
3079 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3080 rc = 1;
3081 goto meta_command_exit;
2070 } 3082 }
2071 if( zErrMsg ){ 3083 if( zErrMsg ){
2072 fprintf(stderr,"Error: %s\n", zErrMsg); 3084 fprintf(stderr,"Error: %s\n", zErrMsg);
2073 sqlite3_free(zErrMsg); 3085 sqlite3_free(zErrMsg);
2074 rc = 1; 3086 rc = 1;
2075 }else if( rc != SQLITE_OK ){ 3087 }else if( rc != SQLITE_OK ){
2076 fprintf(stderr,"Error: querying schema information\n"); 3088 fprintf(stderr,"Error: querying schema information\n");
2077 rc = 1; 3089 rc = 1;
2078 }else{ 3090 }else{
2079 rc = 0; 3091 rc = 0;
2080 } 3092 }
2081 }else 3093 }else
2082 3094
2083 if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ 3095
2084 sqlite3_snprintf(sizeof(p->separator), p->separator, 3096 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2085 "%.*s", (int)sizeof(p->separator)-1, azArg[1]); 3097 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3098 extern int sqlite3SelectTrace;
3099 sqlite3SelectTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3100 }else
3101 #endif
3102
3103
3104 #ifdef SQLITE_DEBUG
3105 /* Undocumented commands for internal testing. Subject to change
3106 ** without notice. */
3107 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3108 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3109 int i, v;
3110 for(i=1; i<nArg; i++){
3111 v = booleanValue(azArg[i]);
3112 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3113 }
3114 }
3115 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3116 int i; sqlite3_int64 v;
3117 for(i=1; i<nArg; i++){
3118 char zBuf[200];
3119 v = integerValue(azArg[i]);
3120 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
3121 fprintf(p->out, "%s", zBuf);
3122 }
3123 }
3124 }else
3125 #endif
3126
3127 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
3128 if( nArg<2 || nArg>3 ){
3129 fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n");
3130 rc = 1;
3131 }
3132 if( nArg>=2 ){
3133 sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]);
3134 }
3135 if( nArg>=3 ){
3136 sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]);
3137 }
2086 }else 3138 }else
2087 3139
2088 if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){ 3140 if( c=='s'
3141 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
3142 ){
3143 char *zCmd;
3144 int i, x;
3145 if( nArg<2 ){
3146 fprintf(stderr, "Usage: .system COMMAND\n");
3147 rc = 1;
3148 goto meta_command_exit;
3149 }
3150 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
3151 for(i=2; i<nArg; i++){
3152 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3153 zCmd, azArg[i]);
3154 }
3155 x = system(zCmd);
3156 sqlite3_free(zCmd);
3157 if( x ) fprintf(stderr, "System command returns %d\n", x);
3158 }else
3159
3160 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
2089 int i; 3161 int i;
3162 if( nArg!=1 ){
3163 fprintf(stderr, "Usage: .show\n");
3164 rc = 1;
3165 goto meta_command_exit;
3166 }
2090 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); 3167 fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off");
2091 fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); 3168 fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off");
3169 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
2092 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); 3170 fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off");
2093 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); 3171 fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]);
2094 fprintf(p->out,"%9.9s: ", "nullvalue"); 3172 fprintf(p->out,"%9.9s: ", "nullvalue");
2095 output_c_string(p->out, p->nullvalue); 3173 output_c_string(p->out, p->nullvalue);
2096 fprintf(p->out, "\n"); 3174 fprintf(p->out, "\n");
2097 fprintf(p->out,"%9.9s: %s\n","output", 3175 fprintf(p->out,"%9.9s: %s\n","output",
2098 strlen30(p->outfile) ? p->outfile : "stdout"); 3176 strlen30(p->outfile) ? p->outfile : "stdout");
2099 fprintf(p->out,"%9.9s: ", "separator"); 3177 fprintf(p->out,"%9.9s: ", "separator");
2100 output_c_string(p->out, p->separator); 3178 output_c_string(p->out, p->separator);
3179 fprintf(p->out," ");
3180 output_c_string(p->out, p->newline);
2101 fprintf(p->out, "\n"); 3181 fprintf(p->out, "\n");
2102 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off"); 3182 fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off");
2103 fprintf(p->out,"%9.9s: ","width"); 3183 fprintf(p->out,"%9.9s: ","width");
2104 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { 3184 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
2105 fprintf(p->out,"%d ",p->colWidth[i]); 3185 fprintf(p->out,"%d ",p->colWidth[i]);
2106 } 3186 }
2107 fprintf(p->out,"\n"); 3187 fprintf(p->out,"\n");
2108 }else 3188 }else
2109 3189
2110 if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){ 3190 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
2111 p->statsOn = booleanValue(azArg[1]); 3191 if( nArg==2 ){
3192 p->statsOn = booleanValue(azArg[1]);
3193 }else{
3194 fprintf(stderr, "Usage: .stats on|off\n");
3195 rc = 1;
3196 }
2112 }else 3197 }else
2113 3198
2114 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){ 3199 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
3200 sqlite3_stmt *pStmt;
2115 char **azResult; 3201 char **azResult;
2116 int nRow; 3202 int nRow, nAlloc;
2117 char *zErrMsg; 3203 char *zSql = 0;
2118 open_db(p); 3204 int ii;
2119 if( nArg==1 ){ 3205 open_db(p, 0);
2120 rc = sqlite3_get_table(p->db, 3206 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
2121 "SELECT name FROM sqlite_master " 3207 if( rc ) return rc;
2122 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' " 3208 zSql = sqlite3_mprintf(
2123 "UNION ALL " 3209 "SELECT name FROM sqlite_master"
2124 "SELECT name FROM sqlite_temp_master " 3210 " WHERE type IN ('table','view')"
2125 "WHERE type IN ('table','view') " 3211 " AND name NOT LIKE 'sqlite_%%'"
2126 "ORDER BY 1", 3212 " AND name LIKE ?1");
2127 &azResult, &nRow, 0, &zErrMsg 3213 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2128 ); 3214 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3215 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3216 if( strcmp(zDbName,"temp")==0 ){
3217 zSql = sqlite3_mprintf(
3218 "%z UNION ALL "
3219 "SELECT 'temp.' || name FROM sqlite_temp_master"
3220 " WHERE type IN ('table','view')"
3221 " AND name NOT LIKE 'sqlite_%%'"
3222 " AND name LIKE ?1", zSql);
3223 }else{
3224 zSql = sqlite3_mprintf(
3225 "%z UNION ALL "
3226 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3227 " WHERE type IN ('table','view')"
3228 " AND name NOT LIKE 'sqlite_%%'"
3229 " AND name LIKE ?1", zSql, zDbName, zDbName);
3230 }
3231 }
3232 sqlite3_finalize(pStmt);
3233 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3234 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3235 sqlite3_free(zSql);
3236 if( rc ) return rc;
3237 nRow = nAlloc = 0;
3238 azResult = 0;
3239 if( nArg>1 ){
3240 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
2129 }else{ 3241 }else{
2130 zShellStatic = azArg[1]; 3242 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
2131 rc = sqlite3_get_table(p->db,
2132 "SELECT name FROM sqlite_master "
2133 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
2134 "UNION ALL "
2135 "SELECT name FROM sqlite_temp_master "
2136 "WHERE type IN ('table','view') AND name LIKE shellstatic() "
2137 "ORDER BY 1",
2138 &azResult, &nRow, 0, &zErrMsg
2139 );
2140 zShellStatic = 0;
2141 } 3243 }
2142 if( zErrMsg ){ 3244 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2143 fprintf(stderr,"Error: %s\n", zErrMsg); 3245 if( nRow>=nAlloc ){
2144 sqlite3_free(zErrMsg); 3246 char **azNew;
2145 rc = 1; 3247 int n = nAlloc*2 + 10;
2146 }else if( rc != SQLITE_OK ){ 3248 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n);
2147 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n"); 3249 if( azNew==0 ){
2148 rc = 1; 3250 fprintf(stderr, "Error: out of memory\n");
2149 }else{ 3251 break;
3252 }
3253 nAlloc = n;
3254 azResult = azNew;
3255 }
3256 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3257 if( azResult[nRow] ) nRow++;
3258 }
3259 sqlite3_finalize(pStmt);
3260 if( nRow>0 ){
2150 int len, maxlen = 0; 3261 int len, maxlen = 0;
2151 int i, j; 3262 int i, j;
2152 int nPrintCol, nPrintRow; 3263 int nPrintCol, nPrintRow;
2153 for(i=1; i<=nRow; i++){ 3264 for(i=0; i<nRow; i++){
2154 if( azResult[i]==0 ) continue;
2155 len = strlen30(azResult[i]); 3265 len = strlen30(azResult[i]);
2156 if( len>maxlen ) maxlen = len; 3266 if( len>maxlen ) maxlen = len;
2157 } 3267 }
2158 nPrintCol = 80/(maxlen+2); 3268 nPrintCol = 80/(maxlen+2);
2159 if( nPrintCol<1 ) nPrintCol = 1; 3269 if( nPrintCol<1 ) nPrintCol = 1;
2160 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 3270 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
2161 for(i=0; i<nPrintRow; i++){ 3271 for(i=0; i<nPrintRow; i++){
2162 for(j=i+1; j<=nRow; j+=nPrintRow){ 3272 for(j=i; j<nRow; j+=nPrintRow){
2163 char *zSp = j<=nPrintRow ? "" : " "; 3273 char *zSp = j<nPrintRow ? "" : " ";
2164 printf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : ""); 3274 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j] : "") ;
2165 } 3275 }
2166 printf("\n"); 3276 fprintf(p->out, "\n");
2167 } 3277 }
2168 } 3278 }
2169 sqlite3_free_table(azResult); 3279 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3280 sqlite3_free(azResult);
2170 }else 3281 }else
2171 3282
2172 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){ 3283 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
2173 static const struct { 3284 static const struct {
2174 const char *zCtrlName; /* Name of a test-control option */ 3285 const char *zCtrlName; /* Name of a test-control option */
2175 int ctrlCode; /* Integer code for that option */ 3286 int ctrlCode; /* Integer code for that option */
2176 } aCtrl[] = { 3287 } aCtrl[] = {
2177 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE }, 3288 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
2178 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE }, 3289 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
2179 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET }, 3290 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
2180 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST }, 3291 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
2181 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL }, 3292 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
2182 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS }, 3293 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
2183 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE }, 3294 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
2184 { "assert", SQLITE_TESTCTRL_ASSERT }, 3295 { "assert", SQLITE_TESTCTRL_ASSERT },
2185 { "always", SQLITE_TESTCTRL_ALWAYS }, 3296 { "always", SQLITE_TESTCTRL_ALWAYS },
2186 { "reserve", SQLITE_TESTCTRL_RESERVE }, 3297 { "reserve", SQLITE_TESTCTRL_RESERVE },
2187 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, 3298 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
2188 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, 3299 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
2189 { "pghdrsz", SQLITE_TESTCTRL_PGHDRSZ },
2190 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, 3300 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
3301 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
2191 }; 3302 };
2192 int testctrl = -1; 3303 int testctrl = -1;
2193 int rc = 0; 3304 int rc = 0;
2194 int i, n; 3305 int i, n;
2195 open_db(p); 3306 open_db(p, 0);
2196 3307
2197 /* convert testctrl text option to value. allow any unique prefix 3308 /* convert testctrl text option to value. allow any unique prefix
2198 ** of the option name, or a numerical value. */ 3309 ** of the option name, or a numerical value. */
2199 n = strlen30(azArg[1]); 3310 n = strlen30(azArg[1]);
2200 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){ 3311 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
2201 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){ 3312 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){
2202 if( testctrl<0 ){ 3313 if( testctrl<0 ){
2203 testctrl = aCtrl[i].ctrlCode; 3314 testctrl = aCtrl[i].ctrlCode;
2204 }else{ 3315 }else{
2205 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[i]); 3316 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
2206 testctrl = -1; 3317 testctrl = -1;
2207 break; 3318 break;
2208 } 3319 }
2209 } 3320 }
2210 } 3321 }
2211 if( testctrl<0 ) testctrl = atoi(azArg[1]); 3322 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
2212 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){ 3323 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
2213 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]); 3324 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
2214 }else{ 3325 }else{
2215 switch(testctrl){ 3326 switch(testctrl){
2216 3327
2217 /* sqlite3_test_control(int, db, int) */ 3328 /* sqlite3_test_control(int, db, int) */
2218 case SQLITE_TESTCTRL_OPTIMIZATIONS: 3329 case SQLITE_TESTCTRL_OPTIMIZATIONS:
2219 case SQLITE_TESTCTRL_RESERVE: 3330 case SQLITE_TESTCTRL_RESERVE:
2220 if( nArg==3 ){ 3331 if( nArg==3 ){
2221 int opt = (int)strtol(azArg[2], 0, 0); 3332 int opt = (int)strtol(azArg[2], 0, 0);
2222 rc = sqlite3_test_control(testctrl, p->db, opt); 3333 rc = sqlite3_test_control(testctrl, p->db, opt);
2223 printf("%d (0x%08x)\n", rc, rc); 3334 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
2224 } else { 3335 } else {
2225 fprintf(stderr,"Error: testctrl %s takes a single int option\n", 3336 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2226 azArg[1]); 3337 azArg[1]);
2227 } 3338 }
2228 break; 3339 break;
2229 3340
2230 /* sqlite3_test_control(int) */ 3341 /* sqlite3_test_control(int) */
2231 case SQLITE_TESTCTRL_PRNG_SAVE: 3342 case SQLITE_TESTCTRL_PRNG_SAVE:
2232 case SQLITE_TESTCTRL_PRNG_RESTORE: 3343 case SQLITE_TESTCTRL_PRNG_RESTORE:
2233 case SQLITE_TESTCTRL_PRNG_RESET: 3344 case SQLITE_TESTCTRL_PRNG_RESET:
2234 case SQLITE_TESTCTRL_PGHDRSZ: 3345 case SQLITE_TESTCTRL_BYTEORDER:
2235 if( nArg==2 ){ 3346 if( nArg==2 ){
2236 rc = sqlite3_test_control(testctrl); 3347 rc = sqlite3_test_control(testctrl);
2237 printf("%d (0x%08x)\n", rc, rc); 3348 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
2238 } else { 3349 } else {
2239 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]); 3350 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
2240 } 3351 }
2241 break; 3352 break;
2242 3353
2243 /* sqlite3_test_control(int, uint) */ 3354 /* sqlite3_test_control(int, uint) */
2244 case SQLITE_TESTCTRL_PENDING_BYTE: 3355 case SQLITE_TESTCTRL_PENDING_BYTE:
2245 if( nArg==3 ){ 3356 if( nArg==3 ){
2246 unsigned int opt = (unsigned int)atoi(azArg[2]); 3357 unsigned int opt = (unsigned int)integerValue(azArg[2]);
2247 rc = sqlite3_test_control(testctrl, opt); 3358 rc = sqlite3_test_control(testctrl, opt);
2248 printf("%d (0x%08x)\n", rc, rc); 3359 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
2249 } else { 3360 } else {
2250 fprintf(stderr,"Error: testctrl %s takes a single unsigned" 3361 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
2251 " int option\n", azArg[1]); 3362 " int option\n", azArg[1]);
2252 } 3363 }
2253 break; 3364 break;
2254 3365
2255 /* sqlite3_test_control(int, int) */ 3366 /* sqlite3_test_control(int, int) */
2256 case SQLITE_TESTCTRL_ASSERT: 3367 case SQLITE_TESTCTRL_ASSERT:
2257 case SQLITE_TESTCTRL_ALWAYS: 3368 case SQLITE_TESTCTRL_ALWAYS:
2258 if( nArg==3 ){ 3369 if( nArg==3 ){
2259 int opt = atoi(azArg[2]); 3370 int opt = booleanValue(azArg[2]);
2260 rc = sqlite3_test_control(testctrl, opt); 3371 rc = sqlite3_test_control(testctrl, opt);
2261 printf("%d (0x%08x)\n", rc, rc); 3372 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
2262 } else { 3373 } else {
2263 fprintf(stderr,"Error: testctrl %s takes a single int option\n", 3374 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
2264 azArg[1]); 3375 azArg[1]);
2265 } 3376 }
2266 break; 3377 break;
2267 3378
2268 /* sqlite3_test_control(int, char *) */ 3379 /* sqlite3_test_control(int, char *) */
2269 #ifdef SQLITE_N_KEYWORD 3380 #ifdef SQLITE_N_KEYWORD
2270 case SQLITE_TESTCTRL_ISKEYWORD: 3381 case SQLITE_TESTCTRL_ISKEYWORD:
2271 if( nArg==3 ){ 3382 if( nArg==3 ){
2272 const char *opt = azArg[2]; 3383 const char *opt = azArg[2];
2273 rc = sqlite3_test_control(testctrl, opt); 3384 rc = sqlite3_test_control(testctrl, opt);
2274 printf("%d (0x%08x)\n", rc, rc); 3385 fprintf(p->out, "%d (0x%08x)\n", rc, rc);
2275 } else { 3386 } else {
2276 fprintf(stderr,"Error: testctrl %s takes a single char * option\n", 3387 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
2277 azArg[1]); 3388 azArg[1]);
2278 } 3389 }
2279 break; 3390 break;
2280 #endif 3391 #endif
2281 3392
2282 case SQLITE_TESTCTRL_BITVEC_TEST: 3393 case SQLITE_TESTCTRL_BITVEC_TEST:
2283 case SQLITE_TESTCTRL_FAULT_INSTALL: 3394 case SQLITE_TESTCTRL_FAULT_INSTALL:
2284 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: 3395 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
2285 case SQLITE_TESTCTRL_SCRATCHMALLOC: 3396 case SQLITE_TESTCTRL_SCRATCHMALLOC:
2286 default: 3397 default:
2287 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n", 3398 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
2288 azArg[1]); 3399 azArg[1]);
2289 break; 3400 break;
2290 } 3401 }
2291 } 3402 }
2292 }else 3403 }else
2293 3404
2294 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){ 3405 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
2295 open_db(p); 3406 open_db(p, 0);
2296 sqlite3_busy_timeout(p->db, atoi(azArg[1])); 3407 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
2297 }else 3408 }else
2298 3409
2299 if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 3410 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
2300 && nArg==2 3411 if( nArg==2 ){
2301 ){ 3412 enableTimer = booleanValue(azArg[1]);
2302 enableTimer = booleanValue(azArg[1]); 3413 if( enableTimer && !HAS_TIMER ){
3414 fprintf(stderr, "Error: timer not available on this system.\n");
3415 enableTimer = 0;
3416 }
3417 }else{
3418 fprintf(stderr, "Usage: .timer on|off\n");
3419 rc = 1;
3420 }
2303 }else 3421 }else
2304 3422
2305 if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){ 3423 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
3424 open_db(p, 0);
3425 output_file_close(p->traceOut);
3426 if( nArg!=2 ){
3427 fprintf(stderr, "Usage: .trace FILE|off\n");
3428 rc = 1;
3429 goto meta_command_exit;
3430 }
3431 p->traceOut = output_file_open(azArg[1]);
3432 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3433 if( p->traceOut==0 ){
3434 sqlite3_trace(p->db, 0, 0);
3435 }else{
3436 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3437 }
3438 #endif
3439 }else
3440
3441 #if SQLITE_USER_AUTHENTICATION
3442 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3443 if( nArg<2 ){
3444 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3445 rc = 1;
3446 goto meta_command_exit;
3447 }
3448 open_db(p, 0);
3449 if( strcmp(azArg[1],"login")==0 ){
3450 if( nArg!=4 ){
3451 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3452 rc = 1;
3453 goto meta_command_exit;
3454 }
3455 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3456 (int)strlen(azArg[3]));
3457 if( rc ){
3458 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3459 rc = 1;
3460 }
3461 }else if( strcmp(azArg[1],"add")==0 ){
3462 if( nArg!=5 ){
3463 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
3464 rc = 1;
3465 goto meta_command_exit;
3466 }
3467 rc = sqlite3_user_add(p->db, azArg[2],
3468 azArg[3], (int)strlen(azArg[3]),
3469 booleanValue(azArg[4]));
3470 if( rc ){
3471 fprintf(stderr, "User-Add failed: %d\n", rc);
3472 rc = 1;
3473 }
3474 }else if( strcmp(azArg[1],"edit")==0 ){
3475 if( nArg!=5 ){
3476 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
3477 rc = 1;
3478 goto meta_command_exit;
3479 }
3480 rc = sqlite3_user_change(p->db, azArg[2],
3481 azArg[3], (int)strlen(azArg[3]),
3482 booleanValue(azArg[4]));
3483 if( rc ){
3484 fprintf(stderr, "User-Edit failed: %d\n", rc);
3485 rc = 1;
3486 }
3487 }else if( strcmp(azArg[1],"delete")==0 ){
3488 if( nArg!=3 ){
3489 fprintf(stderr, "Usage: .user delete USER\n");
3490 rc = 1;
3491 goto meta_command_exit;
3492 }
3493 rc = sqlite3_user_delete(p->db, azArg[2]);
3494 if( rc ){
3495 fprintf(stderr, "User-Delete failed: %d\n", rc);
3496 rc = 1;
3497 }
3498 }else{
3499 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3500 rc = 1;
3501 goto meta_command_exit;
3502 }
3503 }else
3504 #endif /* SQLITE_USER_AUTHENTICATION */
3505
3506 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
3507 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
3508 sqlite3_libversion(), sqlite3_sourceid());
3509 }else
3510
3511 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3512 const char *zDbName = nArg==2 ? azArg[1] : "main";
3513 char *zVfsName = 0;
3514 if( p->db ){
3515 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3516 if( zVfsName ){
3517 fprintf(p->out, "%s\n", zVfsName);
3518 sqlite3_free(zVfsName);
3519 }
3520 }
3521 }else
3522
3523 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3524 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3525 extern int sqlite3WhereTrace;
3526 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
3527 }else
3528 #endif
3529
3530 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
2306 int j; 3531 int j;
2307 assert( nArg<=ArraySize(azArg) ); 3532 assert( nArg<=ArraySize(azArg) );
2308 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ 3533 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
2309 p->colWidth[j-1] = atoi(azArg[j]); 3534 p->colWidth[j-1] = (int)integerValue(azArg[j]);
2310 } 3535 }
2311 }else 3536 }else
2312 3537
2313 { 3538 {
2314 fprintf(stderr, "Error: unknown command or invalid arguments: " 3539 fprintf(stderr, "Error: unknown command or invalid arguments: "
2315 " \"%s\". Enter \".help\" for help\n", azArg[0]); 3540 " \"%s\". Enter \".help\" for help\n", azArg[0]);
2316 rc = 1; 3541 rc = 1;
2317 } 3542 }
2318 3543
3544 meta_command_exit:
3545 if( p->outCount ){
3546 p->outCount--;
3547 if( p->outCount==0 ) output_reset(p);
3548 }
2319 return rc; 3549 return rc;
2320 } 3550 }
2321 3551
2322 /* 3552 /*
2323 ** Return TRUE if a semicolon occurs anywhere in the first N characters 3553 ** Return TRUE if a semicolon occurs anywhere in the first N characters
2324 ** of string z[]. 3554 ** of string z[].
2325 */ 3555 */
2326 static int _contains_semicolon(const char *z, int N){ 3556 static int line_contains_semicolon(const char *z, int N){
2327 int i; 3557 int i;
2328 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; } 3558 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
2329 return 0; 3559 return 0;
2330 } 3560 }
2331 3561
2332 /* 3562 /*
2333 ** Test to see if a line consists entirely of whitespace. 3563 ** Test to see if a line consists entirely of whitespace.
2334 */ 3564 */
2335 static int _all_whitespace(const char *z){ 3565 static int _all_whitespace(const char *z){
2336 for(; *z; z++){ 3566 for(; *z; z++){
2337 if( isspace(*(unsigned char*)z) ) continue; 3567 if( IsSpace(z[0]) ) continue;
2338 if( *z=='/' && z[1]=='*' ){ 3568 if( *z=='/' && z[1]=='*' ){
2339 z += 2; 3569 z += 2;
2340 while( *z && (*z!='*' || z[1]!='/') ){ z++; } 3570 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
2341 if( *z==0 ) return 0; 3571 if( *z==0 ) return 0;
2342 z++; 3572 z++;
2343 continue; 3573 continue;
2344 } 3574 }
2345 if( *z=='-' && z[1]=='-' ){ 3575 if( *z=='-' && z[1]=='-' ){
2346 z += 2; 3576 z += 2;
2347 while( *z && *z!='\n' ){ z++; } 3577 while( *z && *z!='\n' ){ z++; }
2348 if( *z==0 ) return 1; 3578 if( *z==0 ) return 1;
2349 continue; 3579 continue;
2350 } 3580 }
2351 return 0; 3581 return 0;
2352 } 3582 }
2353 return 1; 3583 return 1;
2354 } 3584 }
2355 3585
2356 /* 3586 /*
2357 ** Return TRUE if the line typed in is an SQL command terminator other 3587 ** Return TRUE if the line typed in is an SQL command terminator other
2358 ** than a semi-colon. The SQL Server style "go" command is understood 3588 ** than a semi-colon. The SQL Server style "go" command is understood
2359 ** as is the Oracle "/". 3589 ** as is the Oracle "/".
2360 */ 3590 */
2361 static int _is_command_terminator(const char *zLine){ 3591 static int line_is_command_terminator(const char *zLine){
2362 while( isspace(*(unsigned char*)zLine) ){ zLine++; }; 3592 while( IsSpace(zLine[0]) ){ zLine++; };
2363 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){ 3593 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
2364 return 1; /* Oracle */ 3594 return 1; /* Oracle */
2365 } 3595 }
2366 if( tolower(zLine[0])=='g' && tolower(zLine[1])=='o' 3596 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
2367 && _all_whitespace(&zLine[2]) ){ 3597 && _all_whitespace(&zLine[2]) ){
2368 return 1; /* SQL Server */ 3598 return 1; /* SQL Server */
2369 } 3599 }
2370 return 0; 3600 return 0;
2371 } 3601 }
2372 3602
2373 /* 3603 /*
2374 ** Return true if zSql is a complete SQL statement. Return false if it 3604 ** Return true if zSql is a complete SQL statement. Return false if it
2375 ** ends in the middle of a string literal or C-style comment. 3605 ** ends in the middle of a string literal or C-style comment.
2376 */ 3606 */
2377 static int _is_complete(char *zSql, int nSql){ 3607 static int line_is_complete(char *zSql, int nSql){
2378 int rc; 3608 int rc;
2379 if( zSql==0 ) return 1; 3609 if( zSql==0 ) return 1;
2380 zSql[nSql] = ';'; 3610 zSql[nSql] = ';';
2381 zSql[nSql+1] = 0; 3611 zSql[nSql+1] = 0;
2382 rc = sqlite3_complete(zSql); 3612 rc = sqlite3_complete(zSql);
2383 zSql[nSql] = 0; 3613 zSql[nSql] = 0;
2384 return rc; 3614 return rc;
2385 } 3615 }
2386 3616
2387 /* 3617 /*
2388 ** Read input from *in and process it. If *in==0 then input 3618 ** Read input from *in and process it. If *in==0 then input
2389 ** is interactive - the user is typing it it. Otherwise, input 3619 ** is interactive - the user is typing it it. Otherwise, input
2390 ** is coming from a file or device. A prompt is issued and history 3620 ** is coming from a file or device. A prompt is issued and history
2391 ** is saved only if input is interactive. An interrupt signal will 3621 ** is saved only if input is interactive. An interrupt signal will
2392 ** cause this routine to exit immediately, unless input is interactive. 3622 ** cause this routine to exit immediately, unless input is interactive.
2393 ** 3623 **
2394 ** Return the number of errors. 3624 ** Return the number of errors.
2395 */ 3625 */
2396 static int process_input(struct callback_data *p, FILE *in){ 3626 static int process_input(ShellState *p, FILE *in){
2397 char *zLine = 0; 3627 char *zLine = 0; /* A single input line */
2398 char *zSql = 0; 3628 char *zSql = 0; /* Accumulated SQL text */
2399 int nSql = 0; 3629 int nLine; /* Length of current line */
2400 int nSqlPrior = 0; 3630 int nSql = 0; /* Bytes of zSql[] used */
2401 char *zErrMsg; 3631 int nAlloc = 0; /* Allocated zSql[] space */
2402 int rc; 3632 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
2403 int errCnt = 0; 3633 char *zErrMsg; /* Error message returned */
2404 int lineno = 0; 3634 int rc; /* Error code */
2405 int startline = 0; 3635 int errCnt = 0; /* Number of errors seen */
3636 int lineno = 0; /* Current line number */
3637 int startline = 0; /* Line number for start of current input */
2406 3638
2407 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){ 3639 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
2408 fflush(p->out); 3640 fflush(p->out);
2409 free(zLine); 3641 zLine = one_input_line(in, zLine, nSql>0);
2410 zLine = one_input_line(zSql, in);
2411 if( zLine==0 ){ 3642 if( zLine==0 ){
2412 break; /* We have reached EOF */ 3643 /* End of input */
3644 if( stdin_is_interactive ) printf("\n");
3645 break;
2413 } 3646 }
2414 if( seenInterrupt ){ 3647 if( seenInterrupt ){
2415 if( in!=0 ) break; 3648 if( in!=0 ) break;
2416 seenInterrupt = 0; 3649 seenInterrupt = 0;
2417 } 3650 }
2418 lineno++; 3651 lineno++;
2419 if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; 3652 if( nSql==0 && _all_whitespace(zLine) ){
3653 if( p->echoOn ) printf("%s\n", zLine);
3654 continue;
3655 }
2420 if( zLine && zLine[0]=='.' && nSql==0 ){ 3656 if( zLine && zLine[0]=='.' && nSql==0 ){
2421 if( p->echoOn ) printf("%s\n", zLine); 3657 if( p->echoOn ) printf("%s\n", zLine);
2422 rc = do_meta_command(zLine, p); 3658 rc = do_meta_command(zLine, p);
2423 if( rc==2 ){ /* exit requested */ 3659 if( rc==2 ){ /* exit requested */
2424 break; 3660 break;
2425 }else if( rc ){ 3661 }else if( rc ){
2426 errCnt++; 3662 errCnt++;
2427 } 3663 }
2428 continue; 3664 continue;
2429 } 3665 }
2430 if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){ 3666 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
2431 memcpy(zLine,";",2); 3667 memcpy(zLine,";",2);
2432 } 3668 }
2433 nSqlPrior = nSql; 3669 nLine = strlen30(zLine);
2434 if( zSql==0 ){ 3670 if( nSql+nLine+2>=nAlloc ){
2435 int i; 3671 nAlloc = nSql+nLine+100;
2436 for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){} 3672 zSql = realloc(zSql, nAlloc);
2437 if( zLine[i]!=0 ){
2438 nSql = strlen30(zLine);
2439 zSql = malloc( nSql+3 );
2440 if( zSql==0 ){
2441 fprintf(stderr, "Error: out of memory\n");
2442 exit(1);
2443 }
2444 memcpy(zSql, zLine, nSql+1);
2445 startline = lineno;
2446 }
2447 }else{
2448 int len = strlen30(zLine);
2449 zSql = realloc( zSql, nSql + len + 4 );
2450 if( zSql==0 ){ 3673 if( zSql==0 ){
2451 fprintf(stderr,"Error: out of memory\n"); 3674 fprintf(stderr, "Error: out of memory\n");
2452 exit(1); 3675 exit(1);
2453 } 3676 }
3677 }
3678 nSqlPrior = nSql;
3679 if( nSql==0 ){
3680 int i;
3681 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
3682 assert( nAlloc>0 && zSql!=0 );
3683 memcpy(zSql, zLine+i, nLine+1-i);
3684 startline = lineno;
3685 nSql = nLine-i;
3686 }else{
2454 zSql[nSql++] = '\n'; 3687 zSql[nSql++] = '\n';
2455 memcpy(&zSql[nSql], zLine, len+1); 3688 memcpy(zSql+nSql, zLine, nLine+1);
2456 nSql += len; 3689 nSql += nLine;
2457 } 3690 }
2458 if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 3691 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
2459 && sqlite3_complete(zSql) ){ 3692 && sqlite3_complete(zSql) ){
2460 p->cnt = 0; 3693 p->cnt = 0;
2461 open_db(p); 3694 open_db(p, 0);
2462 BEGIN_TIMER; 3695 BEGIN_TIMER;
2463 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); 3696 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
2464 END_TIMER; 3697 END_TIMER;
2465 if( rc || zErrMsg ){ 3698 if( rc || zErrMsg ){
2466 char zPrefix[100]; 3699 char zPrefix[100];
2467 if( in!=0 || !stdin_is_interactive ){ 3700 if( in!=0 || !stdin_is_interactive ){
2468 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 3701 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
2469 "Error: near line %d:", startline); 3702 "Error: near line %d:", startline);
2470 }else{ 3703 }else{
2471 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 3704 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
2472 } 3705 }
2473 if( zErrMsg!=0 ){ 3706 if( zErrMsg!=0 ){
2474 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg); 3707 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
2475 sqlite3_free(zErrMsg); 3708 sqlite3_free(zErrMsg);
2476 zErrMsg = 0; 3709 zErrMsg = 0;
2477 }else{ 3710 }else{
2478 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 3711 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
2479 } 3712 }
2480 errCnt++; 3713 errCnt++;
2481 } 3714 }
2482 free(zSql); 3715 nSql = 0;
2483 zSql = 0; 3716 if( p->outCount ){
3717 output_reset(p);
3718 p->outCount = 0;
3719 }
3720 }else if( nSql && _all_whitespace(zSql) ){
3721 if( p->echoOn ) printf("%s\n", zSql);
2484 nSql = 0; 3722 nSql = 0;
2485 } 3723 }
2486 } 3724 }
2487 if( zSql ){ 3725 if( nSql ){
2488 if( !_all_whitespace(zSql) ){ 3726 if( !_all_whitespace(zSql) ){
2489 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql); 3727 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
3728 errCnt++;
2490 } 3729 }
2491 free(zSql); 3730 free(zSql);
2492 } 3731 }
2493 free(zLine); 3732 free(zLine);
2494 return errCnt; 3733 return errCnt>0;
2495 } 3734 }
2496 3735
2497 /* 3736 /*
2498 ** Return a pathname which is the user's home directory. A 3737 ** Return a pathname which is the user's home directory. A
2499 ** 0 return indicates an error of some kind. Space to hold the 3738 ** 0 return indicates an error of some kind.
2500 ** resulting string is obtained from malloc(). The calling
2501 ** function should free the result.
2502 */ 3739 */
2503 static char *find_home_dir(void){ 3740 static char *find_home_dir(void){
2504 char *home_dir = NULL; 3741 static char *home_dir = NULL;
3742 if( home_dir ) return home_dir;
2505 3743
2506 #if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_ WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL) 3744 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__RT P__) && !defined(_WRS_KERNEL)
2507 struct passwd *pwent; 3745 {
2508 uid_t uid = getuid(); 3746 struct passwd *pwent;
2509 if( (pwent=getpwuid(uid)) != NULL) { 3747 uid_t uid = getuid();
2510 home_dir = pwent->pw_dir; 3748 if( (pwent=getpwuid(uid)) != NULL) {
3749 home_dir = pwent->pw_dir;
3750 }
2511 } 3751 }
2512 #endif 3752 #endif
2513 3753
2514 #if defined(_WIN32_WCE) 3754 #if defined(_WIN32_WCE)
2515 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 3755 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
2516 */ 3756 */
2517 home_dir = strdup("/"); 3757 home_dir = "/";
2518 #else 3758 #else
2519 3759
2520 #if defined(_WIN32) || defined(WIN32) || defined(__OS2__) 3760 #if defined(_WIN32) || defined(WIN32)
2521 if (!home_dir) { 3761 if (!home_dir) {
2522 home_dir = getenv("USERPROFILE"); 3762 home_dir = getenv("USERPROFILE");
2523 } 3763 }
2524 #endif 3764 #endif
2525 3765
2526 if (!home_dir) { 3766 if (!home_dir) {
2527 home_dir = getenv("HOME"); 3767 home_dir = getenv("HOME");
2528 } 3768 }
2529 3769
2530 #if defined(_WIN32) || defined(WIN32) || defined(__OS2__) 3770 #if defined(_WIN32) || defined(WIN32)
2531 if (!home_dir) { 3771 if (!home_dir) {
2532 char *zDrive, *zPath; 3772 char *zDrive, *zPath;
2533 int n; 3773 int n;
2534 zDrive = getenv("HOMEDRIVE"); 3774 zDrive = getenv("HOMEDRIVE");
2535 zPath = getenv("HOMEPATH"); 3775 zPath = getenv("HOMEPATH");
2536 if( zDrive && zPath ){ 3776 if( zDrive && zPath ){
2537 n = strlen30(zDrive) + strlen30(zPath) + 1; 3777 n = strlen30(zDrive) + strlen30(zPath) + 1;
2538 home_dir = malloc( n ); 3778 home_dir = malloc( n );
2539 if( home_dir==0 ) return 0; 3779 if( home_dir==0 ) return 0;
2540 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 3780 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
(...skipping 15 matching lines...) Expand all
2556 return home_dir; 3796 return home_dir;
2557 } 3797 }
2558 3798
2559 /* 3799 /*
2560 ** Read input from the file given by sqliterc_override. Or if that 3800 ** Read input from the file given by sqliterc_override. Or if that
2561 ** parameter is NULL, take input from ~/.sqliterc 3801 ** parameter is NULL, take input from ~/.sqliterc
2562 ** 3802 **
2563 ** Returns the number of errors. 3803 ** Returns the number of errors.
2564 */ 3804 */
2565 static int process_sqliterc( 3805 static int process_sqliterc(
2566 struct callback_data *p, /* Configuration data */ 3806 ShellState *p, /* Configuration data */
2567 const char *sqliterc_override /* Name of config file. NULL to use default */ 3807 const char *sqliterc_override /* Name of config file. NULL to use default */
2568 ){ 3808 ){
2569 char *home_dir = NULL; 3809 char *home_dir = NULL;
2570 const char *sqliterc = sqliterc_override; 3810 const char *sqliterc = sqliterc_override;
2571 char *zBuf = 0; 3811 char *zBuf = 0;
2572 FILE *in = NULL; 3812 FILE *in = NULL;
2573 int nBuf;
2574 int rc = 0; 3813 int rc = 0;
2575 3814
2576 if (sqliterc == NULL) { 3815 if (sqliterc == NULL) {
2577 home_dir = find_home_dir(); 3816 home_dir = find_home_dir();
2578 if( home_dir==0 ){ 3817 if( home_dir==0 ){
2579 #if !defined(__RTP__) && !defined(_WRS_KERNEL) 3818 #if !defined(__RTP__) && !defined(_WRS_KERNEL)
2580 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0); 3819 fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0);
2581 #endif 3820 #endif
2582 return 1; 3821 return 1;
2583 } 3822 }
2584 nBuf = strlen30(home_dir) + 16; 3823 sqlite3_initialize();
2585 zBuf = malloc( nBuf ); 3824 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
2586 if( zBuf==0 ){ 3825 sqliterc = zBuf;
2587 fprintf(stderr,"%s: Error: out of memory\n",Argv0);
2588 return 1;
2589 }
2590 sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir);
2591 free(home_dir);
2592 sqliterc = (const char*)zBuf;
2593 } 3826 }
2594 in = fopen(sqliterc,"rb"); 3827 in = fopen(sqliterc,"rb");
2595 if( in ){ 3828 if( in ){
2596 if( stdin_is_interactive ){ 3829 if( stdin_is_interactive ){
2597 fprintf(stderr,"-- Loading resources from %s\n",sqliterc); 3830 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
2598 } 3831 }
2599 rc = process_input(p,in); 3832 rc = process_input(p,in);
2600 fclose(in); 3833 fclose(in);
2601 } 3834 }
2602 free(zBuf); 3835 sqlite3_free(zBuf);
2603 return rc; 3836 return rc;
2604 } 3837 }
2605 3838
2606 /* 3839 /*
2607 ** Show available command line options 3840 ** Show available command line options
2608 */ 3841 */
2609 static const char zOptions[] = 3842 static const char zOptions[] =
2610 " -help show this message\n"
2611 " -init filename read/process named file\n"
2612 " -echo print commands before execution\n"
2613 " -[no]header turn headers on or off\n"
2614 " -bail stop after hitting an error\n" 3843 " -bail stop after hitting an error\n"
2615 " -interactive force interactive I/O\n"
2616 " -batch force batch I/O\n" 3844 " -batch force batch I/O\n"
2617 " -column set output mode to 'column'\n" 3845 " -column set output mode to 'column'\n"
3846 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
2618 " -csv set output mode to 'csv'\n" 3847 " -csv set output mode to 'csv'\n"
3848 " -echo print commands before execution\n"
3849 " -init FILENAME read/process named file\n"
3850 " -[no]header turn headers on or off\n"
3851 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
3852 " -heap SIZE Size of heap for memsys3 or memsys5\n"
3853 #endif
3854 " -help show this message\n"
2619 " -html set output mode to HTML\n" 3855 " -html set output mode to HTML\n"
3856 " -interactive force interactive I/O\n"
2620 " -line set output mode to 'line'\n" 3857 " -line set output mode to 'line'\n"
2621 " -list set output mode to 'list'\n" 3858 " -list set output mode to 'list'\n"
2622 " -separator 'x' set output field separator (|)\n" 3859 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
3860 " -mmap N default mmap size set to N\n"
3861 #ifdef SQLITE_ENABLE_MULTIPLEX
3862 " -multiplex enable the multiplexor VFS\n"
3863 #endif
3864 " -newline SEP set newline character(s) for CSV\n"
3865 " -nullvalue TEXT set text string for NULL values. Default ''\n"
3866 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
3867 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
3868 " -separator SEP set output field separator. Default: '|'\n"
2623 " -stats print memory stats before each finalize\n" 3869 " -stats print memory stats before each finalize\n"
2624 " -nullvalue 'text' set text string for NULL values\n"
2625 " -version show SQLite version\n" 3870 " -version show SQLite version\n"
2626 " -vfs NAME use NAME as the default VFS\n" 3871 " -vfs NAME use NAME as the default VFS\n"
2627 #ifdef SQLITE_ENABLE_VFSTRACE 3872 #ifdef SQLITE_ENABLE_VFSTRACE
2628 " -vfstrace enable tracing of all VFS calls\n" 3873 " -vfstrace enable tracing of all VFS calls\n"
2629 #endif 3874 #endif
2630 ; 3875 ;
2631 static void usage(int showDetail){ 3876 static void usage(int showDetail){
2632 fprintf(stderr, 3877 fprintf(stderr,
2633 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 3878 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
2634 "FILENAME is the name of an SQLite database. A new database is created\n" 3879 "FILENAME is the name of an SQLite database. A new database is created\n"
2635 "if the file does not previously exist.\n", Argv0); 3880 "if the file does not previously exist.\n", Argv0);
2636 if( showDetail ){ 3881 if( showDetail ){
2637 fprintf(stderr, "OPTIONS include:\n%s", zOptions); 3882 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
2638 }else{ 3883 }else{
2639 fprintf(stderr, "Use the -help option for additional information\n"); 3884 fprintf(stderr, "Use the -help option for additional information\n");
2640 } 3885 }
2641 exit(1); 3886 exit(1);
2642 } 3887 }
2643 3888
2644 /* 3889 /*
2645 ** Initialize the state information in data 3890 ** Initialize the state information in data
2646 */ 3891 */
2647 static void main_init(struct callback_data *data) { 3892 static void main_init(ShellState *data) {
2648 memset(data, 0, sizeof(*data)); 3893 memset(data, 0, sizeof(*data));
2649 data->mode = MODE_List; 3894 data->mode = MODE_List;
2650 memcpy(data->separator,"|", 2); 3895 memcpy(data->separator,"|", 2);
3896 memcpy(data->newline,"\r\n", 3);
2651 data->showHeader = 0; 3897 data->showHeader = 0;
3898 data->shellFlgs = SHFLG_Lookaside;
3899 sqlite3_config(SQLITE_CONFIG_URI, 1);
2652 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 3900 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
3901 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
2653 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 3902 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
2654 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 3903 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
2655 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); 3904 }
3905
3906 /*
3907 ** Output text to the console in a font that attracts extra attention.
3908 */
3909 #ifdef _WIN32
3910 static void printBold(const char *zText){
3911 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
3912 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
3913 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
3914 SetConsoleTextAttribute(out,
3915 FOREGROUND_RED|FOREGROUND_INTENSITY
3916 );
3917 printf("%s", zText);
3918 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
3919 }
3920 #else
3921 static void printBold(const char *zText){
3922 printf("\033[1m%s\033[0m", zText);
3923 }
3924 #endif
3925
3926 /*
3927 ** Get the argument to an --option. Throw an error and die if no argument
3928 ** is available.
3929 */
3930 static char *cmdline_option_value(int argc, char **argv, int i){
3931 if( i==argc ){
3932 fprintf(stderr, "%s: Error: missing argument to %s\n",
3933 argv[0], argv[argc-1]);
3934 exit(1);
3935 }
3936 return argv[i];
2656 } 3937 }
2657 3938
2658 int main(int argc, char **argv){ 3939 int main(int argc, char **argv){
2659 char *zErrMsg = 0; 3940 char *zErrMsg = 0;
2660 struct callback_data data; 3941 ShellState data;
2661 const char *zInitFile = 0; 3942 const char *zInitFile = 0;
2662 char *zFirstCmd = 0; 3943 char *zFirstCmd = 0;
2663 int i; 3944 int i;
2664 int rc = 0; 3945 int rc = 0;
3946 int warnInmemoryDb = 0;
2665 3947
2666 /* Begin evanm patch. */ 3948 #if USE_SYSTEM_SQLITE+0!=1
2667 #if !defined(__APPLE__) 3949 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
2668 extern int sqlite_shell_init_icu(); 3950 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
2669 if( !sqlite_shell_init_icu() ){ 3951 sqlite3_sourceid(), SQLITE_SOURCE_ID);
2670 fprintf(stderr, "%s: warning: couldn't find icudt38.dll; " 3952 exit(1);
2671 "queries against ICU FTS tables will fail.\n", argv[0]);
2672 } 3953 }
2673 #endif /* !defined(__APPLE__) */ 3954 #endif
2674 /* End evanm patch. */
2675
2676 Argv0 = argv[0]; 3955 Argv0 = argv[0];
2677 main_init(&data); 3956 main_init(&data);
2678 stdin_is_interactive = isatty(0); 3957 stdin_is_interactive = isatty(0);
2679 3958
2680 /* Make sure we have a valid signal handler early, before anything 3959 /* Make sure we have a valid signal handler early, before anything
2681 ** else is done. 3960 ** else is done.
2682 */ 3961 */
2683 #ifdef SIGINT 3962 #ifdef SIGINT
2684 signal(SIGINT, interrupt_handler); 3963 signal(SIGINT, interrupt_handler);
2685 #endif 3964 #endif
2686 3965
2687 /* Do an initial pass through the command-line argument to locate 3966 /* Do an initial pass through the command-line argument to locate
2688 ** the name of the database file, the name of the initialization file, 3967 ** the name of the database file, the name of the initialization file,
2689 ** the size of the alternative malloc heap, 3968 ** the size of the alternative malloc heap,
2690 ** and the first command to execute. 3969 ** and the first command to execute.
2691 */ 3970 */
2692 for(i=1; i<argc-1; i++){ 3971 for(i=1; i<argc; i++){
2693 char *z; 3972 char *z;
2694 if( argv[i][0]!='-' ) break;
2695 z = argv[i]; 3973 z = argv[i];
2696 if( z[0]=='-' && z[1]=='-' ) z++; 3974 if( z[0]!='-' ){
2697 if( strcmp(argv[i],"-separator")==0 || strcmp(argv[i],"-nullvalue")==0 ){ 3975 if( data.zDbFilename==0 ){
2698 i++; 3976 data.zDbFilename = z;
2699 }else if( strcmp(argv[i],"-init")==0 ){ 3977 continue;
2700 i++; 3978 }
2701 zInitFile = argv[i]; 3979 if( zFirstCmd==0 ){
2702 /* Need to check for batch mode here to so we can avoid printing 3980 zFirstCmd = z;
2703 ** informational messages (like from process_sqliterc) before 3981 continue;
2704 ** we do the actual processing of arguments later in a second pass. 3982 }
2705 */ 3983 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
2706 }else if( strcmp(argv[i],"-batch")==0 ){ 3984 fprintf(stderr,"Use -help for a list of options.\n");
3985 return 1;
3986 }
3987 if( z[1]=='-' ) z++;
3988 if( strcmp(z,"-separator")==0
3989 || strcmp(z,"-nullvalue")==0
3990 || strcmp(z,"-newline")==0
3991 || strcmp(z,"-cmd")==0
3992 ){
3993 (void)cmdline_option_value(argc, argv, ++i);
3994 }else if( strcmp(z,"-init")==0 ){
3995 zInitFile = cmdline_option_value(argc, argv, ++i);
3996 }else if( strcmp(z,"-batch")==0 ){
3997 /* Need to check for batch mode here to so we can avoid printing
3998 ** informational messages (like from process_sqliterc) before
3999 ** we do the actual processing of arguments later in a second pass.
4000 */
2707 stdin_is_interactive = 0; 4001 stdin_is_interactive = 0;
2708 }else if( strcmp(argv[i],"-heap")==0 ){ 4002 }else if( strcmp(z,"-heap")==0 ){
2709 int j, c; 4003 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2710 const char *zSize; 4004 const char *zSize;
2711 sqlite3_int64 szHeap; 4005 sqlite3_int64 szHeap;
2712 4006
2713 zSize = argv[++i]; 4007 zSize = cmdline_option_value(argc, argv, ++i);
2714 szHeap = atoi(zSize); 4008 szHeap = integerValue(zSize);
2715 for(j=0; (c = zSize[j])!=0; j++){
2716 if( c=='M' ){ szHeap *= 1000000; break; }
2717 if( c=='K' ){ szHeap *= 1000; break; }
2718 if( c=='G' ){ szHeap *= 1000000000; break; }
2719 }
2720 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 4009 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
2721 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
2722 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 4010 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
2723 #endif 4011 #endif
4012 }else if( strcmp(z,"-scratch")==0 ){
4013 int n, sz;
4014 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4015 if( sz>400000 ) sz = 400000;
4016 if( sz<2500 ) sz = 2500;
4017 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4018 if( n>10 ) n = 10;
4019 if( n<1 ) n = 1;
4020 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4021 data.shellFlgs |= SHFLG_Scratch;
4022 }else if( strcmp(z,"-pagecache")==0 ){
4023 int n, sz;
4024 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4025 if( sz>70000 ) sz = 70000;
4026 if( sz<800 ) sz = 800;
4027 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4028 if( n<10 ) n = 10;
4029 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4030 data.shellFlgs |= SHFLG_Pagecache;
4031 }else if( strcmp(z,"-lookaside")==0 ){
4032 int n, sz;
4033 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4034 if( sz<0 ) sz = 0;
4035 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4036 if( n<0 ) n = 0;
4037 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4038 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
2724 #ifdef SQLITE_ENABLE_VFSTRACE 4039 #ifdef SQLITE_ENABLE_VFSTRACE
2725 }else if( strcmp(argv[i],"-vfstrace")==0 ){ 4040 }else if( strcmp(z,"-vfstrace")==0 ){
2726 extern int vfstrace_register( 4041 extern int vfstrace_register(
2727 const char *zTraceName, 4042 const char *zTraceName,
2728 const char *zOldVfsName, 4043 const char *zOldVfsName,
2729 int (*xOut)(const char*,void*), 4044 int (*xOut)(const char*,void*),
2730 void *pOutArg, 4045 void *pOutArg,
2731 int makeDefault 4046 int makeDefault
2732 ); 4047 );
2733 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 4048 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
2734 #endif 4049 #endif
2735 }else if( strcmp(argv[i],"-vfs")==0 ){ 4050 #ifdef SQLITE_ENABLE_MULTIPLEX
2736 sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]); 4051 }else if( strcmp(z,"-multiplex")==0 ){
4052 extern int sqlite3_multiple_initialize(const char*,int);
4053 sqlite3_multiplex_initialize(0, 1);
4054 #endif
4055 }else if( strcmp(z,"-mmap")==0 ){
4056 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4057 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
4058 }else if( strcmp(z,"-vfs")==0 ){
4059 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
2737 if( pVfs ){ 4060 if( pVfs ){
2738 sqlite3_vfs_register(pVfs, 1); 4061 sqlite3_vfs_register(pVfs, 1);
2739 }else{ 4062 }else{
2740 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]); 4063 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
2741 exit(1); 4064 exit(1);
2742 } 4065 }
2743 } 4066 }
2744 } 4067 }
2745 if( i<argc ){ 4068 if( data.zDbFilename==0 ){
2746 #if defined(SQLITE_OS_OS2) && SQLITE_OS_OS2
2747 data.zDbFilename = (const char *)convertCpPathToUtf8( argv[i++] );
2748 #else
2749 data.zDbFilename = argv[i++];
2750 #endif
2751 }else{
2752 #ifndef SQLITE_OMIT_MEMORYDB 4069 #ifndef SQLITE_OMIT_MEMORYDB
2753 data.zDbFilename = ":memory:"; 4070 data.zDbFilename = ":memory:";
4071 warnInmemoryDb = argc==1;
2754 #else 4072 #else
2755 data.zDbFilename = 0; 4073 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4074 return 1;
2756 #endif 4075 #endif
2757 } 4076 #ifdef SQLITE_SHELL_DBNAME_PROC
2758 if( i<argc ){ 4077 { extern void SQLITE_SHELL_DBNAME_PROC(const char**);
2759 zFirstCmd = argv[i++]; 4078 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
2760 } 4079 warnInmemoryDb = 0; }
2761 if( i<argc ){ 4080 #endif
2762 fprintf(stderr,"%s: Error: too many options: \"%s\"\n", Argv0, argv[i]);
2763 fprintf(stderr,"Use -help for a list of options.\n");
2764 return 1;
2765 } 4081 }
2766 data.out = stdout; 4082 data.out = stdout;
2767 4083
2768 #ifdef SQLITE_OMIT_MEMORYDB
2769 if( data.zDbFilename==0 ){
2770 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
2771 return 1;
2772 }
2773 #endif
2774
2775 /* Go ahead and open the database file if it already exists. If the 4084 /* Go ahead and open the database file if it already exists. If the
2776 ** file does not exist, delay opening it. This prevents empty database 4085 ** file does not exist, delay opening it. This prevents empty database
2777 ** files from being created if a user mistypes the database name argument 4086 ** files from being created if a user mistypes the database name argument
2778 ** to the sqlite command-line tool. 4087 ** to the sqlite command-line tool.
2779 */ 4088 */
2780 if( access(data.zDbFilename, 0)==0 ){ 4089 if( access(data.zDbFilename, 0)==0 ){
2781 open_db(&data); 4090 open_db(&data, 0);
2782 } 4091 }
2783 4092
2784 /* Process the initialization file if there is one. If no -init option 4093 /* Process the initialization file if there is one. If no -init option
2785 ** is given on the command line, look for a file named ~/.sqliterc and 4094 ** is given on the command line, look for a file named ~/.sqliterc and
2786 ** try to process it. 4095 ** try to process it.
2787 */ 4096 */
2788 rc = process_sqliterc(&data,zInitFile); 4097 rc = process_sqliterc(&data,zInitFile);
2789 if( rc>0 ){ 4098 if( rc>0 ){
2790 return rc; 4099 return rc;
2791 } 4100 }
2792 4101
2793 /* Make a second pass through the command-line argument and set 4102 /* Make a second pass through the command-line argument and set
2794 ** options. This second pass is delayed until after the initialization 4103 ** options. This second pass is delayed until after the initialization
2795 ** file is processed so that the command-line arguments will override 4104 ** file is processed so that the command-line arguments will override
2796 ** settings in the initialization file. 4105 ** settings in the initialization file.
2797 */ 4106 */
2798 for(i=1; i<argc && argv[i][0]=='-'; i++){ 4107 for(i=1; i<argc; i++){
2799 char *z = argv[i]; 4108 char *z = argv[i];
4109 if( z[0]!='-' ) continue;
2800 if( z[1]=='-' ){ z++; } 4110 if( z[1]=='-' ){ z++; }
2801 if( strcmp(z,"-init")==0 ){ 4111 if( strcmp(z,"-init")==0 ){
2802 i++; 4112 i++;
2803 }else if( strcmp(z,"-html")==0 ){ 4113 }else if( strcmp(z,"-html")==0 ){
2804 data.mode = MODE_Html; 4114 data.mode = MODE_Html;
2805 }else if( strcmp(z,"-list")==0 ){ 4115 }else if( strcmp(z,"-list")==0 ){
2806 data.mode = MODE_List; 4116 data.mode = MODE_List;
2807 }else if( strcmp(z,"-line")==0 ){ 4117 }else if( strcmp(z,"-line")==0 ){
2808 data.mode = MODE_Line; 4118 data.mode = MODE_Line;
2809 }else if( strcmp(z,"-column")==0 ){ 4119 }else if( strcmp(z,"-column")==0 ){
2810 data.mode = MODE_Column; 4120 data.mode = MODE_Column;
2811 }else if( strcmp(z,"-csv")==0 ){ 4121 }else if( strcmp(z,"-csv")==0 ){
2812 data.mode = MODE_Csv; 4122 data.mode = MODE_Csv;
2813 memcpy(data.separator,",",2); 4123 memcpy(data.separator,",",2);
2814 }else if( strcmp(z,"-separator")==0 ){ 4124 }else if( strcmp(z,"-separator")==0 ){
2815 i++;
2816 if(i>=argc){
2817 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z) ;
2818 fprintf(stderr,"Use -help for a list of options.\n");
2819 return 1;
2820 }
2821 sqlite3_snprintf(sizeof(data.separator), data.separator, 4125 sqlite3_snprintf(sizeof(data.separator), data.separator,
2822 "%.*s",(int)sizeof(data.separator)-1,argv[i]); 4126 "%s",cmdline_option_value(argc,argv,++i));
4127 }else if( strcmp(z,"-newline")==0 ){
4128 sqlite3_snprintf(sizeof(data.newline), data.newline,
4129 "%s",cmdline_option_value(argc,argv,++i));
2823 }else if( strcmp(z,"-nullvalue")==0 ){ 4130 }else if( strcmp(z,"-nullvalue")==0 ){
2824 i++;
2825 if(i>=argc){
2826 fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z) ;
2827 fprintf(stderr,"Use -help for a list of options.\n");
2828 return 1;
2829 }
2830 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue, 4131 sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue,
2831 "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]); 4132 "%s",cmdline_option_value(argc,argv,++i));
2832 }else if( strcmp(z,"-header")==0 ){ 4133 }else if( strcmp(z,"-header")==0 ){
2833 data.showHeader = 1; 4134 data.showHeader = 1;
2834 }else if( strcmp(z,"-noheader")==0 ){ 4135 }else if( strcmp(z,"-noheader")==0 ){
2835 data.showHeader = 0; 4136 data.showHeader = 0;
2836 }else if( strcmp(z,"-echo")==0 ){ 4137 }else if( strcmp(z,"-echo")==0 ){
2837 data.echoOn = 1; 4138 data.echoOn = 1;
4139 }else if( strcmp(z,"-eqp")==0 ){
4140 data.autoEQP = 1;
2838 }else if( strcmp(z,"-stats")==0 ){ 4141 }else if( strcmp(z,"-stats")==0 ){
2839 data.statsOn = 1; 4142 data.statsOn = 1;
2840 }else if( strcmp(z,"-bail")==0 ){ 4143 }else if( strcmp(z,"-bail")==0 ){
2841 bail_on_error = 1; 4144 bail_on_error = 1;
2842 }else if( strcmp(z,"-version")==0 ){ 4145 }else if( strcmp(z,"-version")==0 ){
2843 printf("%s\n", sqlite3_libversion()); 4146 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
2844 return 0; 4147 return 0;
2845 }else if( strcmp(z,"-interactive")==0 ){ 4148 }else if( strcmp(z,"-interactive")==0 ){
2846 stdin_is_interactive = 1; 4149 stdin_is_interactive = 1;
2847 }else if( strcmp(z,"-batch")==0 ){ 4150 }else if( strcmp(z,"-batch")==0 ){
2848 stdin_is_interactive = 0; 4151 stdin_is_interactive = 0;
2849 }else if( strcmp(z,"-heap")==0 ){ 4152 }else if( strcmp(z,"-heap")==0 ){
2850 i++; 4153 i++;
4154 }else if( strcmp(z,"-scratch")==0 ){
4155 i+=2;
4156 }else if( strcmp(z,"-pagecache")==0 ){
4157 i+=2;
4158 }else if( strcmp(z,"-lookaside")==0 ){
4159 i+=2;
4160 }else if( strcmp(z,"-mmap")==0 ){
4161 i++;
2851 }else if( strcmp(z,"-vfs")==0 ){ 4162 }else if( strcmp(z,"-vfs")==0 ){
2852 i++; 4163 i++;
4164 #ifdef SQLITE_ENABLE_VFSTRACE
2853 }else if( strcmp(z,"-vfstrace")==0 ){ 4165 }else if( strcmp(z,"-vfstrace")==0 ){
2854 i++; 4166 i++;
2855 }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){ 4167 #endif
4168 #ifdef SQLITE_ENABLE_MULTIPLEX
4169 }else if( strcmp(z,"-multiplex")==0 ){
4170 i++;
4171 #endif
4172 }else if( strcmp(z,"-help")==0 ){
2856 usage(1); 4173 usage(1);
4174 }else if( strcmp(z,"-cmd")==0 ){
4175 if( i==argc-1 ) break;
4176 z = cmdline_option_value(argc,argv,++i);
4177 if( z[0]=='.' ){
4178 rc = do_meta_command(z, &data);
4179 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
4180 }else{
4181 open_db(&data, 0);
4182 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4183 if( zErrMsg!=0 ){
4184 fprintf(stderr,"Error: %s\n", zErrMsg);
4185 if( bail_on_error ) return rc!=0 ? rc : 1;
4186 }else if( rc!=0 ){
4187 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4188 if( bail_on_error ) return rc;
4189 }
4190 }
2857 }else{ 4191 }else{
2858 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 4192 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
2859 fprintf(stderr,"Use -help for a list of options.\n"); 4193 fprintf(stderr,"Use -help for a list of options.\n");
2860 return 1; 4194 return 1;
2861 } 4195 }
2862 } 4196 }
2863 4197
2864 if( zFirstCmd ){ 4198 if( zFirstCmd ){
2865 /* Run just the command that follows the database name 4199 /* Run just the command that follows the database name
2866 */ 4200 */
2867 if( zFirstCmd[0]=='.' ){ 4201 if( zFirstCmd[0]=='.' ){
2868 rc = do_meta_command(zFirstCmd, &data); 4202 rc = do_meta_command(zFirstCmd, &data);
4203 if( rc==2 ) rc = 0;
2869 }else{ 4204 }else{
2870 open_db(&data); 4205 open_db(&data, 0);
2871 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg); 4206 rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
2872 if( zErrMsg!=0 ){ 4207 if( zErrMsg!=0 ){
2873 fprintf(stderr,"Error: %s\n", zErrMsg); 4208 fprintf(stderr,"Error: %s\n", zErrMsg);
2874 return rc!=0 ? rc : 1; 4209 return rc!=0 ? rc : 1;
2875 }else if( rc!=0 ){ 4210 }else if( rc!=0 ){
2876 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd); 4211 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd);
2877 return rc; 4212 return rc;
2878 } 4213 }
2879 } 4214 }
2880 }else{ 4215 }else{
2881 /* Run commands received from standard input 4216 /* Run commands received from standard input
2882 */ 4217 */
2883 if( stdin_is_interactive ){ 4218 if( stdin_is_interactive ){
2884 char *zHome; 4219 char *zHome;
2885 char *zHistory = 0; 4220 char *zHistory = 0;
2886 int nHistory; 4221 int nHistory;
2887 printf( 4222 printf(
2888 "SQLite version %s\n" 4223 "SQLite version %s %.19s\n" /*extra-version-info*/
2889 "Enter \".help\" for instructions\n" 4224 "Enter \".help\" for usage hints.\n",
2890 "Enter SQL statements terminated with a \";\"\n", 4225 sqlite3_libversion(), sqlite3_sourceid()
2891 sqlite3_libversion()
2892 ); 4226 );
4227 if( warnInmemoryDb ){
4228 printf("Connected to a ");
4229 printBold("transient in-memory database");
4230 printf(".\nUse \".open FILENAME\" to reopen on a "
4231 "persistent database.\n");
4232 }
2893 zHome = find_home_dir(); 4233 zHome = find_home_dir();
2894 if( zHome ){ 4234 if( zHome ){
2895 nHistory = strlen30(zHome) + 20; 4235 nHistory = strlen30(zHome) + 20;
2896 if( (zHistory = malloc(nHistory))!=0 ){ 4236 if( (zHistory = malloc(nHistory))!=0 ){
2897 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 4237 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
2898 } 4238 }
2899 } 4239 }
2900 #if defined(HAVE_READLINE) && HAVE_READLINE==1 4240 #if defined(HAVE_READLINE)
2901 if( zHistory ) read_history(zHistory); 4241 if( zHistory ) read_history(zHistory);
2902 #endif 4242 #endif
2903 rc = process_input(&data, 0); 4243 rc = process_input(&data, 0);
2904 if( zHistory ){ 4244 if( zHistory ){
2905 stifle_history(100); 4245 stifle_history(100);
2906 write_history(zHistory); 4246 write_history(zHistory);
2907 free(zHistory); 4247 free(zHistory);
2908 } 4248 }
2909 free(zHome);
2910 }else{ 4249 }else{
2911 rc = process_input(&data, stdin); 4250 rc = process_input(&data, stdin);
2912 } 4251 }
2913 } 4252 }
2914 set_table_name(&data, 0); 4253 set_table_name(&data, 0);
2915 if( data.db ){ 4254 if( data.db ){
2916 sqlite3_close(data.db); 4255 sqlite3_close(data.db);
2917 } 4256 }
4257 sqlite3_free(data.zFreeOnClose);
2918 return rc; 4258 return rc;
2919 } 4259 }
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3080704/src/select.c ('k') | third_party/sqlite/sqlite-src-3080704/src/sqlite.h.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698