ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/src/vendor/sqlite3/dist/shell.c
Revision: 7655
Committed: Sat Aug 6 14:14:06 2016 UTC (7 years, 8 months ago) by laffer1
Content type: text/plain
File size: 175474 byte(s)
Log Message:
sqlite 3.13.0

File Contents

# Content
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
6 **
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases.
14 */
15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS
18 #endif
19
20 /*
21 ** If requested, include the SQLite compiler options file for MSVC.
22 */
23 #if defined(INCLUDE_MSVC_H)
24 #include "msvc.h"
25 #endif
26
27 /*
28 ** No support for loadable extensions in VxWorks.
29 */
30 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
31 # define SQLITE_OMIT_LOAD_EXTENSION 1
32 #endif
33
34 /*
35 ** Enable large-file support for fopen() and friends on unix.
36 */
37 #ifndef SQLITE_DISABLE_LFS
38 # define _LARGE_FILE 1
39 # ifndef _FILE_OFFSET_BITS
40 # define _FILE_OFFSET_BITS 64
41 # endif
42 # define _LARGEFILE_SOURCE 1
43 #endif
44
45 #include <stdlib.h>
46 #include <string.h>
47 #include <stdio.h>
48 #include <assert.h>
49 #include "sqlite3.h"
50 #if SQLITE_USER_AUTHENTICATION
51 # include "sqlite3userauth.h"
52 #endif
53 #include <ctype.h>
54 #include <stdarg.h>
55
56 #if !defined(_WIN32) && !defined(WIN32)
57 # include <signal.h>
58 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
59 # include <pwd.h>
60 # endif
61 # include <unistd.h>
62 # include <sys/types.h>
63 #endif
64
65 #if HAVE_READLINE
66 # include <readline/readline.h>
67 # include <readline/history.h>
68 #endif
69
70 #if HAVE_EDITLINE
71 # include <editline/readline.h>
72 #endif
73
74 #if HAVE_EDITLINE || HAVE_READLINE
75
76 # define shell_add_history(X) add_history(X)
77 # define shell_read_history(X) read_history(X)
78 # define shell_write_history(X) write_history(X)
79 # define shell_stifle_history(X) stifle_history(X)
80 # define shell_readline(X) readline(X)
81
82 #elif HAVE_LINENOISE
83
84 # include "linenoise.h"
85 # define shell_add_history(X) linenoiseHistoryAdd(X)
86 # define shell_read_history(X) linenoiseHistoryLoad(X)
87 # define shell_write_history(X) linenoiseHistorySave(X)
88 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89 # define shell_readline(X) linenoise(X)
90
91 #else
92
93 # define shell_read_history(X)
94 # define shell_write_history(X)
95 # define shell_stifle_history(X)
96
97 # define SHELL_USE_LOCAL_GETLINE 1
98 #endif
99
100
101 #if defined(_WIN32) || defined(WIN32)
102 # include <io.h>
103 # include <fcntl.h>
104 # define isatty(h) _isatty(h)
105 # ifndef access
106 # define access(f,m) _access((f),(m))
107 # endif
108 # undef popen
109 # define popen _popen
110 # undef pclose
111 # define pclose _pclose
112 #else
113 /* Make sure isatty() has a prototype. */
114 extern int isatty(int);
115
116 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
117 /* popen and pclose are not C89 functions and so are
118 ** sometimes omitted from the <stdio.h> header */
119 extern FILE *popen(const char*,const char*);
120 extern int pclose(FILE*);
121 # else
122 # define SQLITE_OMIT_POPEN 1
123 # endif
124 #endif
125
126 #if defined(_WIN32_WCE)
127 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128 * thus we always assume that we have a console. That can be
129 * overridden with the -batch command line option.
130 */
131 #define isatty(x) 1
132 #endif
133
134 /* ctype macros that work with signed characters */
135 #define IsSpace(X) isspace((unsigned char)X)
136 #define IsDigit(X) isdigit((unsigned char)X)
137 #define ToLower(X) (char)tolower((unsigned char)X)
138
139 #if defined(_WIN32) || defined(WIN32)
140 #include <windows.h>
141
142 /* string conversion routines only needed on Win32 */
143 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
144 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
145 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
146 #endif
147
148 /* On Windows, we normally run with output mode of TEXT so that \n characters
149 ** are automatically translated into \r\n. However, this behavior needs
150 ** to be disabled in some cases (ex: when generating CSV output and when
151 ** rendering quoted strings that contain \n characters). The following
152 ** routines take care of that.
153 */
154 #if defined(_WIN32) || defined(WIN32)
155 static void setBinaryMode(FILE *file, int isOutput){
156 if( isOutput ) fflush(file);
157 _setmode(_fileno(file), _O_BINARY);
158 }
159 static void setTextMode(FILE *file, int isOutput){
160 if( isOutput ) fflush(file);
161 _setmode(_fileno(file), _O_TEXT);
162 }
163 #else
164 # define setBinaryMode(X,Y)
165 # define setTextMode(X,Y)
166 #endif
167
168
169 /* True if the timer is enabled */
170 static int enableTimer = 0;
171
172 /* Return the current wall-clock time */
173 static sqlite3_int64 timeOfDay(void){
174 static sqlite3_vfs *clockVfs = 0;
175 sqlite3_int64 t;
176 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
177 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
178 clockVfs->xCurrentTimeInt64(clockVfs, &t);
179 }else{
180 double r;
181 clockVfs->xCurrentTime(clockVfs, &r);
182 t = (sqlite3_int64)(r*86400000.0);
183 }
184 return t;
185 }
186
187 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
188 #include <sys/time.h>
189 #include <sys/resource.h>
190
191 /* VxWorks does not support getrusage() as far as we can determine */
192 #if defined(_WRS_KERNEL) || defined(__RTP__)
193 struct rusage {
194 struct timeval ru_utime; /* user CPU time used */
195 struct timeval ru_stime; /* system CPU time used */
196 };
197 #define getrusage(A,B) memset(B,0,sizeof(*B))
198 #endif
199
200 /* Saved resource information for the beginning of an operation */
201 static struct rusage sBegin; /* CPU time at start */
202 static sqlite3_int64 iBegin; /* Wall-clock time at start */
203
204 /*
205 ** Begin timing an operation
206 */
207 static void beginTimer(void){
208 if( enableTimer ){
209 getrusage(RUSAGE_SELF, &sBegin);
210 iBegin = timeOfDay();
211 }
212 }
213
214 /* Return the difference of two time_structs in seconds */
215 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
216 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
217 (double)(pEnd->tv_sec - pStart->tv_sec);
218 }
219
220 /*
221 ** Print the timing results.
222 */
223 static void endTimer(void){
224 if( enableTimer ){
225 sqlite3_int64 iEnd = timeOfDay();
226 struct rusage sEnd;
227 getrusage(RUSAGE_SELF, &sEnd);
228 printf("Run Time: real %.3f user %f sys %f\n",
229 (iEnd - iBegin)*0.001,
230 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
231 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
232 }
233 }
234
235 #define BEGIN_TIMER beginTimer()
236 #define END_TIMER endTimer()
237 #define HAS_TIMER 1
238
239 #elif (defined(_WIN32) || defined(WIN32))
240
241 /* Saved resource information for the beginning of an operation */
242 static HANDLE hProcess;
243 static FILETIME ftKernelBegin;
244 static FILETIME ftUserBegin;
245 static sqlite3_int64 ftWallBegin;
246 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
247 LPFILETIME, LPFILETIME);
248 static GETPROCTIMES getProcessTimesAddr = NULL;
249
250 /*
251 ** Check to see if we have timer support. Return 1 if necessary
252 ** support found (or found previously).
253 */
254 static int hasTimer(void){
255 if( getProcessTimesAddr ){
256 return 1;
257 } else {
258 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
259 ** versions. See if the version we are running on has it, and if it
260 ** does, save off a pointer to it and the current process handle.
261 */
262 hProcess = GetCurrentProcess();
263 if( hProcess ){
264 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
265 if( NULL != hinstLib ){
266 getProcessTimesAddr =
267 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
268 if( NULL != getProcessTimesAddr ){
269 return 1;
270 }
271 FreeLibrary(hinstLib);
272 }
273 }
274 }
275 return 0;
276 }
277
278 /*
279 ** Begin timing an operation
280 */
281 static void beginTimer(void){
282 if( enableTimer && getProcessTimesAddr ){
283 FILETIME ftCreation, ftExit;
284 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
285 &ftKernelBegin,&ftUserBegin);
286 ftWallBegin = timeOfDay();
287 }
288 }
289
290 /* Return the difference of two FILETIME structs in seconds */
291 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
292 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
293 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
294 return (double) ((i64End - i64Start) / 10000000.0);
295 }
296
297 /*
298 ** Print the timing results.
299 */
300 static void endTimer(void){
301 if( enableTimer && getProcessTimesAddr){
302 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
303 sqlite3_int64 ftWallEnd = timeOfDay();
304 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
305 printf("Run Time: real %.3f user %f sys %f\n",
306 (ftWallEnd - ftWallBegin)*0.001,
307 timeDiff(&ftUserBegin, &ftUserEnd),
308 timeDiff(&ftKernelBegin, &ftKernelEnd));
309 }
310 }
311
312 #define BEGIN_TIMER beginTimer()
313 #define END_TIMER endTimer()
314 #define HAS_TIMER hasTimer()
315
316 #else
317 #define BEGIN_TIMER
318 #define END_TIMER
319 #define HAS_TIMER 0
320 #endif
321
322 /*
323 ** Used to prevent warnings about unused parameters
324 */
325 #define UNUSED_PARAMETER(x) (void)(x)
326
327 /*
328 ** If the following flag is set, then command execution stops
329 ** at an error if we are not interactive.
330 */
331 static int bail_on_error = 0;
332
333 /*
334 ** Threat stdin as an interactive input if the following variable
335 ** is true. Otherwise, assume stdin is connected to a file or pipe.
336 */
337 static int stdin_is_interactive = 1;
338
339 /*
340 ** On Windows systems we have to know if standard output is a console
341 ** in order to translate UTF-8 into MBCS. The following variable is
342 ** true if translation is required.
343 */
344 static int stdout_is_console = 1;
345
346 /*
347 ** The following is the open SQLite database. We make a pointer
348 ** to this database a static variable so that it can be accessed
349 ** by the SIGINT handler to interrupt database processing.
350 */
351 static sqlite3 *globalDb = 0;
352
353 /*
354 ** True if an interrupt (Control-C) has been received.
355 */
356 static volatile int seenInterrupt = 0;
357
358 /*
359 ** This is the name of our program. It is set in main(), used
360 ** in a number of other places, mostly for error messages.
361 */
362 static char *Argv0;
363
364 /*
365 ** Prompt strings. Initialized in main. Settable with
366 ** .prompt main continue
367 */
368 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
369 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
370
371 /*
372 ** Render output like fprintf(). Except, if the output is going to the
373 ** console and if this is running on a Windows machine, translate the
374 ** output from UTF-8 into MBCS.
375 */
376 #if defined(_WIN32) || defined(WIN32)
377 void utf8_printf(FILE *out, const char *zFormat, ...){
378 va_list ap;
379 va_start(ap, zFormat);
380 if( stdout_is_console && (out==stdout || out==stderr) ){
381 char *z1 = sqlite3_vmprintf(zFormat, ap);
382 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
383 sqlite3_free(z1);
384 fputs(z2, out);
385 sqlite3_free(z2);
386 }else{
387 vfprintf(out, zFormat, ap);
388 }
389 va_end(ap);
390 }
391 #elif !defined(utf8_printf)
392 # define utf8_printf fprintf
393 #endif
394
395 /*
396 ** Render output like fprintf(). This should not be used on anything that
397 ** includes string formatting (e.g. "%s").
398 */
399 #if !defined(raw_printf)
400 # define raw_printf fprintf
401 #endif
402
403 /*
404 ** Write I/O traces to the following stream.
405 */
406 #ifdef SQLITE_ENABLE_IOTRACE
407 static FILE *iotrace = 0;
408 #endif
409
410 /*
411 ** This routine works like printf in that its first argument is a
412 ** format string and subsequent arguments are values to be substituted
413 ** in place of % fields. The result of formatting this string
414 ** is written to iotrace.
415 */
416 #ifdef SQLITE_ENABLE_IOTRACE
417 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
418 va_list ap;
419 char *z;
420 if( iotrace==0 ) return;
421 va_start(ap, zFormat);
422 z = sqlite3_vmprintf(zFormat, ap);
423 va_end(ap);
424 utf8_printf(iotrace, "%s", z);
425 sqlite3_free(z);
426 }
427 #endif
428
429
430 /*
431 ** Determines if a string is a number of not.
432 */
433 static int isNumber(const char *z, int *realnum){
434 if( *z=='-' || *z=='+' ) z++;
435 if( !IsDigit(*z) ){
436 return 0;
437 }
438 z++;
439 if( realnum ) *realnum = 0;
440 while( IsDigit(*z) ){ z++; }
441 if( *z=='.' ){
442 z++;
443 if( !IsDigit(*z) ) return 0;
444 while( IsDigit(*z) ){ z++; }
445 if( realnum ) *realnum = 1;
446 }
447 if( *z=='e' || *z=='E' ){
448 z++;
449 if( *z=='+' || *z=='-' ) z++;
450 if( !IsDigit(*z) ) return 0;
451 while( IsDigit(*z) ){ z++; }
452 if( realnum ) *realnum = 1;
453 }
454 return *z==0;
455 }
456
457 /*
458 ** A global char* and an SQL function to access its current value
459 ** from within an SQL statement. This program used to use the
460 ** sqlite_exec_printf() API to substitue a string into an SQL statement.
461 ** The correct way to do this with sqlite3 is to use the bind API, but
462 ** since the shell is built around the callback paradigm it would be a lot
463 ** of work. Instead just use this hack, which is quite harmless.
464 */
465 static const char *zShellStatic = 0;
466 static void shellstaticFunc(
467 sqlite3_context *context,
468 int argc,
469 sqlite3_value **argv
470 ){
471 assert( 0==argc );
472 assert( zShellStatic );
473 UNUSED_PARAMETER(argc);
474 UNUSED_PARAMETER(argv);
475 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
476 }
477
478
479 /*
480 ** Compute a string length that is limited to what can be stored in
481 ** lower 30 bits of a 32-bit signed integer.
482 */
483 static int strlen30(const char *z){
484 const char *z2 = z;
485 while( *z2 ){ z2++; }
486 return 0x3fffffff & (int)(z2 - z);
487 }
488
489 /*
490 ** This routine reads a line of text from FILE in, stores
491 ** the text in memory obtained from malloc() and returns a pointer
492 ** to the text. NULL is returned at end of file, or if malloc()
493 ** fails.
494 **
495 ** If zLine is not NULL then it is a malloced buffer returned from
496 ** a previous call to this routine that may be reused.
497 */
498 static char *local_getline(char *zLine, FILE *in){
499 int nLine = zLine==0 ? 0 : 100;
500 int n = 0;
501
502 while( 1 ){
503 if( n+100>nLine ){
504 nLine = nLine*2 + 100;
505 zLine = realloc(zLine, nLine);
506 if( zLine==0 ) return 0;
507 }
508 if( fgets(&zLine[n], nLine - n, in)==0 ){
509 if( n==0 ){
510 free(zLine);
511 return 0;
512 }
513 zLine[n] = 0;
514 break;
515 }
516 while( zLine[n] ) n++;
517 if( n>0 && zLine[n-1]=='\n' ){
518 n--;
519 if( n>0 && zLine[n-1]=='\r' ) n--;
520 zLine[n] = 0;
521 break;
522 }
523 }
524 #if defined(_WIN32) || defined(WIN32)
525 /* For interactive input on Windows systems, translate the
526 ** multi-byte characterset characters into UTF-8. */
527 if( stdin_is_interactive ){
528 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
529 if( zTrans ){
530 int nTrans = strlen30(zTrans)+1;
531 if( nTrans>nLine ){
532 zLine = realloc(zLine, nTrans);
533 if( zLine==0 ){
534 sqlite3_free(zTrans);
535 return 0;
536 }
537 }
538 memcpy(zLine, zTrans, nTrans);
539 sqlite3_free(zTrans);
540 }
541 }
542 #endif /* defined(_WIN32) || defined(WIN32) */
543 return zLine;
544 }
545
546 /*
547 ** Retrieve a single line of input text.
548 **
549 ** If in==0 then read from standard input and prompt before each line.
550 ** If isContinuation is true, then a continuation prompt is appropriate.
551 ** If isContinuation is zero, then the main prompt should be used.
552 **
553 ** If zPrior is not NULL then it is a buffer from a prior call to this
554 ** routine that can be reused.
555 **
556 ** The result is stored in space obtained from malloc() and must either
557 ** be freed by the caller or else passed back into this routine via the
558 ** zPrior argument for reuse.
559 */
560 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
561 char *zPrompt;
562 char *zResult;
563 if( in!=0 ){
564 zResult = local_getline(zPrior, in);
565 }else{
566 zPrompt = isContinuation ? continuePrompt : mainPrompt;
567 #if SHELL_USE_LOCAL_GETLINE
568 printf("%s", zPrompt);
569 fflush(stdout);
570 zResult = local_getline(zPrior, stdin);
571 #else
572 free(zPrior);
573 zResult = shell_readline(zPrompt);
574 if( zResult && *zResult ) shell_add_history(zResult);
575 #endif
576 }
577 return zResult;
578 }
579
580 #if defined(SQLITE_ENABLE_SESSION)
581 /*
582 ** State information for a single open session
583 */
584 typedef struct OpenSession OpenSession;
585 struct OpenSession {
586 char *zName; /* Symbolic name for this session */
587 int nFilter; /* Number of xFilter rejection GLOB patterns */
588 char **azFilter; /* Array of xFilter rejection GLOB patterns */
589 sqlite3_session *p; /* The open session */
590 };
591 #endif
592
593 /*
594 ** Shell output mode information from before ".explain on",
595 ** saved so that it can be restored by ".explain off"
596 */
597 typedef struct SavedModeInfo SavedModeInfo;
598 struct SavedModeInfo {
599 int valid; /* Is there legit data in here? */
600 int mode; /* Mode prior to ".explain on" */
601 int showHeader; /* The ".header" setting prior to ".explain on" */
602 int colWidth[100]; /* Column widths prior to ".explain on" */
603 };
604
605 /*
606 ** State information about the database connection is contained in an
607 ** instance of the following structure.
608 */
609 typedef struct ShellState ShellState;
610 struct ShellState {
611 sqlite3 *db; /* The database */
612 int echoOn; /* True to echo input commands */
613 int autoExplain; /* Automatically turn on .explain mode */
614 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
615 int statsOn; /* True to display memory stats before each finalize */
616 int scanstatsOn; /* True to display scan stats before each finalize */
617 int countChanges; /* True to display change counts */
618 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
619 int outCount; /* Revert to stdout when reaching zero */
620 int cnt; /* Number of records displayed so far */
621 FILE *out; /* Write results here */
622 FILE *traceOut; /* Output for sqlite3_trace() */
623 int nErr; /* Number of errors seen */
624 int mode; /* An output mode setting */
625 int cMode; /* temporary output mode for the current query */
626 int normalMode; /* Output mode before ".explain on" */
627 int writableSchema; /* True if PRAGMA writable_schema=ON */
628 int showHeader; /* True to show column names in List or Column mode */
629 unsigned shellFlgs; /* Various flags */
630 char *zDestTable; /* Name of destination table when MODE_Insert */
631 char colSeparator[20]; /* Column separator character for several modes */
632 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
633 int colWidth[100]; /* Requested width of each column when in column mode*/
634 int actualWidth[100]; /* Actual width of each column */
635 char nullValue[20]; /* The text to print when a NULL comes back from
636 ** the database */
637 char outfile[FILENAME_MAX]; /* Filename for *out */
638 const char *zDbFilename; /* name of the database file */
639 char *zFreeOnClose; /* Filename to free when closing */
640 const char *zVfs; /* Name of VFS to use */
641 sqlite3_stmt *pStmt; /* Current statement if any. */
642 FILE *pLog; /* Write log output here */
643 int *aiIndent; /* Array of indents used in MODE_Explain */
644 int nIndent; /* Size of array aiIndent[] */
645 int iIndent; /* Index of current op in aiIndent[] */
646 #if defined(SQLITE_ENABLE_SESSION)
647 int nSession; /* Number of active sessions */
648 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
649 #endif
650 };
651
652 /*
653 ** These are the allowed shellFlgs values
654 */
655 #define SHFLG_Scratch 0x00001 /* The --scratch option is used */
656 #define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
657 #define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
658
659 /*
660 ** These are the allowed modes.
661 */
662 #define MODE_Line 0 /* One column per line. Blank line between records */
663 #define MODE_Column 1 /* One record per line in neat columns */
664 #define MODE_List 2 /* One record per line with a separator */
665 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
666 #define MODE_Html 4 /* Generate an XHTML table */
667 #define MODE_Insert 5 /* Generate SQL "insert" statements */
668 #define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
669 #define MODE_Csv 7 /* Quote strings, numbers are plain */
670 #define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
671 #define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
672 #define MODE_Pretty 10 /* Pretty-print schemas */
673
674 static const char *modeDescr[] = {
675 "line",
676 "column",
677 "list",
678 "semi",
679 "html",
680 "insert",
681 "tcl",
682 "csv",
683 "explain",
684 "ascii",
685 "prettyprint",
686 };
687
688 /*
689 ** These are the column/row/line separators used by the various
690 ** import/export modes.
691 */
692 #define SEP_Column "|"
693 #define SEP_Row "\n"
694 #define SEP_Tab "\t"
695 #define SEP_Space " "
696 #define SEP_Comma ","
697 #define SEP_CrLf "\r\n"
698 #define SEP_Unit "\x1F"
699 #define SEP_Record "\x1E"
700
701 /*
702 ** Number of elements in an array
703 */
704 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
705
706 /*
707 ** A callback for the sqlite3_log() interface.
708 */
709 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
710 ShellState *p = (ShellState*)pArg;
711 if( p->pLog==0 ) return;
712 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
713 fflush(p->pLog);
714 }
715
716 /*
717 ** Output the given string as a hex-encoded blob (eg. X'1234' )
718 */
719 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
720 int i;
721 char *zBlob = (char *)pBlob;
722 raw_printf(out,"X'");
723 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
724 raw_printf(out,"'");
725 }
726
727 /*
728 ** Output the given string as a quoted string using SQL quoting conventions.
729 */
730 static void output_quoted_string(FILE *out, const char *z){
731 int i;
732 int nSingle = 0;
733 setBinaryMode(out, 1);
734 for(i=0; z[i]; i++){
735 if( z[i]=='\'' ) nSingle++;
736 }
737 if( nSingle==0 ){
738 utf8_printf(out,"'%s'",z);
739 }else{
740 raw_printf(out,"'");
741 while( *z ){
742 for(i=0; z[i] && z[i]!='\''; i++){}
743 if( i==0 ){
744 raw_printf(out,"''");
745 z++;
746 }else if( z[i]=='\'' ){
747 utf8_printf(out,"%.*s''",i,z);
748 z += i+1;
749 }else{
750 utf8_printf(out,"%s",z);
751 break;
752 }
753 }
754 raw_printf(out,"'");
755 }
756 setTextMode(out, 1);
757 }
758
759 /*
760 ** Output the given string as a quoted according to C or TCL quoting rules.
761 */
762 static void output_c_string(FILE *out, const char *z){
763 unsigned int c;
764 fputc('"', out);
765 while( (c = *(z++))!=0 ){
766 if( c=='\\' ){
767 fputc(c, out);
768 fputc(c, out);
769 }else if( c=='"' ){
770 fputc('\\', out);
771 fputc('"', out);
772 }else if( c=='\t' ){
773 fputc('\\', out);
774 fputc('t', out);
775 }else if( c=='\n' ){
776 fputc('\\', out);
777 fputc('n', out);
778 }else if( c=='\r' ){
779 fputc('\\', out);
780 fputc('r', out);
781 }else if( !isprint(c&0xff) ){
782 raw_printf(out, "\\%03o", c&0xff);
783 }else{
784 fputc(c, out);
785 }
786 }
787 fputc('"', out);
788 }
789
790 /*
791 ** Output the given string with characters that are special to
792 ** HTML escaped.
793 */
794 static void output_html_string(FILE *out, const char *z){
795 int i;
796 if( z==0 ) z = "";
797 while( *z ){
798 for(i=0; z[i]
799 && z[i]!='<'
800 && z[i]!='&'
801 && z[i]!='>'
802 && z[i]!='\"'
803 && z[i]!='\'';
804 i++){}
805 if( i>0 ){
806 utf8_printf(out,"%.*s",i,z);
807 }
808 if( z[i]=='<' ){
809 raw_printf(out,"&lt;");
810 }else if( z[i]=='&' ){
811 raw_printf(out,"&amp;");
812 }else if( z[i]=='>' ){
813 raw_printf(out,"&gt;");
814 }else if( z[i]=='\"' ){
815 raw_printf(out,"&quot;");
816 }else if( z[i]=='\'' ){
817 raw_printf(out,"&#39;");
818 }else{
819 break;
820 }
821 z += i + 1;
822 }
823 }
824
825 /*
826 ** If a field contains any character identified by a 1 in the following
827 ** array, then the string must be quoted for CSV.
828 */
829 static const char needCsvQuote[] = {
830 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
831 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
832 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
833 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
834 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
835 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
836 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
837 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
838 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
839 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
840 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
841 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
842 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
843 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
844 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
845 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
846 };
847
848 /*
849 ** Output a single term of CSV. Actually, p->colSeparator is used for
850 ** the separator, which may or may not be a comma. p->nullValue is
851 ** the null value. Strings are quoted if necessary. The separator
852 ** is only issued if bSep is true.
853 */
854 static void output_csv(ShellState *p, const char *z, int bSep){
855 FILE *out = p->out;
856 if( z==0 ){
857 utf8_printf(out,"%s",p->nullValue);
858 }else{
859 int i;
860 int nSep = strlen30(p->colSeparator);
861 for(i=0; z[i]; i++){
862 if( needCsvQuote[((unsigned char*)z)[i]]
863 || (z[i]==p->colSeparator[0] &&
864 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
865 i = 0;
866 break;
867 }
868 }
869 if( i==0 ){
870 putc('"', out);
871 for(i=0; z[i]; i++){
872 if( z[i]=='"' ) putc('"', out);
873 putc(z[i], out);
874 }
875 putc('"', out);
876 }else{
877 utf8_printf(out, "%s", z);
878 }
879 }
880 if( bSep ){
881 utf8_printf(p->out, "%s", p->colSeparator);
882 }
883 }
884
885 #ifdef SIGINT
886 /*
887 ** This routine runs when the user presses Ctrl-C
888 */
889 static void interrupt_handler(int NotUsed){
890 UNUSED_PARAMETER(NotUsed);
891 seenInterrupt++;
892 if( seenInterrupt>2 ) exit(1);
893 if( globalDb ) sqlite3_interrupt(globalDb);
894 }
895 #endif
896
897 /*
898 ** When the ".auth ON" is set, the following authorizer callback is
899 ** invoked. It always returns SQLITE_OK.
900 */
901 static int shellAuth(
902 void *pClientData,
903 int op,
904 const char *zA1,
905 const char *zA2,
906 const char *zA3,
907 const char *zA4
908 ){
909 ShellState *p = (ShellState*)pClientData;
910 static const char *azAction[] = { 0,
911 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
912 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
913 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
914 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
915 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
916 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
917 "PRAGMA", "READ", "SELECT",
918 "TRANSACTION", "UPDATE", "ATTACH",
919 "DETACH", "ALTER_TABLE", "REINDEX",
920 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
921 "FUNCTION", "SAVEPOINT", "RECURSIVE"
922 };
923 int i;
924 const char *az[4];
925 az[0] = zA1;
926 az[1] = zA2;
927 az[2] = zA3;
928 az[3] = zA4;
929 raw_printf(p->out, "authorizer: %s", azAction[op]);
930 for(i=0; i<4; i++){
931 raw_printf(p->out, " ");
932 if( az[i] ){
933 output_c_string(p->out, az[i]);
934 }else{
935 raw_printf(p->out, "NULL");
936 }
937 }
938 raw_printf(p->out, "\n");
939 return SQLITE_OK;
940 }
941
942
943 /*
944 ** This is the callback routine that the shell
945 ** invokes for each row of a query result.
946 */
947 static int shell_callback(
948 void *pArg,
949 int nArg, /* Number of result columns */
950 char **azArg, /* Text of each result column */
951 char **azCol, /* Column names */
952 int *aiType /* Column types */
953 ){
954 int i;
955 ShellState *p = (ShellState*)pArg;
956
957 switch( p->cMode ){
958 case MODE_Line: {
959 int w = 5;
960 if( azArg==0 ) break;
961 for(i=0; i<nArg; i++){
962 int len = strlen30(azCol[i] ? azCol[i] : "");
963 if( len>w ) w = len;
964 }
965 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
966 for(i=0; i<nArg; i++){
967 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
968 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
969 }
970 break;
971 }
972 case MODE_Explain:
973 case MODE_Column: {
974 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
975 const int *colWidth;
976 int showHdr;
977 char *rowSep;
978 if( p->cMode==MODE_Column ){
979 colWidth = p->colWidth;
980 showHdr = p->showHeader;
981 rowSep = p->rowSeparator;
982 }else{
983 colWidth = aExplainWidths;
984 showHdr = 1;
985 rowSep = SEP_Row;
986 }
987 if( p->cnt++==0 ){
988 for(i=0; i<nArg; i++){
989 int w, n;
990 if( i<ArraySize(p->colWidth) ){
991 w = colWidth[i];
992 }else{
993 w = 0;
994 }
995 if( w==0 ){
996 w = strlen30(azCol[i] ? azCol[i] : "");
997 if( w<10 ) w = 10;
998 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
999 if( w<n ) w = n;
1000 }
1001 if( i<ArraySize(p->actualWidth) ){
1002 p->actualWidth[i] = w;
1003 }
1004 if( showHdr ){
1005 if( w<0 ){
1006 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
1007 i==nArg-1 ? rowSep : " ");
1008 }else{
1009 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
1010 i==nArg-1 ? rowSep : " ");
1011 }
1012 }
1013 }
1014 if( showHdr ){
1015 for(i=0; i<nArg; i++){
1016 int w;
1017 if( i<ArraySize(p->actualWidth) ){
1018 w = p->actualWidth[i];
1019 if( w<0 ) w = -w;
1020 }else{
1021 w = 10;
1022 }
1023 utf8_printf(p->out,"%-*.*s%s",w,w,
1024 "----------------------------------------------------------"
1025 "----------------------------------------------------------",
1026 i==nArg-1 ? rowSep : " ");
1027 }
1028 }
1029 }
1030 if( azArg==0 ) break;
1031 for(i=0; i<nArg; i++){
1032 int w;
1033 if( i<ArraySize(p->actualWidth) ){
1034 w = p->actualWidth[i];
1035 }else{
1036 w = 10;
1037 }
1038 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
1039 w = strlen30(azArg[i]);
1040 }
1041 if( i==1 && p->aiIndent && p->pStmt ){
1042 if( p->iIndent<p->nIndent ){
1043 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
1044 }
1045 p->iIndent++;
1046 }
1047 if( w<0 ){
1048 utf8_printf(p->out,"%*.*s%s",-w,-w,
1049 azArg[i] ? azArg[i] : p->nullValue,
1050 i==nArg-1 ? rowSep : " ");
1051 }else{
1052 utf8_printf(p->out,"%-*.*s%s",w,w,
1053 azArg[i] ? azArg[i] : p->nullValue,
1054 i==nArg-1 ? rowSep : " ");
1055 }
1056 }
1057 break;
1058 }
1059 case MODE_Semi: { /* .schema and .fullschema output */
1060 utf8_printf(p->out, "%s;\n", azArg[0]);
1061 break;
1062 }
1063 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1064 char *z;
1065 int j;
1066 int nParen = 0;
1067 char cEnd = 0;
1068 char c;
1069 int nLine = 0;
1070 assert( nArg==1 );
1071 if( azArg[0]==0 ) break;
1072 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1073 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1074 ){
1075 utf8_printf(p->out, "%s;\n", azArg[0]);
1076 break;
1077 }
1078 z = sqlite3_mprintf("%s", azArg[0]);
1079 j = 0;
1080 for(i=0; IsSpace(z[i]); i++){}
1081 for(; (c = z[i])!=0; i++){
1082 if( IsSpace(c) ){
1083 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1084 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1085 j--;
1086 }
1087 z[j++] = c;
1088 }
1089 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1090 z[j] = 0;
1091 if( strlen30(z)>=79 ){
1092 for(i=j=0; (c = z[i])!=0; i++){
1093 if( c==cEnd ){
1094 cEnd = 0;
1095 }else if( c=='"' || c=='\'' || c=='`' ){
1096 cEnd = c;
1097 }else if( c=='[' ){
1098 cEnd = ']';
1099 }else if( c=='(' ){
1100 nParen++;
1101 }else if( c==')' ){
1102 nParen--;
1103 if( nLine>0 && nParen==0 && j>0 ){
1104 utf8_printf(p->out, "%.*s\n", j, z);
1105 j = 0;
1106 }
1107 }
1108 z[j++] = c;
1109 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1110 if( c=='\n' ) j--;
1111 utf8_printf(p->out, "%.*s\n ", j, z);
1112 j = 0;
1113 nLine++;
1114 while( IsSpace(z[i+1]) ){ i++; }
1115 }
1116 }
1117 z[j] = 0;
1118 }
1119 utf8_printf(p->out, "%s;\n", z);
1120 sqlite3_free(z);
1121 break;
1122 }
1123 case MODE_List: {
1124 if( p->cnt++==0 && p->showHeader ){
1125 for(i=0; i<nArg; i++){
1126 utf8_printf(p->out,"%s%s",azCol[i],
1127 i==nArg-1 ? p->rowSeparator : p->colSeparator);
1128 }
1129 }
1130 if( azArg==0 ) break;
1131 for(i=0; i<nArg; i++){
1132 char *z = azArg[i];
1133 if( z==0 ) z = p->nullValue;
1134 utf8_printf(p->out, "%s", z);
1135 if( i<nArg-1 ){
1136 utf8_printf(p->out, "%s", p->colSeparator);
1137 }else{
1138 utf8_printf(p->out, "%s", p->rowSeparator);
1139 }
1140 }
1141 break;
1142 }
1143 case MODE_Html: {
1144 if( p->cnt++==0 && p->showHeader ){
1145 raw_printf(p->out,"<TR>");
1146 for(i=0; i<nArg; i++){
1147 raw_printf(p->out,"<TH>");
1148 output_html_string(p->out, azCol[i]);
1149 raw_printf(p->out,"</TH>\n");
1150 }
1151 raw_printf(p->out,"</TR>\n");
1152 }
1153 if( azArg==0 ) break;
1154 raw_printf(p->out,"<TR>");
1155 for(i=0; i<nArg; i++){
1156 raw_printf(p->out,"<TD>");
1157 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1158 raw_printf(p->out,"</TD>\n");
1159 }
1160 raw_printf(p->out,"</TR>\n");
1161 break;
1162 }
1163 case MODE_Tcl: {
1164 if( p->cnt++==0 && p->showHeader ){
1165 for(i=0; i<nArg; i++){
1166 output_c_string(p->out,azCol[i] ? azCol[i] : "");
1167 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1168 }
1169 utf8_printf(p->out, "%s", p->rowSeparator);
1170 }
1171 if( azArg==0 ) break;
1172 for(i=0; i<nArg; i++){
1173 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1174 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1175 }
1176 utf8_printf(p->out, "%s", p->rowSeparator);
1177 break;
1178 }
1179 case MODE_Csv: {
1180 setBinaryMode(p->out, 1);
1181 if( p->cnt++==0 && p->showHeader ){
1182 for(i=0; i<nArg; i++){
1183 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
1184 }
1185 utf8_printf(p->out, "%s", p->rowSeparator);
1186 }
1187 if( nArg>0 ){
1188 for(i=0; i<nArg; i++){
1189 output_csv(p, azArg[i], i<nArg-1);
1190 }
1191 utf8_printf(p->out, "%s", p->rowSeparator);
1192 }
1193 setTextMode(p->out, 1);
1194 break;
1195 }
1196 case MODE_Insert: {
1197 p->cnt++;
1198 if( azArg==0 ) break;
1199 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
1200 if( p->showHeader ){
1201 raw_printf(p->out,"(");
1202 for(i=0; i<nArg; i++){
1203 char *zSep = i>0 ? ",": "";
1204 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
1205 }
1206 raw_printf(p->out,")");
1207 }
1208 raw_printf(p->out," VALUES(");
1209 for(i=0; i<nArg; i++){
1210 char *zSep = i>0 ? ",": "";
1211 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1212 utf8_printf(p->out,"%sNULL",zSep);
1213 }else if( aiType && aiType[i]==SQLITE_TEXT ){
1214 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
1215 output_quoted_string(p->out, azArg[i]);
1216 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1217 || aiType[i]==SQLITE_FLOAT) ){
1218 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
1219 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1220 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1221 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1222 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
1223 output_hex_blob(p->out, pBlob, nBlob);
1224 }else if( isNumber(azArg[i], 0) ){
1225 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
1226 }else{
1227 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
1228 output_quoted_string(p->out, azArg[i]);
1229 }
1230 }
1231 raw_printf(p->out,");\n");
1232 break;
1233 }
1234 case MODE_Ascii: {
1235 if( p->cnt++==0 && p->showHeader ){
1236 for(i=0; i<nArg; i++){
1237 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1238 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
1239 }
1240 utf8_printf(p->out, "%s", p->rowSeparator);
1241 }
1242 if( azArg==0 ) break;
1243 for(i=0; i<nArg; i++){
1244 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1245 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
1246 }
1247 utf8_printf(p->out, "%s", p->rowSeparator);
1248 break;
1249 }
1250 }
1251 return 0;
1252 }
1253
1254 /*
1255 ** This is the callback routine that the SQLite library
1256 ** invokes for each row of a query result.
1257 */
1258 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1259 /* since we don't have type info, call the shell_callback with a NULL value */
1260 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1261 }
1262
1263 /*
1264 ** Set the destination table field of the ShellState structure to
1265 ** the name of the table given. Escape any quote characters in the
1266 ** table name.
1267 */
1268 static void set_table_name(ShellState *p, const char *zName){
1269 int i, n;
1270 int needQuote;
1271 char *z;
1272
1273 if( p->zDestTable ){
1274 free(p->zDestTable);
1275 p->zDestTable = 0;
1276 }
1277 if( zName==0 ) return;
1278 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
1279 for(i=n=0; zName[i]; i++, n++){
1280 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
1281 needQuote = 1;
1282 if( zName[i]=='\'' ) n++;
1283 }
1284 }
1285 if( needQuote ) n += 2;
1286 z = p->zDestTable = malloc( n+1 );
1287 if( z==0 ){
1288 raw_printf(stderr,"Error: out of memory\n");
1289 exit(1);
1290 }
1291 n = 0;
1292 if( needQuote ) z[n++] = '\'';
1293 for(i=0; zName[i]; i++){
1294 z[n++] = zName[i];
1295 if( zName[i]=='\'' ) z[n++] = '\'';
1296 }
1297 if( needQuote ) z[n++] = '\'';
1298 z[n] = 0;
1299 }
1300
1301 /* zIn is either a pointer to a NULL-terminated string in memory obtained
1302 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1303 ** added to zIn, and the result returned in memory obtained from malloc().
1304 ** zIn, if it was not NULL, is freed.
1305 **
1306 ** If the third argument, quote, is not '\0', then it is used as a
1307 ** quote character for zAppend.
1308 */
1309 static char *appendText(char *zIn, char const *zAppend, char quote){
1310 int len;
1311 int i;
1312 int nAppend = strlen30(zAppend);
1313 int nIn = (zIn?strlen30(zIn):0);
1314
1315 len = nAppend+nIn+1;
1316 if( quote ){
1317 len += 2;
1318 for(i=0; i<nAppend; i++){
1319 if( zAppend[i]==quote ) len++;
1320 }
1321 }
1322
1323 zIn = (char *)realloc(zIn, len);
1324 if( !zIn ){
1325 return 0;
1326 }
1327
1328 if( quote ){
1329 char *zCsr = &zIn[nIn];
1330 *zCsr++ = quote;
1331 for(i=0; i<nAppend; i++){
1332 *zCsr++ = zAppend[i];
1333 if( zAppend[i]==quote ) *zCsr++ = quote;
1334 }
1335 *zCsr++ = quote;
1336 *zCsr++ = '\0';
1337 assert( (zCsr-zIn)==len );
1338 }else{
1339 memcpy(&zIn[nIn], zAppend, nAppend);
1340 zIn[len-1] = '\0';
1341 }
1342
1343 return zIn;
1344 }
1345
1346
1347 /*
1348 ** Execute a query statement that will generate SQL output. Print
1349 ** the result columns, comma-separated, on a line and then add a
1350 ** semicolon terminator to the end of that line.
1351 **
1352 ** If the number of columns is 1 and that column contains text "--"
1353 ** then write the semicolon on a separate line. That way, if a
1354 ** "--" comment occurs at the end of the statement, the comment
1355 ** won't consume the semicolon terminator.
1356 */
1357 static int run_table_dump_query(
1358 ShellState *p, /* Query context */
1359 const char *zSelect, /* SELECT statement to extract content */
1360 const char *zFirstRow /* Print before first row, if not NULL */
1361 ){
1362 sqlite3_stmt *pSelect;
1363 int rc;
1364 int nResult;
1365 int i;
1366 const char *z;
1367 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
1368 if( rc!=SQLITE_OK || !pSelect ){
1369 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1370 sqlite3_errmsg(p->db));
1371 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1372 return rc;
1373 }
1374 rc = sqlite3_step(pSelect);
1375 nResult = sqlite3_column_count(pSelect);
1376 while( rc==SQLITE_ROW ){
1377 if( zFirstRow ){
1378 utf8_printf(p->out, "%s", zFirstRow);
1379 zFirstRow = 0;
1380 }
1381 z = (const char*)sqlite3_column_text(pSelect, 0);
1382 utf8_printf(p->out, "%s", z);
1383 for(i=1; i<nResult; i++){
1384 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1385 }
1386 if( z==0 ) z = "";
1387 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1388 if( z[0] ){
1389 raw_printf(p->out, "\n;\n");
1390 }else{
1391 raw_printf(p->out, ";\n");
1392 }
1393 rc = sqlite3_step(pSelect);
1394 }
1395 rc = sqlite3_finalize(pSelect);
1396 if( rc!=SQLITE_OK ){
1397 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1398 sqlite3_errmsg(p->db));
1399 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1400 }
1401 return rc;
1402 }
1403
1404 /*
1405 ** Allocate space and save off current error string.
1406 */
1407 static char *save_err_msg(
1408 sqlite3 *db /* Database to query */
1409 ){
1410 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1411 char *zErrMsg = sqlite3_malloc64(nErrMsg);
1412 if( zErrMsg ){
1413 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1414 }
1415 return zErrMsg;
1416 }
1417
1418 #ifdef __linux__
1419 /*
1420 ** Attempt to display I/O stats on Linux using /proc/PID/io
1421 */
1422 static void displayLinuxIoStats(FILE *out){
1423 FILE *in;
1424 char z[200];
1425 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
1426 in = fopen(z, "rb");
1427 if( in==0 ) return;
1428 while( fgets(z, sizeof(z), in)!=0 ){
1429 static const struct {
1430 const char *zPattern;
1431 const char *zDesc;
1432 } aTrans[] = {
1433 { "rchar: ", "Bytes received by read():" },
1434 { "wchar: ", "Bytes sent to write():" },
1435 { "syscr: ", "Read() system calls:" },
1436 { "syscw: ", "Write() system calls:" },
1437 { "read_bytes: ", "Bytes read from storage:" },
1438 { "write_bytes: ", "Bytes written to storage:" },
1439 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
1440 };
1441 int i;
1442 for(i=0; i<ArraySize(aTrans); i++){
1443 int n = (int)strlen(aTrans[i].zPattern);
1444 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
1445 raw_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
1446 break;
1447 }
1448 }
1449 }
1450 fclose(in);
1451 }
1452 #endif
1453
1454
1455 /*
1456 ** Display memory stats.
1457 */
1458 static int display_stats(
1459 sqlite3 *db, /* Database to query */
1460 ShellState *pArg, /* Pointer to ShellState */
1461 int bReset /* True to reset the stats */
1462 ){
1463 int iCur;
1464 int iHiwtr;
1465
1466 if( pArg && pArg->out ){
1467
1468 iHiwtr = iCur = -1;
1469 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
1470 raw_printf(pArg->out,
1471 "Memory Used: %d (max %d) bytes\n",
1472 iCur, iHiwtr);
1473 iHiwtr = iCur = -1;
1474 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
1475 raw_printf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
1476 iCur, iHiwtr);
1477 if( pArg->shellFlgs & SHFLG_Pagecache ){
1478 iHiwtr = iCur = -1;
1479 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1480 raw_printf(pArg->out,
1481 "Number of Pcache Pages Used: %d (max %d) pages\n",
1482 iCur, iHiwtr);
1483 }
1484 iHiwtr = iCur = -1;
1485 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1486 raw_printf(pArg->out,
1487 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1488 iCur, iHiwtr);
1489 if( pArg->shellFlgs & SHFLG_Scratch ){
1490 iHiwtr = iCur = -1;
1491 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1492 raw_printf(pArg->out,
1493 "Number of Scratch Allocations Used: %d (max %d)\n",
1494 iCur, iHiwtr);
1495 }
1496 iHiwtr = iCur = -1;
1497 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1498 raw_printf(pArg->out,
1499 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1500 iCur, iHiwtr);
1501 iHiwtr = iCur = -1;
1502 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1503 raw_printf(pArg->out, "Largest Allocation: %d bytes\n",
1504 iHiwtr);
1505 iHiwtr = iCur = -1;
1506 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1507 raw_printf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
1508 iHiwtr);
1509 iHiwtr = iCur = -1;
1510 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1511 raw_printf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
1512 iHiwtr);
1513 #ifdef YYTRACKMAXSTACKDEPTH
1514 iHiwtr = iCur = -1;
1515 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1516 raw_printf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
1517 iCur, iHiwtr);
1518 #endif
1519 }
1520
1521 if( pArg && pArg->out && db ){
1522 if( pArg->shellFlgs & SHFLG_Lookaside ){
1523 iHiwtr = iCur = -1;
1524 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1525 &iCur, &iHiwtr, bReset);
1526 raw_printf(pArg->out,
1527 "Lookaside Slots Used: %d (max %d)\n",
1528 iCur, iHiwtr);
1529 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1530 &iCur, &iHiwtr, bReset);
1531 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
1532 iHiwtr);
1533 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1534 &iCur, &iHiwtr, bReset);
1535 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
1536 iHiwtr);
1537 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1538 &iCur, &iHiwtr, bReset);
1539 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
1540 iHiwtr);
1541 }
1542 iHiwtr = iCur = -1;
1543 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1544 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
1545 iCur);
1546 iHiwtr = iCur = -1;
1547 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1548 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
1549 iHiwtr = iCur = -1;
1550 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1551 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
1552 iHiwtr = iCur = -1;
1553 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1554 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
1555 iHiwtr = iCur = -1;
1556 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1557 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
1558 iCur);
1559 iHiwtr = iCur = -1;
1560 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1561 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
1562 iCur);
1563 }
1564
1565 if( pArg && pArg->out && db && pArg->pStmt ){
1566 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1567 bReset);
1568 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
1569 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1570 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
1571 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
1572 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1573 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1574 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
1575 }
1576
1577 #ifdef __linux__
1578 displayLinuxIoStats(pArg->out);
1579 #endif
1580
1581 /* Do not remove this machine readable comment: extra-stats-output-here */
1582
1583 return 0;
1584 }
1585
1586 /*
1587 ** Display scan stats.
1588 */
1589 static void display_scanstats(
1590 sqlite3 *db, /* Database to query */
1591 ShellState *pArg /* Pointer to ShellState */
1592 ){
1593 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1594 UNUSED_PARAMETER(db);
1595 UNUSED_PARAMETER(pArg);
1596 #else
1597 int i, k, n, mx;
1598 raw_printf(pArg->out, "-------- scanstats --------\n");
1599 mx = 0;
1600 for(k=0; k<=mx; k++){
1601 double rEstLoop = 1.0;
1602 for(i=n=0; 1; i++){
1603 sqlite3_stmt *p = pArg->pStmt;
1604 sqlite3_int64 nLoop, nVisit;
1605 double rEst;
1606 int iSid;
1607 const char *zExplain;
1608 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1609 break;
1610 }
1611 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
1612 if( iSid>mx ) mx = iSid;
1613 if( iSid!=k ) continue;
1614 if( n==0 ){
1615 rEstLoop = (double)nLoop;
1616 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
1617 }
1618 n++;
1619 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1620 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1621 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1622 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1623 rEstLoop *= rEst;
1624 raw_printf(pArg->out,
1625 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
1626 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
1627 );
1628 }
1629 }
1630 raw_printf(pArg->out, "---------------------------\n");
1631 #endif
1632 }
1633
1634 /*
1635 ** Parameter azArray points to a zero-terminated array of strings. zStr
1636 ** points to a single nul-terminated string. Return non-zero if zStr
1637 ** is equal, according to strcmp(), to any of the strings in the array.
1638 ** Otherwise, return zero.
1639 */
1640 static int str_in_array(const char *zStr, const char **azArray){
1641 int i;
1642 for(i=0; azArray[i]; i++){
1643 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1644 }
1645 return 0;
1646 }
1647
1648 /*
1649 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1650 ** and populate the ShellState.aiIndent[] array with the number of
1651 ** spaces each opcode should be indented before it is output.
1652 **
1653 ** The indenting rules are:
1654 **
1655 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1656 ** all opcodes that occur between the p2 jump destination and the opcode
1657 ** itself by 2 spaces.
1658 **
1659 ** * For each "Goto", if the jump destination is earlier in the program
1660 ** and ends on one of:
1661 ** Yield SeekGt SeekLt RowSetRead Rewind
1662 ** or if the P1 parameter is one instead of zero,
1663 ** then indent all opcodes between the earlier instruction
1664 ** and "Goto" by 2 spaces.
1665 */
1666 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
1667 const char *zSql; /* The text of the SQL statement */
1668 const char *z; /* Used to check if this is an EXPLAIN */
1669 int *abYield = 0; /* True if op is an OP_Yield */
1670 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
1671 int iOp; /* Index of operation in p->aiIndent[] */
1672
1673 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1674 "NextIfOpen", "PrevIfOpen", 0 };
1675 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1676 "Rewind", 0 };
1677 const char *azGoto[] = { "Goto", 0 };
1678
1679 /* Try to figure out if this is really an EXPLAIN statement. If this
1680 ** cannot be verified, return early. */
1681 if( sqlite3_column_count(pSql)!=8 ){
1682 p->cMode = p->mode;
1683 return;
1684 }
1685 zSql = sqlite3_sql(pSql);
1686 if( zSql==0 ) return;
1687 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1688 if( sqlite3_strnicmp(z, "explain", 7) ){
1689 p->cMode = p->mode;
1690 return;
1691 }
1692
1693 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1694 int i;
1695 int iAddr = sqlite3_column_int(pSql, 0);
1696 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1697
1698 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1699 ** p2 is an instruction address, set variable p2op to the index of that
1700 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1701 ** the current instruction is part of a sub-program generated by an
1702 ** SQL trigger or foreign key. */
1703 int p2 = sqlite3_column_int(pSql, 3);
1704 int p2op = (p2 + (iOp-iAddr));
1705
1706 /* Grow the p->aiIndent array as required */
1707 if( iOp>=nAlloc ){
1708 if( iOp==0 ){
1709 /* Do further verfication that this is explain output. Abort if
1710 ** it is not */
1711 static const char *explainCols[] = {
1712 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
1713 int jj;
1714 for(jj=0; jj<ArraySize(explainCols); jj++){
1715 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
1716 p->cMode = p->mode;
1717 sqlite3_reset(pSql);
1718 return;
1719 }
1720 }
1721 }
1722 nAlloc += 100;
1723 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1724 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
1725 }
1726 abYield[iOp] = str_in_array(zOp, azYield);
1727 p->aiIndent[iOp] = 0;
1728 p->nIndent = iOp+1;
1729
1730 if( str_in_array(zOp, azNext) ){
1731 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
1732 }
1733 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1734 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1735 ){
1736 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
1737 }
1738 }
1739
1740 p->iIndent = 0;
1741 sqlite3_free(abYield);
1742 sqlite3_reset(pSql);
1743 }
1744
1745 /*
1746 ** Free the array allocated by explain_data_prepare().
1747 */
1748 static void explain_data_delete(ShellState *p){
1749 sqlite3_free(p->aiIndent);
1750 p->aiIndent = 0;
1751 p->nIndent = 0;
1752 p->iIndent = 0;
1753 }
1754
1755 /*
1756 ** Disable and restore .wheretrace and .selecttrace settings.
1757 */
1758 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
1759 extern int sqlite3SelectTrace;
1760 static int savedSelectTrace;
1761 #endif
1762 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
1763 extern int sqlite3WhereTrace;
1764 static int savedWhereTrace;
1765 #endif
1766 static void disable_debug_trace_modes(void){
1767 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
1768 savedSelectTrace = sqlite3SelectTrace;
1769 sqlite3SelectTrace = 0;
1770 #endif
1771 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
1772 savedWhereTrace = sqlite3WhereTrace;
1773 sqlite3WhereTrace = 0;
1774 #endif
1775 }
1776 static void restore_debug_trace_modes(void){
1777 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
1778 sqlite3SelectTrace = savedSelectTrace;
1779 #endif
1780 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
1781 sqlite3WhereTrace = savedWhereTrace;
1782 #endif
1783 }
1784
1785 /*
1786 ** Run a prepared statement
1787 */
1788 static void exec_prepared_stmt(
1789 ShellState *pArg, /* Pointer to ShellState */
1790 sqlite3_stmt *pStmt, /* Statment to run */
1791 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
1792 ){
1793 int rc;
1794
1795 /* perform the first step. this will tell us if we
1796 ** have a result set or not and how wide it is.
1797 */
1798 rc = sqlite3_step(pStmt);
1799 /* if we have a result set... */
1800 if( SQLITE_ROW == rc ){
1801 /* if we have a callback... */
1802 if( xCallback ){
1803 /* allocate space for col name ptr, value ptr, and type */
1804 int nCol = sqlite3_column_count(pStmt);
1805 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
1806 if( !pData ){
1807 rc = SQLITE_NOMEM;
1808 }else{
1809 char **azCols = (char **)pData; /* Names of result columns */
1810 char **azVals = &azCols[nCol]; /* Results */
1811 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1812 int i, x;
1813 assert(sizeof(int) <= sizeof(char *));
1814 /* save off ptrs to column names */
1815 for(i=0; i<nCol; i++){
1816 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1817 }
1818 do{
1819 /* extract the data and data types */
1820 for(i=0; i<nCol; i++){
1821 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
1822 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
1823 azVals[i] = "";
1824 }else{
1825 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1826 }
1827 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1828 rc = SQLITE_NOMEM;
1829 break; /* from for */
1830 }
1831 } /* end for */
1832
1833 /* if data and types extracted successfully... */
1834 if( SQLITE_ROW == rc ){
1835 /* call the supplied callback with the result row data */
1836 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1837 rc = SQLITE_ABORT;
1838 }else{
1839 rc = sqlite3_step(pStmt);
1840 }
1841 }
1842 } while( SQLITE_ROW == rc );
1843 sqlite3_free(pData);
1844 }
1845 }else{
1846 do{
1847 rc = sqlite3_step(pStmt);
1848 } while( rc == SQLITE_ROW );
1849 }
1850 }
1851 }
1852
1853 /*
1854 ** Execute a statement or set of statements. Print
1855 ** any result rows/columns depending on the current mode
1856 ** set via the supplied callback.
1857 **
1858 ** This is very similar to SQLite's built-in sqlite3_exec()
1859 ** function except it takes a slightly different callback
1860 ** and callback data argument.
1861 */
1862 static int shell_exec(
1863 sqlite3 *db, /* An open database */
1864 const char *zSql, /* SQL to be evaluated */
1865 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
1866 /* (not the same as sqlite3_exec) */
1867 ShellState *pArg, /* Pointer to ShellState */
1868 char **pzErrMsg /* Error msg written here */
1869 ){
1870 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1871 int rc = SQLITE_OK; /* Return Code */
1872 int rc2;
1873 const char *zLeftover; /* Tail of unprocessed SQL */
1874
1875 if( pzErrMsg ){
1876 *pzErrMsg = NULL;
1877 }
1878
1879 while( zSql[0] && (SQLITE_OK == rc) ){
1880 static const char *zStmtSql;
1881 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1882 if( SQLITE_OK != rc ){
1883 if( pzErrMsg ){
1884 *pzErrMsg = save_err_msg(db);
1885 }
1886 }else{
1887 if( !pStmt ){
1888 /* this happens for a comment or white-space */
1889 zSql = zLeftover;
1890 while( IsSpace(zSql[0]) ) zSql++;
1891 continue;
1892 }
1893 zStmtSql = sqlite3_sql(pStmt);
1894 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
1895
1896 /* save off the prepared statment handle and reset row count */
1897 if( pArg ){
1898 pArg->pStmt = pStmt;
1899 pArg->cnt = 0;
1900 }
1901
1902 /* echo the sql statement if echo on */
1903 if( pArg && pArg->echoOn ){
1904 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
1905 }
1906
1907 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1908 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
1909 sqlite3_stmt *pExplain;
1910 char *zEQP;
1911 disable_debug_trace_modes();
1912 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
1913 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1914 if( rc==SQLITE_OK ){
1915 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1916 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
1917 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1918 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1919 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1920 }
1921 }
1922 sqlite3_finalize(pExplain);
1923 sqlite3_free(zEQP);
1924 if( pArg->autoEQP>=2 ){
1925 /* Also do an EXPLAIN for ".eqp full" mode */
1926 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
1927 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1928 if( rc==SQLITE_OK ){
1929 pArg->cMode = MODE_Explain;
1930 explain_data_prepare(pArg, pExplain);
1931 exec_prepared_stmt(pArg, pExplain, xCallback);
1932 explain_data_delete(pArg);
1933 }
1934 sqlite3_finalize(pExplain);
1935 sqlite3_free(zEQP);
1936 }
1937 restore_debug_trace_modes();
1938 }
1939
1940 if( pArg ){
1941 pArg->cMode = pArg->mode;
1942 if( pArg->autoExplain
1943 && sqlite3_column_count(pStmt)==8
1944 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
1945 ){
1946 pArg->cMode = MODE_Explain;
1947 }
1948
1949 /* If the shell is currently in ".explain" mode, gather the extra
1950 ** data required to add indents to the output.*/
1951 if( pArg->cMode==MODE_Explain ){
1952 explain_data_prepare(pArg, pStmt);
1953 }
1954 }
1955
1956 exec_prepared_stmt(pArg, pStmt, xCallback);
1957 explain_data_delete(pArg);
1958
1959 /* print usage stats if stats on */
1960 if( pArg && pArg->statsOn ){
1961 display_stats(db, pArg, 0);
1962 }
1963
1964 /* print loop-counters if required */
1965 if( pArg && pArg->scanstatsOn ){
1966 display_scanstats(db, pArg);
1967 }
1968
1969 /* Finalize the statement just executed. If this fails, save a
1970 ** copy of the error message. Otherwise, set zSql to point to the
1971 ** next statement to execute. */
1972 rc2 = sqlite3_finalize(pStmt);
1973 if( rc!=SQLITE_NOMEM ) rc = rc2;
1974 if( rc==SQLITE_OK ){
1975 zSql = zLeftover;
1976 while( IsSpace(zSql[0]) ) zSql++;
1977 }else if( pzErrMsg ){
1978 *pzErrMsg = save_err_msg(db);
1979 }
1980
1981 /* clear saved stmt handle */
1982 if( pArg ){
1983 pArg->pStmt = NULL;
1984 }
1985 }
1986 } /* end while */
1987
1988 return rc;
1989 }
1990
1991
1992 /*
1993 ** This is a different callback routine used for dumping the database.
1994 ** Each row received by this callback consists of a table name,
1995 ** the table type ("index" or "table") and SQL to create the table.
1996 ** This routine should print text sufficient to recreate the table.
1997 */
1998 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
1999 int rc;
2000 const char *zTable;
2001 const char *zType;
2002 const char *zSql;
2003 const char *zPrepStmt = 0;
2004 ShellState *p = (ShellState *)pArg;
2005
2006 UNUSED_PARAMETER(azCol);
2007 if( nArg!=3 ) return 1;
2008 zTable = azArg[0];
2009 zType = azArg[1];
2010 zSql = azArg[2];
2011
2012 if( strcmp(zTable, "sqlite_sequence")==0 ){
2013 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
2014 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
2015 raw_printf(p->out, "ANALYZE sqlite_master;\n");
2016 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2017 return 0;
2018 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2019 char *zIns;
2020 if( !p->writableSchema ){
2021 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
2022 p->writableSchema = 1;
2023 }
2024 zIns = sqlite3_mprintf(
2025 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2026 "VALUES('table','%q','%q',0,'%q');",
2027 zTable, zTable, zSql);
2028 utf8_printf(p->out, "%s\n", zIns);
2029 sqlite3_free(zIns);
2030 return 0;
2031 }else{
2032 utf8_printf(p->out, "%s;\n", zSql);
2033 }
2034
2035 if( strcmp(zType, "table")==0 ){
2036 sqlite3_stmt *pTableInfo = 0;
2037 char *zSelect = 0;
2038 char *zTableInfo = 0;
2039 char *zTmp = 0;
2040 int nRow = 0;
2041
2042 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
2043 zTableInfo = appendText(zTableInfo, zTable, '"');
2044 zTableInfo = appendText(zTableInfo, ");", 0);
2045
2046 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
2047 free(zTableInfo);
2048 if( rc!=SQLITE_OK || !pTableInfo ){
2049 return 1;
2050 }
2051
2052 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
2053 /* Always quote the table name, even if it appears to be pure ascii,
2054 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
2055 zTmp = appendText(zTmp, zTable, '"');
2056 if( zTmp ){
2057 zSelect = appendText(zSelect, zTmp, '\'');
2058 free(zTmp);
2059 }
2060 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
2061 rc = sqlite3_step(pTableInfo);
2062 while( rc==SQLITE_ROW ){
2063 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
2064 zSelect = appendText(zSelect, "quote(", 0);
2065 zSelect = appendText(zSelect, zText, '"');
2066 rc = sqlite3_step(pTableInfo);
2067 if( rc==SQLITE_ROW ){
2068 zSelect = appendText(zSelect, "), ", 0);
2069 }else{
2070 zSelect = appendText(zSelect, ") ", 0);
2071 }
2072 nRow++;
2073 }
2074 rc = sqlite3_finalize(pTableInfo);
2075 if( rc!=SQLITE_OK || nRow==0 ){
2076 free(zSelect);
2077 return 1;
2078 }
2079 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
2080 zSelect = appendText(zSelect, zTable, '"');
2081
2082 rc = run_table_dump_query(p, zSelect, zPrepStmt);
2083 if( rc==SQLITE_CORRUPT ){
2084 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
2085 run_table_dump_query(p, zSelect, 0);
2086 }
2087 free(zSelect);
2088 }
2089 return 0;
2090 }
2091
2092 /*
2093 ** Run zQuery. Use dump_callback() as the callback routine so that
2094 ** the contents of the query are output as SQL statements.
2095 **
2096 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
2097 ** "ORDER BY rowid DESC" to the end.
2098 */
2099 static int run_schema_dump_query(
2100 ShellState *p,
2101 const char *zQuery
2102 ){
2103 int rc;
2104 char *zErr = 0;
2105 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
2106 if( rc==SQLITE_CORRUPT ){
2107 char *zQ2;
2108 int len = strlen30(zQuery);
2109 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
2110 if( zErr ){
2111 utf8_printf(p->out, "/****** %s ******/\n", zErr);
2112 sqlite3_free(zErr);
2113 zErr = 0;
2114 }
2115 zQ2 = malloc( len+100 );
2116 if( zQ2==0 ) return rc;
2117 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
2118 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
2119 if( rc ){
2120 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
2121 }else{
2122 rc = SQLITE_CORRUPT;
2123 }
2124 sqlite3_free(zErr);
2125 free(zQ2);
2126 }
2127 return rc;
2128 }
2129
2130 /*
2131 ** Text of a help message
2132 */
2133 static char zHelp[] =
2134 ".auth ON|OFF Show authorizer callbacks\n"
2135 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
2136 ".bail on|off Stop after hitting an error. Default OFF\n"
2137 ".binary on|off Turn binary output on or off. Default OFF\n"
2138 ".changes on|off Show number of rows changed by SQL\n"
2139 ".clone NEWDB Clone data into NEWDB from the existing database\n"
2140 ".databases List names and files of attached databases\n"
2141 ".dbinfo ?DB? Show status information about the database\n"
2142 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
2143 " If TABLE specified, only dump tables matching\n"
2144 " LIKE pattern TABLE.\n"
2145 ".echo on|off Turn command echo on or off\n"
2146 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
2147 ".exit Exit this program\n"
2148 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
2149 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
2150 ".headers on|off Turn display of headers on or off\n"
2151 ".help Show this message\n"
2152 ".import FILE TABLE Import data from FILE into TABLE\n"
2153 ".indexes ?TABLE? Show names of all indexes\n"
2154 " If TABLE specified, only show indexes for tables\n"
2155 " matching LIKE pattern TABLE.\n"
2156 #ifdef SQLITE_ENABLE_IOTRACE
2157 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
2158 #endif
2159 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
2160 #ifndef SQLITE_OMIT_LOAD_EXTENSION
2161 ".load FILE ?ENTRY? Load an extension library\n"
2162 #endif
2163 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
2164 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
2165 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
2166 " csv Comma-separated values\n"
2167 " column Left-aligned columns. (See .width)\n"
2168 " html HTML <table> code\n"
2169 " insert SQL insert statements for TABLE\n"
2170 " line One value per line\n"
2171 " list Values delimited by .separator strings\n"
2172 " tabs Tab-separated values\n"
2173 " tcl TCL list elements\n"
2174 ".nullvalue STRING Use STRING in place of NULL values\n"
2175 ".once FILENAME Output for the next SQL command only to FILENAME\n"
2176 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
2177 ".output ?FILENAME? Send output to FILENAME or stdout\n"
2178 ".print STRING... Print literal STRING\n"
2179 ".prompt MAIN CONTINUE Replace the standard prompts\n"
2180 ".quit Exit this program\n"
2181 ".read FILENAME Execute SQL in FILENAME\n"
2182 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
2183 ".save FILE Write in-memory database into FILE\n"
2184 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
2185 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
2186 " Add --indent for pretty-printing\n"
2187 ".separator COL ?ROW? Change the column separator and optionally the row\n"
2188 " separator for both the output mode and .import\n"
2189 #if defined(SQLITE_ENABLE_SESSION)
2190 ".session CMD ... Create or control sessions\n"
2191 #endif
2192 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
2193 ".show Show the current values for various settings\n"
2194 ".stats ?on|off? Show stats or turn stats on or off\n"
2195 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
2196 ".tables ?TABLE? List names of tables\n"
2197 " If TABLE specified, only list tables matching\n"
2198 " LIKE pattern TABLE.\n"
2199 ".timeout MS Try opening locked tables for MS milliseconds\n"
2200 ".timer on|off Turn SQL timer on or off\n"
2201 ".trace FILE|off Output each SQL statement as it is run\n"
2202 ".vfsinfo ?AUX? Information about the top-level VFS\n"
2203 ".vfslist List all available VFSes\n"
2204 ".vfsname ?AUX? Print the name of the VFS stack\n"
2205 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
2206 " Negative values right-justify\n"
2207 ;
2208
2209 #if defined(SQLITE_ENABLE_SESSION)
2210 /*
2211 ** Print help information for the ".sessions" command
2212 */
2213 void session_help(ShellState *p){
2214 raw_printf(p->out,
2215 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
2216 "If ?NAME? is omitted, the first defined session is used.\n"
2217 "Subcommands:\n"
2218 " attach TABLE Attach TABLE\n"
2219 " changeset FILE Write a changeset into FILE\n"
2220 " close Close one session\n"
2221 " enable ?BOOLEAN? Set or query the enable bit\n"
2222 " filter GLOB... Reject tables matching GLOBs\n"
2223 " indirect ?BOOLEAN? Mark or query the indirect status\n"
2224 " isempty Query whether the session is empty\n"
2225 " list List currently open session names\n"
2226 " open DB NAME Open a new session on DB\n"
2227 " patchset FILE Write a patchset into FILE\n"
2228 );
2229 }
2230 #endif
2231
2232
2233 /* Forward reference */
2234 static int process_input(ShellState *p, FILE *in);
2235 /*
2236 ** Implementation of the "readfile(X)" SQL function. The entire content
2237 ** of the file named X is read and returned as a BLOB. NULL is returned
2238 ** if the file does not exist or is unreadable.
2239 */
2240 static void readfileFunc(
2241 sqlite3_context *context,
2242 int argc,
2243 sqlite3_value **argv
2244 ){
2245 const char *zName;
2246 FILE *in;
2247 long nIn;
2248 void *pBuf;
2249
2250 UNUSED_PARAMETER(argc);
2251 zName = (const char*)sqlite3_value_text(argv[0]);
2252 if( zName==0 ) return;
2253 in = fopen(zName, "rb");
2254 if( in==0 ) return;
2255 fseek(in, 0, SEEK_END);
2256 nIn = ftell(in);
2257 rewind(in);
2258 pBuf = sqlite3_malloc64( nIn );
2259 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
2260 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
2261 }else{
2262 sqlite3_free(pBuf);
2263 }
2264 fclose(in);
2265 }
2266
2267 /*
2268 ** Implementation of the "writefile(X,Y)" SQL function. The argument Y
2269 ** is written into file X. The number of bytes written is returned. Or
2270 ** NULL is returned if something goes wrong, such as being unable to open
2271 ** file X for writing.
2272 */
2273 static void writefileFunc(
2274 sqlite3_context *context,
2275 int argc,
2276 sqlite3_value **argv
2277 ){
2278 FILE *out;
2279 const char *z;
2280 sqlite3_int64 rc;
2281 const char *zFile;
2282
2283 UNUSED_PARAMETER(argc);
2284 zFile = (const char*)sqlite3_value_text(argv[0]);
2285 if( zFile==0 ) return;
2286 out = fopen(zFile, "wb");
2287 if( out==0 ) return;
2288 z = (const char*)sqlite3_value_blob(argv[1]);
2289 if( z==0 ){
2290 rc = 0;
2291 }else{
2292 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
2293 }
2294 fclose(out);
2295 sqlite3_result_int64(context, rc);
2296 }
2297
2298 #if defined(SQLITE_ENABLE_SESSION)
2299 /*
2300 ** Close a single OpenSession object and release all of its associated
2301 ** resources.
2302 */
2303 static void session_close(OpenSession *pSession){
2304 int i;
2305 sqlite3session_delete(pSession->p);
2306 sqlite3_free(pSession->zName);
2307 for(i=0; i<pSession->nFilter; i++){
2308 sqlite3_free(pSession->azFilter[i]);
2309 }
2310 sqlite3_free(pSession->azFilter);
2311 memset(pSession, 0, sizeof(OpenSession));
2312 }
2313 #endif
2314
2315 /*
2316 ** Close all OpenSession objects and release all associated resources.
2317 */
2318 #if defined(SQLITE_ENABLE_SESSION)
2319 static void session_close_all(ShellState *p){
2320 int i;
2321 for(i=0; i<p->nSession; i++){
2322 session_close(&p->aSession[i]);
2323 }
2324 p->nSession = 0;
2325 }
2326 #else
2327 # define session_close_all(X)
2328 #endif
2329
2330 /*
2331 ** Implementation of the xFilter function for an open session. Omit
2332 ** any tables named by ".session filter" but let all other table through.
2333 */
2334 #if defined(SQLITE_ENABLE_SESSION)
2335 static int session_filter(void *pCtx, const char *zTab){
2336 OpenSession *pSession = (OpenSession*)pCtx;
2337 int i;
2338 for(i=0; i<pSession->nFilter; i++){
2339 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
2340 }
2341 return 1;
2342 }
2343 #endif
2344
2345 /*
2346 ** Make sure the database is open. If it is not, then open it. If
2347 ** the database fails to open, print an error message and exit.
2348 */
2349 static void open_db(ShellState *p, int keepAlive){
2350 if( p->db==0 ){
2351 sqlite3_initialize();
2352 sqlite3_open(p->zDbFilename, &p->db);
2353 globalDb = p->db;
2354 if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
2355 sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
2356 shellstaticFunc, 0, 0);
2357 }
2358 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
2359 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
2360 p->zDbFilename, sqlite3_errmsg(p->db));
2361 if( keepAlive ) return;
2362 exit(1);
2363 }
2364 #ifndef SQLITE_OMIT_LOAD_EXTENSION
2365 sqlite3_enable_load_extension(p->db, 1);
2366 #endif
2367 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
2368 readfileFunc, 0, 0);
2369 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
2370 writefileFunc, 0, 0);
2371 }
2372 }
2373
2374 /*
2375 ** Do C-language style dequoting.
2376 **
2377 ** \a -> alarm
2378 ** \b -> backspace
2379 ** \t -> tab
2380 ** \n -> newline
2381 ** \v -> vertical tab
2382 ** \f -> form feed
2383 ** \r -> carriage return
2384 ** \s -> space
2385 ** \" -> "
2386 ** \' -> '
2387 ** \\ -> backslash
2388 ** \NNN -> ascii character NNN in octal
2389 */
2390 static void resolve_backslashes(char *z){
2391 int i, j;
2392 char c;
2393 while( *z && *z!='\\' ) z++;
2394 for(i=j=0; (c = z[i])!=0; i++, j++){
2395 if( c=='\\' && z[i+1]!=0 ){
2396 c = z[++i];
2397 if( c=='a' ){
2398 c = '\a';
2399 }else if( c=='b' ){
2400 c = '\b';
2401 }else if( c=='t' ){
2402 c = '\t';
2403 }else if( c=='n' ){
2404 c = '\n';
2405 }else if( c=='v' ){
2406 c = '\v';
2407 }else if( c=='f' ){
2408 c = '\f';
2409 }else if( c=='r' ){
2410 c = '\r';
2411 }else if( c=='"' ){
2412 c = '"';
2413 }else if( c=='\'' ){
2414 c = '\'';
2415 }else if( c=='\\' ){
2416 c = '\\';
2417 }else if( c>='0' && c<='7' ){
2418 c -= '0';
2419 if( z[i+1]>='0' && z[i+1]<='7' ){
2420 i++;
2421 c = (c<<3) + z[i] - '0';
2422 if( z[i+1]>='0' && z[i+1]<='7' ){
2423 i++;
2424 c = (c<<3) + z[i] - '0';
2425 }
2426 }
2427 }
2428 }
2429 z[j] = c;
2430 }
2431 if( j<i ) z[j] = 0;
2432 }
2433
2434 /*
2435 ** Return the value of a hexadecimal digit. Return -1 if the input
2436 ** is not a hex digit.
2437 */
2438 static int hexDigitValue(char c){
2439 if( c>='0' && c<='9' ) return c - '0';
2440 if( c>='a' && c<='f' ) return c - 'a' + 10;
2441 if( c>='A' && c<='F' ) return c - 'A' + 10;
2442 return -1;
2443 }
2444
2445 /*
2446 ** Interpret zArg as an integer value, possibly with suffixes.
2447 */
2448 static sqlite3_int64 integerValue(const char *zArg){
2449 sqlite3_int64 v = 0;
2450 static const struct { char *zSuffix; int iMult; } aMult[] = {
2451 { "KiB", 1024 },
2452 { "MiB", 1024*1024 },
2453 { "GiB", 1024*1024*1024 },
2454 { "KB", 1000 },
2455 { "MB", 1000000 },
2456 { "GB", 1000000000 },
2457 { "K", 1000 },
2458 { "M", 1000000 },
2459 { "G", 1000000000 },
2460 };
2461 int i;
2462 int isNeg = 0;
2463 if( zArg[0]=='-' ){
2464 isNeg = 1;
2465 zArg++;
2466 }else if( zArg[0]=='+' ){
2467 zArg++;
2468 }
2469 if( zArg[0]=='0' && zArg[1]=='x' ){
2470 int x;
2471 zArg += 2;
2472 while( (x = hexDigitValue(zArg[0]))>=0 ){
2473 v = (v<<4) + x;
2474 zArg++;
2475 }
2476 }else{
2477 while( IsDigit(zArg[0]) ){
2478 v = v*10 + zArg[0] - '0';
2479 zArg++;
2480 }
2481 }
2482 for(i=0; i<ArraySize(aMult); i++){
2483 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2484 v *= aMult[i].iMult;
2485 break;
2486 }
2487 }
2488 return isNeg? -v : v;
2489 }
2490
2491 /*
2492 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2493 ** for TRUE and FALSE. Return the integer value if appropriate.
2494 */
2495 static int booleanValue(char *zArg){
2496 int i;
2497 if( zArg[0]=='0' && zArg[1]=='x' ){
2498 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2499 }else{
2500 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2501 }
2502 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2503 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2504 return 1;
2505 }
2506 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2507 return 0;
2508 }
2509 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2510 zArg);
2511 return 0;
2512 }
2513
2514 /*
2515 ** Close an output file, assuming it is not stderr or stdout
2516 */
2517 static void output_file_close(FILE *f){
2518 if( f && f!=stdout && f!=stderr ) fclose(f);
2519 }
2520
2521 /*
2522 ** Try to open an output file. The names "stdout" and "stderr" are
2523 ** recognized and do the right thing. NULL is returned if the output
2524 ** filename is "off".
2525 */
2526 static FILE *output_file_open(const char *zFile){
2527 FILE *f;
2528 if( strcmp(zFile,"stdout")==0 ){
2529 f = stdout;
2530 }else if( strcmp(zFile, "stderr")==0 ){
2531 f = stderr;
2532 }else if( strcmp(zFile, "off")==0 ){
2533 f = 0;
2534 }else{
2535 f = fopen(zFile, "wb");
2536 if( f==0 ){
2537 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
2538 }
2539 }
2540 return f;
2541 }
2542
2543 /*
2544 ** A routine for handling output from sqlite3_trace().
2545 */
2546 static void sql_trace_callback(void *pArg, const char *z){
2547 FILE *f = (FILE*)pArg;
2548 if( f ){
2549 int i = (int)strlen(z);
2550 while( i>0 && z[i-1]==';' ){ i--; }
2551 utf8_printf(f, "%.*s;\n", i, z);
2552 }
2553 }
2554
2555 /*
2556 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
2557 ** a useful spot to set a debugger breakpoint.
2558 */
2559 static void test_breakpoint(void){
2560 static int nCall = 0;
2561 nCall++;
2562 }
2563
2564 /*
2565 ** An object used to read a CSV and other files for import.
2566 */
2567 typedef struct ImportCtx ImportCtx;
2568 struct ImportCtx {
2569 const char *zFile; /* Name of the input file */
2570 FILE *in; /* Read the CSV text from this input stream */
2571 char *z; /* Accumulated text for a field */
2572 int n; /* Number of bytes in z */
2573 int nAlloc; /* Space allocated for z[] */
2574 int nLine; /* Current line number */
2575 int cTerm; /* Character that terminated the most recent field */
2576 int cColSep; /* The column separator character. (Usually ",") */
2577 int cRowSep; /* The row separator character. (Usually "\n") */
2578 };
2579
2580 /* Append a single byte to z[] */
2581 static void import_append_char(ImportCtx *p, int c){
2582 if( p->n+1>=p->nAlloc ){
2583 p->nAlloc += p->nAlloc + 100;
2584 p->z = sqlite3_realloc64(p->z, p->nAlloc);
2585 if( p->z==0 ){
2586 raw_printf(stderr, "out of memory\n");
2587 exit(1);
2588 }
2589 }
2590 p->z[p->n++] = (char)c;
2591 }
2592
2593 /* Read a single field of CSV text. Compatible with rfc4180 and extended
2594 ** with the option of having a separator other than ",".
2595 **
2596 ** + Input comes from p->in.
2597 ** + Store results in p->z of length p->n. Space to hold p->z comes
2598 ** from sqlite3_malloc64().
2599 ** + Use p->cSep as the column separator. The default is ",".
2600 ** + Use p->rSep as the row separator. The default is "\n".
2601 ** + Keep track of the line number in p->nLine.
2602 ** + Store the character that terminates the field in p->cTerm. Store
2603 ** EOF on end-of-file.
2604 ** + Report syntax errors on stderr
2605 */
2606 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
2607 int c;
2608 int cSep = p->cColSep;
2609 int rSep = p->cRowSep;
2610 p->n = 0;
2611 c = fgetc(p->in);
2612 if( c==EOF || seenInterrupt ){
2613 p->cTerm = EOF;
2614 return 0;
2615 }
2616 if( c=='"' ){
2617 int pc, ppc;
2618 int startLine = p->nLine;
2619 int cQuote = c;
2620 pc = ppc = 0;
2621 while( 1 ){
2622 c = fgetc(p->in);
2623 if( c==rSep ) p->nLine++;
2624 if( c==cQuote ){
2625 if( pc==cQuote ){
2626 pc = 0;
2627 continue;
2628 }
2629 }
2630 if( (c==cSep && pc==cQuote)
2631 || (c==rSep && pc==cQuote)
2632 || (c==rSep && pc=='\r' && ppc==cQuote)
2633 || (c==EOF && pc==cQuote)
2634 ){
2635 do{ p->n--; }while( p->z[p->n]!=cQuote );
2636 p->cTerm = c;
2637 break;
2638 }
2639 if( pc==cQuote && c!='\r' ){
2640 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
2641 p->zFile, p->nLine, cQuote);
2642 }
2643 if( c==EOF ){
2644 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
2645 p->zFile, startLine, cQuote);
2646 p->cTerm = c;
2647 break;
2648 }
2649 import_append_char(p, c);
2650 ppc = pc;
2651 pc = c;
2652 }
2653 }else{
2654 while( c!=EOF && c!=cSep && c!=rSep ){
2655 import_append_char(p, c);
2656 c = fgetc(p->in);
2657 }
2658 if( c==rSep ){
2659 p->nLine++;
2660 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
2661 }
2662 p->cTerm = c;
2663 }
2664 if( p->z ) p->z[p->n] = 0;
2665 return p->z;
2666 }
2667
2668 /* Read a single field of ASCII delimited text.
2669 **
2670 ** + Input comes from p->in.
2671 ** + Store results in p->z of length p->n. Space to hold p->z comes
2672 ** from sqlite3_malloc64().
2673 ** + Use p->cSep as the column separator. The default is "\x1F".
2674 ** + Use p->rSep as the row separator. The default is "\x1E".
2675 ** + Keep track of the row number in p->nLine.
2676 ** + Store the character that terminates the field in p->cTerm. Store
2677 ** EOF on end-of-file.
2678 ** + Report syntax errors on stderr
2679 */
2680 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
2681 int c;
2682 int cSep = p->cColSep;
2683 int rSep = p->cRowSep;
2684 p->n = 0;
2685 c = fgetc(p->in);
2686 if( c==EOF || seenInterrupt ){
2687 p->cTerm = EOF;
2688 return 0;
2689 }
2690 while( c!=EOF && c!=cSep && c!=rSep ){
2691 import_append_char(p, c);
2692 c = fgetc(p->in);
2693 }
2694 if( c==rSep ){
2695 p->nLine++;
2696 }
2697 p->cTerm = c;
2698 if( p->z ) p->z[p->n] = 0;
2699 return p->z;
2700 }
2701
2702 /*
2703 ** Try to transfer data for table zTable. If an error is seen while
2704 ** moving forward, try to go backwards. The backwards movement won't
2705 ** work for WITHOUT ROWID tables.
2706 */
2707 static void tryToCloneData(
2708 ShellState *p,
2709 sqlite3 *newDb,
2710 const char *zTable
2711 ){
2712 sqlite3_stmt *pQuery = 0;
2713 sqlite3_stmt *pInsert = 0;
2714 char *zQuery = 0;
2715 char *zInsert = 0;
2716 int rc;
2717 int i, j, n;
2718 int nTable = (int)strlen(zTable);
2719 int k = 0;
2720 int cnt = 0;
2721 const int spinRate = 10000;
2722
2723 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2724 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2725 if( rc ){
2726 utf8_printf(stderr, "Error %d: %s on [%s]\n",
2727 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2728 zQuery);
2729 goto end_data_xfer;
2730 }
2731 n = sqlite3_column_count(pQuery);
2732 zInsert = sqlite3_malloc64(200 + nTable + n*3);
2733 if( zInsert==0 ){
2734 raw_printf(stderr, "out of memory\n");
2735 goto end_data_xfer;
2736 }
2737 sqlite3_snprintf(200+nTable,zInsert,
2738 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2739 i = (int)strlen(zInsert);
2740 for(j=1; j<n; j++){
2741 memcpy(zInsert+i, ",?", 2);
2742 i += 2;
2743 }
2744 memcpy(zInsert+i, ");", 3);
2745 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2746 if( rc ){
2747 utf8_printf(stderr, "Error %d: %s on [%s]\n",
2748 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2749 zQuery);
2750 goto end_data_xfer;
2751 }
2752 for(k=0; k<2; k++){
2753 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2754 for(i=0; i<n; i++){
2755 switch( sqlite3_column_type(pQuery, i) ){
2756 case SQLITE_NULL: {
2757 sqlite3_bind_null(pInsert, i+1);
2758 break;
2759 }
2760 case SQLITE_INTEGER: {
2761 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2762 break;
2763 }
2764 case SQLITE_FLOAT: {
2765 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2766 break;
2767 }
2768 case SQLITE_TEXT: {
2769 sqlite3_bind_text(pInsert, i+1,
2770 (const char*)sqlite3_column_text(pQuery,i),
2771 -1, SQLITE_STATIC);
2772 break;
2773 }
2774 case SQLITE_BLOB: {
2775 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2776 sqlite3_column_bytes(pQuery,i),
2777 SQLITE_STATIC);
2778 break;
2779 }
2780 }
2781 } /* End for */
2782 rc = sqlite3_step(pInsert);
2783 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2784 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2785 sqlite3_errmsg(newDb));
2786 }
2787 sqlite3_reset(pInsert);
2788 cnt++;
2789 if( (cnt%spinRate)==0 ){
2790 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2791 fflush(stdout);
2792 }
2793 } /* End while */
2794 if( rc==SQLITE_DONE ) break;
2795 sqlite3_finalize(pQuery);
2796 sqlite3_free(zQuery);
2797 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2798 zTable);
2799 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2800 if( rc ){
2801 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2802 break;
2803 }
2804 } /* End for(k=0...) */
2805
2806 end_data_xfer:
2807 sqlite3_finalize(pQuery);
2808 sqlite3_finalize(pInsert);
2809 sqlite3_free(zQuery);
2810 sqlite3_free(zInsert);
2811 }
2812
2813
2814 /*
2815 ** Try to transfer all rows of the schema that match zWhere. For
2816 ** each row, invoke xForEach() on the object defined by that row.
2817 ** If an error is encountered while moving forward through the
2818 ** sqlite_master table, try again moving backwards.
2819 */
2820 static void tryToCloneSchema(
2821 ShellState *p,
2822 sqlite3 *newDb,
2823 const char *zWhere,
2824 void (*xForEach)(ShellState*,sqlite3*,const char*)
2825 ){
2826 sqlite3_stmt *pQuery = 0;
2827 char *zQuery = 0;
2828 int rc;
2829 const unsigned char *zName;
2830 const unsigned char *zSql;
2831 char *zErrMsg = 0;
2832
2833 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2834 " WHERE %s", zWhere);
2835 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2836 if( rc ){
2837 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
2838 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2839 zQuery);
2840 goto end_schema_xfer;
2841 }
2842 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2843 zName = sqlite3_column_text(pQuery, 0);
2844 zSql = sqlite3_column_text(pQuery, 1);
2845 printf("%s... ", zName); fflush(stdout);
2846 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2847 if( zErrMsg ){
2848 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2849 sqlite3_free(zErrMsg);
2850 zErrMsg = 0;
2851 }
2852 if( xForEach ){
2853 xForEach(p, newDb, (const char*)zName);
2854 }
2855 printf("done\n");
2856 }
2857 if( rc!=SQLITE_DONE ){
2858 sqlite3_finalize(pQuery);
2859 sqlite3_free(zQuery);
2860 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2861 " WHERE %s ORDER BY rowid DESC", zWhere);
2862 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2863 if( rc ){
2864 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
2865 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2866 zQuery);
2867 goto end_schema_xfer;
2868 }
2869 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2870 zName = sqlite3_column_text(pQuery, 0);
2871 zSql = sqlite3_column_text(pQuery, 1);
2872 printf("%s... ", zName); fflush(stdout);
2873 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2874 if( zErrMsg ){
2875 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2876 sqlite3_free(zErrMsg);
2877 zErrMsg = 0;
2878 }
2879 if( xForEach ){
2880 xForEach(p, newDb, (const char*)zName);
2881 }
2882 printf("done\n");
2883 }
2884 }
2885 end_schema_xfer:
2886 sqlite3_finalize(pQuery);
2887 sqlite3_free(zQuery);
2888 }
2889
2890 /*
2891 ** Open a new database file named "zNewDb". Try to recover as much information
2892 ** as possible out of the main database (which might be corrupt) and write it
2893 ** into zNewDb.
2894 */
2895 static void tryToClone(ShellState *p, const char *zNewDb){
2896 int rc;
2897 sqlite3 *newDb = 0;
2898 if( access(zNewDb,0)==0 ){
2899 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
2900 return;
2901 }
2902 rc = sqlite3_open(zNewDb, &newDb);
2903 if( rc ){
2904 utf8_printf(stderr, "Cannot create output database: %s\n",
2905 sqlite3_errmsg(newDb));
2906 }else{
2907 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
2908 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
2909 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2910 tryToCloneSchema(p, newDb, "type!='table'", 0);
2911 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2912 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2913 }
2914 sqlite3_close(newDb);
2915 }
2916
2917 /*
2918 ** Change the output file back to stdout
2919 */
2920 static void output_reset(ShellState *p){
2921 if( p->outfile[0]=='|' ){
2922 #ifndef SQLITE_OMIT_POPEN
2923 pclose(p->out);
2924 #endif
2925 }else{
2926 output_file_close(p->out);
2927 }
2928 p->outfile[0] = 0;
2929 p->out = stdout;
2930 }
2931
2932 /*
2933 ** Run an SQL command and return the single integer result.
2934 */
2935 static int db_int(ShellState *p, const char *zSql){
2936 sqlite3_stmt *pStmt;
2937 int res = 0;
2938 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2939 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2940 res = sqlite3_column_int(pStmt,0);
2941 }
2942 sqlite3_finalize(pStmt);
2943 return res;
2944 }
2945
2946 /*
2947 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
2948 */
2949 unsigned int get2byteInt(unsigned char *a){
2950 return (a[0]<<8) + a[1];
2951 }
2952 unsigned int get4byteInt(unsigned char *a){
2953 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2954 }
2955
2956 /*
2957 ** Implementation of the ".info" command.
2958 **
2959 ** Return 1 on error, 2 to exit, and 0 otherwise.
2960 */
2961 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
2962 static const struct { const char *zName; int ofst; } aField[] = {
2963 { "file change counter:", 24 },
2964 { "database page count:", 28 },
2965 { "freelist page count:", 36 },
2966 { "schema cookie:", 40 },
2967 { "schema format:", 44 },
2968 { "default cache size:", 48 },
2969 { "autovacuum top root:", 52 },
2970 { "incremental vacuum:", 64 },
2971 { "text encoding:", 56 },
2972 { "user version:", 60 },
2973 { "application id:", 68 },
2974 { "software version:", 96 },
2975 };
2976 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2977 { "number of tables:",
2978 "SELECT count(*) FROM %s WHERE type='table'" },
2979 { "number of indexes:",
2980 "SELECT count(*) FROM %s WHERE type='index'" },
2981 { "number of triggers:",
2982 "SELECT count(*) FROM %s WHERE type='trigger'" },
2983 { "number of views:",
2984 "SELECT count(*) FROM %s WHERE type='view'" },
2985 { "schema size:",
2986 "SELECT total(length(sql)) FROM %s" },
2987 };
2988 sqlite3_file *pFile = 0;
2989 int i;
2990 char *zSchemaTab;
2991 char *zDb = nArg>=2 ? azArg[1] : "main";
2992 unsigned char aHdr[100];
2993 open_db(p, 0);
2994 if( p->db==0 ) return 1;
2995 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
2996 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2997 return 1;
2998 }
2999 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
3000 if( i!=SQLITE_OK ){
3001 raw_printf(stderr, "unable to read database header\n");
3002 return 1;
3003 }
3004 i = get2byteInt(aHdr+16);
3005 if( i==1 ) i = 65536;
3006 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
3007 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
3008 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
3009 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
3010 for(i=0; i<ArraySize(aField); i++){
3011 int ofst = aField[i].ofst;
3012 unsigned int val = get4byteInt(aHdr + ofst);
3013 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
3014 switch( ofst ){
3015 case 56: {
3016 if( val==1 ) raw_printf(p->out, " (utf8)");
3017 if( val==2 ) raw_printf(p->out, " (utf16le)");
3018 if( val==3 ) raw_printf(p->out, " (utf16be)");
3019 }
3020 }
3021 raw_printf(p->out, "\n");
3022 }
3023 if( zDb==0 ){
3024 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
3025 }else if( strcmp(zDb,"temp")==0 ){
3026 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
3027 }else{
3028 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
3029 }
3030 for(i=0; i<ArraySize(aQuery); i++){
3031 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
3032 int val = db_int(p, zSql);
3033 sqlite3_free(zSql);
3034 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
3035 }
3036 sqlite3_free(zSchemaTab);
3037 return 0;
3038 }
3039
3040 /*
3041 ** Print the current sqlite3_errmsg() value to stderr and return 1.
3042 */
3043 static int shellDatabaseError(sqlite3 *db){
3044 const char *zErr = sqlite3_errmsg(db);
3045 utf8_printf(stderr, "Error: %s\n", zErr);
3046 return 1;
3047 }
3048
3049 /*
3050 ** Print an out-of-memory message to stderr and return 1.
3051 */
3052 static int shellNomemError(void){
3053 raw_printf(stderr, "Error: out of memory\n");
3054 return 1;
3055 }
3056
3057 /*
3058 ** Compare the string as a command-line option with either one or two
3059 ** initial "-" characters.
3060 */
3061 static int optionMatch(const char *zStr, const char *zOpt){
3062 if( zStr[0]!='-' ) return 0;
3063 zStr++;
3064 if( zStr[0]=='-' ) zStr++;
3065 return strcmp(zStr, zOpt)==0;
3066 }
3067
3068 /*
3069 ** If an input line begins with "." then invoke this routine to
3070 ** process that line.
3071 **
3072 ** Return 1 on error, 2 to exit, and 0 otherwise.
3073 */
3074 static int do_meta_command(char *zLine, ShellState *p){
3075 int h = 1;
3076 int nArg = 0;
3077 int n, c;
3078 int rc = 0;
3079 char *azArg[50];
3080
3081 /* Parse the input line into tokens.
3082 */
3083 while( zLine[h] && nArg<ArraySize(azArg) ){
3084 while( IsSpace(zLine[h]) ){ h++; }
3085 if( zLine[h]==0 ) break;
3086 if( zLine[h]=='\'' || zLine[h]=='"' ){
3087 int delim = zLine[h++];
3088 azArg[nArg++] = &zLine[h];
3089 while( zLine[h] && zLine[h]!=delim ){
3090 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
3091 h++;
3092 }
3093 if( zLine[h]==delim ){
3094 zLine[h++] = 0;
3095 }
3096 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
3097 }else{
3098 azArg[nArg++] = &zLine[h];
3099 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
3100 if( zLine[h] ) zLine[h++] = 0;
3101 resolve_backslashes(azArg[nArg-1]);
3102 }
3103 }
3104
3105 /* Process the input line.
3106 */
3107 if( nArg==0 ) return 0; /* no tokens, no error */
3108 n = strlen30(azArg[0]);
3109 c = azArg[0][0];
3110
3111 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
3112 if( nArg!=2 ){
3113 raw_printf(stderr, "Usage: .auth ON|OFF\n");
3114 rc = 1;
3115 goto meta_command_exit;
3116 }
3117 open_db(p, 0);
3118 if( booleanValue(azArg[1]) ){
3119 sqlite3_set_authorizer(p->db, shellAuth, p);
3120 }else{
3121 sqlite3_set_authorizer(p->db, 0, 0);
3122 }
3123 }else
3124
3125 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
3126 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
3127 ){
3128 const char *zDestFile = 0;
3129 const char *zDb = 0;
3130 sqlite3 *pDest;
3131 sqlite3_backup *pBackup;
3132 int j;
3133 for(j=1; j<nArg; j++){
3134 const char *z = azArg[j];
3135 if( z[0]=='-' ){
3136 while( z[0]=='-' ) z++;
3137 /* No options to process at this time */
3138 {
3139 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
3140 return 1;
3141 }
3142 }else if( zDestFile==0 ){
3143 zDestFile = azArg[j];
3144 }else if( zDb==0 ){
3145 zDb = zDestFile;
3146 zDestFile = azArg[j];
3147 }else{
3148 raw_printf(stderr, "too many arguments to .backup\n");
3149 return 1;
3150 }
3151 }
3152 if( zDestFile==0 ){
3153 raw_printf(stderr, "missing FILENAME argument on .backup\n");
3154 return 1;
3155 }
3156 if( zDb==0 ) zDb = "main";
3157 rc = sqlite3_open(zDestFile, &pDest);
3158 if( rc!=SQLITE_OK ){
3159 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
3160 sqlite3_close(pDest);
3161 return 1;
3162 }
3163 open_db(p, 0);
3164 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
3165 if( pBackup==0 ){
3166 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
3167 sqlite3_close(pDest);
3168 return 1;
3169 }
3170 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
3171 sqlite3_backup_finish(pBackup);
3172 if( rc==SQLITE_DONE ){
3173 rc = 0;
3174 }else{
3175 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
3176 rc = 1;
3177 }
3178 sqlite3_close(pDest);
3179 }else
3180
3181 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
3182 if( nArg==2 ){
3183 bail_on_error = booleanValue(azArg[1]);
3184 }else{
3185 raw_printf(stderr, "Usage: .bail on|off\n");
3186 rc = 1;
3187 }
3188 }else
3189
3190 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
3191 if( nArg==2 ){
3192 if( booleanValue(azArg[1]) ){
3193 setBinaryMode(p->out, 1);
3194 }else{
3195 setTextMode(p->out, 1);
3196 }
3197 }else{
3198 raw_printf(stderr, "Usage: .binary on|off\n");
3199 rc = 1;
3200 }
3201 }else
3202
3203 /* The undocumented ".breakpoint" command causes a call to the no-op
3204 ** routine named test_breakpoint().
3205 */
3206 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
3207 test_breakpoint();
3208 }else
3209
3210 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
3211 if( nArg==2 ){
3212 p->countChanges = booleanValue(azArg[1]);
3213 }else{
3214 raw_printf(stderr, "Usage: .changes on|off\n");
3215 rc = 1;
3216 }
3217 }else
3218
3219 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
3220 if( nArg==2 ){
3221 tryToClone(p, azArg[1]);
3222 }else{
3223 raw_printf(stderr, "Usage: .clone FILENAME\n");
3224 rc = 1;
3225 }
3226 }else
3227
3228 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
3229 ShellState data;
3230 char *zErrMsg = 0;
3231 open_db(p, 0);
3232 memcpy(&data, p, sizeof(data));
3233 data.showHeader = 1;
3234 data.cMode = data.mode = MODE_Column;
3235 data.colWidth[0] = 3;
3236 data.colWidth[1] = 15;
3237 data.colWidth[2] = 58;
3238 data.cnt = 0;
3239 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
3240 if( zErrMsg ){
3241 utf8_printf(stderr,"Error: %s\n", zErrMsg);
3242 sqlite3_free(zErrMsg);
3243 rc = 1;
3244 }
3245 }else
3246
3247 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
3248 rc = shell_dbinfo_command(p, nArg, azArg);
3249 }else
3250
3251 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
3252 open_db(p, 0);
3253 /* When playing back a "dump", the content might appear in an order
3254 ** which causes immediate foreign key constraints to be violated.
3255 ** So disable foreign-key constraint enforcement to prevent problems. */
3256 if( nArg!=1 && nArg!=2 ){
3257 raw_printf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
3258 rc = 1;
3259 goto meta_command_exit;
3260 }
3261 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
3262 raw_printf(p->out, "BEGIN TRANSACTION;\n");
3263 p->writableSchema = 0;
3264 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
3265 p->nErr = 0;
3266 if( nArg==1 ){
3267 run_schema_dump_query(p,
3268 "SELECT name, type, sql FROM sqlite_master "
3269 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
3270 );
3271 run_schema_dump_query(p,
3272 "SELECT name, type, sql FROM sqlite_master "
3273 "WHERE name=='sqlite_sequence'"
3274 );
3275 run_table_dump_query(p,
3276 "SELECT sql FROM sqlite_master "
3277 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
3278 );
3279 }else{
3280 int i;
3281 for(i=1; i<nArg; i++){
3282 zShellStatic = azArg[i];
3283 run_schema_dump_query(p,
3284 "SELECT name, type, sql FROM sqlite_master "
3285 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
3286 " AND sql NOT NULL");
3287 run_table_dump_query(p,
3288 "SELECT sql FROM sqlite_master "
3289 "WHERE sql NOT NULL"
3290 " AND type IN ('index','trigger','view')"
3291 " AND tbl_name LIKE shellstatic()", 0
3292 );
3293 zShellStatic = 0;
3294 }
3295 }
3296 if( p->writableSchema ){
3297 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
3298 p->writableSchema = 0;
3299 }
3300 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
3301 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
3302 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
3303 }else
3304
3305 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
3306 if( nArg==2 ){
3307 p->echoOn = booleanValue(azArg[1]);
3308 }else{
3309 raw_printf(stderr, "Usage: .echo on|off\n");
3310 rc = 1;
3311 }
3312 }else
3313
3314 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
3315 if( nArg==2 ){
3316 if( strcmp(azArg[1],"full")==0 ){
3317 p->autoEQP = 2;
3318 }else{
3319 p->autoEQP = booleanValue(azArg[1]);
3320 }
3321 }else{
3322 raw_printf(stderr, "Usage: .eqp on|off|full\n");
3323 rc = 1;
3324 }
3325 }else
3326
3327 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
3328 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
3329 rc = 2;
3330 }else
3331
3332 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
3333 int val = 1;
3334 if( nArg>=2 ){
3335 if( strcmp(azArg[1],"auto")==0 ){
3336 val = 99;
3337 }else{
3338 val = booleanValue(azArg[1]);
3339 }
3340 }
3341 if( val==1 && p->mode!=MODE_Explain ){
3342 p->normalMode = p->mode;
3343 p->mode = MODE_Explain;
3344 p->autoExplain = 0;
3345 }else if( val==0 ){
3346 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
3347 p->autoExplain = 0;
3348 }else if( val==99 ){
3349 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
3350 p->autoExplain = 1;
3351 }
3352 }else
3353
3354 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
3355 ShellState data;
3356 char *zErrMsg = 0;
3357 int doStats = 0;
3358 memcpy(&data, p, sizeof(data));
3359 data.showHeader = 0;
3360 data.cMode = data.mode = MODE_Semi;
3361 if( nArg==2 && optionMatch(azArg[1], "indent") ){
3362 data.cMode = data.mode = MODE_Pretty;
3363 nArg = 1;
3364 }
3365 if( nArg!=1 ){
3366 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
3367 rc = 1;
3368 goto meta_command_exit;
3369 }
3370 open_db(p, 0);
3371 rc = sqlite3_exec(p->db,
3372 "SELECT sql FROM"
3373 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3374 " FROM sqlite_master UNION ALL"
3375 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
3376 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
3377 "ORDER BY rowid",
3378 callback, &data, &zErrMsg
3379 );
3380 if( rc==SQLITE_OK ){
3381 sqlite3_stmt *pStmt;
3382 rc = sqlite3_prepare_v2(p->db,
3383 "SELECT rowid FROM sqlite_master"
3384 " WHERE name GLOB 'sqlite_stat[134]'",
3385 -1, &pStmt, 0);
3386 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
3387 sqlite3_finalize(pStmt);
3388 }
3389 if( doStats==0 ){
3390 raw_printf(p->out, "/* No STAT tables available */\n");
3391 }else{
3392 raw_printf(p->out, "ANALYZE sqlite_master;\n");
3393 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
3394 callback, &data, &zErrMsg);
3395 data.cMode = data.mode = MODE_Insert;
3396 data.zDestTable = "sqlite_stat1";
3397 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
3398 shell_callback, &data,&zErrMsg);
3399 data.zDestTable = "sqlite_stat3";
3400 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
3401 shell_callback, &data,&zErrMsg);
3402 data.zDestTable = "sqlite_stat4";
3403 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
3404 shell_callback, &data, &zErrMsg);
3405 raw_printf(p->out, "ANALYZE sqlite_master;\n");
3406 }
3407 }else
3408
3409 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
3410 if( nArg==2 ){
3411 p->showHeader = booleanValue(azArg[1]);
3412 }else{
3413 raw_printf(stderr, "Usage: .headers on|off\n");
3414 rc = 1;
3415 }
3416 }else
3417
3418 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
3419 utf8_printf(p->out, "%s", zHelp);
3420 }else
3421
3422 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
3423 char *zTable; /* Insert data into this table */
3424 char *zFile; /* Name of file to extra content from */
3425 sqlite3_stmt *pStmt = NULL; /* A statement */
3426 int nCol; /* Number of columns in the table */
3427 int nByte; /* Number of bytes in an SQL string */
3428 int i, j; /* Loop counters */
3429 int needCommit; /* True to COMMIT or ROLLBACK at end */
3430 int nSep; /* Number of bytes in p->colSeparator[] */
3431 char *zSql; /* An SQL statement */
3432 ImportCtx sCtx; /* Reader context */
3433 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
3434 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
3435
3436 if( nArg!=3 ){
3437 raw_printf(stderr, "Usage: .import FILE TABLE\n");
3438 goto meta_command_exit;
3439 }
3440 zFile = azArg[1];
3441 zTable = azArg[2];
3442 seenInterrupt = 0;
3443 memset(&sCtx, 0, sizeof(sCtx));
3444 open_db(p, 0);
3445 nSep = strlen30(p->colSeparator);
3446 if( nSep==0 ){
3447 raw_printf(stderr,
3448 "Error: non-null column separator required for import\n");
3449 return 1;
3450 }
3451 if( nSep>1 ){
3452 raw_printf(stderr, "Error: multi-character column separators not allowed"
3453 " for import\n");
3454 return 1;
3455 }
3456 nSep = strlen30(p->rowSeparator);
3457 if( nSep==0 ){
3458 raw_printf(stderr, "Error: non-null row separator required for import\n");
3459 return 1;
3460 }
3461 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
3462 /* When importing CSV (only), if the row separator is set to the
3463 ** default output row separator, change it to the default input
3464 ** row separator. This avoids having to maintain different input
3465 ** and output row separators. */
3466 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
3467 nSep = strlen30(p->rowSeparator);
3468 }
3469 if( nSep>1 ){
3470 raw_printf(stderr, "Error: multi-character row separators not allowed"
3471 " for import\n");
3472 return 1;
3473 }
3474 sCtx.zFile = zFile;
3475 sCtx.nLine = 1;
3476 if( sCtx.zFile[0]=='|' ){
3477 #ifdef SQLITE_OMIT_POPEN
3478 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
3479 return 1;
3480 #else
3481 sCtx.in = popen(sCtx.zFile+1, "r");
3482 sCtx.zFile = "<pipe>";
3483 xCloser = pclose;
3484 #endif
3485 }else{
3486 sCtx.in = fopen(sCtx.zFile, "rb");
3487 xCloser = fclose;
3488 }
3489 if( p->mode==MODE_Ascii ){
3490 xRead = ascii_read_one_field;
3491 }else{
3492 xRead = csv_read_one_field;
3493 }
3494 if( sCtx.in==0 ){
3495 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
3496 return 1;
3497 }
3498 sCtx.cColSep = p->colSeparator[0];
3499 sCtx.cRowSep = p->rowSeparator[0];
3500 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
3501 if( zSql==0 ){
3502 raw_printf(stderr, "Error: out of memory\n");
3503 xCloser(sCtx.in);
3504 return 1;
3505 }
3506 nByte = strlen30(zSql);
3507 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3508 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
3509 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
3510 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3511 char cSep = '(';
3512 while( xRead(&sCtx) ){
3513 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
3514 cSep = ',';
3515 if( sCtx.cTerm!=sCtx.cColSep ) break;
3516 }
3517 if( cSep=='(' ){
3518 sqlite3_free(zCreate);
3519 sqlite3_free(sCtx.z);
3520 xCloser(sCtx.in);
3521 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
3522 return 1;
3523 }
3524 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3525 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3526 sqlite3_free(zCreate);
3527 if( rc ){
3528 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
3529 sqlite3_errmsg(p->db));
3530 sqlite3_free(sCtx.z);
3531 xCloser(sCtx.in);
3532 return 1;
3533 }
3534 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3535 }
3536 sqlite3_free(zSql);
3537 if( rc ){
3538 if (pStmt) sqlite3_finalize(pStmt);
3539 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
3540 xCloser(sCtx.in);
3541 return 1;
3542 }
3543 nCol = sqlite3_column_count(pStmt);
3544 sqlite3_finalize(pStmt);
3545 pStmt = 0;
3546 if( nCol==0 ) return 0; /* no columns, no error */
3547 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
3548 if( zSql==0 ){
3549 raw_printf(stderr, "Error: out of memory\n");
3550 xCloser(sCtx.in);
3551 return 1;
3552 }
3553 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
3554 j = strlen30(zSql);
3555 for(i=1; i<nCol; i++){
3556 zSql[j++] = ',';
3557 zSql[j++] = '?';
3558 }
3559 zSql[j++] = ')';
3560 zSql[j] = 0;
3561 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3562 sqlite3_free(zSql);
3563 if( rc ){
3564 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3565 if (pStmt) sqlite3_finalize(pStmt);
3566 xCloser(sCtx.in);
3567 return 1;
3568 }
3569 needCommit = sqlite3_get_autocommit(p->db);
3570 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
3571 do{
3572 int startLine = sCtx.nLine;
3573 for(i=0; i<nCol; i++){
3574 char *z = xRead(&sCtx);
3575 /*
3576 ** Did we reach end-of-file before finding any columns?
3577 ** If so, stop instead of NULL filling the remaining columns.
3578 */
3579 if( z==0 && i==0 ) break;
3580 /*
3581 ** Did we reach end-of-file OR end-of-line before finding any
3582 ** columns in ASCII mode? If so, stop instead of NULL filling
3583 ** the remaining columns.
3584 */
3585 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
3586 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
3587 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
3588 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
3589 "filling the rest with NULL\n",
3590 sCtx.zFile, startLine, nCol, i+1);
3591 i += 2;
3592 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
3593 }
3594 }
3595 if( sCtx.cTerm==sCtx.cColSep ){
3596 do{
3597 xRead(&sCtx);
3598 i++;
3599 }while( sCtx.cTerm==sCtx.cColSep );
3600 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
3601 "extras ignored\n",
3602 sCtx.zFile, startLine, nCol, i);
3603 }
3604 if( i>=nCol ){
3605 sqlite3_step(pStmt);
3606 rc = sqlite3_reset(pStmt);
3607 if( rc!=SQLITE_OK ){
3608 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
3609 startLine, sqlite3_errmsg(p->db));
3610 }
3611 }
3612 }while( sCtx.cTerm!=EOF );
3613
3614 xCloser(sCtx.in);
3615 sqlite3_free(sCtx.z);
3616 sqlite3_finalize(pStmt);
3617 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
3618 }else
3619
3620 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3621 || strncmp(azArg[0], "indexes", n)==0) ){
3622 ShellState data;
3623 char *zErrMsg = 0;
3624 open_db(p, 0);
3625 memcpy(&data, p, sizeof(data));
3626 data.showHeader = 0;
3627 data.cMode = data.mode = MODE_List;
3628 if( nArg==1 ){
3629 rc = sqlite3_exec(p->db,
3630 "SELECT name FROM sqlite_master "
3631 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3632 "UNION ALL "
3633 "SELECT name FROM sqlite_temp_master "
3634 "WHERE type='index' "
3635 "ORDER BY 1",
3636 callback, &data, &zErrMsg
3637 );
3638 }else if( nArg==2 ){
3639 zShellStatic = azArg[1];
3640 rc = sqlite3_exec(p->db,
3641 "SELECT name FROM sqlite_master "
3642 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3643 "UNION ALL "
3644 "SELECT name FROM sqlite_temp_master "
3645 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3646 "ORDER BY 1",
3647 callback, &data, &zErrMsg
3648 );
3649 zShellStatic = 0;
3650 }else{
3651 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
3652 rc = 1;
3653 goto meta_command_exit;
3654 }
3655 if( zErrMsg ){
3656 utf8_printf(stderr,"Error: %s\n", zErrMsg);
3657 sqlite3_free(zErrMsg);
3658 rc = 1;
3659 }else if( rc != SQLITE_OK ){
3660 raw_printf(stderr,
3661 "Error: querying sqlite_master and sqlite_temp_master\n");
3662 rc = 1;
3663 }
3664 }else
3665
3666 #ifdef SQLITE_ENABLE_IOTRACE
3667 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
3668 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
3669 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3670 iotrace = 0;
3671 if( nArg<2 ){
3672 sqlite3IoTrace = 0;
3673 }else if( strcmp(azArg[1], "-")==0 ){
3674 sqlite3IoTrace = iotracePrintf;
3675 iotrace = stdout;
3676 }else{
3677 iotrace = fopen(azArg[1], "w");
3678 if( iotrace==0 ){
3679 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
3680 sqlite3IoTrace = 0;
3681 rc = 1;
3682 }else{
3683 sqlite3IoTrace = iotracePrintf;
3684 }
3685 }
3686 }else
3687 #endif
3688 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3689 static const struct {
3690 const char *zLimitName; /* Name of a limit */
3691 int limitCode; /* Integer code for that limit */
3692 } aLimit[] = {
3693 { "length", SQLITE_LIMIT_LENGTH },
3694 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
3695 { "column", SQLITE_LIMIT_COLUMN },
3696 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
3697 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
3698 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
3699 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
3700 { "attached", SQLITE_LIMIT_ATTACHED },
3701 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
3702 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
3703 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
3704 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
3705 };
3706 int i, n2;
3707 open_db(p, 0);
3708 if( nArg==1 ){
3709 for(i=0; i<ArraySize(aLimit); i++){
3710 printf("%20s %d\n", aLimit[i].zLimitName,
3711 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3712 }
3713 }else if( nArg>3 ){
3714 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
3715 rc = 1;
3716 goto meta_command_exit;
3717 }else{
3718 int iLimit = -1;
3719 n2 = strlen30(azArg[1]);
3720 for(i=0; i<ArraySize(aLimit); i++){
3721 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3722 if( iLimit<0 ){
3723 iLimit = i;
3724 }else{
3725 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
3726 rc = 1;
3727 goto meta_command_exit;
3728 }
3729 }
3730 }
3731 if( iLimit<0 ){
3732 utf8_printf(stderr, "unknown limit: \"%s\"\n"
3733 "enter \".limits\" with no arguments for a list.\n",
3734 azArg[1]);
3735 rc = 1;
3736 goto meta_command_exit;
3737 }
3738 if( nArg==3 ){
3739 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3740 (int)integerValue(azArg[2]));
3741 }
3742 printf("%20s %d\n", aLimit[iLimit].zLimitName,
3743 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3744 }
3745 }else
3746
3747 #ifndef SQLITE_OMIT_LOAD_EXTENSION
3748 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
3749 const char *zFile, *zProc;
3750 char *zErrMsg = 0;
3751 if( nArg<2 ){
3752 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3753 rc = 1;
3754 goto meta_command_exit;
3755 }
3756 zFile = azArg[1];
3757 zProc = nArg>=3 ? azArg[2] : 0;
3758 open_db(p, 0);
3759 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3760 if( rc!=SQLITE_OK ){
3761 utf8_printf(stderr, "Error: %s\n", zErrMsg);
3762 sqlite3_free(zErrMsg);
3763 rc = 1;
3764 }
3765 }else
3766 #endif
3767
3768 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3769 if( nArg!=2 ){
3770 raw_printf(stderr, "Usage: .log FILENAME\n");
3771 rc = 1;
3772 }else{
3773 const char *zFile = azArg[1];
3774 output_file_close(p->pLog);
3775 p->pLog = output_file_open(zFile);
3776 }
3777 }else
3778
3779 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3780 const char *zMode = nArg>=2 ? azArg[1] : "";
3781 int n2 = (int)strlen(zMode);
3782 int c2 = zMode[0];
3783 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
3784 p->mode = MODE_Line;
3785 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
3786 p->mode = MODE_Column;
3787 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
3788 p->mode = MODE_List;
3789 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
3790 p->mode = MODE_Html;
3791 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
3792 p->mode = MODE_Tcl;
3793 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
3794 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
3795 p->mode = MODE_Csv;
3796 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
3797 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
3798 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
3799 p->mode = MODE_List;
3800 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
3801 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
3802 p->mode = MODE_Insert;
3803 set_table_name(p, nArg>=3 ? azArg[2] : "table");
3804 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3805 p->mode = MODE_Ascii;
3806 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3807 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
3808 }else {
3809 raw_printf(stderr, "Error: mode should be one of: "
3810 "ascii column csv html insert line list tabs tcl\n");
3811 rc = 1;
3812 }
3813 p->cMode = p->mode;
3814 }else
3815
3816 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3817 if( nArg==2 ){
3818 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3819 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
3820 }else{
3821 raw_printf(stderr, "Usage: .nullvalue STRING\n");
3822 rc = 1;
3823 }
3824 }else
3825
3826 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3827 sqlite3 *savedDb = p->db;
3828 const char *zSavedFilename = p->zDbFilename;
3829 char *zNewFilename = 0;
3830 p->db = 0;
3831 if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3832 p->zDbFilename = zNewFilename;
3833 open_db(p, 1);
3834 if( p->db!=0 ){
3835 session_close_all(p);
3836 sqlite3_close(savedDb);
3837 sqlite3_free(p->zFreeOnClose);
3838 p->zFreeOnClose = zNewFilename;
3839 }else{
3840 sqlite3_free(zNewFilename);
3841 p->db = savedDb;
3842 p->zDbFilename = zSavedFilename;
3843 }
3844 }else
3845
3846 if( c=='o'
3847 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3848 ){
3849 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3850 if( nArg>2 ){
3851 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
3852 rc = 1;
3853 goto meta_command_exit;
3854 }
3855 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3856 if( nArg<2 ){
3857 raw_printf(stderr, "Usage: .once FILE\n");
3858 rc = 1;
3859 goto meta_command_exit;
3860 }
3861 p->outCount = 2;
3862 }else{
3863 p->outCount = 0;
3864 }
3865 output_reset(p);
3866 if( zFile[0]=='|' ){
3867 #ifdef SQLITE_OMIT_POPEN
3868 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
3869 rc = 1;
3870 p->out = stdout;
3871 #else
3872 p->out = popen(zFile + 1, "w");
3873 if( p->out==0 ){
3874 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
3875 p->out = stdout;
3876 rc = 1;
3877 }else{
3878 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3879 }
3880 #endif
3881 }else{
3882 p->out = output_file_open(zFile);
3883 if( p->out==0 ){
3884 if( strcmp(zFile,"off")!=0 ){
3885 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
3886 }
3887 p->out = stdout;
3888 rc = 1;
3889 } else {
3890 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3891 }
3892 }
3893 }else
3894
3895 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3896 int i;
3897 for(i=1; i<nArg; i++){
3898 if( i>1 ) raw_printf(p->out, " ");
3899 utf8_printf(p->out, "%s", azArg[i]);
3900 }
3901 raw_printf(p->out, "\n");
3902 }else
3903
3904 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
3905 if( nArg >= 2) {
3906 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3907 }
3908 if( nArg >= 3) {
3909 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3910 }
3911 }else
3912
3913 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
3914 rc = 2;
3915 }else
3916
3917 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3918 FILE *alt;
3919 if( nArg!=2 ){
3920 raw_printf(stderr, "Usage: .read FILE\n");
3921 rc = 1;
3922 goto meta_command_exit;
3923 }
3924 alt = fopen(azArg[1], "rb");
3925 if( alt==0 ){
3926 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3927 rc = 1;
3928 }else{
3929 rc = process_input(p, alt);
3930 fclose(alt);
3931 }
3932 }else
3933
3934 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
3935 const char *zSrcFile;
3936 const char *zDb;
3937 sqlite3 *pSrc;
3938 sqlite3_backup *pBackup;
3939 int nTimeout = 0;
3940
3941 if( nArg==2 ){
3942 zSrcFile = azArg[1];
3943 zDb = "main";
3944 }else if( nArg==3 ){
3945 zSrcFile = azArg[2];
3946 zDb = azArg[1];
3947 }else{
3948 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
3949 rc = 1;
3950 goto meta_command_exit;
3951 }
3952 rc = sqlite3_open(zSrcFile, &pSrc);
3953 if( rc!=SQLITE_OK ){
3954 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
3955 sqlite3_close(pSrc);
3956 return 1;
3957 }
3958 open_db(p, 0);
3959 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3960 if( pBackup==0 ){
3961 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3962 sqlite3_close(pSrc);
3963 return 1;
3964 }
3965 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3966 || rc==SQLITE_BUSY ){
3967 if( rc==SQLITE_BUSY ){
3968 if( nTimeout++ >= 3 ) break;
3969 sqlite3_sleep(100);
3970 }
3971 }
3972 sqlite3_backup_finish(pBackup);
3973 if( rc==SQLITE_DONE ){
3974 rc = 0;
3975 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
3976 raw_printf(stderr, "Error: source database is busy\n");
3977 rc = 1;
3978 }else{
3979 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3980 rc = 1;
3981 }
3982 sqlite3_close(pSrc);
3983 }else
3984
3985
3986 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3987 if( nArg==2 ){
3988 p->scanstatsOn = booleanValue(azArg[1]);
3989 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3990 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
3991 #endif
3992 }else{
3993 raw_printf(stderr, "Usage: .scanstats on|off\n");
3994 rc = 1;
3995 }
3996 }else
3997
3998 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
3999 ShellState data;
4000 char *zErrMsg = 0;
4001 open_db(p, 0);
4002 memcpy(&data, p, sizeof(data));
4003 data.showHeader = 0;
4004 data.cMode = data.mode = MODE_Semi;
4005 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
4006 data.cMode = data.mode = MODE_Pretty;
4007 nArg--;
4008 if( nArg==2 ) azArg[1] = azArg[2];
4009 }
4010 if( nArg==2 && azArg[1][0]!='-' ){
4011 int i;
4012 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
4013 if( strcmp(azArg[1],"sqlite_master")==0 ){
4014 char *new_argv[2], *new_colv[2];
4015 new_argv[0] = "CREATE TABLE sqlite_master (\n"
4016 " type text,\n"
4017 " name text,\n"
4018 " tbl_name text,\n"
4019 " rootpage integer,\n"
4020 " sql text\n"
4021 ")";
4022 new_argv[1] = 0;
4023 new_colv[0] = "sql";
4024 new_colv[1] = 0;
4025 callback(&data, 1, new_argv, new_colv);
4026 rc = SQLITE_OK;
4027 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
4028 char *new_argv[2], *new_colv[2];
4029 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
4030 " type text,\n"
4031 " name text,\n"
4032 " tbl_name text,\n"
4033 " rootpage integer,\n"
4034 " sql text\n"
4035 ")";
4036 new_argv[1] = 0;
4037 new_colv[0] = "sql";
4038 new_colv[1] = 0;
4039 callback(&data, 1, new_argv, new_colv);
4040 rc = SQLITE_OK;
4041 }else{
4042 zShellStatic = azArg[1];
4043 rc = sqlite3_exec(p->db,
4044 "SELECT sql FROM "
4045 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4046 " FROM sqlite_master UNION ALL"
4047 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
4048 "WHERE lower(tbl_name) LIKE shellstatic()"
4049 " AND type!='meta' AND sql NOTNULL "
4050 "ORDER BY rowid",
4051 callback, &data, &zErrMsg);
4052 zShellStatic = 0;
4053 }
4054 }else if( nArg==1 ){
4055 rc = sqlite3_exec(p->db,
4056 "SELECT sql FROM "
4057 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4058 " FROM sqlite_master UNION ALL"
4059 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
4060 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
4061 "ORDER BY rowid",
4062 callback, &data, &zErrMsg
4063 );
4064 }else{
4065 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
4066 rc = 1;
4067 goto meta_command_exit;
4068 }
4069 if( zErrMsg ){
4070 utf8_printf(stderr,"Error: %s\n", zErrMsg);
4071 sqlite3_free(zErrMsg);
4072 rc = 1;
4073 }else if( rc != SQLITE_OK ){
4074 raw_printf(stderr,"Error: querying schema information\n");
4075 rc = 1;
4076 }else{
4077 rc = 0;
4078 }
4079 }else
4080
4081 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
4082 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
4083 sqlite3SelectTrace = integerValue(azArg[1]);
4084 }else
4085 #endif
4086
4087 #if defined(SQLITE_ENABLE_SESSION)
4088 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
4089 OpenSession *pSession = &p->aSession[0];
4090 char **azCmd = &azArg[1];
4091 int iSes = 0;
4092 int nCmd = nArg - 1;
4093 int i;
4094 if( nArg<=1 ) goto session_syntax_error;
4095 open_db(p, 0);
4096 if( nArg>=3 ){
4097 for(iSes=0; iSes<p->nSession; iSes++){
4098 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
4099 }
4100 if( iSes<p->nSession ){
4101 pSession = &p->aSession[iSes];
4102 azCmd++;
4103 nCmd--;
4104 }else{
4105 pSession = &p->aSession[0];
4106 iSes = 0;
4107 }
4108 }
4109
4110 /* .session attach TABLE
4111 ** Invoke the sqlite3session_attach() interface to attach a particular
4112 ** table so that it is never filtered.
4113 */
4114 if( strcmp(azCmd[0],"attach")==0 ){
4115 if( nCmd!=2 ) goto session_syntax_error;
4116 if( pSession->p==0 ){
4117 session_not_open:
4118 raw_printf(stderr, "ERROR: No sessions are open\n");
4119 }else{
4120 rc = sqlite3session_attach(pSession->p, azCmd[1]);
4121 if( rc ){
4122 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
4123 rc = 0;
4124 }
4125 }
4126 }else
4127
4128 /* .session changeset FILE
4129 ** .session patchset FILE
4130 ** Write a changeset or patchset into a file. The file is overwritten.
4131 */
4132 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
4133 FILE *out = 0;
4134 if( nCmd!=2 ) goto session_syntax_error;
4135 if( pSession->p==0 ) goto session_not_open;
4136 out = fopen(azCmd[1], "wb");
4137 if( out==0 ){
4138 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
4139 }else{
4140 int szChng;
4141 void *pChng;
4142 if( azCmd[0][0]=='c' ){
4143 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
4144 }else{
4145 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
4146 }
4147 if( rc ){
4148 printf("Error: error code %d\n", rc);
4149 rc = 0;
4150 }
4151 if( pChng
4152 && fwrite(pChng, szChng, 1, out)!=1 ){
4153 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
4154 szChng);
4155 }
4156 sqlite3_free(pChng);
4157 fclose(out);
4158 }
4159 }else
4160
4161 /* .session close
4162 ** Close the identified session
4163 */
4164 if( strcmp(azCmd[0], "close")==0 ){
4165 if( nCmd!=1 ) goto session_syntax_error;
4166 if( p->nSession ){
4167 session_close(pSession);
4168 p->aSession[iSes] = p->aSession[--p->nSession];
4169 }
4170 }else
4171
4172 /* .session enable ?BOOLEAN?
4173 ** Query or set the enable flag
4174 */
4175 if( strcmp(azCmd[0], "enable")==0 ){
4176 int ii;
4177 if( nCmd>2 ) goto session_syntax_error;
4178 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
4179 if( p->nSession ){
4180 ii = sqlite3session_enable(pSession->p, ii);
4181 utf8_printf(p->out, "session %s enable flag = %d\n",
4182 pSession->zName, ii);
4183 }
4184 }else
4185
4186 /* .session filter GLOB ....
4187 ** Set a list of GLOB patterns of table names to be excluded.
4188 */
4189 if( strcmp(azCmd[0], "filter")==0 ){
4190 int ii, nByte;
4191 if( nCmd<2 ) goto session_syntax_error;
4192 if( p->nSession ){
4193 for(ii=0; ii<pSession->nFilter; ii++){
4194 sqlite3_free(pSession->azFilter[ii]);
4195 }
4196 sqlite3_free(pSession->azFilter);
4197 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
4198 pSession->azFilter = sqlite3_malloc( nByte );
4199 if( pSession->azFilter==0 ){
4200 raw_printf(stderr, "Error: out or memory\n");
4201 exit(1);
4202 }
4203 for(ii=1; ii<nCmd; ii++){
4204 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
4205 }
4206 pSession->nFilter = ii-1;
4207 }
4208 }else
4209
4210 /* .session indirect ?BOOLEAN?
4211 ** Query or set the indirect flag
4212 */
4213 if( strcmp(azCmd[0], "indirect")==0 ){
4214 int ii;
4215 if( nCmd>2 ) goto session_syntax_error;
4216 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
4217 if( p->nSession ){
4218 ii = sqlite3session_indirect(pSession->p, ii);
4219 utf8_printf(p->out, "session %s indirect flag = %d\n",
4220 pSession->zName, ii);
4221 }
4222 }else
4223
4224 /* .session isempty
4225 ** Determine if the session is empty
4226 */
4227 if( strcmp(azCmd[0], "isempty")==0 ){
4228 int ii;
4229 if( nCmd!=1 ) goto session_syntax_error;
4230 if( p->nSession ){
4231 ii = sqlite3session_isempty(pSession->p);
4232 utf8_printf(p->out, "session %s isempty flag = %d\n",
4233 pSession->zName, ii);
4234 }
4235 }else
4236
4237 /* .session list
4238 ** List all currently open sessions
4239 */
4240 if( strcmp(azCmd[0],"list")==0 ){
4241 for(i=0; i<p->nSession; i++){
4242 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
4243 }
4244 }else
4245
4246 /* .session open DB NAME
4247 ** Open a new session called NAME on the attached database DB.
4248 ** DB is normally "main".
4249 */
4250 if( strcmp(azCmd[0],"open")==0 ){
4251 char *zName;
4252 if( nCmd!=3 ) goto session_syntax_error;
4253 zName = azCmd[2];
4254 if( zName[0]==0 ) goto session_syntax_error;
4255 for(i=0; i<p->nSession; i++){
4256 if( strcmp(p->aSession[i].zName,zName)==0 ){
4257 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
4258 goto meta_command_exit;
4259 }
4260 }
4261 if( p->nSession>=ArraySize(p->aSession) ){
4262 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
4263 goto meta_command_exit;
4264 }
4265 pSession = &p->aSession[p->nSession];
4266 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
4267 if( rc ){
4268 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
4269 rc = 0;
4270 goto meta_command_exit;
4271 }
4272 pSession->nFilter = 0;
4273 sqlite3session_table_filter(pSession->p, session_filter, pSession);
4274 p->nSession++;
4275 pSession->zName = sqlite3_mprintf("%s", zName);
4276 }else
4277 /* If no command name matches, show a syntax error */
4278 session_syntax_error:
4279 session_help(p);
4280 }else
4281 #endif
4282
4283 #ifdef SQLITE_DEBUG
4284 /* Undocumented commands for internal testing. Subject to change
4285 ** without notice. */
4286 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
4287 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
4288 int i, v;
4289 for(i=1; i<nArg; i++){
4290 v = booleanValue(azArg[i]);
4291 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
4292 }
4293 }
4294 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
4295 int i; sqlite3_int64 v;
4296 for(i=1; i<nArg; i++){
4297 char zBuf[200];
4298 v = integerValue(azArg[i]);
4299 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
4300 utf8_printf(p->out, "%s", zBuf);
4301 }
4302 }
4303 }else
4304 #endif
4305
4306 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
4307 if( nArg<2 || nArg>3 ){
4308 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
4309 rc = 1;
4310 }
4311 if( nArg>=2 ){
4312 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
4313 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
4314 }
4315 if( nArg>=3 ){
4316 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
4317 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
4318 }
4319 }else
4320
4321 if( c=='s'
4322 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
4323 ){
4324 char *zCmd;
4325 int i, x;
4326 if( nArg<2 ){
4327 raw_printf(stderr, "Usage: .system COMMAND\n");
4328 rc = 1;
4329 goto meta_command_exit;
4330 }
4331 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
4332 for(i=2; i<nArg; i++){
4333 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
4334 zCmd, azArg[i]);
4335 }
4336 x = system(zCmd);
4337 sqlite3_free(zCmd);
4338 if( x ) raw_printf(stderr, "System command returns %d\n", x);
4339 }else
4340
4341 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
4342 static const char *azBool[] = { "off", "on", "full", "unk" };
4343 int i;
4344 if( nArg!=1 ){
4345 raw_printf(stderr, "Usage: .show\n");
4346 rc = 1;
4347 goto meta_command_exit;
4348 }
4349 utf8_printf(p->out, "%12.12s: %s\n","echo", azBool[p->echoOn!=0]);
4350 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
4351 utf8_printf(p->out, "%12.12s: %s\n","explain",
4352 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
4353 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
4354 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
4355 utf8_printf(p->out, "%12.12s: ", "nullvalue");
4356 output_c_string(p->out, p->nullValue);
4357 raw_printf(p->out, "\n");
4358 utf8_printf(p->out,"%12.12s: %s\n","output",
4359 strlen30(p->outfile) ? p->outfile : "stdout");
4360 utf8_printf(p->out,"%12.12s: ", "colseparator");
4361 output_c_string(p->out, p->colSeparator);
4362 raw_printf(p->out, "\n");
4363 utf8_printf(p->out,"%12.12s: ", "rowseparator");
4364 output_c_string(p->out, p->rowSeparator);
4365 raw_printf(p->out, "\n");
4366 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
4367 utf8_printf(p->out, "%12.12s: ", "width");
4368 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
4369 raw_printf(p->out, "%d ", p->colWidth[i]);
4370 }
4371 raw_printf(p->out, "\n");
4372 }else
4373
4374 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
4375 if( nArg==2 ){
4376 p->statsOn = booleanValue(azArg[1]);
4377 }else if( nArg==1 ){
4378 display_stats(p->db, p, 0);
4379 }else{
4380 raw_printf(stderr, "Usage: .stats ?on|off?\n");
4381 rc = 1;
4382 }
4383 }else
4384
4385 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
4386 sqlite3_stmt *pStmt;
4387 char **azResult;
4388 int nRow, nAlloc;
4389 char *zSql = 0;
4390 int ii;
4391 open_db(p, 0);
4392 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
4393 if( rc ) return shellDatabaseError(p->db);
4394
4395 /* Create an SQL statement to query for the list of tables in the
4396 ** main and all attached databases where the table name matches the
4397 ** LIKE pattern bound to variable "?1". */
4398 zSql = sqlite3_mprintf(
4399 "SELECT name FROM sqlite_master"
4400 " WHERE type IN ('table','view')"
4401 " AND name NOT LIKE 'sqlite_%%'"
4402 " AND name LIKE ?1");
4403 while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){
4404 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
4405 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
4406 if( strcmp(zDbName,"temp")==0 ){
4407 zSql = sqlite3_mprintf(
4408 "%z UNION ALL "
4409 "SELECT 'temp.' || name FROM sqlite_temp_master"
4410 " WHERE type IN ('table','view')"
4411 " AND name NOT LIKE 'sqlite_%%'"
4412 " AND name LIKE ?1", zSql);
4413 }else{
4414 zSql = sqlite3_mprintf(
4415 "%z UNION ALL "
4416 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
4417 " WHERE type IN ('table','view')"
4418 " AND name NOT LIKE 'sqlite_%%'"
4419 " AND name LIKE ?1", zSql, zDbName, zDbName);
4420 }
4421 }
4422 rc = sqlite3_finalize(pStmt);
4423 if( zSql && rc==SQLITE_OK ){
4424 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
4425 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4426 }
4427 sqlite3_free(zSql);
4428 if( !zSql ) return shellNomemError();
4429 if( rc ) return shellDatabaseError(p->db);
4430
4431 /* Run the SQL statement prepared by the above block. Store the results
4432 ** as an array of nul-terminated strings in azResult[]. */
4433 nRow = nAlloc = 0;
4434 azResult = 0;
4435 if( nArg>1 ){
4436 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
4437 }else{
4438 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
4439 }
4440 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4441 if( nRow>=nAlloc ){
4442 char **azNew;
4443 int n2 = nAlloc*2 + 10;
4444 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
4445 if( azNew==0 ){
4446 rc = shellNomemError();
4447 break;
4448 }
4449 nAlloc = n2;
4450 azResult = azNew;
4451 }
4452 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
4453 if( 0==azResult[nRow] ){
4454 rc = shellNomemError();
4455 break;
4456 }
4457 nRow++;
4458 }
4459 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
4460 rc = shellDatabaseError(p->db);
4461 }
4462
4463 /* Pretty-print the contents of array azResult[] to the output */
4464 if( rc==0 && nRow>0 ){
4465 int len, maxlen = 0;
4466 int i, j;
4467 int nPrintCol, nPrintRow;
4468 for(i=0; i<nRow; i++){
4469 len = strlen30(azResult[i]);
4470 if( len>maxlen ) maxlen = len;
4471 }
4472 nPrintCol = 80/(maxlen+2);
4473 if( nPrintCol<1 ) nPrintCol = 1;
4474 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
4475 for(i=0; i<nPrintRow; i++){
4476 for(j=i; j<nRow; j+=nPrintRow){
4477 char *zSp = j<nPrintRow ? "" : " ";
4478 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
4479 azResult[j] ? azResult[j]:"");
4480 }
4481 raw_printf(p->out, "\n");
4482 }
4483 }
4484
4485 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
4486 sqlite3_free(azResult);
4487 }else
4488
4489 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
4490 static const struct {
4491 const char *zCtrlName; /* Name of a test-control option */
4492 int ctrlCode; /* Integer code for that option */
4493 } aCtrl[] = {
4494 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
4495 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
4496 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
4497 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
4498 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
4499 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
4500 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
4501 { "assert", SQLITE_TESTCTRL_ASSERT },
4502 { "always", SQLITE_TESTCTRL_ALWAYS },
4503 { "reserve", SQLITE_TESTCTRL_RESERVE },
4504 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
4505 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
4506 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
4507 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
4508 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
4509 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
4510 };
4511 int testctrl = -1;
4512 int rc2 = 0;
4513 int i, n2;
4514 open_db(p, 0);
4515
4516 /* convert testctrl text option to value. allow any unique prefix
4517 ** of the option name, or a numerical value. */
4518 n2 = strlen30(azArg[1]);
4519 for(i=0; i<ArraySize(aCtrl); i++){
4520 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
4521 if( testctrl<0 ){
4522 testctrl = aCtrl[i].ctrlCode;
4523 }else{
4524 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
4525 testctrl = -1;
4526 break;
4527 }
4528 }
4529 }
4530 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
4531 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
4532 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
4533 }else{
4534 switch(testctrl){
4535
4536 /* sqlite3_test_control(int, db, int) */
4537 case SQLITE_TESTCTRL_OPTIMIZATIONS:
4538 case SQLITE_TESTCTRL_RESERVE:
4539 if( nArg==3 ){
4540 int opt = (int)strtol(azArg[2], 0, 0);
4541 rc2 = sqlite3_test_control(testctrl, p->db, opt);
4542 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4543 } else {
4544 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
4545 azArg[1]);
4546 }
4547 break;
4548
4549 /* sqlite3_test_control(int) */
4550 case SQLITE_TESTCTRL_PRNG_SAVE:
4551 case SQLITE_TESTCTRL_PRNG_RESTORE:
4552 case SQLITE_TESTCTRL_PRNG_RESET:
4553 case SQLITE_TESTCTRL_BYTEORDER:
4554 if( nArg==2 ){
4555 rc2 = sqlite3_test_control(testctrl);
4556 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4557 } else {
4558 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
4559 azArg[1]);
4560 }
4561 break;
4562
4563 /* sqlite3_test_control(int, uint) */
4564 case SQLITE_TESTCTRL_PENDING_BYTE:
4565 if( nArg==3 ){
4566 unsigned int opt = (unsigned int)integerValue(azArg[2]);
4567 rc2 = sqlite3_test_control(testctrl, opt);
4568 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4569 } else {
4570 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
4571 " int option\n", azArg[1]);
4572 }
4573 break;
4574
4575 /* sqlite3_test_control(int, int) */
4576 case SQLITE_TESTCTRL_ASSERT:
4577 case SQLITE_TESTCTRL_ALWAYS:
4578 case SQLITE_TESTCTRL_NEVER_CORRUPT:
4579 if( nArg==3 ){
4580 int opt = booleanValue(azArg[2]);
4581 rc2 = sqlite3_test_control(testctrl, opt);
4582 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4583 } else {
4584 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
4585 azArg[1]);
4586 }
4587 break;
4588
4589 /* sqlite3_test_control(int, char *) */
4590 #ifdef SQLITE_N_KEYWORD
4591 case SQLITE_TESTCTRL_ISKEYWORD:
4592 if( nArg==3 ){
4593 const char *opt = azArg[2];
4594 rc2 = sqlite3_test_control(testctrl, opt);
4595 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4596 } else {
4597 utf8_printf(stderr,
4598 "Error: testctrl %s takes a single char * option\n",
4599 azArg[1]);
4600 }
4601 break;
4602 #endif
4603
4604 case SQLITE_TESTCTRL_IMPOSTER:
4605 if( nArg==5 ){
4606 rc2 = sqlite3_test_control(testctrl, p->db,
4607 azArg[2],
4608 integerValue(azArg[3]),
4609 integerValue(azArg[4]));
4610 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
4611 }else{
4612 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
4613 }
4614 break;
4615
4616 case SQLITE_TESTCTRL_BITVEC_TEST:
4617 case SQLITE_TESTCTRL_FAULT_INSTALL:
4618 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
4619 case SQLITE_TESTCTRL_SCRATCHMALLOC:
4620 default:
4621 utf8_printf(stderr,
4622 "Error: CLI support for testctrl %s not implemented\n",
4623 azArg[1]);
4624 break;
4625 }
4626 }
4627 }else
4628
4629 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
4630 open_db(p, 0);
4631 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
4632 }else
4633
4634 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
4635 if( nArg==2 ){
4636 enableTimer = booleanValue(azArg[1]);
4637 if( enableTimer && !HAS_TIMER ){
4638 raw_printf(stderr, "Error: timer not available on this system.\n");
4639 enableTimer = 0;
4640 }
4641 }else{
4642 raw_printf(stderr, "Usage: .timer on|off\n");
4643 rc = 1;
4644 }
4645 }else
4646
4647 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
4648 open_db(p, 0);
4649 if( nArg!=2 ){
4650 raw_printf(stderr, "Usage: .trace FILE|off\n");
4651 rc = 1;
4652 goto meta_command_exit;
4653 }
4654 output_file_close(p->traceOut);
4655 p->traceOut = output_file_open(azArg[1]);
4656 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
4657 if( p->traceOut==0 ){
4658 sqlite3_trace(p->db, 0, 0);
4659 }else{
4660 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
4661 }
4662 #endif
4663 }else
4664
4665 #if SQLITE_USER_AUTHENTICATION
4666 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
4667 if( nArg<2 ){
4668 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
4669 rc = 1;
4670 goto meta_command_exit;
4671 }
4672 open_db(p, 0);
4673 if( strcmp(azArg[1],"login")==0 ){
4674 if( nArg!=4 ){
4675 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
4676 rc = 1;
4677 goto meta_command_exit;
4678 }
4679 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
4680 (int)strlen(azArg[3]));
4681 if( rc ){
4682 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
4683 rc = 1;
4684 }
4685 }else if( strcmp(azArg[1],"add")==0 ){
4686 if( nArg!=5 ){
4687 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
4688 rc = 1;
4689 goto meta_command_exit;
4690 }
4691 rc = sqlite3_user_add(p->db, azArg[2],
4692 azArg[3], (int)strlen(azArg[3]),
4693 booleanValue(azArg[4]));
4694 if( rc ){
4695 raw_printf(stderr, "User-Add failed: %d\n", rc);
4696 rc = 1;
4697 }
4698 }else if( strcmp(azArg[1],"edit")==0 ){
4699 if( nArg!=5 ){
4700 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
4701 rc = 1;
4702 goto meta_command_exit;
4703 }
4704 rc = sqlite3_user_change(p->db, azArg[2],
4705 azArg[3], (int)strlen(azArg[3]),
4706 booleanValue(azArg[4]));
4707 if( rc ){
4708 raw_printf(stderr, "User-Edit failed: %d\n", rc);
4709 rc = 1;
4710 }
4711 }else if( strcmp(azArg[1],"delete")==0 ){
4712 if( nArg!=3 ){
4713 raw_printf(stderr, "Usage: .user delete USER\n");
4714 rc = 1;
4715 goto meta_command_exit;
4716 }
4717 rc = sqlite3_user_delete(p->db, azArg[2]);
4718 if( rc ){
4719 raw_printf(stderr, "User-Delete failed: %d\n", rc);
4720 rc = 1;
4721 }
4722 }else{
4723 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
4724 rc = 1;
4725 goto meta_command_exit;
4726 }
4727 }else
4728 #endif /* SQLITE_USER_AUTHENTICATION */
4729
4730 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
4731 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
4732 sqlite3_libversion(), sqlite3_sourceid());
4733 }else
4734
4735 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
4736 const char *zDbName = nArg==2 ? azArg[1] : "main";
4737 sqlite3_vfs *pVfs;
4738 if( p->db ){
4739 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
4740 if( pVfs ){
4741 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
4742 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4743 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4744 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
4745 }
4746 }
4747 }else
4748
4749 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
4750 sqlite3_vfs *pVfs;
4751 sqlite3_vfs *pCurrent = 0;
4752 if( p->db ){
4753 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
4754 }
4755 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
4756 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
4757 pVfs==pCurrent ? " <--- CURRENT" : "");
4758 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
4759 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
4760 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
4761 if( pVfs->pNext ){
4762 raw_printf(p->out, "-----------------------------------\n");
4763 }
4764 }
4765 }else
4766
4767 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4768 const char *zDbName = nArg==2 ? azArg[1] : "main";
4769 char *zVfsName = 0;
4770 if( p->db ){
4771 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4772 if( zVfsName ){
4773 utf8_printf(p->out, "%s\n", zVfsName);
4774 sqlite3_free(zVfsName);
4775 }
4776 }
4777 }else
4778
4779 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4780 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4781 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
4782 }else
4783 #endif
4784
4785 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
4786 int j;
4787 assert( nArg<=ArraySize(azArg) );
4788 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
4789 p->colWidth[j-1] = (int)integerValue(azArg[j]);
4790 }
4791 }else
4792
4793 {
4794 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
4795 " \"%s\". Enter \".help\" for help\n", azArg[0]);
4796 rc = 1;
4797 }
4798
4799 meta_command_exit:
4800 if( p->outCount ){
4801 p->outCount--;
4802 if( p->outCount==0 ) output_reset(p);
4803 }
4804 return rc;
4805 }
4806
4807 /*
4808 ** Return TRUE if a semicolon occurs anywhere in the first N characters
4809 ** of string z[].
4810 */
4811 static int line_contains_semicolon(const char *z, int N){
4812 int i;
4813 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
4814 return 0;
4815 }
4816
4817 /*
4818 ** Test to see if a line consists entirely of whitespace.
4819 */
4820 static int _all_whitespace(const char *z){
4821 for(; *z; z++){
4822 if( IsSpace(z[0]) ) continue;
4823 if( *z=='/' && z[1]=='*' ){
4824 z += 2;
4825 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4826 if( *z==0 ) return 0;
4827 z++;
4828 continue;
4829 }
4830 if( *z=='-' && z[1]=='-' ){
4831 z += 2;
4832 while( *z && *z!='\n' ){ z++; }
4833 if( *z==0 ) return 1;
4834 continue;
4835 }
4836 return 0;
4837 }
4838 return 1;
4839 }
4840
4841 /*
4842 ** Return TRUE if the line typed in is an SQL command terminator other
4843 ** than a semi-colon. The SQL Server style "go" command is understood
4844 ** as is the Oracle "/".
4845 */
4846 static int line_is_command_terminator(const char *zLine){
4847 while( IsSpace(zLine[0]) ){ zLine++; };
4848 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4849 return 1; /* Oracle */
4850 }
4851 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
4852 && _all_whitespace(&zLine[2]) ){
4853 return 1; /* SQL Server */
4854 }
4855 return 0;
4856 }
4857
4858 /*
4859 ** Return true if zSql is a complete SQL statement. Return false if it
4860 ** ends in the middle of a string literal or C-style comment.
4861 */
4862 static int line_is_complete(char *zSql, int nSql){
4863 int rc;
4864 if( zSql==0 ) return 1;
4865 zSql[nSql] = ';';
4866 zSql[nSql+1] = 0;
4867 rc = sqlite3_complete(zSql);
4868 zSql[nSql] = 0;
4869 return rc;
4870 }
4871
4872 /*
4873 ** Read input from *in and process it. If *in==0 then input
4874 ** is interactive - the user is typing it it. Otherwise, input
4875 ** is coming from a file or device. A prompt is issued and history
4876 ** is saved only if input is interactive. An interrupt signal will
4877 ** cause this routine to exit immediately, unless input is interactive.
4878 **
4879 ** Return the number of errors.
4880 */
4881 static int process_input(ShellState *p, FILE *in){
4882 char *zLine = 0; /* A single input line */
4883 char *zSql = 0; /* Accumulated SQL text */
4884 int nLine; /* Length of current line */
4885 int nSql = 0; /* Bytes of zSql[] used */
4886 int nAlloc = 0; /* Allocated zSql[] space */
4887 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4888 char *zErrMsg; /* Error message returned */
4889 int rc; /* Error code */
4890 int errCnt = 0; /* Number of errors seen */
4891 int lineno = 0; /* Current line number */
4892 int startline = 0; /* Line number for start of current input */
4893
4894 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4895 fflush(p->out);
4896 zLine = one_input_line(in, zLine, nSql>0);
4897 if( zLine==0 ){
4898 /* End of input */
4899 if( stdin_is_interactive ) printf("\n");
4900 break;
4901 }
4902 if( seenInterrupt ){
4903 if( in!=0 ) break;
4904 seenInterrupt = 0;
4905 }
4906 lineno++;
4907 if( nSql==0 && _all_whitespace(zLine) ){
4908 if( p->echoOn ) printf("%s\n", zLine);
4909 continue;
4910 }
4911 if( zLine && zLine[0]=='.' && nSql==0 ){
4912 if( p->echoOn ) printf("%s\n", zLine);
4913 rc = do_meta_command(zLine, p);
4914 if( rc==2 ){ /* exit requested */
4915 break;
4916 }else if( rc ){
4917 errCnt++;
4918 }
4919 continue;
4920 }
4921 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
4922 memcpy(zLine,";",2);
4923 }
4924 nLine = strlen30(zLine);
4925 if( nSql+nLine+2>=nAlloc ){
4926 nAlloc = nSql+nLine+100;
4927 zSql = realloc(zSql, nAlloc);
4928 if( zSql==0 ){
4929 raw_printf(stderr, "Error: out of memory\n");
4930 exit(1);
4931 }
4932 }
4933 nSqlPrior = nSql;
4934 if( nSql==0 ){
4935 int i;
4936 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
4937 assert( nAlloc>0 && zSql!=0 );
4938 memcpy(zSql, zLine+i, nLine+1-i);
4939 startline = lineno;
4940 nSql = nLine-i;
4941 }else{
4942 zSql[nSql++] = '\n';
4943 memcpy(zSql+nSql, zLine, nLine+1);
4944 nSql += nLine;
4945 }
4946 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
4947 && sqlite3_complete(zSql) ){
4948 p->cnt = 0;
4949 open_db(p, 0);
4950 if( p->backslashOn ) resolve_backslashes(zSql);
4951 BEGIN_TIMER;
4952 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
4953 END_TIMER;
4954 if( rc || zErrMsg ){
4955 char zPrefix[100];
4956 if( in!=0 || !stdin_is_interactive ){
4957 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
4958 "Error: near line %d:", startline);
4959 }else{
4960 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
4961 }
4962 if( zErrMsg!=0 ){
4963 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
4964 sqlite3_free(zErrMsg);
4965 zErrMsg = 0;
4966 }else{
4967 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
4968 }
4969 errCnt++;
4970 }else if( p->countChanges ){
4971 raw_printf(p->out, "changes: %3d total_changes: %d\n",
4972 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
4973 }
4974 nSql = 0;
4975 if( p->outCount ){
4976 output_reset(p);
4977 p->outCount = 0;
4978 }
4979 }else if( nSql && _all_whitespace(zSql) ){
4980 if( p->echoOn ) printf("%s\n", zSql);
4981 nSql = 0;
4982 }
4983 }
4984 if( nSql ){
4985 if( !_all_whitespace(zSql) ){
4986 utf8_printf(stderr, "Error: incomplete SQL: %s\n", zSql);
4987 errCnt++;
4988 }
4989 }
4990 free(zSql);
4991 free(zLine);
4992 return errCnt>0;
4993 }
4994
4995 /*
4996 ** Return a pathname which is the user's home directory. A
4997 ** 0 return indicates an error of some kind.
4998 */
4999 static char *find_home_dir(void){
5000 static char *home_dir = NULL;
5001 if( home_dir ) return home_dir;
5002
5003 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
5004 && !defined(__RTP__) && !defined(_WRS_KERNEL)
5005 {
5006 struct passwd *pwent;
5007 uid_t uid = getuid();
5008 if( (pwent=getpwuid(uid)) != NULL) {
5009 home_dir = pwent->pw_dir;
5010 }
5011 }
5012 #endif
5013
5014 #if defined(_WIN32_WCE)
5015 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
5016 */
5017 home_dir = "/";
5018 #else
5019
5020 #if defined(_WIN32) || defined(WIN32)
5021 if (!home_dir) {
5022 home_dir = getenv("USERPROFILE");
5023 }
5024 #endif
5025
5026 if (!home_dir) {
5027 home_dir = getenv("HOME");
5028 }
5029
5030 #if defined(_WIN32) || defined(WIN32)
5031 if (!home_dir) {
5032 char *zDrive, *zPath;
5033 int n;
5034 zDrive = getenv("HOMEDRIVE");
5035 zPath = getenv("HOMEPATH");
5036 if( zDrive && zPath ){
5037 n = strlen30(zDrive) + strlen30(zPath) + 1;
5038 home_dir = malloc( n );
5039 if( home_dir==0 ) return 0;
5040 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
5041 return home_dir;
5042 }
5043 home_dir = "c:\\";
5044 }
5045 #endif
5046
5047 #endif /* !_WIN32_WCE */
5048
5049 if( home_dir ){
5050 int n = strlen30(home_dir) + 1;
5051 char *z = malloc( n );
5052 if( z ) memcpy(z, home_dir, n);
5053 home_dir = z;
5054 }
5055
5056 return home_dir;
5057 }
5058
5059 /*
5060 ** Read input from the file given by sqliterc_override. Or if that
5061 ** parameter is NULL, take input from ~/.sqliterc
5062 **
5063 ** Returns the number of errors.
5064 */
5065 static void process_sqliterc(
5066 ShellState *p, /* Configuration data */
5067 const char *sqliterc_override /* Name of config file. NULL to use default */
5068 ){
5069 char *home_dir = NULL;
5070 const char *sqliterc = sqliterc_override;
5071 char *zBuf = 0;
5072 FILE *in = NULL;
5073
5074 if (sqliterc == NULL) {
5075 home_dir = find_home_dir();
5076 if( home_dir==0 ){
5077 raw_printf(stderr, "-- warning: cannot find home directory;"
5078 " cannot read ~/.sqliterc\n");
5079 return;
5080 }
5081 sqlite3_initialize();
5082 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
5083 sqliterc = zBuf;
5084 }
5085 in = fopen(sqliterc,"rb");
5086 if( in ){
5087 if( stdin_is_interactive ){
5088 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
5089 }
5090 process_input(p,in);
5091 fclose(in);
5092 }
5093 sqlite3_free(zBuf);
5094 }
5095
5096 /*
5097 ** Show available command line options
5098 */
5099 static const char zOptions[] =
5100 " -ascii set output mode to 'ascii'\n"
5101 " -bail stop after hitting an error\n"
5102 " -batch force batch I/O\n"
5103 " -column set output mode to 'column'\n"
5104 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
5105 " -csv set output mode to 'csv'\n"
5106 " -echo print commands before execution\n"
5107 " -init FILENAME read/process named file\n"
5108 " -[no]header turn headers on or off\n"
5109 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
5110 " -heap SIZE Size of heap for memsys3 or memsys5\n"
5111 #endif
5112 " -help show this message\n"
5113 " -html set output mode to HTML\n"
5114 " -interactive force interactive I/O\n"
5115 " -line set output mode to 'line'\n"
5116 " -list set output mode to 'list'\n"
5117 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
5118 " -mmap N default mmap size set to N\n"
5119 #ifdef SQLITE_ENABLE_MULTIPLEX
5120 " -multiplex enable the multiplexor VFS\n"
5121 #endif
5122 " -newline SEP set output row separator. Default: '\\n'\n"
5123 " -nullvalue TEXT set text string for NULL values. Default ''\n"
5124 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
5125 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
5126 " -separator SEP set output column separator. Default: '|'\n"
5127 " -stats print memory stats before each finalize\n"
5128 " -version show SQLite version\n"
5129 " -vfs NAME use NAME as the default VFS\n"
5130 #ifdef SQLITE_ENABLE_VFSTRACE
5131 " -vfstrace enable tracing of all VFS calls\n"
5132 #endif
5133 ;
5134 static void usage(int showDetail){
5135 utf8_printf(stderr,
5136 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
5137 "FILENAME is the name of an SQLite database. A new database is created\n"
5138 "if the file does not previously exist.\n", Argv0);
5139 if( showDetail ){
5140 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
5141 }else{
5142 raw_printf(stderr, "Use the -help option for additional information\n");
5143 }
5144 exit(1);
5145 }
5146
5147 /*
5148 ** Initialize the state information in data
5149 */
5150 static void main_init(ShellState *data) {
5151 memset(data, 0, sizeof(*data));
5152 data->normalMode = data->cMode = data->mode = MODE_List;
5153 data->autoExplain = 1;
5154 memcpy(data->colSeparator,SEP_Column, 2);
5155 memcpy(data->rowSeparator,SEP_Row, 2);
5156 data->showHeader = 0;
5157 data->shellFlgs = SHFLG_Lookaside;
5158 sqlite3_config(SQLITE_CONFIG_URI, 1);
5159 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
5160 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
5161 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
5162 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
5163 }
5164
5165 /*
5166 ** Output text to the console in a font that attracts extra attention.
5167 */
5168 #ifdef _WIN32
5169 static void printBold(const char *zText){
5170 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
5171 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
5172 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
5173 SetConsoleTextAttribute(out,
5174 FOREGROUND_RED|FOREGROUND_INTENSITY
5175 );
5176 printf("%s", zText);
5177 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
5178 }
5179 #else
5180 static void printBold(const char *zText){
5181 printf("\033[1m%s\033[0m", zText);
5182 }
5183 #endif
5184
5185 /*
5186 ** Get the argument to an --option. Throw an error and die if no argument
5187 ** is available.
5188 */
5189 static char *cmdline_option_value(int argc, char **argv, int i){
5190 if( i==argc ){
5191 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
5192 argv[0], argv[argc-1]);
5193 exit(1);
5194 }
5195 return argv[i];
5196 }
5197
5198 #ifndef SQLITE_SHELL_IS_UTF8
5199 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
5200 # define SQLITE_SHELL_IS_UTF8 (0)
5201 # else
5202 # define SQLITE_SHELL_IS_UTF8 (1)
5203 # endif
5204 #endif
5205
5206 #if SQLITE_SHELL_IS_UTF8
5207 int SQLITE_CDECL main(int argc, char **argv){
5208 #else
5209 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
5210 char **argv;
5211 #endif
5212 char *zErrMsg = 0;
5213 ShellState data;
5214 const char *zInitFile = 0;
5215 int i;
5216 int rc = 0;
5217 int warnInmemoryDb = 0;
5218 int readStdin = 1;
5219 int nCmd = 0;
5220 char **azCmd = 0;
5221
5222 setBinaryMode(stdin, 0);
5223 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
5224 stdin_is_interactive = isatty(0);
5225 stdout_is_console = isatty(1);
5226
5227 #if USE_SYSTEM_SQLITE+0!=1
5228 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
5229 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
5230 sqlite3_sourceid(), SQLITE_SOURCE_ID);
5231 exit(1);
5232 }
5233 #endif
5234 main_init(&data);
5235 #if !SQLITE_SHELL_IS_UTF8
5236 sqlite3_initialize();
5237 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
5238 if( argv==0 ){
5239 raw_printf(stderr, "out of memory\n");
5240 exit(1);
5241 }
5242 for(i=0; i<argc; i++){
5243 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
5244 if( argv[i]==0 ){
5245 raw_printf(stderr, "out of memory\n");
5246 exit(1);
5247 }
5248 }
5249 #endif
5250 assert( argc>=1 && argv && argv[0] );
5251 Argv0 = argv[0];
5252
5253 /* Make sure we have a valid signal handler early, before anything
5254 ** else is done.
5255 */
5256 #ifdef SIGINT
5257 signal(SIGINT, interrupt_handler);
5258 #endif
5259
5260 #ifdef SQLITE_SHELL_DBNAME_PROC
5261 {
5262 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
5263 ** of a C-function that will provide the name of the database file. Use
5264 ** this compile-time option to embed this shell program in larger
5265 ** applications. */
5266 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
5267 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
5268 warnInmemoryDb = 0;
5269 }
5270 #endif
5271
5272 /* Do an initial pass through the command-line argument to locate
5273 ** the name of the database file, the name of the initialization file,
5274 ** the size of the alternative malloc heap,
5275 ** and the first command to execute.
5276 */
5277 for(i=1; i<argc; i++){
5278 char *z;
5279 z = argv[i];
5280 if( z[0]!='-' ){
5281 if( data.zDbFilename==0 ){
5282 data.zDbFilename = z;
5283 }else{
5284 /* Excesss arguments are interpreted as SQL (or dot-commands) and
5285 ** mean that nothing is read from stdin */
5286 readStdin = 0;
5287 nCmd++;
5288 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
5289 if( azCmd==0 ){
5290 raw_printf(stderr, "out of memory\n");
5291 exit(1);
5292 }
5293 azCmd[nCmd-1] = z;
5294 }
5295 }
5296 if( z[1]=='-' ) z++;
5297 if( strcmp(z,"-separator")==0
5298 || strcmp(z,"-nullvalue")==0
5299 || strcmp(z,"-newline")==0
5300 || strcmp(z,"-cmd")==0
5301 ){
5302 (void)cmdline_option_value(argc, argv, ++i);
5303 }else if( strcmp(z,"-init")==0 ){
5304 zInitFile = cmdline_option_value(argc, argv, ++i);
5305 }else if( strcmp(z,"-batch")==0 ){
5306 /* Need to check for batch mode here to so we can avoid printing
5307 ** informational messages (like from process_sqliterc) before
5308 ** we do the actual processing of arguments later in a second pass.
5309 */
5310 stdin_is_interactive = 0;
5311 }else if( strcmp(z,"-heap")==0 ){
5312 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
5313 const char *zSize;
5314 sqlite3_int64 szHeap;
5315
5316 zSize = cmdline_option_value(argc, argv, ++i);
5317 szHeap = integerValue(zSize);
5318 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
5319 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
5320 #endif
5321 }else if( strcmp(z,"-scratch")==0 ){
5322 int n, sz;
5323 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
5324 if( sz>400000 ) sz = 400000;
5325 if( sz<2500 ) sz = 2500;
5326 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
5327 if( n>10 ) n = 10;
5328 if( n<1 ) n = 1;
5329 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
5330 data.shellFlgs |= SHFLG_Scratch;
5331 }else if( strcmp(z,"-pagecache")==0 ){
5332 int n, sz;
5333 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
5334 if( sz>70000 ) sz = 70000;
5335 if( sz<0 ) sz = 0;
5336 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
5337 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
5338 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
5339 data.shellFlgs |= SHFLG_Pagecache;
5340 }else if( strcmp(z,"-lookaside")==0 ){
5341 int n, sz;
5342 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
5343 if( sz<0 ) sz = 0;
5344 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
5345 if( n<0 ) n = 0;
5346 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
5347 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
5348 #ifdef SQLITE_ENABLE_VFSTRACE
5349 }else if( strcmp(z,"-vfstrace")==0 ){
5350 extern int vfstrace_register(
5351 const char *zTraceName,
5352 const char *zOldVfsName,
5353 int (*xOut)(const char*,void*),
5354 void *pOutArg,
5355 int makeDefault
5356 );
5357 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
5358 #endif
5359 #ifdef SQLITE_ENABLE_MULTIPLEX
5360 }else if( strcmp(z,"-multiplex")==0 ){
5361 extern int sqlite3_multiple_initialize(const char*,int);
5362 sqlite3_multiplex_initialize(0, 1);
5363 #endif
5364 }else if( strcmp(z,"-mmap")==0 ){
5365 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
5366 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
5367 }else if( strcmp(z,"-vfs")==0 ){
5368 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
5369 if( pVfs ){
5370 sqlite3_vfs_register(pVfs, 1);
5371 }else{
5372 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
5373 exit(1);
5374 }
5375 }
5376 }
5377 if( data.zDbFilename==0 ){
5378 #ifndef SQLITE_OMIT_MEMORYDB
5379 data.zDbFilename = ":memory:";
5380 warnInmemoryDb = argc==1;
5381 #else
5382 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
5383 return 1;
5384 #endif
5385 }
5386 data.out = stdout;
5387
5388 /* Go ahead and open the database file if it already exists. If the
5389 ** file does not exist, delay opening it. This prevents empty database
5390 ** files from being created if a user mistypes the database name argument
5391 ** to the sqlite command-line tool.
5392 */
5393 if( access(data.zDbFilename, 0)==0 ){
5394 open_db(&data, 0);
5395 }
5396
5397 /* Process the initialization file if there is one. If no -init option
5398 ** is given on the command line, look for a file named ~/.sqliterc and
5399 ** try to process it.
5400 */
5401 process_sqliterc(&data,zInitFile);
5402
5403 /* Make a second pass through the command-line argument and set
5404 ** options. This second pass is delayed until after the initialization
5405 ** file is processed so that the command-line arguments will override
5406 ** settings in the initialization file.
5407 */
5408 for(i=1; i<argc; i++){
5409 char *z = argv[i];
5410 if( z[0]!='-' ) continue;
5411 if( z[1]=='-' ){ z++; }
5412 if( strcmp(z,"-init")==0 ){
5413 i++;
5414 }else if( strcmp(z,"-html")==0 ){
5415 data.mode = MODE_Html;
5416 }else if( strcmp(z,"-list")==0 ){
5417 data.mode = MODE_List;
5418 }else if( strcmp(z,"-line")==0 ){
5419 data.mode = MODE_Line;
5420 }else if( strcmp(z,"-column")==0 ){
5421 data.mode = MODE_Column;
5422 }else if( strcmp(z,"-csv")==0 ){
5423 data.mode = MODE_Csv;
5424 memcpy(data.colSeparator,",",2);
5425 }else if( strcmp(z,"-ascii")==0 ){
5426 data.mode = MODE_Ascii;
5427 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
5428 SEP_Unit);
5429 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
5430 SEP_Record);
5431 }else if( strcmp(z,"-separator")==0 ){
5432 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
5433 "%s",cmdline_option_value(argc,argv,++i));
5434 }else if( strcmp(z,"-newline")==0 ){
5435 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
5436 "%s",cmdline_option_value(argc,argv,++i));
5437 }else if( strcmp(z,"-nullvalue")==0 ){
5438 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
5439 "%s",cmdline_option_value(argc,argv,++i));
5440 }else if( strcmp(z,"-header")==0 ){
5441 data.showHeader = 1;
5442 }else if( strcmp(z,"-noheader")==0 ){
5443 data.showHeader = 0;
5444 }else if( strcmp(z,"-echo")==0 ){
5445 data.echoOn = 1;
5446 }else if( strcmp(z,"-eqp")==0 ){
5447 data.autoEQP = 1;
5448 }else if( strcmp(z,"-eqpfull")==0 ){
5449 data.autoEQP = 2;
5450 }else if( strcmp(z,"-stats")==0 ){
5451 data.statsOn = 1;
5452 }else if( strcmp(z,"-scanstats")==0 ){
5453 data.scanstatsOn = 1;
5454 }else if( strcmp(z,"-backslash")==0 ){
5455 /* Undocumented command-line option: -backslash
5456 ** Causes C-style backslash escapes to be evaluated in SQL statements
5457 ** prior to sending the SQL into SQLite. Useful for injecting
5458 ** crazy bytes in the middle of SQL statements for testing and debugging.
5459 */
5460 data.backslashOn = 1;
5461 }else if( strcmp(z,"-bail")==0 ){
5462 bail_on_error = 1;
5463 }else if( strcmp(z,"-version")==0 ){
5464 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
5465 return 0;
5466 }else if( strcmp(z,"-interactive")==0 ){
5467 stdin_is_interactive = 1;
5468 }else if( strcmp(z,"-batch")==0 ){
5469 stdin_is_interactive = 0;
5470 }else if( strcmp(z,"-heap")==0 ){
5471 i++;
5472 }else if( strcmp(z,"-scratch")==0 ){
5473 i+=2;
5474 }else if( strcmp(z,"-pagecache")==0 ){
5475 i+=2;
5476 }else if( strcmp(z,"-lookaside")==0 ){
5477 i+=2;
5478 }else if( strcmp(z,"-mmap")==0 ){
5479 i++;
5480 }else if( strcmp(z,"-vfs")==0 ){
5481 i++;
5482 #ifdef SQLITE_ENABLE_VFSTRACE
5483 }else if( strcmp(z,"-vfstrace")==0 ){
5484 i++;
5485 #endif
5486 #ifdef SQLITE_ENABLE_MULTIPLEX
5487 }else if( strcmp(z,"-multiplex")==0 ){
5488 i++;
5489 #endif
5490 }else if( strcmp(z,"-help")==0 ){
5491 usage(1);
5492 }else if( strcmp(z,"-cmd")==0 ){
5493 /* Run commands that follow -cmd first and separately from commands
5494 ** that simply appear on the command-line. This seems goofy. It would
5495 ** be better if all commands ran in the order that they appear. But
5496 ** we retain the goofy behavior for historical compatibility. */
5497 if( i==argc-1 ) break;
5498 z = cmdline_option_value(argc,argv,++i);
5499 if( z[0]=='.' ){
5500 rc = do_meta_command(z, &data);
5501 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
5502 }else{
5503 open_db(&data, 0);
5504 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
5505 if( zErrMsg!=0 ){
5506 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5507 if( bail_on_error ) return rc!=0 ? rc : 1;
5508 }else if( rc!=0 ){
5509 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
5510 if( bail_on_error ) return rc;
5511 }
5512 }
5513 }else{
5514 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
5515 raw_printf(stderr,"Use -help for a list of options.\n");
5516 return 1;
5517 }
5518 data.cMode = data.mode;
5519 }
5520
5521 if( !readStdin ){
5522 /* Run all arguments that do not begin with '-' as if they were separate
5523 ** command-line inputs, except for the argToSkip argument which contains
5524 ** the database filename.
5525 */
5526 for(i=0; i<nCmd; i++){
5527 if( azCmd[i][0]=='.' ){
5528 rc = do_meta_command(azCmd[i], &data);
5529 if( rc ) return rc==2 ? 0 : rc;
5530 }else{
5531 open_db(&data, 0);
5532 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
5533 if( zErrMsg!=0 ){
5534 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5535 return rc!=0 ? rc : 1;
5536 }else if( rc!=0 ){
5537 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
5538 return rc;
5539 }
5540 }
5541 }
5542 free(azCmd);
5543 }else{
5544 /* Run commands received from standard input
5545 */
5546 if( stdin_is_interactive ){
5547 char *zHome;
5548 char *zHistory = 0;
5549 int nHistory;
5550 printf(
5551 "SQLite version %s %.19s\n" /*extra-version-info*/
5552 "Enter \".help\" for usage hints.\n",
5553 sqlite3_libversion(), sqlite3_sourceid()
5554 );
5555 if( warnInmemoryDb ){
5556 printf("Connected to a ");
5557 printBold("transient in-memory database");
5558 printf(".\nUse \".open FILENAME\" to reopen on a "
5559 "persistent database.\n");
5560 }
5561 zHome = find_home_dir();
5562 if( zHome ){
5563 nHistory = strlen30(zHome) + 20;
5564 if( (zHistory = malloc(nHistory))!=0 ){
5565 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
5566 }
5567 }
5568 if( zHistory ){ shell_read_history(zHistory); }
5569 rc = process_input(&data, 0);
5570 if( zHistory ){
5571 shell_stifle_history(100);
5572 shell_write_history(zHistory);
5573 free(zHistory);
5574 }
5575 }else{
5576 rc = process_input(&data, stdin);
5577 }
5578 }
5579 set_table_name(&data, 0);
5580 if( data.db ){
5581 session_close_all(&data);
5582 sqlite3_close(data.db);
5583 }
5584 sqlite3_free(data.zFreeOnClose);
5585 #if !SQLITE_SHELL_IS_UTF8
5586 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
5587 sqlite3_free(argv);
5588 #endif
5589 return rc;
5590 }