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