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