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

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

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

Powered by Google App Engine
This is Rietveld 408576698