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** Optionally #include a user-defined header, whereby compilation options 22** may be set prior to where they take effect, but after platform setup. 23** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include 24** file. Note that this macro has a like effect on sqlite3.c compilation. 25*/ 26#ifdef SQLITE_CUSTOM_INCLUDE 27# define INC_STRINGIFY_(f) #f 28# define INC_STRINGIFY(f) INC_STRINGIFY_(f) 29# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE) 30#endif 31 32/* 33** Determine if we are dealing with WinRT, which provides only a subset of 34** the full Win32 API. 35*/ 36#if !defined(SQLITE_OS_WINRT) 37# define SQLITE_OS_WINRT 0 38#endif 39 40/* 41** Warning pragmas copied from msvc.h in the core. 42*/ 43#if defined(_MSC_VER) 44#pragma warning(disable : 4054) 45#pragma warning(disable : 4055) 46#pragma warning(disable : 4100) 47#pragma warning(disable : 4127) 48#pragma warning(disable : 4130) 49#pragma warning(disable : 4152) 50#pragma warning(disable : 4189) 51#pragma warning(disable : 4206) 52#pragma warning(disable : 4210) 53#pragma warning(disable : 4232) 54#pragma warning(disable : 4244) 55#pragma warning(disable : 4305) 56#pragma warning(disable : 4306) 57#pragma warning(disable : 4702) 58#pragma warning(disable : 4706) 59#endif /* defined(_MSC_VER) */ 60 61/* 62** No support for loadable extensions in VxWorks. 63*/ 64#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 65# define SQLITE_OMIT_LOAD_EXTENSION 1 66#endif 67 68/* 69** Enable large-file support for fopen() and friends on unix. 70*/ 71#ifndef SQLITE_DISABLE_LFS 72# define _LARGE_FILE 1 73# ifndef _FILE_OFFSET_BITS 74# define _FILE_OFFSET_BITS 64 75# endif 76# define _LARGEFILE_SOURCE 1 77#endif 78 79#include <stdlib.h> 80#include <string.h> 81#include <stdio.h> 82#include <assert.h> 83#include "sqlite3.h" 84typedef sqlite3_int64 i64; 85typedef sqlite3_uint64 u64; 86typedef unsigned char u8; 87#if SQLITE_USER_AUTHENTICATION 88# include "sqlite3userauth.h" 89#endif 90#include <ctype.h> 91#include <stdarg.h> 92 93#if !defined(_WIN32) && !defined(WIN32) 94# include <signal.h> 95# if !defined(__RTP__) && !defined(_WRS_KERNEL) 96# include <pwd.h> 97# endif 98#endif 99#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 100# include <unistd.h> 101# include <dirent.h> 102# define GETPID getpid 103# if defined(__MINGW32__) 104# define DIRENT dirent 105# ifndef S_ISLNK 106# define S_ISLNK(mode) (0) 107# endif 108# endif 109#else 110# define GETPID (int)GetCurrentProcessId 111#endif 112#include <sys/types.h> 113#include <sys/stat.h> 114 115#if HAVE_READLINE 116# include <readline/readline.h> 117# include <readline/history.h> 118#endif 119 120#if HAVE_EDITLINE 121# include <editline/readline.h> 122#endif 123 124#if HAVE_EDITLINE || HAVE_READLINE 125 126# define shell_add_history(X) add_history(X) 127# define shell_read_history(X) read_history(X) 128# define shell_write_history(X) write_history(X) 129# define shell_stifle_history(X) stifle_history(X) 130# define shell_readline(X) readline(X) 131 132#elif HAVE_LINENOISE 133 134# include "linenoise.h" 135# define shell_add_history(X) linenoiseHistoryAdd(X) 136# define shell_read_history(X) linenoiseHistoryLoad(X) 137# define shell_write_history(X) linenoiseHistorySave(X) 138# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 139# define shell_readline(X) linenoise(X) 140 141#else 142 143# define shell_read_history(X) 144# define shell_write_history(X) 145# define shell_stifle_history(X) 146 147# define SHELL_USE_LOCAL_GETLINE 1 148#endif 149 150 151#if defined(_WIN32) || defined(WIN32) 152# if SQLITE_OS_WINRT 153# define SQLITE_OMIT_POPEN 1 154# else 155# include <io.h> 156# include <fcntl.h> 157# define isatty(h) _isatty(h) 158# ifndef access 159# define access(f,m) _access((f),(m)) 160# endif 161# ifndef unlink 162# define unlink _unlink 163# endif 164# ifndef strdup 165# define strdup _strdup 166# endif 167# undef popen 168# define popen _popen 169# undef pclose 170# define pclose _pclose 171# endif 172#else 173 /* Make sure isatty() has a prototype. */ 174 extern int isatty(int); 175 176# if !defined(__RTP__) && !defined(_WRS_KERNEL) 177 /* popen and pclose are not C89 functions and so are 178 ** sometimes omitted from the <stdio.h> header */ 179 extern FILE *popen(const char*,const char*); 180 extern int pclose(FILE*); 181# else 182# define SQLITE_OMIT_POPEN 1 183# endif 184#endif 185 186#if defined(_WIN32_WCE) 187/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 188 * thus we always assume that we have a console. That can be 189 * overridden with the -batch command line option. 190 */ 191#define isatty(x) 1 192#endif 193 194/* ctype macros that work with signed characters */ 195#define IsSpace(X) isspace((unsigned char)X) 196#define IsDigit(X) isdigit((unsigned char)X) 197#define ToLower(X) (char)tolower((unsigned char)X) 198 199#if defined(_WIN32) || defined(WIN32) 200#if SQLITE_OS_WINRT 201#include <intrin.h> 202#endif 203#include <windows.h> 204 205/* string conversion routines only needed on Win32 */ 206extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 207extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 208extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 209extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 210#endif 211 212/* On Windows, we normally run with output mode of TEXT so that \n characters 213** are automatically translated into \r\n. However, this behavior needs 214** to be disabled in some cases (ex: when generating CSV output and when 215** rendering quoted strings that contain \n characters). The following 216** routines take care of that. 217*/ 218#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT 219static void setBinaryMode(FILE *file, int isOutput){ 220 if( isOutput ) fflush(file); 221 _setmode(_fileno(file), _O_BINARY); 222} 223static void setTextMode(FILE *file, int isOutput){ 224 if( isOutput ) fflush(file); 225 _setmode(_fileno(file), _O_TEXT); 226} 227#else 228# define setBinaryMode(X,Y) 229# define setTextMode(X,Y) 230#endif 231 232 233/* True if the timer is enabled */ 234static int enableTimer = 0; 235 236/* Return the current wall-clock time */ 237static sqlite3_int64 timeOfDay(void){ 238 static sqlite3_vfs *clockVfs = 0; 239 sqlite3_int64 t; 240 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 241 if( clockVfs==0 ) return 0; /* Never actually happens */ 242 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 243 clockVfs->xCurrentTimeInt64(clockVfs, &t); 244 }else{ 245 double r; 246 clockVfs->xCurrentTime(clockVfs, &r); 247 t = (sqlite3_int64)(r*86400000.0); 248 } 249 return t; 250} 251 252#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 253#include <sys/time.h> 254#include <sys/resource.h> 255 256/* VxWorks does not support getrusage() as far as we can determine */ 257#if defined(_WRS_KERNEL) || defined(__RTP__) 258struct rusage { 259 struct timeval ru_utime; /* user CPU time used */ 260 struct timeval ru_stime; /* system CPU time used */ 261}; 262#define getrusage(A,B) memset(B,0,sizeof(*B)) 263#endif 264 265/* Saved resource information for the beginning of an operation */ 266static struct rusage sBegin; /* CPU time at start */ 267static sqlite3_int64 iBegin; /* Wall-clock time at start */ 268 269/* 270** Begin timing an operation 271*/ 272static void beginTimer(void){ 273 if( enableTimer ){ 274 getrusage(RUSAGE_SELF, &sBegin); 275 iBegin = timeOfDay(); 276 } 277} 278 279/* Return the difference of two time_structs in seconds */ 280static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 281 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 282 (double)(pEnd->tv_sec - pStart->tv_sec); 283} 284 285/* 286** Print the timing results. 287*/ 288static void endTimer(void){ 289 if( enableTimer ){ 290 sqlite3_int64 iEnd = timeOfDay(); 291 struct rusage sEnd; 292 getrusage(RUSAGE_SELF, &sEnd); 293 printf("Run Time: real %.3f user %f sys %f\n", 294 (iEnd - iBegin)*0.001, 295 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 296 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 297 } 298} 299 300#define BEGIN_TIMER beginTimer() 301#define END_TIMER endTimer() 302#define HAS_TIMER 1 303 304#elif (defined(_WIN32) || defined(WIN32)) 305 306/* Saved resource information for the beginning of an operation */ 307static HANDLE hProcess; 308static FILETIME ftKernelBegin; 309static FILETIME ftUserBegin; 310static sqlite3_int64 ftWallBegin; 311typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 312 LPFILETIME, LPFILETIME); 313static GETPROCTIMES getProcessTimesAddr = NULL; 314 315/* 316** Check to see if we have timer support. Return 1 if necessary 317** support found (or found previously). 318*/ 319static int hasTimer(void){ 320 if( getProcessTimesAddr ){ 321 return 1; 322 } else { 323#if !SQLITE_OS_WINRT 324 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 325 ** versions. See if the version we are running on has it, and if it 326 ** does, save off a pointer to it and the current process handle. 327 */ 328 hProcess = GetCurrentProcess(); 329 if( hProcess ){ 330 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 331 if( NULL != hinstLib ){ 332 getProcessTimesAddr = 333 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 334 if( NULL != getProcessTimesAddr ){ 335 return 1; 336 } 337 FreeLibrary(hinstLib); 338 } 339 } 340#endif 341 } 342 return 0; 343} 344 345/* 346** Begin timing an operation 347*/ 348static void beginTimer(void){ 349 if( enableTimer && getProcessTimesAddr ){ 350 FILETIME ftCreation, ftExit; 351 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 352 &ftKernelBegin,&ftUserBegin); 353 ftWallBegin = timeOfDay(); 354 } 355} 356 357/* Return the difference of two FILETIME structs in seconds */ 358static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 359 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 360 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 361 return (double) ((i64End - i64Start) / 10000000.0); 362} 363 364/* 365** Print the timing results. 366*/ 367static void endTimer(void){ 368 if( enableTimer && getProcessTimesAddr){ 369 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 370 sqlite3_int64 ftWallEnd = timeOfDay(); 371 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 372 printf("Run Time: real %.3f user %f sys %f\n", 373 (ftWallEnd - ftWallBegin)*0.001, 374 timeDiff(&ftUserBegin, &ftUserEnd), 375 timeDiff(&ftKernelBegin, &ftKernelEnd)); 376 } 377} 378 379#define BEGIN_TIMER beginTimer() 380#define END_TIMER endTimer() 381#define HAS_TIMER hasTimer() 382 383#else 384#define BEGIN_TIMER 385#define END_TIMER 386#define HAS_TIMER 0 387#endif 388 389/* 390** Used to prevent warnings about unused parameters 391*/ 392#define UNUSED_PARAMETER(x) (void)(x) 393 394/* 395** Number of elements in an array 396*/ 397#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 398 399/* 400** If the following flag is set, then command execution stops 401** at an error if we are not interactive. 402*/ 403static int bail_on_error = 0; 404 405/* 406** Threat stdin as an interactive input if the following variable 407** is true. Otherwise, assume stdin is connected to a file or pipe. 408*/ 409static int stdin_is_interactive = 1; 410 411/* 412** On Windows systems we have to know if standard output is a console 413** in order to translate UTF-8 into MBCS. The following variable is 414** true if translation is required. 415*/ 416static int stdout_is_console = 1; 417 418/* 419** The following is the open SQLite database. We make a pointer 420** to this database a static variable so that it can be accessed 421** by the SIGINT handler to interrupt database processing. 422*/ 423static sqlite3 *globalDb = 0; 424 425/* 426** True if an interrupt (Control-C) has been received. 427*/ 428static volatile int seenInterrupt = 0; 429 430/* 431** This is the name of our program. It is set in main(), used 432** in a number of other places, mostly for error messages. 433*/ 434static char *Argv0; 435 436/* 437** Prompt strings. Initialized in main. Settable with 438** .prompt main continue 439*/ 440static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 441static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 442 443/* 444** Render output like fprintf(). Except, if the output is going to the 445** console and if this is running on a Windows machine, translate the 446** output from UTF-8 into MBCS. 447*/ 448#if defined(_WIN32) || defined(WIN32) 449void utf8_printf(FILE *out, const char *zFormat, ...){ 450 va_list ap; 451 va_start(ap, zFormat); 452 if( stdout_is_console && (out==stdout || out==stderr) ){ 453 char *z1 = sqlite3_vmprintf(zFormat, ap); 454 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 455 sqlite3_free(z1); 456 fputs(z2, out); 457 sqlite3_free(z2); 458 }else{ 459 vfprintf(out, zFormat, ap); 460 } 461 va_end(ap); 462} 463#elif !defined(utf8_printf) 464# define utf8_printf fprintf 465#endif 466 467/* 468** Render output like fprintf(). This should not be used on anything that 469** includes string formatting (e.g. "%s"). 470*/ 471#if !defined(raw_printf) 472# define raw_printf fprintf 473#endif 474 475/* Indicate out-of-memory and exit. */ 476static void shell_out_of_memory(void){ 477 raw_printf(stderr,"Error: out of memory\n"); 478 exit(1); 479} 480 481/* Check a pointer to see if it is NULL. If it is NULL, exit with an 482** out-of-memory error. 483*/ 484static void shell_check_oom(void *p){ 485 if( p==0 ) shell_out_of_memory(); 486} 487 488/* 489** Write I/O traces to the following stream. 490*/ 491#ifdef SQLITE_ENABLE_IOTRACE 492static FILE *iotrace = 0; 493#endif 494 495/* 496** This routine works like printf in that its first argument is a 497** format string and subsequent arguments are values to be substituted 498** in place of % fields. The result of formatting this string 499** is written to iotrace. 500*/ 501#ifdef SQLITE_ENABLE_IOTRACE 502static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 503 va_list ap; 504 char *z; 505 if( iotrace==0 ) return; 506 va_start(ap, zFormat); 507 z = sqlite3_vmprintf(zFormat, ap); 508 va_end(ap); 509 utf8_printf(iotrace, "%s", z); 510 sqlite3_free(z); 511} 512#endif 513 514/* 515** Output string zUtf to stream pOut as w characters. If w is negative, 516** then right-justify the text. W is the width in UTF-8 characters, not 517** in bytes. This is different from the %*.*s specification in printf 518** since with %*.*s the width is measured in bytes, not characters. 519*/ 520static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 521 int i; 522 int n; 523 int aw = w<0 ? -w : w; 524 for(i=n=0; zUtf[i]; i++){ 525 if( (zUtf[i]&0xc0)!=0x80 ){ 526 n++; 527 if( n==aw ){ 528 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 529 break; 530 } 531 } 532 } 533 if( n>=aw ){ 534 utf8_printf(pOut, "%.*s", i, zUtf); 535 }else if( w<0 ){ 536 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 537 }else{ 538 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 539 } 540} 541 542 543/* 544** Determines if a string is a number of not. 545*/ 546static int isNumber(const char *z, int *realnum){ 547 if( *z=='-' || *z=='+' ) z++; 548 if( !IsDigit(*z) ){ 549 return 0; 550 } 551 z++; 552 if( realnum ) *realnum = 0; 553 while( IsDigit(*z) ){ z++; } 554 if( *z=='.' ){ 555 z++; 556 if( !IsDigit(*z) ) return 0; 557 while( IsDigit(*z) ){ z++; } 558 if( realnum ) *realnum = 1; 559 } 560 if( *z=='e' || *z=='E' ){ 561 z++; 562 if( *z=='+' || *z=='-' ) z++; 563 if( !IsDigit(*z) ) return 0; 564 while( IsDigit(*z) ){ z++; } 565 if( realnum ) *realnum = 1; 566 } 567 return *z==0; 568} 569 570/* 571** Compute a string length that is limited to what can be stored in 572** lower 30 bits of a 32-bit signed integer. 573*/ 574static int strlen30(const char *z){ 575 const char *z2 = z; 576 while( *z2 ){ z2++; } 577 return 0x3fffffff & (int)(z2 - z); 578} 579 580/* 581** Return the length of a string in characters. Multibyte UTF8 characters 582** count as a single character. 583*/ 584static int strlenChar(const char *z){ 585 int n = 0; 586 while( *z ){ 587 if( (0xc0&*(z++))!=0x80 ) n++; 588 } 589 return n; 590} 591 592/* 593** Return open FILE * if zFile exists, can be opened for read 594** and is an ordinary file or a character stream source. 595** Otherwise return 0. 596*/ 597static FILE * openChrSource(const char *zFile){ 598#ifdef _WIN32 599 struct _stat x = {0}; 600# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) 601 /* On Windows, open first, then check the stream nature. This order 602 ** is necessary because _stat() and sibs, when checking a named pipe, 603 ** effectively break the pipe as its supplier sees it. */ 604 FILE *rv = fopen(zFile, "rb"); 605 if( rv==0 ) return 0; 606 if( _fstat(_fileno(rv), &x) != 0 607 || !STAT_CHR_SRC(x.st_mode)){ 608 fclose(rv); 609 rv = 0; 610 } 611 return rv; 612#else 613 struct stat x = {0}; 614 int rc = stat(zFile, &x); 615# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) 616 if( rc!=0 ) return 0; 617 if( STAT_CHR_SRC(x.st_mode) ){ 618 return fopen(zFile, "rb"); 619 }else{ 620 return 0; 621 } 622#endif 623#undef STAT_CHR_SRC 624} 625 626/* 627** This routine reads a line of text from FILE in, stores 628** the text in memory obtained from malloc() and returns a pointer 629** to the text. NULL is returned at end of file, or if malloc() 630** fails. 631** 632** If zLine is not NULL then it is a malloced buffer returned from 633** a previous call to this routine that may be reused. 634*/ 635static char *local_getline(char *zLine, FILE *in){ 636 int nLine = zLine==0 ? 0 : 100; 637 int n = 0; 638 639 while( 1 ){ 640 if( n+100>nLine ){ 641 nLine = nLine*2 + 100; 642 zLine = realloc(zLine, nLine); 643 shell_check_oom(zLine); 644 } 645 if( fgets(&zLine[n], nLine - n, in)==0 ){ 646 if( n==0 ){ 647 free(zLine); 648 return 0; 649 } 650 zLine[n] = 0; 651 break; 652 } 653 while( zLine[n] ) n++; 654 if( n>0 && zLine[n-1]=='\n' ){ 655 n--; 656 if( n>0 && zLine[n-1]=='\r' ) n--; 657 zLine[n] = 0; 658 break; 659 } 660 } 661#if defined(_WIN32) || defined(WIN32) 662 /* For interactive input on Windows systems, translate the 663 ** multi-byte characterset characters into UTF-8. */ 664 if( stdin_is_interactive && in==stdin ){ 665 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 666 if( zTrans ){ 667 int nTrans = strlen30(zTrans)+1; 668 if( nTrans>nLine ){ 669 zLine = realloc(zLine, nTrans); 670 shell_check_oom(zLine); 671 } 672 memcpy(zLine, zTrans, nTrans); 673 sqlite3_free(zTrans); 674 } 675 } 676#endif /* defined(_WIN32) || defined(WIN32) */ 677 return zLine; 678} 679 680/* 681** Retrieve a single line of input text. 682** 683** If in==0 then read from standard input and prompt before each line. 684** If isContinuation is true, then a continuation prompt is appropriate. 685** If isContinuation is zero, then the main prompt should be used. 686** 687** If zPrior is not NULL then it is a buffer from a prior call to this 688** routine that can be reused. 689** 690** The result is stored in space obtained from malloc() and must either 691** be freed by the caller or else passed back into this routine via the 692** zPrior argument for reuse. 693*/ 694static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 695 char *zPrompt; 696 char *zResult; 697 if( in!=0 ){ 698 zResult = local_getline(zPrior, in); 699 }else{ 700 zPrompt = isContinuation ? continuePrompt : mainPrompt; 701#if SHELL_USE_LOCAL_GETLINE 702 printf("%s", zPrompt); 703 fflush(stdout); 704 zResult = local_getline(zPrior, stdin); 705#else 706 free(zPrior); 707 zResult = shell_readline(zPrompt); 708 if( zResult && *zResult ) shell_add_history(zResult); 709#endif 710 } 711 return zResult; 712} 713 714 715/* 716** Return the value of a hexadecimal digit. Return -1 if the input 717** is not a hex digit. 718*/ 719static int hexDigitValue(char c){ 720 if( c>='0' && c<='9' ) return c - '0'; 721 if( c>='a' && c<='f' ) return c - 'a' + 10; 722 if( c>='A' && c<='F' ) return c - 'A' + 10; 723 return -1; 724} 725 726/* 727** Interpret zArg as an integer value, possibly with suffixes. 728*/ 729static sqlite3_int64 integerValue(const char *zArg){ 730 sqlite3_int64 v = 0; 731 static const struct { char *zSuffix; int iMult; } aMult[] = { 732 { "KiB", 1024 }, 733 { "MiB", 1024*1024 }, 734 { "GiB", 1024*1024*1024 }, 735 { "KB", 1000 }, 736 { "MB", 1000000 }, 737 { "GB", 1000000000 }, 738 { "K", 1000 }, 739 { "M", 1000000 }, 740 { "G", 1000000000 }, 741 }; 742 int i; 743 int isNeg = 0; 744 if( zArg[0]=='-' ){ 745 isNeg = 1; 746 zArg++; 747 }else if( zArg[0]=='+' ){ 748 zArg++; 749 } 750 if( zArg[0]=='0' && zArg[1]=='x' ){ 751 int x; 752 zArg += 2; 753 while( (x = hexDigitValue(zArg[0]))>=0 ){ 754 v = (v<<4) + x; 755 zArg++; 756 } 757 }else{ 758 while( IsDigit(zArg[0]) ){ 759 v = v*10 + zArg[0] - '0'; 760 zArg++; 761 } 762 } 763 for(i=0; i<ArraySize(aMult); i++){ 764 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 765 v *= aMult[i].iMult; 766 break; 767 } 768 } 769 return isNeg? -v : v; 770} 771 772/* 773** A variable length string to which one can append text. 774*/ 775typedef struct ShellText ShellText; 776struct ShellText { 777 char *z; 778 int n; 779 int nAlloc; 780}; 781 782/* 783** Initialize and destroy a ShellText object 784*/ 785static void initText(ShellText *p){ 786 memset(p, 0, sizeof(*p)); 787} 788static void freeText(ShellText *p){ 789 free(p->z); 790 initText(p); 791} 792 793/* zIn is either a pointer to a NULL-terminated string in memory obtained 794** from malloc(), or a NULL pointer. The string pointed to by zAppend is 795** added to zIn, and the result returned in memory obtained from malloc(). 796** zIn, if it was not NULL, is freed. 797** 798** If the third argument, quote, is not '\0', then it is used as a 799** quote character for zAppend. 800*/ 801static void appendText(ShellText *p, char const *zAppend, char quote){ 802 int len; 803 int i; 804 int nAppend = strlen30(zAppend); 805 806 len = nAppend+p->n+1; 807 if( quote ){ 808 len += 2; 809 for(i=0; i<nAppend; i++){ 810 if( zAppend[i]==quote ) len++; 811 } 812 } 813 814 if( p->z==0 || p->n+len>=p->nAlloc ){ 815 p->nAlloc = p->nAlloc*2 + len + 20; 816 p->z = realloc(p->z, p->nAlloc); 817 shell_check_oom(p->z); 818 } 819 820 if( quote ){ 821 char *zCsr = p->z+p->n; 822 *zCsr++ = quote; 823 for(i=0; i<nAppend; i++){ 824 *zCsr++ = zAppend[i]; 825 if( zAppend[i]==quote ) *zCsr++ = quote; 826 } 827 *zCsr++ = quote; 828 p->n = (int)(zCsr - p->z); 829 *zCsr = '\0'; 830 }else{ 831 memcpy(p->z+p->n, zAppend, nAppend); 832 p->n += nAppend; 833 p->z[p->n] = '\0'; 834 } 835} 836 837/* 838** Attempt to determine if identifier zName needs to be quoted, either 839** because it contains non-alphanumeric characters, or because it is an 840** SQLite keyword. Be conservative in this estimate: When in doubt assume 841** that quoting is required. 842** 843** Return '"' if quoting is required. Return 0 if no quoting is required. 844*/ 845static char quoteChar(const char *zName){ 846 int i; 847 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 848 for(i=0; zName[i]; i++){ 849 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 850 } 851 return sqlite3_keyword_check(zName, i) ? '"' : 0; 852} 853 854/* 855** Construct a fake object name and column list to describe the structure 856** of the view, virtual table, or table valued function zSchema.zName. 857*/ 858static char *shellFakeSchema( 859 sqlite3 *db, /* The database connection containing the vtab */ 860 const char *zSchema, /* Schema of the database holding the vtab */ 861 const char *zName /* The name of the virtual table */ 862){ 863 sqlite3_stmt *pStmt = 0; 864 char *zSql; 865 ShellText s; 866 char cQuote; 867 char *zDiv = "("; 868 int nRow = 0; 869 870 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 871 zSchema ? zSchema : "main", zName); 872 shell_check_oom(zSql); 873 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 874 sqlite3_free(zSql); 875 initText(&s); 876 if( zSchema ){ 877 cQuote = quoteChar(zSchema); 878 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 879 appendText(&s, zSchema, cQuote); 880 appendText(&s, ".", 0); 881 } 882 cQuote = quoteChar(zName); 883 appendText(&s, zName, cQuote); 884 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 885 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 886 nRow++; 887 appendText(&s, zDiv, 0); 888 zDiv = ","; 889 if( zCol==0 ) zCol = ""; 890 cQuote = quoteChar(zCol); 891 appendText(&s, zCol, cQuote); 892 } 893 appendText(&s, ")", 0); 894 sqlite3_finalize(pStmt); 895 if( nRow==0 ){ 896 freeText(&s); 897 s.z = 0; 898 } 899 return s.z; 900} 901 902/* 903** SQL function: shell_module_schema(X) 904** 905** Return a fake schema for the table-valued function or eponymous virtual 906** table X. 907*/ 908static void shellModuleSchema( 909 sqlite3_context *pCtx, 910 int nVal, 911 sqlite3_value **apVal 912){ 913 const char *zName; 914 char *zFake; 915 UNUSED_PARAMETER(nVal); 916 zName = (const char*)sqlite3_value_text(apVal[0]); 917 zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0; 918 if( zFake ){ 919 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 920 -1, sqlite3_free); 921 free(zFake); 922 } 923} 924 925/* 926** SQL function: shell_add_schema(S,X) 927** 928** Add the schema name X to the CREATE statement in S and return the result. 929** Examples: 930** 931** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 932** 933** Also works on 934** 935** CREATE INDEX 936** CREATE UNIQUE INDEX 937** CREATE VIEW 938** CREATE TRIGGER 939** CREATE VIRTUAL TABLE 940** 941** This UDF is used by the .schema command to insert the schema name of 942** attached databases into the middle of the sqlite_schema.sql field. 943*/ 944static void shellAddSchemaName( 945 sqlite3_context *pCtx, 946 int nVal, 947 sqlite3_value **apVal 948){ 949 static const char *aPrefix[] = { 950 "TABLE", 951 "INDEX", 952 "UNIQUE INDEX", 953 "VIEW", 954 "TRIGGER", 955 "VIRTUAL TABLE" 956 }; 957 int i = 0; 958 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 959 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 960 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 961 sqlite3 *db = sqlite3_context_db_handle(pCtx); 962 UNUSED_PARAMETER(nVal); 963 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 964 for(i=0; i<ArraySize(aPrefix); i++){ 965 int n = strlen30(aPrefix[i]); 966 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 967 char *z = 0; 968 char *zFake = 0; 969 if( zSchema ){ 970 char cQuote = quoteChar(zSchema); 971 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 972 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 973 }else{ 974 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 975 } 976 } 977 if( zName 978 && aPrefix[i][0]=='V' 979 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 980 ){ 981 if( z==0 ){ 982 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 983 }else{ 984 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 985 } 986 free(zFake); 987 } 988 if( z ){ 989 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 990 return; 991 } 992 } 993 } 994 } 995 sqlite3_result_value(pCtx, apVal[0]); 996} 997 998/* 999** The source code for several run-time loadable extensions is inserted 1000** below by the ../tool/mkshellc.tcl script. Before processing that included 1001** code, we need to override some macros to make the included program code 1002** work here in the middle of this regular program. 1003*/ 1004#define SQLITE_EXTENSION_INIT1 1005#define SQLITE_EXTENSION_INIT2(X) (void)(X) 1006 1007#if defined(_WIN32) && defined(_MSC_VER) 1008INCLUDE test_windirent.h 1009INCLUDE test_windirent.c 1010#define dirent DIRENT 1011#endif 1012INCLUDE ../ext/misc/shathree.c 1013INCLUDE ../ext/misc/fileio.c 1014INCLUDE ../ext/misc/completion.c 1015INCLUDE ../ext/misc/appendvfs.c 1016INCLUDE ../ext/misc/memtrace.c 1017INCLUDE ../ext/misc/uint.c 1018INCLUDE ../ext/misc/decimal.c 1019INCLUDE ../ext/misc/ieee754.c 1020INCLUDE ../ext/misc/series.c 1021INCLUDE ../ext/misc/regexp.c 1022#ifdef SQLITE_HAVE_ZLIB 1023INCLUDE ../ext/misc/zipfile.c 1024INCLUDE ../ext/misc/sqlar.c 1025#endif 1026INCLUDE ../ext/expert/sqlite3expert.h 1027INCLUDE ../ext/expert/sqlite3expert.c 1028 1029#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 1030INCLUDE ../ext/misc/dbdata.c 1031#endif 1032 1033#if defined(SQLITE_ENABLE_SESSION) 1034/* 1035** State information for a single open session 1036*/ 1037typedef struct OpenSession OpenSession; 1038struct OpenSession { 1039 char *zName; /* Symbolic name for this session */ 1040 int nFilter; /* Number of xFilter rejection GLOB patterns */ 1041 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 1042 sqlite3_session *p; /* The open session */ 1043}; 1044#endif 1045 1046typedef struct ExpertInfo ExpertInfo; 1047struct ExpertInfo { 1048 sqlite3expert *pExpert; 1049 int bVerbose; 1050}; 1051 1052/* A single line in the EQP output */ 1053typedef struct EQPGraphRow EQPGraphRow; 1054struct EQPGraphRow { 1055 int iEqpId; /* ID for this row */ 1056 int iParentId; /* ID of the parent row */ 1057 EQPGraphRow *pNext; /* Next row in sequence */ 1058 char zText[1]; /* Text to display for this row */ 1059}; 1060 1061/* All EQP output is collected into an instance of the following */ 1062typedef struct EQPGraph EQPGraph; 1063struct EQPGraph { 1064 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 1065 EQPGraphRow *pLast; /* Last element of the pRow list */ 1066 char zPrefix[100]; /* Graph prefix */ 1067}; 1068 1069/* 1070** State information about the database connection is contained in an 1071** instance of the following structure. 1072*/ 1073typedef struct ShellState ShellState; 1074struct ShellState { 1075 sqlite3 *db; /* The database */ 1076 u8 autoExplain; /* Automatically turn on .explain mode */ 1077 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 1078 u8 autoEQPtest; /* autoEQP is in test mode */ 1079 u8 autoEQPtrace; /* autoEQP is in trace mode */ 1080 u8 scanstatsOn; /* True to display scan stats before each finalize */ 1081 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 1082 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 1083 u8 nEqpLevel; /* Depth of the EQP output graph */ 1084 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 1085 u8 bSafeMode; /* True to prohibit unsafe operations */ 1086 u8 bSafeModePersist; /* The long-term value of bSafeMode */ 1087 unsigned statsOn; /* True to display memory stats before each finalize */ 1088 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 1089 int outCount; /* Revert to stdout when reaching zero */ 1090 int cnt; /* Number of records displayed so far */ 1091 int lineno; /* Line number of last line read from in */ 1092 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 1093 FILE *in; /* Read commands from this stream */ 1094 FILE *out; /* Write results here */ 1095 FILE *traceOut; /* Output for sqlite3_trace() */ 1096 int nErr; /* Number of errors seen */ 1097 int mode; /* An output mode setting */ 1098 int modePrior; /* Saved mode */ 1099 int cMode; /* temporary output mode for the current query */ 1100 int normalMode; /* Output mode before ".explain on" */ 1101 int writableSchema; /* True if PRAGMA writable_schema=ON */ 1102 int showHeader; /* True to show column names in List or Column mode */ 1103 int nCheck; /* Number of ".check" commands run */ 1104 unsigned nProgress; /* Number of progress callbacks encountered */ 1105 unsigned mxProgress; /* Maximum progress callbacks before failing */ 1106 unsigned flgProgress; /* Flags for the progress callback */ 1107 unsigned shellFlgs; /* Various flags */ 1108 unsigned priorShFlgs; /* Saved copy of flags */ 1109 sqlite3_int64 szMax; /* --maxsize argument to .open */ 1110 char *zDestTable; /* Name of destination table when MODE_Insert */ 1111 char *zTempFile; /* Temporary file that might need deleting */ 1112 char zTestcase[30]; /* Name of current test case */ 1113 char colSeparator[20]; /* Column separator character for several modes */ 1114 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 1115 char colSepPrior[20]; /* Saved column separator */ 1116 char rowSepPrior[20]; /* Saved row separator */ 1117 int *colWidth; /* Requested width of each column in columnar modes */ 1118 int *actualWidth; /* Actual width of each column */ 1119 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 1120 char nullValue[20]; /* The text to print when a NULL comes back from 1121 ** the database */ 1122 char outfile[FILENAME_MAX]; /* Filename for *out */ 1123 sqlite3_stmt *pStmt; /* Current statement if any. */ 1124 FILE *pLog; /* Write log output here */ 1125 struct AuxDb { /* Storage space for auxiliary database connections */ 1126 sqlite3 *db; /* Connection pointer */ 1127 const char *zDbFilename; /* Filename used to open the connection */ 1128 char *zFreeOnClose; /* Free this memory allocation on close */ 1129#if defined(SQLITE_ENABLE_SESSION) 1130 int nSession; /* Number of active sessions */ 1131 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 1132#endif 1133 } aAuxDb[5], /* Array of all database connections */ 1134 *pAuxDb; /* Currently active database connection */ 1135 int *aiIndent; /* Array of indents used in MODE_Explain */ 1136 int nIndent; /* Size of array aiIndent[] */ 1137 int iIndent; /* Index of current op in aiIndent[] */ 1138 char *zNonce; /* Nonce for temporary safe-mode excapes */ 1139 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 1140 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 1141}; 1142 1143 1144/* Allowed values for ShellState.autoEQP 1145*/ 1146#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 1147#define AUTOEQP_on 1 /* Automatic EQP is on */ 1148#define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 1149#define AUTOEQP_full 3 /* Show full EXPLAIN */ 1150 1151/* Allowed values for ShellState.openMode 1152*/ 1153#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 1154#define SHELL_OPEN_NORMAL 1 /* Normal database file */ 1155#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 1156#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 1157#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 1158#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 1159#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 1160 1161/* Allowed values for ShellState.eTraceType 1162*/ 1163#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 1164#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 1165#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 1166 1167/* Bits in the ShellState.flgProgress variable */ 1168#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 1169#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 1170 ** callback limit is reached, and for each 1171 ** top-level SQL statement */ 1172#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 1173 1174/* 1175** These are the allowed shellFlgs values 1176*/ 1177#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 1178#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 1179#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 1180#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 1181#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 1182#define SHFLG_CountChanges 0x00000020 /* .changes setting */ 1183#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 1184#define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ 1185#define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 1186#define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 1187 1188/* 1189** Macros for testing and setting shellFlgs 1190*/ 1191#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 1192#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 1193#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 1194 1195/* 1196** These are the allowed modes. 1197*/ 1198#define MODE_Line 0 /* One column per line. Blank line between records */ 1199#define MODE_Column 1 /* One record per line in neat columns */ 1200#define MODE_List 2 /* One record per line with a separator */ 1201#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 1202#define MODE_Html 4 /* Generate an XHTML table */ 1203#define MODE_Insert 5 /* Generate SQL "insert" statements */ 1204#define MODE_Quote 6 /* Quote values as for SQL */ 1205#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 1206#define MODE_Csv 8 /* Quote strings, numbers are plain */ 1207#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 1208#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 1209#define MODE_Pretty 11 /* Pretty-print schemas */ 1210#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 1211#define MODE_Json 13 /* Output JSON */ 1212#define MODE_Markdown 14 /* Markdown formatting */ 1213#define MODE_Table 15 /* MySQL-style table formatting */ 1214#define MODE_Box 16 /* Unicode box-drawing characters */ 1215#define MODE_Count 17 /* Output only a count of the rows of output */ 1216#define MODE_Off 18 /* No query output shown */ 1217 1218static const char *modeDescr[] = { 1219 "line", 1220 "column", 1221 "list", 1222 "semi", 1223 "html", 1224 "insert", 1225 "quote", 1226 "tcl", 1227 "csv", 1228 "explain", 1229 "ascii", 1230 "prettyprint", 1231 "eqp", 1232 "json", 1233 "markdown", 1234 "table", 1235 "box", 1236 "count", 1237 "off" 1238}; 1239 1240/* 1241** These are the column/row/line separators used by the various 1242** import/export modes. 1243*/ 1244#define SEP_Column "|" 1245#define SEP_Row "\n" 1246#define SEP_Tab "\t" 1247#define SEP_Space " " 1248#define SEP_Comma "," 1249#define SEP_CrLf "\r\n" 1250#define SEP_Unit "\x1F" 1251#define SEP_Record "\x1E" 1252 1253/* 1254** A callback for the sqlite3_log() interface. 1255*/ 1256static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 1257 ShellState *p = (ShellState*)pArg; 1258 if( p->pLog==0 ) return; 1259 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 1260 fflush(p->pLog); 1261} 1262 1263/* 1264** SQL function: shell_putsnl(X) 1265** 1266** Write the text X to the screen (or whatever output is being directed) 1267** adding a newline at the end, and then return X. 1268*/ 1269static void shellPutsFunc( 1270 sqlite3_context *pCtx, 1271 int nVal, 1272 sqlite3_value **apVal 1273){ 1274 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 1275 (void)nVal; 1276 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 1277 sqlite3_result_value(pCtx, apVal[0]); 1278} 1279 1280/* 1281** If in safe mode, print an error message described by the arguments 1282** and exit immediately. 1283*/ 1284static void failIfSafeMode( 1285 ShellState *p, 1286 const char *zErrMsg, 1287 ... 1288){ 1289 if( p->bSafeMode ){ 1290 va_list ap; 1291 char *zMsg; 1292 va_start(ap, zErrMsg); 1293 zMsg = sqlite3_vmprintf(zErrMsg, ap); 1294 va_end(ap); 1295 raw_printf(stderr, "line %d: ", p->lineno); 1296 utf8_printf(stderr, "%s\n", zMsg); 1297 exit(1); 1298 } 1299} 1300 1301/* 1302** SQL function: edit(VALUE) 1303** edit(VALUE,EDITOR) 1304** 1305** These steps: 1306** 1307** (1) Write VALUE into a temporary file. 1308** (2) Run program EDITOR on that temporary file. 1309** (3) Read the temporary file back and return its content as the result. 1310** (4) Delete the temporary file 1311** 1312** If the EDITOR argument is omitted, use the value in the VISUAL 1313** environment variable. If still there is no EDITOR, through an error. 1314** 1315** Also throw an error if the EDITOR program returns a non-zero exit code. 1316*/ 1317#ifndef SQLITE_NOHAVE_SYSTEM 1318static void editFunc( 1319 sqlite3_context *context, 1320 int argc, 1321 sqlite3_value **argv 1322){ 1323 const char *zEditor; 1324 char *zTempFile = 0; 1325 sqlite3 *db; 1326 char *zCmd = 0; 1327 int bBin; 1328 int rc; 1329 int hasCRNL = 0; 1330 FILE *f = 0; 1331 sqlite3_int64 sz; 1332 sqlite3_int64 x; 1333 unsigned char *p = 0; 1334 1335 if( argc==2 ){ 1336 zEditor = (const char*)sqlite3_value_text(argv[1]); 1337 }else{ 1338 zEditor = getenv("VISUAL"); 1339 } 1340 if( zEditor==0 ){ 1341 sqlite3_result_error(context, "no editor for edit()", -1); 1342 return; 1343 } 1344 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 1345 sqlite3_result_error(context, "NULL input to edit()", -1); 1346 return; 1347 } 1348 db = sqlite3_context_db_handle(context); 1349 zTempFile = 0; 1350 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 1351 if( zTempFile==0 ){ 1352 sqlite3_uint64 r = 0; 1353 sqlite3_randomness(sizeof(r), &r); 1354 zTempFile = sqlite3_mprintf("temp%llx", r); 1355 if( zTempFile==0 ){ 1356 sqlite3_result_error_nomem(context); 1357 return; 1358 } 1359 } 1360 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 1361 /* When writing the file to be edited, do \n to \r\n conversions on systems 1362 ** that want \r\n line endings */ 1363 f = fopen(zTempFile, bBin ? "wb" : "w"); 1364 if( f==0 ){ 1365 sqlite3_result_error(context, "edit() cannot open temp file", -1); 1366 goto edit_func_end; 1367 } 1368 sz = sqlite3_value_bytes(argv[0]); 1369 if( bBin ){ 1370 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 1371 }else{ 1372 const char *z = (const char*)sqlite3_value_text(argv[0]); 1373 /* Remember whether or not the value originally contained \r\n */ 1374 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 1375 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 1376 } 1377 fclose(f); 1378 f = 0; 1379 if( x!=sz ){ 1380 sqlite3_result_error(context, "edit() could not write the whole file", -1); 1381 goto edit_func_end; 1382 } 1383 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 1384 if( zCmd==0 ){ 1385 sqlite3_result_error_nomem(context); 1386 goto edit_func_end; 1387 } 1388 rc = system(zCmd); 1389 sqlite3_free(zCmd); 1390 if( rc ){ 1391 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 1392 goto edit_func_end; 1393 } 1394 f = fopen(zTempFile, "rb"); 1395 if( f==0 ){ 1396 sqlite3_result_error(context, 1397 "edit() cannot reopen temp file after edit", -1); 1398 goto edit_func_end; 1399 } 1400 fseek(f, 0, SEEK_END); 1401 sz = ftell(f); 1402 rewind(f); 1403 p = sqlite3_malloc64( sz+1 ); 1404 if( p==0 ){ 1405 sqlite3_result_error_nomem(context); 1406 goto edit_func_end; 1407 } 1408 x = fread(p, 1, (size_t)sz, f); 1409 fclose(f); 1410 f = 0; 1411 if( x!=sz ){ 1412 sqlite3_result_error(context, "could not read back the whole file", -1); 1413 goto edit_func_end; 1414 } 1415 if( bBin ){ 1416 sqlite3_result_blob64(context, p, sz, sqlite3_free); 1417 }else{ 1418 sqlite3_int64 i, j; 1419 if( hasCRNL ){ 1420 /* If the original contains \r\n then do no conversions back to \n */ 1421 }else{ 1422 /* If the file did not originally contain \r\n then convert any new 1423 ** \r\n back into \n */ 1424 for(i=j=0; i<sz; i++){ 1425 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 1426 p[j++] = p[i]; 1427 } 1428 sz = j; 1429 p[sz] = 0; 1430 } 1431 sqlite3_result_text64(context, (const char*)p, sz, 1432 sqlite3_free, SQLITE_UTF8); 1433 } 1434 p = 0; 1435 1436edit_func_end: 1437 if( f ) fclose(f); 1438 unlink(zTempFile); 1439 sqlite3_free(zTempFile); 1440 sqlite3_free(p); 1441} 1442#endif /* SQLITE_NOHAVE_SYSTEM */ 1443 1444/* 1445** Save or restore the current output mode 1446*/ 1447static void outputModePush(ShellState *p){ 1448 p->modePrior = p->mode; 1449 p->priorShFlgs = p->shellFlgs; 1450 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 1451 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 1452} 1453static void outputModePop(ShellState *p){ 1454 p->mode = p->modePrior; 1455 p->shellFlgs = p->priorShFlgs; 1456 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 1457 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 1458} 1459 1460/* 1461** Output the given string as a hex-encoded blob (eg. X'1234' ) 1462*/ 1463static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 1464 int i; 1465 char *zBlob = (char *)pBlob; 1466 raw_printf(out,"X'"); 1467 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 1468 raw_printf(out,"'"); 1469} 1470 1471/* 1472** Find a string that is not found anywhere in z[]. Return a pointer 1473** to that string. 1474** 1475** Try to use zA and zB first. If both of those are already found in z[] 1476** then make up some string and store it in the buffer zBuf. 1477*/ 1478static const char *unused_string( 1479 const char *z, /* Result must not appear anywhere in z */ 1480 const char *zA, const char *zB, /* Try these first */ 1481 char *zBuf /* Space to store a generated string */ 1482){ 1483 unsigned i = 0; 1484 if( strstr(z, zA)==0 ) return zA; 1485 if( strstr(z, zB)==0 ) return zB; 1486 do{ 1487 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 1488 }while( strstr(z,zBuf)!=0 ); 1489 return zBuf; 1490} 1491 1492/* 1493** Output the given string as a quoted string using SQL quoting conventions. 1494** 1495** See also: output_quoted_escaped_string() 1496*/ 1497static void output_quoted_string(FILE *out, const char *z){ 1498 int i; 1499 char c; 1500 setBinaryMode(out, 1); 1501 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1502 if( c==0 ){ 1503 utf8_printf(out,"'%s'",z); 1504 }else{ 1505 raw_printf(out, "'"); 1506 while( *z ){ 1507 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1508 if( c=='\'' ) i++; 1509 if( i ){ 1510 utf8_printf(out, "%.*s", i, z); 1511 z += i; 1512 } 1513 if( c=='\'' ){ 1514 raw_printf(out, "'"); 1515 continue; 1516 } 1517 if( c==0 ){ 1518 break; 1519 } 1520 z++; 1521 } 1522 raw_printf(out, "'"); 1523 } 1524 setTextMode(out, 1); 1525} 1526 1527/* 1528** Output the given string as a quoted string using SQL quoting conventions. 1529** Additionallly , escape the "\n" and "\r" characters so that they do not 1530** get corrupted by end-of-line translation facilities in some operating 1531** systems. 1532** 1533** This is like output_quoted_string() but with the addition of the \r\n 1534** escape mechanism. 1535*/ 1536static void output_quoted_escaped_string(FILE *out, const char *z){ 1537 int i; 1538 char c; 1539 setBinaryMode(out, 1); 1540 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 1541 if( c==0 ){ 1542 utf8_printf(out,"'%s'",z); 1543 }else{ 1544 const char *zNL = 0; 1545 const char *zCR = 0; 1546 int nNL = 0; 1547 int nCR = 0; 1548 char zBuf1[20], zBuf2[20]; 1549 for(i=0; z[i]; i++){ 1550 if( z[i]=='\n' ) nNL++; 1551 if( z[i]=='\r' ) nCR++; 1552 } 1553 if( nNL ){ 1554 raw_printf(out, "replace("); 1555 zNL = unused_string(z, "\\n", "\\012", zBuf1); 1556 } 1557 if( nCR ){ 1558 raw_printf(out, "replace("); 1559 zCR = unused_string(z, "\\r", "\\015", zBuf2); 1560 } 1561 raw_printf(out, "'"); 1562 while( *z ){ 1563 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 1564 if( c=='\'' ) i++; 1565 if( i ){ 1566 utf8_printf(out, "%.*s", i, z); 1567 z += i; 1568 } 1569 if( c=='\'' ){ 1570 raw_printf(out, "'"); 1571 continue; 1572 } 1573 if( c==0 ){ 1574 break; 1575 } 1576 z++; 1577 if( c=='\n' ){ 1578 raw_printf(out, "%s", zNL); 1579 continue; 1580 } 1581 raw_printf(out, "%s", zCR); 1582 } 1583 raw_printf(out, "'"); 1584 if( nCR ){ 1585 raw_printf(out, ",'%s',char(13))", zCR); 1586 } 1587 if( nNL ){ 1588 raw_printf(out, ",'%s',char(10))", zNL); 1589 } 1590 } 1591 setTextMode(out, 1); 1592} 1593 1594/* 1595** Output the given string as a quoted according to C or TCL quoting rules. 1596*/ 1597static void output_c_string(FILE *out, const char *z){ 1598 unsigned int c; 1599 fputc('"', out); 1600 while( (c = *(z++))!=0 ){ 1601 if( c=='\\' ){ 1602 fputc(c, out); 1603 fputc(c, out); 1604 }else if( c=='"' ){ 1605 fputc('\\', out); 1606 fputc('"', out); 1607 }else if( c=='\t' ){ 1608 fputc('\\', out); 1609 fputc('t', out); 1610 }else if( c=='\n' ){ 1611 fputc('\\', out); 1612 fputc('n', out); 1613 }else if( c=='\r' ){ 1614 fputc('\\', out); 1615 fputc('r', out); 1616 }else if( !isprint(c&0xff) ){ 1617 raw_printf(out, "\\%03o", c&0xff); 1618 }else{ 1619 fputc(c, out); 1620 } 1621 } 1622 fputc('"', out); 1623} 1624 1625/* 1626** Output the given string as a quoted according to JSON quoting rules. 1627*/ 1628static void output_json_string(FILE *out, const char *z, int n){ 1629 unsigned int c; 1630 if( n<0 ) n = (int)strlen(z); 1631 fputc('"', out); 1632 while( n-- ){ 1633 c = *(z++); 1634 if( c=='\\' || c=='"' ){ 1635 fputc('\\', out); 1636 fputc(c, out); 1637 }else if( c<=0x1f ){ 1638 fputc('\\', out); 1639 if( c=='\b' ){ 1640 fputc('b', out); 1641 }else if( c=='\f' ){ 1642 fputc('f', out); 1643 }else if( c=='\n' ){ 1644 fputc('n', out); 1645 }else if( c=='\r' ){ 1646 fputc('r', out); 1647 }else if( c=='\t' ){ 1648 fputc('t', out); 1649 }else{ 1650 raw_printf(out, "u%04x",c); 1651 } 1652 }else{ 1653 fputc(c, out); 1654 } 1655 } 1656 fputc('"', out); 1657} 1658 1659/* 1660** Output the given string with characters that are special to 1661** HTML escaped. 1662*/ 1663static void output_html_string(FILE *out, const char *z){ 1664 int i; 1665 if( z==0 ) z = ""; 1666 while( *z ){ 1667 for(i=0; z[i] 1668 && z[i]!='<' 1669 && z[i]!='&' 1670 && z[i]!='>' 1671 && z[i]!='\"' 1672 && z[i]!='\''; 1673 i++){} 1674 if( i>0 ){ 1675 utf8_printf(out,"%.*s",i,z); 1676 } 1677 if( z[i]=='<' ){ 1678 raw_printf(out,"<"); 1679 }else if( z[i]=='&' ){ 1680 raw_printf(out,"&"); 1681 }else if( z[i]=='>' ){ 1682 raw_printf(out,">"); 1683 }else if( z[i]=='\"' ){ 1684 raw_printf(out,"""); 1685 }else if( z[i]=='\'' ){ 1686 raw_printf(out,"'"); 1687 }else{ 1688 break; 1689 } 1690 z += i + 1; 1691 } 1692} 1693 1694/* 1695** If a field contains any character identified by a 1 in the following 1696** array, then the string must be quoted for CSV. 1697*/ 1698static const char needCsvQuote[] = { 1699 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1700 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1701 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1702 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1703 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1704 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1705 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1707 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1708 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1709 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1710 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1711 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1712 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1713 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1714 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1715}; 1716 1717/* 1718** Output a single term of CSV. Actually, p->colSeparator is used for 1719** the separator, which may or may not be a comma. p->nullValue is 1720** the null value. Strings are quoted if necessary. The separator 1721** is only issued if bSep is true. 1722*/ 1723static void output_csv(ShellState *p, const char *z, int bSep){ 1724 FILE *out = p->out; 1725 if( z==0 ){ 1726 utf8_printf(out,"%s",p->nullValue); 1727 }else{ 1728 unsigned i; 1729 for(i=0; z[i]; i++){ 1730 if( needCsvQuote[((unsigned char*)z)[i]] ){ 1731 i = 0; 1732 break; 1733 } 1734 } 1735 if( i==0 || strstr(z, p->colSeparator)!=0 ){ 1736 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 1737 shell_check_oom(zQuoted); 1738 utf8_printf(out, "%s", zQuoted); 1739 sqlite3_free(zQuoted); 1740 }else{ 1741 utf8_printf(out, "%s", z); 1742 } 1743 } 1744 if( bSep ){ 1745 utf8_printf(p->out, "%s", p->colSeparator); 1746 } 1747} 1748 1749/* 1750** This routine runs when the user presses Ctrl-C 1751*/ 1752static void interrupt_handler(int NotUsed){ 1753 UNUSED_PARAMETER(NotUsed); 1754 seenInterrupt++; 1755 if( seenInterrupt>2 ) exit(1); 1756 if( globalDb ) sqlite3_interrupt(globalDb); 1757} 1758 1759#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 1760/* 1761** This routine runs for console events (e.g. Ctrl-C) on Win32 1762*/ 1763static BOOL WINAPI ConsoleCtrlHandler( 1764 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 1765){ 1766 if( dwCtrlType==CTRL_C_EVENT ){ 1767 interrupt_handler(0); 1768 return TRUE; 1769 } 1770 return FALSE; 1771} 1772#endif 1773 1774#ifndef SQLITE_OMIT_AUTHORIZATION 1775/* 1776** This authorizer runs in safe mode. 1777*/ 1778static int safeModeAuth( 1779 void *pClientData, 1780 int op, 1781 const char *zA1, 1782 const char *zA2, 1783 const char *zA3, 1784 const char *zA4 1785){ 1786 ShellState *p = (ShellState*)pClientData; 1787 static const char *azProhibitedFunctions[] = { 1788 "edit", 1789 "fts3_tokenizer", 1790 "load_extension", 1791 "readfile", 1792 "writefile", 1793 "zipfile", 1794 "zipfile_cds", 1795 }; 1796 UNUSED_PARAMETER(zA2); 1797 UNUSED_PARAMETER(zA3); 1798 UNUSED_PARAMETER(zA4); 1799 switch( op ){ 1800 case SQLITE_ATTACH: { 1801 failIfSafeMode(p, "cannot run ATTACH in safe mode"); 1802 break; 1803 } 1804 case SQLITE_FUNCTION: { 1805 int i; 1806 for(i=0; i<ArraySize(azProhibitedFunctions); i++){ 1807 if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){ 1808 failIfSafeMode(p, "cannot use the %s() function in safe mode", 1809 azProhibitedFunctions[i]); 1810 } 1811 } 1812 break; 1813 } 1814 } 1815 return SQLITE_OK; 1816} 1817 1818/* 1819** When the ".auth ON" is set, the following authorizer callback is 1820** invoked. It always returns SQLITE_OK. 1821*/ 1822static int shellAuth( 1823 void *pClientData, 1824 int op, 1825 const char *zA1, 1826 const char *zA2, 1827 const char *zA3, 1828 const char *zA4 1829){ 1830 ShellState *p = (ShellState*)pClientData; 1831 static const char *azAction[] = { 0, 1832 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 1833 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 1834 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 1835 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 1836 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 1837 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 1838 "PRAGMA", "READ", "SELECT", 1839 "TRANSACTION", "UPDATE", "ATTACH", 1840 "DETACH", "ALTER_TABLE", "REINDEX", 1841 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 1842 "FUNCTION", "SAVEPOINT", "RECURSIVE" 1843 }; 1844 int i; 1845 const char *az[4]; 1846 az[0] = zA1; 1847 az[1] = zA2; 1848 az[2] = zA3; 1849 az[3] = zA4; 1850 utf8_printf(p->out, "authorizer: %s", azAction[op]); 1851 for(i=0; i<4; i++){ 1852 raw_printf(p->out, " "); 1853 if( az[i] ){ 1854 output_c_string(p->out, az[i]); 1855 }else{ 1856 raw_printf(p->out, "NULL"); 1857 } 1858 } 1859 raw_printf(p->out, "\n"); 1860 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); 1861 return SQLITE_OK; 1862} 1863#endif 1864 1865/* 1866** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 1867** 1868** This routine converts some CREATE TABLE statements for shadow tables 1869** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 1870*/ 1871static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 1872 if( z==0 ) return; 1873 if( zTail==0 ) return; 1874 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 1875 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 1876 }else{ 1877 utf8_printf(out, "%s%s", z, zTail); 1878 } 1879} 1880static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 1881 char c = z[n]; 1882 z[n] = 0; 1883 printSchemaLine(out, z, zTail); 1884 z[n] = c; 1885} 1886 1887/* 1888** Return true if string z[] has nothing but whitespace and comments to the 1889** end of the first line. 1890*/ 1891static int wsToEol(const char *z){ 1892 int i; 1893 for(i=0; z[i]; i++){ 1894 if( z[i]=='\n' ) return 1; 1895 if( IsSpace(z[i]) ) continue; 1896 if( z[i]=='-' && z[i+1]=='-' ) return 1; 1897 return 0; 1898 } 1899 return 1; 1900} 1901 1902/* 1903** Add a new entry to the EXPLAIN QUERY PLAN data 1904*/ 1905static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 1906 EQPGraphRow *pNew; 1907 int nText = strlen30(zText); 1908 if( p->autoEQPtest ){ 1909 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 1910 } 1911 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 1912 shell_check_oom(pNew); 1913 pNew->iEqpId = iEqpId; 1914 pNew->iParentId = p2; 1915 memcpy(pNew->zText, zText, nText+1); 1916 pNew->pNext = 0; 1917 if( p->sGraph.pLast ){ 1918 p->sGraph.pLast->pNext = pNew; 1919 }else{ 1920 p->sGraph.pRow = pNew; 1921 } 1922 p->sGraph.pLast = pNew; 1923} 1924 1925/* 1926** Free and reset the EXPLAIN QUERY PLAN data that has been collected 1927** in p->sGraph. 1928*/ 1929static void eqp_reset(ShellState *p){ 1930 EQPGraphRow *pRow, *pNext; 1931 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 1932 pNext = pRow->pNext; 1933 sqlite3_free(pRow); 1934 } 1935 memset(&p->sGraph, 0, sizeof(p->sGraph)); 1936} 1937 1938/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 1939** pOld, or return the first such line if pOld is NULL 1940*/ 1941static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 1942 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 1943 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 1944 return pRow; 1945} 1946 1947/* Render a single level of the graph that has iEqpId as its parent. Called 1948** recursively to render sublevels. 1949*/ 1950static void eqp_render_level(ShellState *p, int iEqpId){ 1951 EQPGraphRow *pRow, *pNext; 1952 int n = strlen30(p->sGraph.zPrefix); 1953 char *z; 1954 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 1955 pNext = eqp_next_row(p, iEqpId, pRow); 1956 z = pRow->zText; 1957 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 1958 pNext ? "|--" : "`--", z); 1959 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 1960 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 1961 eqp_render_level(p, pRow->iEqpId); 1962 p->sGraph.zPrefix[n] = 0; 1963 } 1964 } 1965} 1966 1967/* 1968** Display and reset the EXPLAIN QUERY PLAN data 1969*/ 1970static void eqp_render(ShellState *p){ 1971 EQPGraphRow *pRow = p->sGraph.pRow; 1972 if( pRow ){ 1973 if( pRow->zText[0]=='-' ){ 1974 if( pRow->pNext==0 ){ 1975 eqp_reset(p); 1976 return; 1977 } 1978 utf8_printf(p->out, "%s\n", pRow->zText+3); 1979 p->sGraph.pRow = pRow->pNext; 1980 sqlite3_free(pRow); 1981 }else{ 1982 utf8_printf(p->out, "QUERY PLAN\n"); 1983 } 1984 p->sGraph.zPrefix[0] = 0; 1985 eqp_render_level(p, 0); 1986 eqp_reset(p); 1987 } 1988} 1989 1990#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 1991/* 1992** Progress handler callback. 1993*/ 1994static int progress_handler(void *pClientData) { 1995 ShellState *p = (ShellState*)pClientData; 1996 p->nProgress++; 1997 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 1998 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 1999 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 2000 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 2001 return 1; 2002 } 2003 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 2004 raw_printf(p->out, "Progress %u\n", p->nProgress); 2005 } 2006 return 0; 2007} 2008#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 2009 2010/* 2011** Print N dashes 2012*/ 2013static void print_dashes(FILE *out, int N){ 2014 const char zDash[] = "--------------------------------------------------"; 2015 const int nDash = sizeof(zDash) - 1; 2016 while( N>nDash ){ 2017 fputs(zDash, out); 2018 N -= nDash; 2019 } 2020 raw_printf(out, "%.*s", N, zDash); 2021} 2022 2023/* 2024** Print a markdown or table-style row separator using ascii-art 2025*/ 2026static void print_row_separator( 2027 ShellState *p, 2028 int nArg, 2029 const char *zSep 2030){ 2031 int i; 2032 if( nArg>0 ){ 2033 fputs(zSep, p->out); 2034 print_dashes(p->out, p->actualWidth[0]+2); 2035 for(i=1; i<nArg; i++){ 2036 fputs(zSep, p->out); 2037 print_dashes(p->out, p->actualWidth[i]+2); 2038 } 2039 fputs(zSep, p->out); 2040 } 2041 fputs("\n", p->out); 2042} 2043 2044/* 2045** This is the callback routine that the shell 2046** invokes for each row of a query result. 2047*/ 2048static int shell_callback( 2049 void *pArg, 2050 int nArg, /* Number of result columns */ 2051 char **azArg, /* Text of each result column */ 2052 char **azCol, /* Column names */ 2053 int *aiType /* Column types. Might be NULL */ 2054){ 2055 int i; 2056 ShellState *p = (ShellState*)pArg; 2057 2058 if( azArg==0 ) return 0; 2059 switch( p->cMode ){ 2060 case MODE_Count: 2061 case MODE_Off: { 2062 break; 2063 } 2064 case MODE_Line: { 2065 int w = 5; 2066 if( azArg==0 ) break; 2067 for(i=0; i<nArg; i++){ 2068 int len = strlen30(azCol[i] ? azCol[i] : ""); 2069 if( len>w ) w = len; 2070 } 2071 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 2072 for(i=0; i<nArg; i++){ 2073 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 2074 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 2075 } 2076 break; 2077 } 2078 case MODE_Explain: { 2079 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 2080 if( nArg>ArraySize(aExplainWidth) ){ 2081 nArg = ArraySize(aExplainWidth); 2082 } 2083 if( p->cnt++==0 ){ 2084 for(i=0; i<nArg; i++){ 2085 int w = aExplainWidth[i]; 2086 utf8_width_print(p->out, w, azCol[i]); 2087 fputs(i==nArg-1 ? "\n" : " ", p->out); 2088 } 2089 for(i=0; i<nArg; i++){ 2090 int w = aExplainWidth[i]; 2091 print_dashes(p->out, w); 2092 fputs(i==nArg-1 ? "\n" : " ", p->out); 2093 } 2094 } 2095 if( azArg==0 ) break; 2096 for(i=0; i<nArg; i++){ 2097 int w = aExplainWidth[i]; 2098 if( i==nArg-1 ) w = 0; 2099 if( azArg[i] && strlenChar(azArg[i])>w ){ 2100 w = strlenChar(azArg[i]); 2101 } 2102 if( i==1 && p->aiIndent && p->pStmt ){ 2103 if( p->iIndent<p->nIndent ){ 2104 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 2105 } 2106 p->iIndent++; 2107 } 2108 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 2109 fputs(i==nArg-1 ? "\n" : " ", p->out); 2110 } 2111 break; 2112 } 2113 case MODE_Semi: { /* .schema and .fullschema output */ 2114 printSchemaLine(p->out, azArg[0], ";\n"); 2115 break; 2116 } 2117 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 2118 char *z; 2119 int j; 2120 int nParen = 0; 2121 char cEnd = 0; 2122 char c; 2123 int nLine = 0; 2124 assert( nArg==1 ); 2125 if( azArg[0]==0 ) break; 2126 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 2127 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 2128 ){ 2129 utf8_printf(p->out, "%s;\n", azArg[0]); 2130 break; 2131 } 2132 z = sqlite3_mprintf("%s", azArg[0]); 2133 shell_check_oom(z); 2134 j = 0; 2135 for(i=0; IsSpace(z[i]); i++){} 2136 for(; (c = z[i])!=0; i++){ 2137 if( IsSpace(c) ){ 2138 if( z[j-1]=='\r' ) z[j-1] = '\n'; 2139 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 2140 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 2141 j--; 2142 } 2143 z[j++] = c; 2144 } 2145 while( j>0 && IsSpace(z[j-1]) ){ j--; } 2146 z[j] = 0; 2147 if( strlen30(z)>=79 ){ 2148 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 2149 if( c==cEnd ){ 2150 cEnd = 0; 2151 }else if( c=='"' || c=='\'' || c=='`' ){ 2152 cEnd = c; 2153 }else if( c=='[' ){ 2154 cEnd = ']'; 2155 }else if( c=='-' && z[i+1]=='-' ){ 2156 cEnd = '\n'; 2157 }else if( c=='(' ){ 2158 nParen++; 2159 }else if( c==')' ){ 2160 nParen--; 2161 if( nLine>0 && nParen==0 && j>0 ){ 2162 printSchemaLineN(p->out, z, j, "\n"); 2163 j = 0; 2164 } 2165 } 2166 z[j++] = c; 2167 if( nParen==1 && cEnd==0 2168 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 2169 ){ 2170 if( c=='\n' ) j--; 2171 printSchemaLineN(p->out, z, j, "\n "); 2172 j = 0; 2173 nLine++; 2174 while( IsSpace(z[i+1]) ){ i++; } 2175 } 2176 } 2177 z[j] = 0; 2178 } 2179 printSchemaLine(p->out, z, ";\n"); 2180 sqlite3_free(z); 2181 break; 2182 } 2183 case MODE_List: { 2184 if( p->cnt++==0 && p->showHeader ){ 2185 for(i=0; i<nArg; i++){ 2186 utf8_printf(p->out,"%s%s",azCol[i], 2187 i==nArg-1 ? p->rowSeparator : p->colSeparator); 2188 } 2189 } 2190 if( azArg==0 ) break; 2191 for(i=0; i<nArg; i++){ 2192 char *z = azArg[i]; 2193 if( z==0 ) z = p->nullValue; 2194 utf8_printf(p->out, "%s", z); 2195 if( i<nArg-1 ){ 2196 utf8_printf(p->out, "%s", p->colSeparator); 2197 }else{ 2198 utf8_printf(p->out, "%s", p->rowSeparator); 2199 } 2200 } 2201 break; 2202 } 2203 case MODE_Html: { 2204 if( p->cnt++==0 && p->showHeader ){ 2205 raw_printf(p->out,"<TR>"); 2206 for(i=0; i<nArg; i++){ 2207 raw_printf(p->out,"<TH>"); 2208 output_html_string(p->out, azCol[i]); 2209 raw_printf(p->out,"</TH>\n"); 2210 } 2211 raw_printf(p->out,"</TR>\n"); 2212 } 2213 if( azArg==0 ) break; 2214 raw_printf(p->out,"<TR>"); 2215 for(i=0; i<nArg; i++){ 2216 raw_printf(p->out,"<TD>"); 2217 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2218 raw_printf(p->out,"</TD>\n"); 2219 } 2220 raw_printf(p->out,"</TR>\n"); 2221 break; 2222 } 2223 case MODE_Tcl: { 2224 if( p->cnt++==0 && p->showHeader ){ 2225 for(i=0; i<nArg; i++){ 2226 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 2227 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2228 } 2229 utf8_printf(p->out, "%s", p->rowSeparator); 2230 } 2231 if( azArg==0 ) break; 2232 for(i=0; i<nArg; i++){ 2233 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2234 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2235 } 2236 utf8_printf(p->out, "%s", p->rowSeparator); 2237 break; 2238 } 2239 case MODE_Csv: { 2240 setBinaryMode(p->out, 1); 2241 if( p->cnt++==0 && p->showHeader ){ 2242 for(i=0; i<nArg; i++){ 2243 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 2244 } 2245 utf8_printf(p->out, "%s", p->rowSeparator); 2246 } 2247 if( nArg>0 ){ 2248 for(i=0; i<nArg; i++){ 2249 output_csv(p, azArg[i], i<nArg-1); 2250 } 2251 utf8_printf(p->out, "%s", p->rowSeparator); 2252 } 2253 setTextMode(p->out, 1); 2254 break; 2255 } 2256 case MODE_Insert: { 2257 if( azArg==0 ) break; 2258 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 2259 if( p->showHeader ){ 2260 raw_printf(p->out,"("); 2261 for(i=0; i<nArg; i++){ 2262 if( i>0 ) raw_printf(p->out, ","); 2263 if( quoteChar(azCol[i]) ){ 2264 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 2265 shell_check_oom(z); 2266 utf8_printf(p->out, "%s", z); 2267 sqlite3_free(z); 2268 }else{ 2269 raw_printf(p->out, "%s", azCol[i]); 2270 } 2271 } 2272 raw_printf(p->out,")"); 2273 } 2274 p->cnt++; 2275 for(i=0; i<nArg; i++){ 2276 raw_printf(p->out, i>0 ? "," : " VALUES("); 2277 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2278 utf8_printf(p->out,"NULL"); 2279 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2280 if( ShellHasFlag(p, SHFLG_Newlines) ){ 2281 output_quoted_string(p->out, azArg[i]); 2282 }else{ 2283 output_quoted_escaped_string(p->out, azArg[i]); 2284 } 2285 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2286 utf8_printf(p->out,"%s", azArg[i]); 2287 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2288 char z[50]; 2289 double r = sqlite3_column_double(p->pStmt, i); 2290 sqlite3_uint64 ur; 2291 memcpy(&ur,&r,sizeof(r)); 2292 if( ur==0x7ff0000000000000LL ){ 2293 raw_printf(p->out, "1e999"); 2294 }else if( ur==0xfff0000000000000LL ){ 2295 raw_printf(p->out, "-1e999"); 2296 }else{ 2297 sqlite3_snprintf(50,z,"%!.20g", r); 2298 raw_printf(p->out, "%s", z); 2299 } 2300 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2301 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2302 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2303 output_hex_blob(p->out, pBlob, nBlob); 2304 }else if( isNumber(azArg[i], 0) ){ 2305 utf8_printf(p->out,"%s", azArg[i]); 2306 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 2307 output_quoted_string(p->out, azArg[i]); 2308 }else{ 2309 output_quoted_escaped_string(p->out, azArg[i]); 2310 } 2311 } 2312 raw_printf(p->out,");\n"); 2313 break; 2314 } 2315 case MODE_Json: { 2316 if( azArg==0 ) break; 2317 if( p->cnt==0 ){ 2318 fputs("[{", p->out); 2319 }else{ 2320 fputs(",\n{", p->out); 2321 } 2322 p->cnt++; 2323 for(i=0; i<nArg; i++){ 2324 output_json_string(p->out, azCol[i], -1); 2325 putc(':', p->out); 2326 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2327 fputs("null",p->out); 2328 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2329 char z[50]; 2330 double r = sqlite3_column_double(p->pStmt, i); 2331 sqlite3_uint64 ur; 2332 memcpy(&ur,&r,sizeof(r)); 2333 if( ur==0x7ff0000000000000LL ){ 2334 raw_printf(p->out, "1e999"); 2335 }else if( ur==0xfff0000000000000LL ){ 2336 raw_printf(p->out, "-1e999"); 2337 }else{ 2338 sqlite3_snprintf(50,z,"%!.20g", r); 2339 raw_printf(p->out, "%s", z); 2340 } 2341 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2342 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2343 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2344 output_json_string(p->out, pBlob, nBlob); 2345 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2346 output_json_string(p->out, azArg[i], -1); 2347 }else{ 2348 utf8_printf(p->out,"%s", azArg[i]); 2349 } 2350 if( i<nArg-1 ){ 2351 putc(',', p->out); 2352 } 2353 } 2354 putc('}', p->out); 2355 break; 2356 } 2357 case MODE_Quote: { 2358 if( azArg==0 ) break; 2359 if( p->cnt==0 && p->showHeader ){ 2360 for(i=0; i<nArg; i++){ 2361 if( i>0 ) fputs(p->colSeparator, p->out); 2362 output_quoted_string(p->out, azCol[i]); 2363 } 2364 fputs(p->rowSeparator, p->out); 2365 } 2366 p->cnt++; 2367 for(i=0; i<nArg; i++){ 2368 if( i>0 ) fputs(p->colSeparator, p->out); 2369 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2370 utf8_printf(p->out,"NULL"); 2371 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2372 output_quoted_string(p->out, azArg[i]); 2373 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2374 utf8_printf(p->out,"%s", azArg[i]); 2375 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2376 char z[50]; 2377 double r = sqlite3_column_double(p->pStmt, i); 2378 sqlite3_snprintf(50,z,"%!.20g", r); 2379 raw_printf(p->out, "%s", z); 2380 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2381 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2382 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2383 output_hex_blob(p->out, pBlob, nBlob); 2384 }else if( isNumber(azArg[i], 0) ){ 2385 utf8_printf(p->out,"%s", azArg[i]); 2386 }else{ 2387 output_quoted_string(p->out, azArg[i]); 2388 } 2389 } 2390 fputs(p->rowSeparator, p->out); 2391 break; 2392 } 2393 case MODE_Ascii: { 2394 if( p->cnt++==0 && p->showHeader ){ 2395 for(i=0; i<nArg; i++){ 2396 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2397 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 2398 } 2399 utf8_printf(p->out, "%s", p->rowSeparator); 2400 } 2401 if( azArg==0 ) break; 2402 for(i=0; i<nArg; i++){ 2403 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2404 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 2405 } 2406 utf8_printf(p->out, "%s", p->rowSeparator); 2407 break; 2408 } 2409 case MODE_EQP: { 2410 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 2411 break; 2412 } 2413 } 2414 return 0; 2415} 2416 2417/* 2418** This is the callback routine that the SQLite library 2419** invokes for each row of a query result. 2420*/ 2421static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 2422 /* since we don't have type info, call the shell_callback with a NULL value */ 2423 return shell_callback(pArg, nArg, azArg, azCol, NULL); 2424} 2425 2426/* 2427** This is the callback routine from sqlite3_exec() that appends all 2428** output onto the end of a ShellText object. 2429*/ 2430static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 2431 ShellText *p = (ShellText*)pArg; 2432 int i; 2433 UNUSED_PARAMETER(az); 2434 if( azArg==0 ) return 0; 2435 if( p->n ) appendText(p, "|", 0); 2436 for(i=0; i<nArg; i++){ 2437 if( i ) appendText(p, ",", 0); 2438 if( azArg[i] ) appendText(p, azArg[i], 0); 2439 } 2440 return 0; 2441} 2442 2443/* 2444** Generate an appropriate SELFTEST table in the main database. 2445*/ 2446static void createSelftestTable(ShellState *p){ 2447 char *zErrMsg = 0; 2448 sqlite3_exec(p->db, 2449 "SAVEPOINT selftest_init;\n" 2450 "CREATE TABLE IF NOT EXISTS selftest(\n" 2451 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 2452 " op TEXT,\n" /* Operator: memo run */ 2453 " cmd TEXT,\n" /* Command text */ 2454 " ans TEXT\n" /* Desired answer */ 2455 ");" 2456 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 2457 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 2458 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 2459 " 'memo','Tests generated by --init');\n" 2460 "INSERT INTO [_shell$self]\n" 2461 " SELECT 'run',\n" 2462 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 2463 "FROM sqlite_schema ORDER BY 2'',224))',\n" 2464 " hex(sha3_query('SELECT type,name,tbl_name,sql " 2465 "FROM sqlite_schema ORDER BY 2',224));\n" 2466 "INSERT INTO [_shell$self]\n" 2467 " SELECT 'run'," 2468 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 2469 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 2470 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 2471 " FROM (\n" 2472 " SELECT name FROM sqlite_schema\n" 2473 " WHERE type='table'\n" 2474 " AND name<>'selftest'\n" 2475 " AND coalesce(rootpage,0)>0\n" 2476 " )\n" 2477 " ORDER BY name;\n" 2478 "INSERT INTO [_shell$self]\n" 2479 " VALUES('run','PRAGMA integrity_check','ok');\n" 2480 "INSERT INTO selftest(tno,op,cmd,ans)" 2481 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 2482 "DROP TABLE [_shell$self];" 2483 ,0,0,&zErrMsg); 2484 if( zErrMsg ){ 2485 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 2486 sqlite3_free(zErrMsg); 2487 } 2488 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 2489} 2490 2491 2492/* 2493** Set the destination table field of the ShellState structure to 2494** the name of the table given. Escape any quote characters in the 2495** table name. 2496*/ 2497static void set_table_name(ShellState *p, const char *zName){ 2498 int i, n; 2499 char cQuote; 2500 char *z; 2501 2502 if( p->zDestTable ){ 2503 free(p->zDestTable); 2504 p->zDestTable = 0; 2505 } 2506 if( zName==0 ) return; 2507 cQuote = quoteChar(zName); 2508 n = strlen30(zName); 2509 if( cQuote ) n += n+2; 2510 z = p->zDestTable = malloc( n+1 ); 2511 shell_check_oom(z); 2512 n = 0; 2513 if( cQuote ) z[n++] = cQuote; 2514 for(i=0; zName[i]; i++){ 2515 z[n++] = zName[i]; 2516 if( zName[i]==cQuote ) z[n++] = cQuote; 2517 } 2518 if( cQuote ) z[n++] = cQuote; 2519 z[n] = 0; 2520} 2521 2522/* 2523** Maybe construct two lines of text that point out the position of a 2524** syntax error. Return a pointer to the text, in memory obtained from 2525** sqlite3_malloc(). Or, if the most recent error does not involve a 2526** specific token that we can point to, return an empty string. 2527** 2528** In all cases, the memory returned is obtained from sqlite3_malloc64() 2529** and should be released by the caller invoking sqlite3_free(). 2530*/ 2531static char *shell_error_context(const char *zSql, sqlite3 *db){ 2532 int iOffset; 2533 size_t len; 2534 char *zCode; 2535 char *zMsg; 2536 int i; 2537 if( db==0 2538 || zSql==0 2539 || (iOffset = sqlite3_error_offset(db))<0 2540 ){ 2541 return sqlite3_mprintf(""); 2542 } 2543 while( iOffset>50 ){ 2544 iOffset--; 2545 zSql++; 2546 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; } 2547 } 2548 len = strlen(zSql); 2549 if( len>78 ){ 2550 len = 78; 2551 while( (zSql[len]&0xc0)==0x80 ) len--; 2552 } 2553 zCode = sqlite3_mprintf("%.*s", len, zSql); 2554 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; } 2555 if( iOffset<25 ){ 2556 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode, iOffset, ""); 2557 }else{ 2558 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode, iOffset-14, ""); 2559 } 2560 return zMsg; 2561} 2562 2563 2564/* 2565** Execute a query statement that will generate SQL output. Print 2566** the result columns, comma-separated, on a line and then add a 2567** semicolon terminator to the end of that line. 2568** 2569** If the number of columns is 1 and that column contains text "--" 2570** then write the semicolon on a separate line. That way, if a 2571** "--" comment occurs at the end of the statement, the comment 2572** won't consume the semicolon terminator. 2573*/ 2574static int run_table_dump_query( 2575 ShellState *p, /* Query context */ 2576 const char *zSelect /* SELECT statement to extract content */ 2577){ 2578 sqlite3_stmt *pSelect; 2579 int rc; 2580 int nResult; 2581 int i; 2582 const char *z; 2583 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 2584 if( rc!=SQLITE_OK || !pSelect ){ 2585 char *zContext = shell_error_context(zSelect, p->db); 2586 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc, 2587 sqlite3_errmsg(p->db), zContext); 2588 sqlite3_free(zContext); 2589 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2590 return rc; 2591 } 2592 rc = sqlite3_step(pSelect); 2593 nResult = sqlite3_column_count(pSelect); 2594 while( rc==SQLITE_ROW ){ 2595 z = (const char*)sqlite3_column_text(pSelect, 0); 2596 utf8_printf(p->out, "%s", z); 2597 for(i=1; i<nResult; i++){ 2598 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 2599 } 2600 if( z==0 ) z = ""; 2601 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 2602 if( z[0] ){ 2603 raw_printf(p->out, "\n;\n"); 2604 }else{ 2605 raw_printf(p->out, ";\n"); 2606 } 2607 rc = sqlite3_step(pSelect); 2608 } 2609 rc = sqlite3_finalize(pSelect); 2610 if( rc!=SQLITE_OK ){ 2611 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2612 sqlite3_errmsg(p->db)); 2613 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2614 } 2615 return rc; 2616} 2617 2618/* 2619** Allocate space and save off string indicating current error. 2620*/ 2621static char *save_err_msg( 2622 sqlite3 *db, /* Database to query */ 2623 const char *zWhen, /* Qualifier (format) wrapper */ 2624 int rc, /* Error code returned from API */ 2625 const char *zSql /* SQL string, or NULL */ 2626){ 2627 char *zErr; 2628 char *zContext; 2629 if( zWhen==0 ) zWhen = "%s (%d)%s"; 2630 zContext = shell_error_context(zSql, db); 2631 zErr = sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc, zContext); 2632 shell_check_oom(zErr); 2633 sqlite3_free(zContext); 2634 return zErr; 2635} 2636 2637#ifdef __linux__ 2638/* 2639** Attempt to display I/O stats on Linux using /proc/PID/io 2640*/ 2641static void displayLinuxIoStats(FILE *out){ 2642 FILE *in; 2643 char z[200]; 2644 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 2645 in = fopen(z, "rb"); 2646 if( in==0 ) return; 2647 while( fgets(z, sizeof(z), in)!=0 ){ 2648 static const struct { 2649 const char *zPattern; 2650 const char *zDesc; 2651 } aTrans[] = { 2652 { "rchar: ", "Bytes received by read():" }, 2653 { "wchar: ", "Bytes sent to write():" }, 2654 { "syscr: ", "Read() system calls:" }, 2655 { "syscw: ", "Write() system calls:" }, 2656 { "read_bytes: ", "Bytes read from storage:" }, 2657 { "write_bytes: ", "Bytes written to storage:" }, 2658 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 2659 }; 2660 int i; 2661 for(i=0; i<ArraySize(aTrans); i++){ 2662 int n = strlen30(aTrans[i].zPattern); 2663 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 2664 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 2665 break; 2666 } 2667 } 2668 } 2669 fclose(in); 2670} 2671#endif 2672 2673/* 2674** Display a single line of status using 64-bit values. 2675*/ 2676static void displayStatLine( 2677 ShellState *p, /* The shell context */ 2678 char *zLabel, /* Label for this one line */ 2679 char *zFormat, /* Format for the result */ 2680 int iStatusCtrl, /* Which status to display */ 2681 int bReset /* True to reset the stats */ 2682){ 2683 sqlite3_int64 iCur = -1; 2684 sqlite3_int64 iHiwtr = -1; 2685 int i, nPercent; 2686 char zLine[200]; 2687 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 2688 for(i=0, nPercent=0; zFormat[i]; i++){ 2689 if( zFormat[i]=='%' ) nPercent++; 2690 } 2691 if( nPercent>1 ){ 2692 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 2693 }else{ 2694 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 2695 } 2696 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 2697} 2698 2699/* 2700** Display memory stats. 2701*/ 2702static int display_stats( 2703 sqlite3 *db, /* Database to query */ 2704 ShellState *pArg, /* Pointer to ShellState */ 2705 int bReset /* True to reset the stats */ 2706){ 2707 int iCur; 2708 int iHiwtr; 2709 FILE *out; 2710 if( pArg==0 || pArg->out==0 ) return 0; 2711 out = pArg->out; 2712 2713 if( pArg->pStmt && pArg->statsOn==2 ){ 2714 int nCol, i, x; 2715 sqlite3_stmt *pStmt = pArg->pStmt; 2716 char z[100]; 2717 nCol = sqlite3_column_count(pStmt); 2718 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 2719 for(i=0; i<nCol; i++){ 2720 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 2721 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 2722#ifndef SQLITE_OMIT_DECLTYPE 2723 sqlite3_snprintf(30, z+x, "declared type:"); 2724 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 2725#endif 2726#ifdef SQLITE_ENABLE_COLUMN_METADATA 2727 sqlite3_snprintf(30, z+x, "database name:"); 2728 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 2729 sqlite3_snprintf(30, z+x, "table name:"); 2730 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 2731 sqlite3_snprintf(30, z+x, "origin name:"); 2732 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 2733#endif 2734 } 2735 } 2736 2737 if( pArg->statsOn==3 ){ 2738 if( pArg->pStmt ){ 2739 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2740 raw_printf(pArg->out, "VM-steps: %d\n", iCur); 2741 } 2742 return 0; 2743 } 2744 2745 displayStatLine(pArg, "Memory Used:", 2746 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 2747 displayStatLine(pArg, "Number of Outstanding Allocations:", 2748 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 2749 if( pArg->shellFlgs & SHFLG_Pagecache ){ 2750 displayStatLine(pArg, "Number of Pcache Pages Used:", 2751 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 2752 } 2753 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 2754 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 2755 displayStatLine(pArg, "Largest Allocation:", 2756 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 2757 displayStatLine(pArg, "Largest Pcache Allocation:", 2758 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 2759#ifdef YYTRACKMAXSTACKDEPTH 2760 displayStatLine(pArg, "Deepest Parser Stack:", 2761 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 2762#endif 2763 2764 if( db ){ 2765 if( pArg->shellFlgs & SHFLG_Lookaside ){ 2766 iHiwtr = iCur = -1; 2767 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 2768 &iCur, &iHiwtr, bReset); 2769 raw_printf(pArg->out, 2770 "Lookaside Slots Used: %d (max %d)\n", 2771 iCur, iHiwtr); 2772 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 2773 &iCur, &iHiwtr, bReset); 2774 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 2775 iHiwtr); 2776 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 2777 &iCur, &iHiwtr, bReset); 2778 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 2779 iHiwtr); 2780 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 2781 &iCur, &iHiwtr, bReset); 2782 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 2783 iHiwtr); 2784 } 2785 iHiwtr = iCur = -1; 2786 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 2787 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 2788 iCur); 2789 iHiwtr = iCur = -1; 2790 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 2791 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 2792 iHiwtr = iCur = -1; 2793 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 2794 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 2795 iHiwtr = iCur = -1; 2796 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 2797 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 2798 iHiwtr = iCur = -1; 2799 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 2800 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 2801 iHiwtr = iCur = -1; 2802 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 2803 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 2804 iCur); 2805 iHiwtr = iCur = -1; 2806 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 2807 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 2808 iCur); 2809 } 2810 2811 if( pArg->pStmt ){ 2812 int iHit, iMiss; 2813 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 2814 bReset); 2815 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 2816 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 2817 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 2818 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 2819 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 2820 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset); 2821 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset); 2822 if( iHit || iMiss ){ 2823 raw_printf(pArg->out, "Bloom filter bypass taken: %d/%d\n", 2824 iHit, iHit+iMiss); 2825 } 2826 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2827 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 2828 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 2829 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 2830 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 2831 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 2832 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 2833 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 2834 } 2835 2836#ifdef __linux__ 2837 displayLinuxIoStats(pArg->out); 2838#endif 2839 2840 /* Do not remove this machine readable comment: extra-stats-output-here */ 2841 2842 return 0; 2843} 2844 2845/* 2846** Display scan stats. 2847*/ 2848static void display_scanstats( 2849 sqlite3 *db, /* Database to query */ 2850 ShellState *pArg /* Pointer to ShellState */ 2851){ 2852#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 2853 UNUSED_PARAMETER(db); 2854 UNUSED_PARAMETER(pArg); 2855#else 2856 int i, k, n, mx; 2857 raw_printf(pArg->out, "-------- scanstats --------\n"); 2858 mx = 0; 2859 for(k=0; k<=mx; k++){ 2860 double rEstLoop = 1.0; 2861 for(i=n=0; 1; i++){ 2862 sqlite3_stmt *p = pArg->pStmt; 2863 sqlite3_int64 nLoop, nVisit; 2864 double rEst; 2865 int iSid; 2866 const char *zExplain; 2867 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 2868 break; 2869 } 2870 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 2871 if( iSid>mx ) mx = iSid; 2872 if( iSid!=k ) continue; 2873 if( n==0 ){ 2874 rEstLoop = (double)nLoop; 2875 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 2876 } 2877 n++; 2878 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 2879 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 2880 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 2881 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 2882 rEstLoop *= rEst; 2883 raw_printf(pArg->out, 2884 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 2885 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 2886 ); 2887 } 2888 } 2889 raw_printf(pArg->out, "---------------------------\n"); 2890#endif 2891} 2892 2893/* 2894** Parameter azArray points to a zero-terminated array of strings. zStr 2895** points to a single nul-terminated string. Return non-zero if zStr 2896** is equal, according to strcmp(), to any of the strings in the array. 2897** Otherwise, return zero. 2898*/ 2899static int str_in_array(const char *zStr, const char **azArray){ 2900 int i; 2901 for(i=0; azArray[i]; i++){ 2902 if( 0==strcmp(zStr, azArray[i]) ) return 1; 2903 } 2904 return 0; 2905} 2906 2907/* 2908** If compiled statement pSql appears to be an EXPLAIN statement, allocate 2909** and populate the ShellState.aiIndent[] array with the number of 2910** spaces each opcode should be indented before it is output. 2911** 2912** The indenting rules are: 2913** 2914** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 2915** all opcodes that occur between the p2 jump destination and the opcode 2916** itself by 2 spaces. 2917** 2918** * For each "Goto", if the jump destination is earlier in the program 2919** and ends on one of: 2920** Yield SeekGt SeekLt RowSetRead Rewind 2921** or if the P1 parameter is one instead of zero, 2922** then indent all opcodes between the earlier instruction 2923** and "Goto" by 2 spaces. 2924*/ 2925static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 2926 const char *zSql; /* The text of the SQL statement */ 2927 const char *z; /* Used to check if this is an EXPLAIN */ 2928 int *abYield = 0; /* True if op is an OP_Yield */ 2929 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 2930 int iOp; /* Index of operation in p->aiIndent[] */ 2931 2932 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 2933 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 2934 "Rewind", 0 }; 2935 const char *azGoto[] = { "Goto", 0 }; 2936 2937 /* Try to figure out if this is really an EXPLAIN statement. If this 2938 ** cannot be verified, return early. */ 2939 if( sqlite3_column_count(pSql)!=8 ){ 2940 p->cMode = p->mode; 2941 return; 2942 } 2943 zSql = sqlite3_sql(pSql); 2944 if( zSql==0 ) return; 2945 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 2946 if( sqlite3_strnicmp(z, "explain", 7) ){ 2947 p->cMode = p->mode; 2948 return; 2949 } 2950 2951 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 2952 int i; 2953 int iAddr = sqlite3_column_int(pSql, 0); 2954 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 2955 2956 /* Set p2 to the P2 field of the current opcode. Then, assuming that 2957 ** p2 is an instruction address, set variable p2op to the index of that 2958 ** instruction in the aiIndent[] array. p2 and p2op may be different if 2959 ** the current instruction is part of a sub-program generated by an 2960 ** SQL trigger or foreign key. */ 2961 int p2 = sqlite3_column_int(pSql, 3); 2962 int p2op = (p2 + (iOp-iAddr)); 2963 2964 /* Grow the p->aiIndent array as required */ 2965 if( iOp>=nAlloc ){ 2966 if( iOp==0 ){ 2967 /* Do further verfication that this is explain output. Abort if 2968 ** it is not */ 2969 static const char *explainCols[] = { 2970 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 2971 int jj; 2972 for(jj=0; jj<ArraySize(explainCols); jj++){ 2973 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 2974 p->cMode = p->mode; 2975 sqlite3_reset(pSql); 2976 return; 2977 } 2978 } 2979 } 2980 nAlloc += 100; 2981 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 2982 shell_check_oom(p->aiIndent); 2983 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 2984 shell_check_oom(abYield); 2985 } 2986 abYield[iOp] = str_in_array(zOp, azYield); 2987 p->aiIndent[iOp] = 0; 2988 p->nIndent = iOp+1; 2989 2990 if( str_in_array(zOp, azNext) ){ 2991 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2992 } 2993 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 2994 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 2995 ){ 2996 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2997 } 2998 } 2999 3000 p->iIndent = 0; 3001 sqlite3_free(abYield); 3002 sqlite3_reset(pSql); 3003} 3004 3005/* 3006** Free the array allocated by explain_data_prepare(). 3007*/ 3008static void explain_data_delete(ShellState *p){ 3009 sqlite3_free(p->aiIndent); 3010 p->aiIndent = 0; 3011 p->nIndent = 0; 3012 p->iIndent = 0; 3013} 3014 3015/* 3016** Disable and restore .wheretrace and .selecttrace settings. 3017*/ 3018static unsigned int savedSelectTrace; 3019static unsigned int savedWhereTrace; 3020static void disable_debug_trace_modes(void){ 3021 unsigned int zero = 0; 3022 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace); 3023 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero); 3024 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace); 3025 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero); 3026} 3027static void restore_debug_trace_modes(void){ 3028 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace); 3029 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace); 3030} 3031 3032/* Create the TEMP table used to store parameter bindings */ 3033static void bind_table_init(ShellState *p){ 3034 int wrSchema = 0; 3035 int defensiveMode = 0; 3036 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 3037 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 3038 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 3039 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 3040 sqlite3_exec(p->db, 3041 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 3042 " key TEXT PRIMARY KEY,\n" 3043 " value\n" 3044 ") WITHOUT ROWID;", 3045 0, 0, 0); 3046 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 3047 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 3048} 3049 3050/* 3051** Bind parameters on a prepared statement. 3052** 3053** Parameter bindings are taken from a TEMP table of the form: 3054** 3055** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 3056** WITHOUT ROWID; 3057** 3058** No bindings occur if this table does not exist. The name of the table 3059** begins with "sqlite_" so that it will not collide with ordinary application 3060** tables. The table must be in the TEMP schema. 3061*/ 3062static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 3063 int nVar; 3064 int i; 3065 int rc; 3066 sqlite3_stmt *pQ = 0; 3067 3068 nVar = sqlite3_bind_parameter_count(pStmt); 3069 if( nVar==0 ) return; /* Nothing to do */ 3070 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 3071 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 3072 return; /* Parameter table does not exist */ 3073 } 3074 rc = sqlite3_prepare_v2(pArg->db, 3075 "SELECT value FROM temp.sqlite_parameters" 3076 " WHERE key=?1", -1, &pQ, 0); 3077 if( rc || pQ==0 ) return; 3078 for(i=1; i<=nVar; i++){ 3079 char zNum[30]; 3080 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 3081 if( zVar==0 ){ 3082 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 3083 zVar = zNum; 3084 } 3085 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 3086 if( sqlite3_step(pQ)==SQLITE_ROW ){ 3087 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 3088 }else{ 3089 sqlite3_bind_null(pStmt, i); 3090 } 3091 sqlite3_reset(pQ); 3092 } 3093 sqlite3_finalize(pQ); 3094} 3095 3096/* 3097** UTF8 box-drawing characters. Imagine box lines like this: 3098** 3099** 1 3100** | 3101** 4 --+-- 2 3102** | 3103** 3 3104** 3105** Each box characters has between 2 and 4 of the lines leading from 3106** the center. The characters are here identified by the numbers of 3107** their corresponding lines. 3108*/ 3109#define BOX_24 "\342\224\200" /* U+2500 --- */ 3110#define BOX_13 "\342\224\202" /* U+2502 | */ 3111#define BOX_23 "\342\224\214" /* U+250c ,- */ 3112#define BOX_34 "\342\224\220" /* U+2510 -, */ 3113#define BOX_12 "\342\224\224" /* U+2514 '- */ 3114#define BOX_14 "\342\224\230" /* U+2518 -' */ 3115#define BOX_123 "\342\224\234" /* U+251c |- */ 3116#define BOX_134 "\342\224\244" /* U+2524 -| */ 3117#define BOX_234 "\342\224\254" /* U+252c -,- */ 3118#define BOX_124 "\342\224\264" /* U+2534 -'- */ 3119#define BOX_1234 "\342\224\274" /* U+253c -|- */ 3120 3121/* Draw horizontal line N characters long using unicode box 3122** characters 3123*/ 3124static void print_box_line(FILE *out, int N){ 3125 const char zDash[] = 3126 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 3127 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 3128 const int nDash = sizeof(zDash) - 1; 3129 N *= 3; 3130 while( N>nDash ){ 3131 utf8_printf(out, zDash); 3132 N -= nDash; 3133 } 3134 utf8_printf(out, "%.*s", N, zDash); 3135} 3136 3137/* 3138** Draw a horizontal separator for a MODE_Box table. 3139*/ 3140static void print_box_row_separator( 3141 ShellState *p, 3142 int nArg, 3143 const char *zSep1, 3144 const char *zSep2, 3145 const char *zSep3 3146){ 3147 int i; 3148 if( nArg>0 ){ 3149 utf8_printf(p->out, "%s", zSep1); 3150 print_box_line(p->out, p->actualWidth[0]+2); 3151 for(i=1; i<nArg; i++){ 3152 utf8_printf(p->out, "%s", zSep2); 3153 print_box_line(p->out, p->actualWidth[i]+2); 3154 } 3155 utf8_printf(p->out, "%s", zSep3); 3156 } 3157 fputs("\n", p->out); 3158} 3159 3160 3161 3162/* 3163** Run a prepared statement and output the result in one of the 3164** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 3165** or MODE_Box. 3166** 3167** This is different from ordinary exec_prepared_stmt() in that 3168** it has to run the entire query and gather the results into memory 3169** first, in order to determine column widths, before providing 3170** any output. 3171*/ 3172static void exec_prepared_stmt_columnar( 3173 ShellState *p, /* Pointer to ShellState */ 3174 sqlite3_stmt *pStmt /* Statment to run */ 3175){ 3176 sqlite3_int64 nRow = 0; 3177 int nColumn = 0; 3178 char **azData = 0; 3179 sqlite3_int64 nAlloc = 0; 3180 const char *z; 3181 int rc; 3182 sqlite3_int64 i, nData; 3183 int j, nTotal, w, n; 3184 const char *colSep = 0; 3185 const char *rowSep = 0; 3186 3187 rc = sqlite3_step(pStmt); 3188 if( rc!=SQLITE_ROW ) return; 3189 nColumn = sqlite3_column_count(pStmt); 3190 nAlloc = nColumn*4; 3191 if( nAlloc<=0 ) nAlloc = 1; 3192 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 3193 shell_check_oom(azData); 3194 for(i=0; i<nColumn; i++){ 3195 azData[i] = strdup(sqlite3_column_name(pStmt,i)); 3196 } 3197 do{ 3198 if( (nRow+2)*nColumn >= nAlloc ){ 3199 nAlloc *= 2; 3200 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 3201 shell_check_oom(azData); 3202 } 3203 nRow++; 3204 for(i=0; i<nColumn; i++){ 3205 z = (const char*)sqlite3_column_text(pStmt,i); 3206 azData[nRow*nColumn + i] = z ? strdup(z) : 0; 3207 } 3208 }while( sqlite3_step(pStmt)==SQLITE_ROW ); 3209 if( nColumn>p->nWidth ){ 3210 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); 3211 shell_check_oom(p->colWidth); 3212 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 3213 p->nWidth = nColumn; 3214 p->actualWidth = &p->colWidth[nColumn]; 3215 } 3216 memset(p->actualWidth, 0, nColumn*sizeof(int)); 3217 for(i=0; i<nColumn; i++){ 3218 w = p->colWidth[i]; 3219 if( w<0 ) w = -w; 3220 p->actualWidth[i] = w; 3221 } 3222 nTotal = nColumn*(nRow+1); 3223 for(i=0; i<nTotal; i++){ 3224 z = azData[i]; 3225 if( z==0 ) z = p->nullValue; 3226 n = strlenChar(z); 3227 j = i%nColumn; 3228 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 3229 } 3230 if( seenInterrupt ) goto columnar_end; 3231 if( nColumn==0 ) goto columnar_end; 3232 switch( p->cMode ){ 3233 case MODE_Column: { 3234 colSep = " "; 3235 rowSep = "\n"; 3236 if( p->showHeader ){ 3237 for(i=0; i<nColumn; i++){ 3238 w = p->actualWidth[i]; 3239 if( p->colWidth[i]<0 ) w = -w; 3240 utf8_width_print(p->out, w, azData[i]); 3241 fputs(i==nColumn-1?"\n":" ", p->out); 3242 } 3243 for(i=0; i<nColumn; i++){ 3244 print_dashes(p->out, p->actualWidth[i]); 3245 fputs(i==nColumn-1?"\n":" ", p->out); 3246 } 3247 } 3248 break; 3249 } 3250 case MODE_Table: { 3251 colSep = " | "; 3252 rowSep = " |\n"; 3253 print_row_separator(p, nColumn, "+"); 3254 fputs("| ", p->out); 3255 for(i=0; i<nColumn; i++){ 3256 w = p->actualWidth[i]; 3257 n = strlenChar(azData[i]); 3258 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3259 fputs(i==nColumn-1?" |\n":" | ", p->out); 3260 } 3261 print_row_separator(p, nColumn, "+"); 3262 break; 3263 } 3264 case MODE_Markdown: { 3265 colSep = " | "; 3266 rowSep = " |\n"; 3267 fputs("| ", p->out); 3268 for(i=0; i<nColumn; i++){ 3269 w = p->actualWidth[i]; 3270 n = strlenChar(azData[i]); 3271 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3272 fputs(i==nColumn-1?" |\n":" | ", p->out); 3273 } 3274 print_row_separator(p, nColumn, "|"); 3275 break; 3276 } 3277 case MODE_Box: { 3278 colSep = " " BOX_13 " "; 3279 rowSep = " " BOX_13 "\n"; 3280 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 3281 utf8_printf(p->out, BOX_13 " "); 3282 for(i=0; i<nColumn; i++){ 3283 w = p->actualWidth[i]; 3284 n = strlenChar(azData[i]); 3285 utf8_printf(p->out, "%*s%s%*s%s", 3286 (w-n)/2, "", azData[i], (w-n+1)/2, "", 3287 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 3288 } 3289 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 3290 break; 3291 } 3292 } 3293 for(i=nColumn, j=0; i<nTotal; i++, j++){ 3294 if( j==0 && p->cMode!=MODE_Column ){ 3295 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 3296 } 3297 z = azData[i]; 3298 if( z==0 ) z = p->nullValue; 3299 w = p->actualWidth[j]; 3300 if( p->colWidth[j]<0 ) w = -w; 3301 utf8_width_print(p->out, w, z); 3302 if( j==nColumn-1 ){ 3303 utf8_printf(p->out, "%s", rowSep); 3304 j = -1; 3305 if( seenInterrupt ) goto columnar_end; 3306 }else{ 3307 utf8_printf(p->out, "%s", colSep); 3308 } 3309 } 3310 if( p->cMode==MODE_Table ){ 3311 print_row_separator(p, nColumn, "+"); 3312 }else if( p->cMode==MODE_Box ){ 3313 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 3314 } 3315columnar_end: 3316 if( seenInterrupt ){ 3317 utf8_printf(p->out, "Interrupt\n"); 3318 } 3319 nData = (nRow+1)*nColumn; 3320 for(i=0; i<nData; i++) free(azData[i]); 3321 sqlite3_free(azData); 3322} 3323 3324/* 3325** Run a prepared statement 3326*/ 3327static void exec_prepared_stmt( 3328 ShellState *pArg, /* Pointer to ShellState */ 3329 sqlite3_stmt *pStmt /* Statment to run */ 3330){ 3331 int rc; 3332 sqlite3_uint64 nRow = 0; 3333 3334 if( pArg->cMode==MODE_Column 3335 || pArg->cMode==MODE_Table 3336 || pArg->cMode==MODE_Box 3337 || pArg->cMode==MODE_Markdown 3338 ){ 3339 exec_prepared_stmt_columnar(pArg, pStmt); 3340 return; 3341 } 3342 3343 /* perform the first step. this will tell us if we 3344 ** have a result set or not and how wide it is. 3345 */ 3346 rc = sqlite3_step(pStmt); 3347 /* if we have a result set... */ 3348 if( SQLITE_ROW == rc ){ 3349 /* allocate space for col name ptr, value ptr, and type */ 3350 int nCol = sqlite3_column_count(pStmt); 3351 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 3352 if( !pData ){ 3353 shell_out_of_memory(); 3354 }else{ 3355 char **azCols = (char **)pData; /* Names of result columns */ 3356 char **azVals = &azCols[nCol]; /* Results */ 3357 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 3358 int i, x; 3359 assert(sizeof(int) <= sizeof(char *)); 3360 /* save off ptrs to column names */ 3361 for(i=0; i<nCol; i++){ 3362 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 3363 } 3364 do{ 3365 nRow++; 3366 /* extract the data and data types */ 3367 for(i=0; i<nCol; i++){ 3368 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 3369 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 3370 azVals[i] = ""; 3371 }else{ 3372 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 3373 } 3374 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 3375 rc = SQLITE_NOMEM; 3376 break; /* from for */ 3377 } 3378 } /* end for */ 3379 3380 /* if data and types extracted successfully... */ 3381 if( SQLITE_ROW == rc ){ 3382 /* call the supplied callback with the result row data */ 3383 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 3384 rc = SQLITE_ABORT; 3385 }else{ 3386 rc = sqlite3_step(pStmt); 3387 } 3388 } 3389 } while( SQLITE_ROW == rc ); 3390 sqlite3_free(pData); 3391 if( pArg->cMode==MODE_Json ){ 3392 fputs("]\n", pArg->out); 3393 }else if( pArg->cMode==MODE_Count ){ 3394 printf("%llu row%s\n", nRow, nRow!=1 ? "s" : ""); 3395 } 3396 } 3397 } 3398} 3399 3400#ifndef SQLITE_OMIT_VIRTUALTABLE 3401/* 3402** This function is called to process SQL if the previous shell command 3403** was ".expert". It passes the SQL in the second argument directly to 3404** the sqlite3expert object. 3405** 3406** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3407** code. In this case, (*pzErr) may be set to point to a buffer containing 3408** an English language error message. It is the responsibility of the 3409** caller to eventually free this buffer using sqlite3_free(). 3410*/ 3411static int expertHandleSQL( 3412 ShellState *pState, 3413 const char *zSql, 3414 char **pzErr 3415){ 3416 assert( pState->expert.pExpert ); 3417 assert( pzErr==0 || *pzErr==0 ); 3418 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 3419} 3420 3421/* 3422** This function is called either to silently clean up the object 3423** created by the ".expert" command (if bCancel==1), or to generate a 3424** report from it and then clean it up (if bCancel==0). 3425** 3426** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3427** code. In this case, (*pzErr) may be set to point to a buffer containing 3428** an English language error message. It is the responsibility of the 3429** caller to eventually free this buffer using sqlite3_free(). 3430*/ 3431static int expertFinish( 3432 ShellState *pState, 3433 int bCancel, 3434 char **pzErr 3435){ 3436 int rc = SQLITE_OK; 3437 sqlite3expert *p = pState->expert.pExpert; 3438 assert( p ); 3439 assert( bCancel || pzErr==0 || *pzErr==0 ); 3440 if( bCancel==0 ){ 3441 FILE *out = pState->out; 3442 int bVerbose = pState->expert.bVerbose; 3443 3444 rc = sqlite3_expert_analyze(p, pzErr); 3445 if( rc==SQLITE_OK ){ 3446 int nQuery = sqlite3_expert_count(p); 3447 int i; 3448 3449 if( bVerbose ){ 3450 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 3451 raw_printf(out, "-- Candidates -----------------------------\n"); 3452 raw_printf(out, "%s\n", zCand); 3453 } 3454 for(i=0; i<nQuery; i++){ 3455 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 3456 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 3457 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 3458 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 3459 if( bVerbose ){ 3460 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 3461 raw_printf(out, "%s\n\n", zSql); 3462 } 3463 raw_printf(out, "%s\n", zIdx); 3464 raw_printf(out, "%s\n", zEQP); 3465 } 3466 } 3467 } 3468 sqlite3_expert_destroy(p); 3469 pState->expert.pExpert = 0; 3470 return rc; 3471} 3472 3473/* 3474** Implementation of ".expert" dot command. 3475*/ 3476static int expertDotCommand( 3477 ShellState *pState, /* Current shell tool state */ 3478 char **azArg, /* Array of arguments passed to dot command */ 3479 int nArg /* Number of entries in azArg[] */ 3480){ 3481 int rc = SQLITE_OK; 3482 char *zErr = 0; 3483 int i; 3484 int iSample = 0; 3485 3486 assert( pState->expert.pExpert==0 ); 3487 memset(&pState->expert, 0, sizeof(ExpertInfo)); 3488 3489 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 3490 char *z = azArg[i]; 3491 int n; 3492 if( z[0]=='-' && z[1]=='-' ) z++; 3493 n = strlen30(z); 3494 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 3495 pState->expert.bVerbose = 1; 3496 } 3497 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 3498 if( i==(nArg-1) ){ 3499 raw_printf(stderr, "option requires an argument: %s\n", z); 3500 rc = SQLITE_ERROR; 3501 }else{ 3502 iSample = (int)integerValue(azArg[++i]); 3503 if( iSample<0 || iSample>100 ){ 3504 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 3505 rc = SQLITE_ERROR; 3506 } 3507 } 3508 } 3509 else{ 3510 raw_printf(stderr, "unknown option: %s\n", z); 3511 rc = SQLITE_ERROR; 3512 } 3513 } 3514 3515 if( rc==SQLITE_OK ){ 3516 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 3517 if( pState->expert.pExpert==0 ){ 3518 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory"); 3519 rc = SQLITE_ERROR; 3520 }else{ 3521 sqlite3_expert_config( 3522 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 3523 ); 3524 } 3525 } 3526 sqlite3_free(zErr); 3527 3528 return rc; 3529} 3530#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 3531 3532/* 3533** Execute a statement or set of statements. Print 3534** any result rows/columns depending on the current mode 3535** set via the supplied callback. 3536** 3537** This is very similar to SQLite's built-in sqlite3_exec() 3538** function except it takes a slightly different callback 3539** and callback data argument. 3540*/ 3541static int shell_exec( 3542 ShellState *pArg, /* Pointer to ShellState */ 3543 const char *zSql, /* SQL to be evaluated */ 3544 char **pzErrMsg /* Error msg written here */ 3545){ 3546 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 3547 int rc = SQLITE_OK; /* Return Code */ 3548 int rc2; 3549 const char *zLeftover; /* Tail of unprocessed SQL */ 3550 sqlite3 *db = pArg->db; 3551 3552 if( pzErrMsg ){ 3553 *pzErrMsg = NULL; 3554 } 3555 3556#ifndef SQLITE_OMIT_VIRTUALTABLE 3557 if( pArg->expert.pExpert ){ 3558 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 3559 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 3560 } 3561#endif 3562 3563 while( zSql[0] && (SQLITE_OK == rc) ){ 3564 static const char *zStmtSql; 3565 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 3566 if( SQLITE_OK != rc ){ 3567 if( pzErrMsg ){ 3568 *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)%s", rc, zSql); 3569 } 3570 }else{ 3571 if( !pStmt ){ 3572 /* this happens for a comment or white-space */ 3573 zSql = zLeftover; 3574 while( IsSpace(zSql[0]) ) zSql++; 3575 continue; 3576 } 3577 zStmtSql = sqlite3_sql(pStmt); 3578 if( zStmtSql==0 ) zStmtSql = ""; 3579 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 3580 3581 /* save off the prepared statment handle and reset row count */ 3582 if( pArg ){ 3583 pArg->pStmt = pStmt; 3584 pArg->cnt = 0; 3585 } 3586 3587 /* echo the sql statement if echo on */ 3588 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 3589 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 3590 } 3591 3592 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 3593 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 3594 sqlite3_stmt *pExplain; 3595 char *zEQP; 3596 int triggerEQP = 0; 3597 disable_debug_trace_modes(); 3598 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 3599 if( pArg->autoEQP>=AUTOEQP_trigger ){ 3600 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 3601 } 3602 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 3603 shell_check_oom(zEQP); 3604 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3605 if( rc==SQLITE_OK ){ 3606 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 3607 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 3608 int iEqpId = sqlite3_column_int(pExplain, 0); 3609 int iParentId = sqlite3_column_int(pExplain, 1); 3610 if( zEQPLine==0 ) zEQPLine = ""; 3611 if( zEQPLine[0]=='-' ) eqp_render(pArg); 3612 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 3613 } 3614 eqp_render(pArg); 3615 } 3616 sqlite3_finalize(pExplain); 3617 sqlite3_free(zEQP); 3618 if( pArg->autoEQP>=AUTOEQP_full ){ 3619 /* Also do an EXPLAIN for ".eqp full" mode */ 3620 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 3621 shell_check_oom(zEQP); 3622 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3623 if( rc==SQLITE_OK ){ 3624 pArg->cMode = MODE_Explain; 3625 explain_data_prepare(pArg, pExplain); 3626 exec_prepared_stmt(pArg, pExplain); 3627 explain_data_delete(pArg); 3628 } 3629 sqlite3_finalize(pExplain); 3630 sqlite3_free(zEQP); 3631 } 3632 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 3633 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 3634 /* Reprepare pStmt before reactiving trace modes */ 3635 sqlite3_finalize(pStmt); 3636 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 3637 if( pArg ) pArg->pStmt = pStmt; 3638 } 3639 restore_debug_trace_modes(); 3640 } 3641 3642 if( pArg ){ 3643 pArg->cMode = pArg->mode; 3644 if( pArg->autoExplain ){ 3645 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 3646 pArg->cMode = MODE_Explain; 3647 } 3648 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 3649 pArg->cMode = MODE_EQP; 3650 } 3651 } 3652 3653 /* If the shell is currently in ".explain" mode, gather the extra 3654 ** data required to add indents to the output.*/ 3655 if( pArg->cMode==MODE_Explain ){ 3656 explain_data_prepare(pArg, pStmt); 3657 } 3658 } 3659 3660 bind_prepared_stmt(pArg, pStmt); 3661 exec_prepared_stmt(pArg, pStmt); 3662 explain_data_delete(pArg); 3663 eqp_render(pArg); 3664 3665 /* print usage stats if stats on */ 3666 if( pArg && pArg->statsOn ){ 3667 display_stats(db, pArg, 0); 3668 } 3669 3670 /* print loop-counters if required */ 3671 if( pArg && pArg->scanstatsOn ){ 3672 display_scanstats(db, pArg); 3673 } 3674 3675 /* Finalize the statement just executed. If this fails, save a 3676 ** copy of the error message. Otherwise, set zSql to point to the 3677 ** next statement to execute. */ 3678 rc2 = sqlite3_finalize(pStmt); 3679 if( rc!=SQLITE_NOMEM ) rc = rc2; 3680 if( rc==SQLITE_OK ){ 3681 zSql = zLeftover; 3682 while( IsSpace(zSql[0]) ) zSql++; 3683 }else if( pzErrMsg ){ 3684 *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc, 0); 3685 } 3686 3687 /* clear saved stmt handle */ 3688 if( pArg ){ 3689 pArg->pStmt = NULL; 3690 } 3691 } 3692 } /* end while */ 3693 3694 return rc; 3695} 3696 3697/* 3698** Release memory previously allocated by tableColumnList(). 3699*/ 3700static void freeColumnList(char **azCol){ 3701 int i; 3702 for(i=1; azCol[i]; i++){ 3703 sqlite3_free(azCol[i]); 3704 } 3705 /* azCol[0] is a static string */ 3706 sqlite3_free(azCol); 3707} 3708 3709/* 3710** Return a list of pointers to strings which are the names of all 3711** columns in table zTab. The memory to hold the names is dynamically 3712** allocated and must be released by the caller using a subsequent call 3713** to freeColumnList(). 3714** 3715** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 3716** value that needs to be preserved, then azCol[0] is filled in with the 3717** name of the rowid column. 3718** 3719** The first regular column in the table is azCol[1]. The list is terminated 3720** by an entry with azCol[i]==0. 3721*/ 3722static char **tableColumnList(ShellState *p, const char *zTab){ 3723 char **azCol = 0; 3724 sqlite3_stmt *pStmt; 3725 char *zSql; 3726 int nCol = 0; 3727 int nAlloc = 0; 3728 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 3729 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 3730 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 3731 int rc; 3732 3733 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 3734 shell_check_oom(zSql); 3735 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3736 sqlite3_free(zSql); 3737 if( rc ) return 0; 3738 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 3739 if( nCol>=nAlloc-2 ){ 3740 nAlloc = nAlloc*2 + nCol + 10; 3741 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 3742 shell_check_oom(azCol); 3743 } 3744 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 3745 shell_check_oom(azCol[nCol]); 3746 if( sqlite3_column_int(pStmt, 5) ){ 3747 nPK++; 3748 if( nPK==1 3749 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 3750 "INTEGER")==0 3751 ){ 3752 isIPK = 1; 3753 }else{ 3754 isIPK = 0; 3755 } 3756 } 3757 } 3758 sqlite3_finalize(pStmt); 3759 if( azCol==0 ) return 0; 3760 azCol[0] = 0; 3761 azCol[nCol+1] = 0; 3762 3763 /* The decision of whether or not a rowid really needs to be preserved 3764 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 3765 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 3766 ** rowids on tables where the rowid is inaccessible because there are other 3767 ** columns in the table named "rowid", "_rowid_", and "oid". 3768 */ 3769 if( preserveRowid && isIPK ){ 3770 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 3771 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 3772 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 3773 ** ROWID aliases. To distinguish these cases, check to see if 3774 ** there is a "pk" entry in "PRAGMA index_list". There will be 3775 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 3776 */ 3777 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 3778 " WHERE origin='pk'", zTab); 3779 shell_check_oom(zSql); 3780 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3781 sqlite3_free(zSql); 3782 if( rc ){ 3783 freeColumnList(azCol); 3784 return 0; 3785 } 3786 rc = sqlite3_step(pStmt); 3787 sqlite3_finalize(pStmt); 3788 preserveRowid = rc==SQLITE_ROW; 3789 } 3790 if( preserveRowid ){ 3791 /* Only preserve the rowid if we can find a name to use for the 3792 ** rowid */ 3793 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 3794 int i, j; 3795 for(j=0; j<3; j++){ 3796 for(i=1; i<=nCol; i++){ 3797 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 3798 } 3799 if( i>nCol ){ 3800 /* At this point, we know that azRowid[j] is not the name of any 3801 ** ordinary column in the table. Verify that azRowid[j] is a valid 3802 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 3803 ** tables will fail this last check */ 3804 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 3805 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 3806 break; 3807 } 3808 } 3809 } 3810 return azCol; 3811} 3812 3813/* 3814** Toggle the reverse_unordered_selects setting. 3815*/ 3816static void toggleSelectOrder(sqlite3 *db){ 3817 sqlite3_stmt *pStmt = 0; 3818 int iSetting = 0; 3819 char zStmt[100]; 3820 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 3821 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 3822 iSetting = sqlite3_column_int(pStmt, 0); 3823 } 3824 sqlite3_finalize(pStmt); 3825 sqlite3_snprintf(sizeof(zStmt), zStmt, 3826 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 3827 sqlite3_exec(db, zStmt, 0, 0, 0); 3828} 3829 3830/* 3831** This is a different callback routine used for dumping the database. 3832** Each row received by this callback consists of a table name, 3833** the table type ("index" or "table") and SQL to create the table. 3834** This routine should print text sufficient to recreate the table. 3835*/ 3836static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 3837 int rc; 3838 const char *zTable; 3839 const char *zType; 3840 const char *zSql; 3841 ShellState *p = (ShellState *)pArg; 3842 int dataOnly; 3843 int noSys; 3844 3845 UNUSED_PARAMETER(azNotUsed); 3846 if( nArg!=3 || azArg==0 ) return 0; 3847 zTable = azArg[0]; 3848 zType = azArg[1]; 3849 zSql = azArg[2]; 3850 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 3851 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 3852 3853 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 3854 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 3855 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 3856 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 3857 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 3858 return 0; 3859 }else if( dataOnly ){ 3860 /* no-op */ 3861 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 3862 char *zIns; 3863 if( !p->writableSchema ){ 3864 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 3865 p->writableSchema = 1; 3866 } 3867 zIns = sqlite3_mprintf( 3868 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 3869 "VALUES('table','%q','%q',0,'%q');", 3870 zTable, zTable, zSql); 3871 shell_check_oom(zIns); 3872 utf8_printf(p->out, "%s\n", zIns); 3873 sqlite3_free(zIns); 3874 return 0; 3875 }else{ 3876 printSchemaLine(p->out, zSql, ";\n"); 3877 } 3878 3879 if( strcmp(zType, "table")==0 ){ 3880 ShellText sSelect; 3881 ShellText sTable; 3882 char **azCol; 3883 int i; 3884 char *savedDestTable; 3885 int savedMode; 3886 3887 azCol = tableColumnList(p, zTable); 3888 if( azCol==0 ){ 3889 p->nErr++; 3890 return 0; 3891 } 3892 3893 /* Always quote the table name, even if it appears to be pure ascii, 3894 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 3895 initText(&sTable); 3896 appendText(&sTable, zTable, quoteChar(zTable)); 3897 /* If preserving the rowid, add a column list after the table name. 3898 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 3899 ** instead of the usual "INSERT INTO tab VALUES(...)". 3900 */ 3901 if( azCol[0] ){ 3902 appendText(&sTable, "(", 0); 3903 appendText(&sTable, azCol[0], 0); 3904 for(i=1; azCol[i]; i++){ 3905 appendText(&sTable, ",", 0); 3906 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 3907 } 3908 appendText(&sTable, ")", 0); 3909 } 3910 3911 /* Build an appropriate SELECT statement */ 3912 initText(&sSelect); 3913 appendText(&sSelect, "SELECT ", 0); 3914 if( azCol[0] ){ 3915 appendText(&sSelect, azCol[0], 0); 3916 appendText(&sSelect, ",", 0); 3917 } 3918 for(i=1; azCol[i]; i++){ 3919 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 3920 if( azCol[i+1] ){ 3921 appendText(&sSelect, ",", 0); 3922 } 3923 } 3924 freeColumnList(azCol); 3925 appendText(&sSelect, " FROM ", 0); 3926 appendText(&sSelect, zTable, quoteChar(zTable)); 3927 3928 savedDestTable = p->zDestTable; 3929 savedMode = p->mode; 3930 p->zDestTable = sTable.z; 3931 p->mode = p->cMode = MODE_Insert; 3932 rc = shell_exec(p, sSelect.z, 0); 3933 if( (rc&0xff)==SQLITE_CORRUPT ){ 3934 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3935 toggleSelectOrder(p->db); 3936 shell_exec(p, sSelect.z, 0); 3937 toggleSelectOrder(p->db); 3938 } 3939 p->zDestTable = savedDestTable; 3940 p->mode = savedMode; 3941 freeText(&sTable); 3942 freeText(&sSelect); 3943 if( rc ) p->nErr++; 3944 } 3945 return 0; 3946} 3947 3948/* 3949** Run zQuery. Use dump_callback() as the callback routine so that 3950** the contents of the query are output as SQL statements. 3951** 3952** If we get a SQLITE_CORRUPT error, rerun the query after appending 3953** "ORDER BY rowid DESC" to the end. 3954*/ 3955static int run_schema_dump_query( 3956 ShellState *p, 3957 const char *zQuery 3958){ 3959 int rc; 3960 char *zErr = 0; 3961 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 3962 if( rc==SQLITE_CORRUPT ){ 3963 char *zQ2; 3964 int len = strlen30(zQuery); 3965 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3966 if( zErr ){ 3967 utf8_printf(p->out, "/****** %s ******/\n", zErr); 3968 sqlite3_free(zErr); 3969 zErr = 0; 3970 } 3971 zQ2 = malloc( len+100 ); 3972 if( zQ2==0 ) return rc; 3973 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 3974 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 3975 if( rc ){ 3976 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 3977 }else{ 3978 rc = SQLITE_CORRUPT; 3979 } 3980 sqlite3_free(zErr); 3981 free(zQ2); 3982 } 3983 return rc; 3984} 3985 3986/* 3987** Text of help messages. 3988** 3989** The help text for each individual command begins with a line that starts 3990** with ".". Subsequent lines are supplimental information. 3991** 3992** There must be two or more spaces between the end of the command and the 3993** start of the description of what that command does. 3994*/ 3995static const char *(azHelp[]) = { 3996#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 3997 ".archive ... Manage SQL archives", 3998 " Each command must have exactly one of the following options:", 3999 " -c, --create Create a new archive", 4000 " -u, --update Add or update files with changed mtime", 4001 " -i, --insert Like -u but always add even if unchanged", 4002 " -r, --remove Remove files from archive", 4003 " -t, --list List contents of archive", 4004 " -x, --extract Extract files from archive", 4005 " Optional arguments:", 4006 " -v, --verbose Print each filename as it is processed", 4007 " -f FILE, --file FILE Use archive FILE (default is current db)", 4008 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 4009 " -C DIR, --directory DIR Read/extract files from directory DIR", 4010 " -g, --glob Use glob matching for names in archive", 4011 " -n, --dryrun Show the SQL that would have occurred", 4012 " Examples:", 4013 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 4014 " .ar -tf ARCHIVE # List members of ARCHIVE", 4015 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 4016 " See also:", 4017 " http://sqlite.org/cli.html#sqlite_archive_support", 4018#endif 4019#ifndef SQLITE_OMIT_AUTHORIZATION 4020 ".auth ON|OFF Show authorizer callbacks", 4021#endif 4022 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 4023 " --append Use the appendvfs", 4024 " --async Write to FILE without journal and fsync()", 4025 ".bail on|off Stop after hitting an error. Default OFF", 4026 ".binary on|off Turn binary output on or off. Default OFF", 4027 ".cd DIRECTORY Change the working directory to DIRECTORY", 4028 ".changes on|off Show number of rows changed by SQL", 4029 ".check GLOB Fail if output since .testcase does not match", 4030 ".clone NEWDB Clone data into NEWDB from the existing database", 4031 ".connection [close] [#] Open or close an auxiliary database connection", 4032 ".databases List names and files of attached databases", 4033 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 4034 ".dbinfo ?DB? Show status information about the database", 4035 ".dump ?OBJECTS? Render database content as SQL", 4036 " Options:", 4037 " --data-only Output only INSERT statements", 4038 " --newlines Allow unescaped newline characters in output", 4039 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 4040 " --preserve-rowids Include ROWID values in the output", 4041 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump", 4042 " Additional LIKE patterns can be given in subsequent arguments", 4043 ".echo on|off Turn command echo on or off", 4044 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 4045 " Other Modes:", 4046#ifdef SQLITE_DEBUG 4047 " test Show raw EXPLAIN QUERY PLAN output", 4048 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 4049#endif 4050 " trigger Like \"full\" but also show trigger bytecode", 4051 ".excel Display the output of next command in spreadsheet", 4052 " --bom Put a UTF8 byte-order mark on intermediate file", 4053 ".exit ?CODE? Exit this program with return-code CODE", 4054 ".expert EXPERIMENTAL. Suggest indexes for queries", 4055 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 4056 ".filectrl CMD ... Run various sqlite3_file_control() operations", 4057 " --schema SCHEMA Use SCHEMA instead of \"main\"", 4058 " --help Show CMD details", 4059 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 4060 ".headers on|off Turn display of headers on or off", 4061 ".help ?-all? ?PATTERN? Show help text for PATTERN", 4062 ".import FILE TABLE Import data from FILE into TABLE", 4063 " Options:", 4064 " --ascii Use \\037 and \\036 as column and row separators", 4065 " --csv Use , and \\n as column and row separators", 4066 " --skip N Skip the first N rows of input", 4067 " -v \"Verbose\" - increase auxiliary output", 4068 " Notes:", 4069 " * If TABLE does not exist, it is created. The first row of input", 4070 " determines the column names.", 4071 " * If neither --csv or --ascii are used, the input mode is derived", 4072 " from the \".mode\" output mode", 4073 " * If FILE begins with \"|\" then it is a command that generates the", 4074 " input text.", 4075#ifndef SQLITE_OMIT_TEST_CONTROL 4076 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 4077#endif 4078 ".indexes ?TABLE? Show names of indexes", 4079 " If TABLE is specified, only show indexes for", 4080 " tables matching TABLE using the LIKE operator.", 4081#ifdef SQLITE_ENABLE_IOTRACE 4082 ".iotrace FILE Enable I/O diagnostic logging to FILE", 4083#endif 4084 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 4085 ".lint OPTIONS Report potential schema issues.", 4086 " Options:", 4087 " fkey-indexes Find missing foreign key indexes", 4088#ifndef SQLITE_OMIT_LOAD_EXTENSION 4089 ".load FILE ?ENTRY? Load an extension library", 4090#endif 4091 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 4092 ".mode MODE ?TABLE? Set output mode", 4093 " MODE is one of:", 4094 " ascii Columns/rows delimited by 0x1F and 0x1E", 4095 " box Tables using unicode box-drawing characters", 4096 " csv Comma-separated values", 4097 " column Output in columns. (See .width)", 4098 " html HTML <table> code", 4099 " insert SQL insert statements for TABLE", 4100 " json Results in a JSON array", 4101 " line One value per line", 4102 " list Values delimited by \"|\"", 4103 " markdown Markdown table format", 4104 " quote Escape answers as for SQL", 4105 " table ASCII-art table", 4106 " tabs Tab-separated values", 4107 " tcl TCL list elements", 4108 ".nonce STRING Disable safe mode for one command if the nonce matches", 4109 ".nullvalue STRING Use STRING in place of NULL values", 4110 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 4111 " If FILE begins with '|' then open as a pipe", 4112 " --bom Put a UTF8 byte-order mark at the beginning", 4113 " -e Send output to the system text editor", 4114 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 4115 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 4116 " Options:", 4117 " --append Use appendvfs to append database to the end of FILE", 4118#ifndef SQLITE_OMIT_DESERIALIZE 4119 " --deserialize Load into memory using sqlite3_deserialize()", 4120 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 4121 " --maxsize N Maximum size for --hexdb or --deserialized database", 4122#endif 4123 " --new Initialize FILE to an empty database", 4124 " --nofollow Do not follow symbolic links", 4125 " --readonly Open FILE readonly", 4126 " --zip FILE is a ZIP archive", 4127 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 4128 " If FILE begins with '|' then open it as a pipe.", 4129 " Options:", 4130 " --bom Prefix output with a UTF8 byte-order mark", 4131 " -e Send output to the system text editor", 4132 " -x Send output as CSV to a spreadsheet", 4133 ".parameter CMD ... Manage SQL parameter bindings", 4134 " clear Erase all bindings", 4135 " init Initialize the TEMP table that holds bindings", 4136 " list List the current parameter bindings", 4137 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 4138 " PARAMETER should start with one of: $ : @ ?", 4139 " unset PARAMETER Remove PARAMETER from the binding table", 4140 ".print STRING... Print literal STRING", 4141#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 4142 ".progress N Invoke progress handler after every N opcodes", 4143 " --limit N Interrupt after N progress callbacks", 4144 " --once Do no more than one progress interrupt", 4145 " --quiet|-q No output except at interrupts", 4146 " --reset Reset the count for each input and interrupt", 4147#endif 4148 ".prompt MAIN CONTINUE Replace the standard prompts", 4149 ".quit Exit this program", 4150 ".read FILE Read input from FILE or command output", 4151 " If FILE begins with \"|\", it is a command that generates the input.", 4152#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4153 ".recover Recover as much data as possible from corrupt db.", 4154 " --freelist-corrupt Assume the freelist is corrupt", 4155 " --recovery-db NAME Store recovery metadata in database file NAME", 4156 " --lost-and-found TABLE Alternative name for the lost-and-found table", 4157 " --no-rowids Do not attempt to recover rowid values", 4158 " that are not also INTEGER PRIMARY KEYs", 4159#endif 4160 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 4161 ".save FILE Write in-memory database into FILE", 4162 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 4163 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 4164 " Options:", 4165 " --indent Try to pretty-print the schema", 4166 " --nosys Omit objects whose names start with \"sqlite_\"", 4167 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 4168 " Options:", 4169 " --init Create a new SELFTEST table", 4170 " -v Verbose output", 4171 ".separator COL ?ROW? Change the column and row separators", 4172#if defined(SQLITE_ENABLE_SESSION) 4173 ".session ?NAME? CMD ... Create or control sessions", 4174 " Subcommands:", 4175 " attach TABLE Attach TABLE", 4176 " changeset FILE Write a changeset into FILE", 4177 " close Close one session", 4178 " enable ?BOOLEAN? Set or query the enable bit", 4179 " filter GLOB... Reject tables matching GLOBs", 4180 " indirect ?BOOLEAN? Mark or query the indirect status", 4181 " isempty Query whether the session is empty", 4182 " list List currently open session names", 4183 " open DB NAME Open a new session on DB", 4184 " patchset FILE Write a patchset into FILE", 4185 " If ?NAME? is omitted, the first defined session is used.", 4186#endif 4187 ".sha3sum ... Compute a SHA3 hash of database content", 4188 " Options:", 4189 " --schema Also hash the sqlite_schema table", 4190 " --sha3-224 Use the sha3-224 algorithm", 4191 " --sha3-256 Use the sha3-256 algorithm (default)", 4192 " --sha3-384 Use the sha3-384 algorithm", 4193 " --sha3-512 Use the sha3-512 algorithm", 4194 " Any other argument is a LIKE pattern for tables to hash", 4195#ifndef SQLITE_NOHAVE_SYSTEM 4196 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 4197#endif 4198 ".show Show the current values for various settings", 4199 ".stats ?ARG? Show stats or turn stats on or off", 4200 " off Turn off automatic stat display", 4201 " on Turn on automatic stat display", 4202 " stmt Show statement stats", 4203 " vmstep Show the virtual machine step count only", 4204#ifndef SQLITE_NOHAVE_SYSTEM 4205 ".system CMD ARGS... Run CMD ARGS... in a system shell", 4206#endif 4207 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 4208 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 4209 ".testctrl CMD ... Run various sqlite3_test_control() operations", 4210 " Run \".testctrl\" with no arguments for details", 4211 ".timeout MS Try opening locked tables for MS milliseconds", 4212 ".timer on|off Turn SQL timer on or off", 4213#ifndef SQLITE_OMIT_TRACE 4214 ".trace ?OPTIONS? Output each SQL statement as it is run", 4215 " FILE Send output to FILE", 4216 " stdout Send output to stdout", 4217 " stderr Send output to stderr", 4218 " off Disable tracing", 4219 " --expanded Expand query parameters", 4220#ifdef SQLITE_ENABLE_NORMALIZE 4221 " --normalized Normal the SQL statements", 4222#endif 4223 " --plain Show SQL as it is input", 4224 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 4225 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 4226 " --row Trace each row (SQLITE_TRACE_ROW)", 4227 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 4228#endif /* SQLITE_OMIT_TRACE */ 4229#ifdef SQLITE_DEBUG 4230 ".unmodule NAME ... Unregister virtual table modules", 4231 " --allexcept Unregister everything except those named", 4232#endif 4233 ".vfsinfo ?AUX? Information about the top-level VFS", 4234 ".vfslist List all available VFSes", 4235 ".vfsname ?AUX? Print the name of the VFS stack", 4236 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 4237 " Negative values right-justify", 4238}; 4239 4240/* 4241** Output help text. 4242** 4243** zPattern describes the set of commands for which help text is provided. 4244** If zPattern is NULL, then show all commands, but only give a one-line 4245** description of each. 4246** 4247** Return the number of matches. 4248*/ 4249static int showHelp(FILE *out, const char *zPattern){ 4250 int i = 0; 4251 int j = 0; 4252 int n = 0; 4253 char *zPat; 4254 if( zPattern==0 4255 || zPattern[0]=='0' 4256 || strcmp(zPattern,"-a")==0 4257 || strcmp(zPattern,"-all")==0 4258 || strcmp(zPattern,"--all")==0 4259 ){ 4260 /* Show all commands, but only one line per command */ 4261 if( zPattern==0 ) zPattern = ""; 4262 for(i=0; i<ArraySize(azHelp); i++){ 4263 if( azHelp[i][0]=='.' || zPattern[0] ){ 4264 utf8_printf(out, "%s\n", azHelp[i]); 4265 n++; 4266 } 4267 } 4268 }else{ 4269 /* Look for commands that for which zPattern is an exact prefix */ 4270 zPat = sqlite3_mprintf(".%s*", zPattern); 4271 shell_check_oom(zPat); 4272 for(i=0; i<ArraySize(azHelp); i++){ 4273 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 4274 utf8_printf(out, "%s\n", azHelp[i]); 4275 j = i+1; 4276 n++; 4277 } 4278 } 4279 sqlite3_free(zPat); 4280 if( n ){ 4281 if( n==1 ){ 4282 /* when zPattern is a prefix of exactly one command, then include the 4283 ** details of that command, which should begin at offset j */ 4284 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 4285 utf8_printf(out, "%s\n", azHelp[j]); 4286 j++; 4287 } 4288 } 4289 return n; 4290 } 4291 /* Look for commands that contain zPattern anywhere. Show the complete 4292 ** text of all commands that match. */ 4293 zPat = sqlite3_mprintf("%%%s%%", zPattern); 4294 shell_check_oom(zPat); 4295 for(i=0; i<ArraySize(azHelp); i++){ 4296 if( azHelp[i][0]=='.' ) j = i; 4297 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 4298 utf8_printf(out, "%s\n", azHelp[j]); 4299 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 4300 j++; 4301 utf8_printf(out, "%s\n", azHelp[j]); 4302 } 4303 i = j; 4304 n++; 4305 } 4306 } 4307 sqlite3_free(zPat); 4308 } 4309 return n; 4310} 4311 4312/* Forward reference */ 4313static int process_input(ShellState *p); 4314 4315/* 4316** Read the content of file zName into memory obtained from sqlite3_malloc64() 4317** and return a pointer to the buffer. The caller is responsible for freeing 4318** the memory. 4319** 4320** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 4321** read. 4322** 4323** For convenience, a nul-terminator byte is always appended to the data read 4324** from the file before the buffer is returned. This byte is not included in 4325** the final value of (*pnByte), if applicable. 4326** 4327** NULL is returned if any error is encountered. The final value of *pnByte 4328** is undefined in this case. 4329*/ 4330static char *readFile(const char *zName, int *pnByte){ 4331 FILE *in = fopen(zName, "rb"); 4332 long nIn; 4333 size_t nRead; 4334 char *pBuf; 4335 if( in==0 ) return 0; 4336 fseek(in, 0, SEEK_END); 4337 nIn = ftell(in); 4338 rewind(in); 4339 pBuf = sqlite3_malloc64( nIn+1 ); 4340 if( pBuf==0 ){ fclose(in); return 0; } 4341 nRead = fread(pBuf, nIn, 1, in); 4342 fclose(in); 4343 if( nRead!=1 ){ 4344 sqlite3_free(pBuf); 4345 return 0; 4346 } 4347 pBuf[nIn] = 0; 4348 if( pnByte ) *pnByte = nIn; 4349 return pBuf; 4350} 4351 4352#if defined(SQLITE_ENABLE_SESSION) 4353/* 4354** Close a single OpenSession object and release all of its associated 4355** resources. 4356*/ 4357static void session_close(OpenSession *pSession){ 4358 int i; 4359 sqlite3session_delete(pSession->p); 4360 sqlite3_free(pSession->zName); 4361 for(i=0; i<pSession->nFilter; i++){ 4362 sqlite3_free(pSession->azFilter[i]); 4363 } 4364 sqlite3_free(pSession->azFilter); 4365 memset(pSession, 0, sizeof(OpenSession)); 4366} 4367#endif 4368 4369/* 4370** Close all OpenSession objects and release all associated resources. 4371*/ 4372#if defined(SQLITE_ENABLE_SESSION) 4373static void session_close_all(ShellState *p, int i){ 4374 int j; 4375 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; 4376 for(j=0; j<pAuxDb->nSession; j++){ 4377 session_close(&pAuxDb->aSession[j]); 4378 } 4379 pAuxDb->nSession = 0; 4380} 4381#else 4382# define session_close_all(X,Y) 4383#endif 4384 4385/* 4386** Implementation of the xFilter function for an open session. Omit 4387** any tables named by ".session filter" but let all other table through. 4388*/ 4389#if defined(SQLITE_ENABLE_SESSION) 4390static int session_filter(void *pCtx, const char *zTab){ 4391 OpenSession *pSession = (OpenSession*)pCtx; 4392 int i; 4393 for(i=0; i<pSession->nFilter; i++){ 4394 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 4395 } 4396 return 1; 4397} 4398#endif 4399 4400/* 4401** Try to deduce the type of file for zName based on its content. Return 4402** one of the SHELL_OPEN_* constants. 4403** 4404** If the file does not exist or is empty but its name looks like a ZIP 4405** archive and the dfltZip flag is true, then assume it is a ZIP archive. 4406** Otherwise, assume an ordinary database regardless of the filename if 4407** the type cannot be determined from content. 4408*/ 4409int deduceDatabaseType(const char *zName, int dfltZip){ 4410 FILE *f = fopen(zName, "rb"); 4411 size_t n; 4412 int rc = SHELL_OPEN_UNSPEC; 4413 char zBuf[100]; 4414 if( f==0 ){ 4415 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4416 return SHELL_OPEN_ZIPFILE; 4417 }else{ 4418 return SHELL_OPEN_NORMAL; 4419 } 4420 } 4421 n = fread(zBuf, 16, 1, f); 4422 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 4423 fclose(f); 4424 return SHELL_OPEN_NORMAL; 4425 } 4426 fseek(f, -25, SEEK_END); 4427 n = fread(zBuf, 25, 1, f); 4428 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 4429 rc = SHELL_OPEN_APPENDVFS; 4430 }else{ 4431 fseek(f, -22, SEEK_END); 4432 n = fread(zBuf, 22, 1, f); 4433 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 4434 && zBuf[3]==0x06 ){ 4435 rc = SHELL_OPEN_ZIPFILE; 4436 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4437 rc = SHELL_OPEN_ZIPFILE; 4438 } 4439 } 4440 fclose(f); 4441 return rc; 4442} 4443 4444#ifndef SQLITE_OMIT_DESERIALIZE 4445/* 4446** Reconstruct an in-memory database using the output from the "dbtotxt" 4447** program. Read content from the file in p->aAuxDb[].zDbFilename. 4448** If p->aAuxDb[].zDbFilename is 0, then read from standard input. 4449*/ 4450static unsigned char *readHexDb(ShellState *p, int *pnData){ 4451 unsigned char *a = 0; 4452 int nLine; 4453 int n = 0; 4454 int pgsz = 0; 4455 int iOffset = 0; 4456 int j, k; 4457 int rc; 4458 FILE *in; 4459 const char *zDbFilename = p->pAuxDb->zDbFilename; 4460 unsigned int x[16]; 4461 char zLine[1000]; 4462 if( zDbFilename ){ 4463 in = fopen(zDbFilename, "r"); 4464 if( in==0 ){ 4465 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename); 4466 return 0; 4467 } 4468 nLine = 0; 4469 }else{ 4470 in = p->in; 4471 nLine = p->lineno; 4472 if( in==0 ) in = stdin; 4473 } 4474 *pnData = 0; 4475 nLine++; 4476 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 4477 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 4478 if( rc!=2 ) goto readHexDb_error; 4479 if( n<0 ) goto readHexDb_error; 4480 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 4481 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 4482 a = sqlite3_malloc( n ? n : 1 ); 4483 shell_check_oom(a); 4484 memset(a, 0, n); 4485 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 4486 utf8_printf(stderr, "invalid pagesize\n"); 4487 goto readHexDb_error; 4488 } 4489 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 4490 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 4491 if( rc==2 ){ 4492 iOffset = k; 4493 continue; 4494 } 4495 if( strncmp(zLine, "| end ", 6)==0 ){ 4496 break; 4497 } 4498 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 4499 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 4500 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 4501 if( rc==17 ){ 4502 k = iOffset+j; 4503 if( k+16<=n && k>=0 ){ 4504 int ii; 4505 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 4506 } 4507 } 4508 } 4509 *pnData = n; 4510 if( in!=p->in ){ 4511 fclose(in); 4512 }else{ 4513 p->lineno = nLine; 4514 } 4515 return a; 4516 4517readHexDb_error: 4518 if( in!=p->in ){ 4519 fclose(in); 4520 }else{ 4521 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 4522 nLine++; 4523 if(strncmp(zLine, "| end ", 6)==0 ) break; 4524 } 4525 p->lineno = nLine; 4526 } 4527 sqlite3_free(a); 4528 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 4529 return 0; 4530} 4531#endif /* SQLITE_OMIT_DESERIALIZE */ 4532 4533/* 4534** Scalar function "shell_int32". The first argument to this function 4535** must be a blob. The second a non-negative integer. This function 4536** reads and returns a 32-bit big-endian integer from byte 4537** offset (4*<arg2>) of the blob. 4538*/ 4539static void shellInt32( 4540 sqlite3_context *context, 4541 int argc, 4542 sqlite3_value **argv 4543){ 4544 const unsigned char *pBlob; 4545 int nBlob; 4546 int iInt; 4547 4548 UNUSED_PARAMETER(argc); 4549 nBlob = sqlite3_value_bytes(argv[0]); 4550 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 4551 iInt = sqlite3_value_int(argv[1]); 4552 4553 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 4554 const unsigned char *a = &pBlob[iInt*4]; 4555 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 4556 + ((sqlite3_int64)a[1]<<16) 4557 + ((sqlite3_int64)a[2]<< 8) 4558 + ((sqlite3_int64)a[3]<< 0); 4559 sqlite3_result_int64(context, iVal); 4560 } 4561} 4562 4563/* 4564** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 4565** using "..." with internal double-quote characters doubled. 4566*/ 4567static void shellIdQuote( 4568 sqlite3_context *context, 4569 int argc, 4570 sqlite3_value **argv 4571){ 4572 const char *zName = (const char*)sqlite3_value_text(argv[0]); 4573 UNUSED_PARAMETER(argc); 4574 if( zName ){ 4575 char *z = sqlite3_mprintf("\"%w\"", zName); 4576 sqlite3_result_text(context, z, -1, sqlite3_free); 4577 } 4578} 4579 4580/* 4581** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 4582*/ 4583static void shellUSleepFunc( 4584 sqlite3_context *context, 4585 int argcUnused, 4586 sqlite3_value **argv 4587){ 4588 int sleep = sqlite3_value_int(argv[0]); 4589 (void)argcUnused; 4590 sqlite3_sleep(sleep/1000); 4591 sqlite3_result_int(context, sleep); 4592} 4593 4594/* 4595** Scalar function "shell_escape_crnl" used by the .recover command. 4596** The argument passed to this function is the output of built-in 4597** function quote(). If the first character of the input is "'", 4598** indicating that the value passed to quote() was a text value, 4599** then this function searches the input for "\n" and "\r" characters 4600** and adds a wrapper similar to the following: 4601** 4602** replace(replace(<input>, '\n', char(10), '\r', char(13)); 4603** 4604** Or, if the first character of the input is not "'", then a copy 4605** of the input is returned. 4606*/ 4607static void shellEscapeCrnl( 4608 sqlite3_context *context, 4609 int argc, 4610 sqlite3_value **argv 4611){ 4612 const char *zText = (const char*)sqlite3_value_text(argv[0]); 4613 UNUSED_PARAMETER(argc); 4614 if( zText && zText[0]=='\'' ){ 4615 int nText = sqlite3_value_bytes(argv[0]); 4616 int i; 4617 char zBuf1[20]; 4618 char zBuf2[20]; 4619 const char *zNL = 0; 4620 const char *zCR = 0; 4621 int nCR = 0; 4622 int nNL = 0; 4623 4624 for(i=0; zText[i]; i++){ 4625 if( zNL==0 && zText[i]=='\n' ){ 4626 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 4627 nNL = (int)strlen(zNL); 4628 } 4629 if( zCR==0 && zText[i]=='\r' ){ 4630 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 4631 nCR = (int)strlen(zCR); 4632 } 4633 } 4634 4635 if( zNL || zCR ){ 4636 int iOut = 0; 4637 i64 nMax = (nNL > nCR) ? nNL : nCR; 4638 i64 nAlloc = nMax * nText + (nMax+64)*2; 4639 char *zOut = (char*)sqlite3_malloc64(nAlloc); 4640 if( zOut==0 ){ 4641 sqlite3_result_error_nomem(context); 4642 return; 4643 } 4644 4645 if( zNL && zCR ){ 4646 memcpy(&zOut[iOut], "replace(replace(", 16); 4647 iOut += 16; 4648 }else{ 4649 memcpy(&zOut[iOut], "replace(", 8); 4650 iOut += 8; 4651 } 4652 for(i=0; zText[i]; i++){ 4653 if( zText[i]=='\n' ){ 4654 memcpy(&zOut[iOut], zNL, nNL); 4655 iOut += nNL; 4656 }else if( zText[i]=='\r' ){ 4657 memcpy(&zOut[iOut], zCR, nCR); 4658 iOut += nCR; 4659 }else{ 4660 zOut[iOut] = zText[i]; 4661 iOut++; 4662 } 4663 } 4664 4665 if( zNL ){ 4666 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4667 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 4668 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 4669 } 4670 if( zCR ){ 4671 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4672 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 4673 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 4674 } 4675 4676 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 4677 sqlite3_free(zOut); 4678 return; 4679 } 4680 } 4681 4682 sqlite3_result_value(context, argv[0]); 4683} 4684 4685/* Flags for open_db(). 4686** 4687** The default behavior of open_db() is to exit(1) if the database fails to 4688** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 4689** but still returns without calling exit. 4690** 4691** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 4692** ZIP archive if the file does not exist or is empty and its name matches 4693** the *.zip pattern. 4694*/ 4695#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 4696#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 4697 4698/* 4699** Make sure the database is open. If it is not, then open it. If 4700** the database fails to open, print an error message and exit. 4701*/ 4702static void open_db(ShellState *p, int openFlags){ 4703 if( p->db==0 ){ 4704 const char *zDbFilename = p->pAuxDb->zDbFilename; 4705 if( p->openMode==SHELL_OPEN_UNSPEC ){ 4706 if( zDbFilename==0 || zDbFilename[0]==0 ){ 4707 p->openMode = SHELL_OPEN_NORMAL; 4708 }else{ 4709 p->openMode = (u8)deduceDatabaseType(zDbFilename, 4710 (openFlags & OPEN_DB_ZIPFILE)!=0); 4711 } 4712 } 4713 switch( p->openMode ){ 4714 case SHELL_OPEN_APPENDVFS: { 4715 sqlite3_open_v2(zDbFilename, &p->db, 4716 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 4717 break; 4718 } 4719 case SHELL_OPEN_HEXDB: 4720 case SHELL_OPEN_DESERIALIZE: { 4721 sqlite3_open(0, &p->db); 4722 break; 4723 } 4724 case SHELL_OPEN_ZIPFILE: { 4725 sqlite3_open(":memory:", &p->db); 4726 break; 4727 } 4728 case SHELL_OPEN_READONLY: { 4729 sqlite3_open_v2(zDbFilename, &p->db, 4730 SQLITE_OPEN_READONLY|p->openFlags, 0); 4731 break; 4732 } 4733 case SHELL_OPEN_UNSPEC: 4734 case SHELL_OPEN_NORMAL: { 4735 sqlite3_open_v2(zDbFilename, &p->db, 4736 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 4737 break; 4738 } 4739 } 4740 globalDb = p->db; 4741 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 4742 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 4743 zDbFilename, sqlite3_errmsg(p->db)); 4744 if( openFlags & OPEN_DB_KEEPALIVE ){ 4745 sqlite3_open(":memory:", &p->db); 4746 return; 4747 } 4748 exit(1); 4749 } 4750#ifndef SQLITE_OMIT_LOAD_EXTENSION 4751 sqlite3_enable_load_extension(p->db, 1); 4752#endif 4753 sqlite3_fileio_init(p->db, 0, 0); 4754 sqlite3_shathree_init(p->db, 0, 0); 4755 sqlite3_completion_init(p->db, 0, 0); 4756 sqlite3_uint_init(p->db, 0, 0); 4757 sqlite3_decimal_init(p->db, 0, 0); 4758 sqlite3_regexp_init(p->db, 0, 0); 4759 sqlite3_ieee_init(p->db, 0, 0); 4760 sqlite3_series_init(p->db, 0, 0); 4761#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4762 sqlite3_dbdata_init(p->db, 0, 0); 4763#endif 4764#ifdef SQLITE_HAVE_ZLIB 4765 sqlite3_zipfile_init(p->db, 0, 0); 4766 sqlite3_sqlar_init(p->db, 0, 0); 4767#endif 4768 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 4769 shellAddSchemaName, 0, 0); 4770 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 4771 shellModuleSchema, 0, 0); 4772 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 4773 shellPutsFunc, 0, 0); 4774 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 4775 shellEscapeCrnl, 0, 0); 4776 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 4777 shellInt32, 0, 0); 4778 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 4779 shellIdQuote, 0, 0); 4780 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 4781 shellUSleepFunc, 0, 0); 4782#ifndef SQLITE_NOHAVE_SYSTEM 4783 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 4784 editFunc, 0, 0); 4785 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 4786 editFunc, 0, 0); 4787#endif 4788 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 4789 char *zSql = sqlite3_mprintf( 4790 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); 4791 shell_check_oom(zSql); 4792 sqlite3_exec(p->db, zSql, 0, 0, 0); 4793 sqlite3_free(zSql); 4794 } 4795#ifndef SQLITE_OMIT_DESERIALIZE 4796 else 4797 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 4798 int rc; 4799 int nData = 0; 4800 unsigned char *aData; 4801 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 4802 aData = (unsigned char*)readFile(zDbFilename, &nData); 4803 }else{ 4804 aData = readHexDb(p, &nData); 4805 if( aData==0 ){ 4806 return; 4807 } 4808 } 4809 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 4810 SQLITE_DESERIALIZE_RESIZEABLE | 4811 SQLITE_DESERIALIZE_FREEONCLOSE); 4812 if( rc ){ 4813 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 4814 } 4815 if( p->szMax>0 ){ 4816 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 4817 } 4818 } 4819#endif 4820 } 4821 if( p->bSafeModePersist && p->db!=0 ){ 4822 sqlite3_set_authorizer(p->db, safeModeAuth, p); 4823 } 4824} 4825 4826/* 4827** Attempt to close the databaes connection. Report errors. 4828*/ 4829void close_db(sqlite3 *db){ 4830 int rc = sqlite3_close(db); 4831 if( rc ){ 4832 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 4833 rc, sqlite3_errmsg(db)); 4834 } 4835} 4836 4837#if HAVE_READLINE || HAVE_EDITLINE 4838/* 4839** Readline completion callbacks 4840*/ 4841static char *readline_completion_generator(const char *text, int state){ 4842 static sqlite3_stmt *pStmt = 0; 4843 char *zRet; 4844 if( state==0 ){ 4845 char *zSql; 4846 sqlite3_finalize(pStmt); 4847 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 4848 " FROM completion(%Q) ORDER BY 1", text); 4849 shell_check_oom(zSql); 4850 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 4851 sqlite3_free(zSql); 4852 } 4853 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 4854 const char *z = (const char*)sqlite3_column_text(pStmt,0); 4855 zRet = z ? strdup(z) : 0; 4856 }else{ 4857 sqlite3_finalize(pStmt); 4858 pStmt = 0; 4859 zRet = 0; 4860 } 4861 return zRet; 4862} 4863static char **readline_completion(const char *zText, int iStart, int iEnd){ 4864 rl_attempted_completion_over = 1; 4865 return rl_completion_matches(zText, readline_completion_generator); 4866} 4867 4868#elif HAVE_LINENOISE 4869/* 4870** Linenoise completion callback 4871*/ 4872static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 4873 int nLine = strlen30(zLine); 4874 int i, iStart; 4875 sqlite3_stmt *pStmt = 0; 4876 char *zSql; 4877 char zBuf[1000]; 4878 4879 if( nLine>sizeof(zBuf)-30 ) return; 4880 if( zLine[0]=='.' || zLine[0]=='#') return; 4881 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 4882 if( i==nLine-1 ) return; 4883 iStart = i+1; 4884 memcpy(zBuf, zLine, iStart); 4885 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 4886 " FROM completion(%Q,%Q) ORDER BY 1", 4887 &zLine[iStart], zLine); 4888 shell_check_oom(zSql); 4889 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 4890 sqlite3_free(zSql); 4891 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 4892 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 4893 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 4894 int nCompletion = sqlite3_column_bytes(pStmt, 0); 4895 if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){ 4896 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 4897 linenoiseAddCompletion(lc, zBuf); 4898 } 4899 } 4900 sqlite3_finalize(pStmt); 4901} 4902#endif 4903 4904/* 4905** Do C-language style dequoting. 4906** 4907** \a -> alarm 4908** \b -> backspace 4909** \t -> tab 4910** \n -> newline 4911** \v -> vertical tab 4912** \f -> form feed 4913** \r -> carriage return 4914** \s -> space 4915** \" -> " 4916** \' -> ' 4917** \\ -> backslash 4918** \NNN -> ascii character NNN in octal 4919*/ 4920static void resolve_backslashes(char *z){ 4921 int i, j; 4922 char c; 4923 while( *z && *z!='\\' ) z++; 4924 for(i=j=0; (c = z[i])!=0; i++, j++){ 4925 if( c=='\\' && z[i+1]!=0 ){ 4926 c = z[++i]; 4927 if( c=='a' ){ 4928 c = '\a'; 4929 }else if( c=='b' ){ 4930 c = '\b'; 4931 }else if( c=='t' ){ 4932 c = '\t'; 4933 }else if( c=='n' ){ 4934 c = '\n'; 4935 }else if( c=='v' ){ 4936 c = '\v'; 4937 }else if( c=='f' ){ 4938 c = '\f'; 4939 }else if( c=='r' ){ 4940 c = '\r'; 4941 }else if( c=='"' ){ 4942 c = '"'; 4943 }else if( c=='\'' ){ 4944 c = '\''; 4945 }else if( c=='\\' ){ 4946 c = '\\'; 4947 }else if( c>='0' && c<='7' ){ 4948 c -= '0'; 4949 if( z[i+1]>='0' && z[i+1]<='7' ){ 4950 i++; 4951 c = (c<<3) + z[i] - '0'; 4952 if( z[i+1]>='0' && z[i+1]<='7' ){ 4953 i++; 4954 c = (c<<3) + z[i] - '0'; 4955 } 4956 } 4957 } 4958 } 4959 z[j] = c; 4960 } 4961 if( j<i ) z[j] = 0; 4962} 4963 4964/* 4965** Interpret zArg as either an integer or a boolean value. Return 1 or 0 4966** for TRUE and FALSE. Return the integer value if appropriate. 4967*/ 4968static int booleanValue(const char *zArg){ 4969 int i; 4970 if( zArg[0]=='0' && zArg[1]=='x' ){ 4971 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 4972 }else{ 4973 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 4974 } 4975 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 4976 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 4977 return 1; 4978 } 4979 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 4980 return 0; 4981 } 4982 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 4983 zArg); 4984 return 0; 4985} 4986 4987/* 4988** Set or clear a shell flag according to a boolean value. 4989*/ 4990static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 4991 if( booleanValue(zArg) ){ 4992 ShellSetFlag(p, mFlag); 4993 }else{ 4994 ShellClearFlag(p, mFlag); 4995 } 4996} 4997 4998/* 4999** Close an output file, assuming it is not stderr or stdout 5000*/ 5001static void output_file_close(FILE *f){ 5002 if( f && f!=stdout && f!=stderr ) fclose(f); 5003} 5004 5005/* 5006** Try to open an output file. The names "stdout" and "stderr" are 5007** recognized and do the right thing. NULL is returned if the output 5008** filename is "off". 5009*/ 5010static FILE *output_file_open(const char *zFile, int bTextMode){ 5011 FILE *f; 5012 if( strcmp(zFile,"stdout")==0 ){ 5013 f = stdout; 5014 }else if( strcmp(zFile, "stderr")==0 ){ 5015 f = stderr; 5016 }else if( strcmp(zFile, "off")==0 ){ 5017 f = 0; 5018 }else{ 5019 f = fopen(zFile, bTextMode ? "w" : "wb"); 5020 if( f==0 ){ 5021 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 5022 } 5023 } 5024 return f; 5025} 5026 5027#ifndef SQLITE_OMIT_TRACE 5028/* 5029** A routine for handling output from sqlite3_trace(). 5030*/ 5031static int sql_trace_callback( 5032 unsigned mType, /* The trace type */ 5033 void *pArg, /* The ShellState pointer */ 5034 void *pP, /* Usually a pointer to sqlite_stmt */ 5035 void *pX /* Auxiliary output */ 5036){ 5037 ShellState *p = (ShellState*)pArg; 5038 sqlite3_stmt *pStmt; 5039 const char *zSql; 5040 int nSql; 5041 if( p->traceOut==0 ) return 0; 5042 if( mType==SQLITE_TRACE_CLOSE ){ 5043 utf8_printf(p->traceOut, "-- closing database connection\n"); 5044 return 0; 5045 } 5046 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 5047 zSql = (const char*)pX; 5048 }else{ 5049 pStmt = (sqlite3_stmt*)pP; 5050 switch( p->eTraceType ){ 5051 case SHELL_TRACE_EXPANDED: { 5052 zSql = sqlite3_expanded_sql(pStmt); 5053 break; 5054 } 5055#ifdef SQLITE_ENABLE_NORMALIZE 5056 case SHELL_TRACE_NORMALIZED: { 5057 zSql = sqlite3_normalized_sql(pStmt); 5058 break; 5059 } 5060#endif 5061 default: { 5062 zSql = sqlite3_sql(pStmt); 5063 break; 5064 } 5065 } 5066 } 5067 if( zSql==0 ) return 0; 5068 nSql = strlen30(zSql); 5069 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 5070 switch( mType ){ 5071 case SQLITE_TRACE_ROW: 5072 case SQLITE_TRACE_STMT: { 5073 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 5074 break; 5075 } 5076 case SQLITE_TRACE_PROFILE: { 5077 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 5078 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 5079 break; 5080 } 5081 } 5082 return 0; 5083} 5084#endif 5085 5086/* 5087** A no-op routine that runs with the ".breakpoint" doc-command. This is 5088** a useful spot to set a debugger breakpoint. 5089*/ 5090static void test_breakpoint(void){ 5091 static int nCall = 0; 5092 nCall++; 5093} 5094 5095/* 5096** An object used to read a CSV and other files for import. 5097*/ 5098typedef struct ImportCtx ImportCtx; 5099struct ImportCtx { 5100 const char *zFile; /* Name of the input file */ 5101 FILE *in; /* Read the CSV text from this input stream */ 5102 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 5103 char *z; /* Accumulated text for a field */ 5104 int n; /* Number of bytes in z */ 5105 int nAlloc; /* Space allocated for z[] */ 5106 int nLine; /* Current line number */ 5107 int nRow; /* Number of rows imported */ 5108 int nErr; /* Number of errors encountered */ 5109 int bNotFirst; /* True if one or more bytes already read */ 5110 int cTerm; /* Character that terminated the most recent field */ 5111 int cColSep; /* The column separator character. (Usually ",") */ 5112 int cRowSep; /* The row separator character. (Usually "\n") */ 5113}; 5114 5115/* Clean up resourced used by an ImportCtx */ 5116static void import_cleanup(ImportCtx *p){ 5117 if( p->in!=0 && p->xCloser!=0 ){ 5118 p->xCloser(p->in); 5119 p->in = 0; 5120 } 5121 sqlite3_free(p->z); 5122 p->z = 0; 5123} 5124 5125/* Append a single byte to z[] */ 5126static void import_append_char(ImportCtx *p, int c){ 5127 if( p->n+1>=p->nAlloc ){ 5128 p->nAlloc += p->nAlloc + 100; 5129 p->z = sqlite3_realloc64(p->z, p->nAlloc); 5130 shell_check_oom(p->z); 5131 } 5132 p->z[p->n++] = (char)c; 5133} 5134 5135/* Read a single field of CSV text. Compatible with rfc4180 and extended 5136** with the option of having a separator other than ",". 5137** 5138** + Input comes from p->in. 5139** + Store results in p->z of length p->n. Space to hold p->z comes 5140** from sqlite3_malloc64(). 5141** + Use p->cSep as the column separator. The default is ",". 5142** + Use p->rSep as the row separator. The default is "\n". 5143** + Keep track of the line number in p->nLine. 5144** + Store the character that terminates the field in p->cTerm. Store 5145** EOF on end-of-file. 5146** + Report syntax errors on stderr 5147*/ 5148static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 5149 int c; 5150 int cSep = p->cColSep; 5151 int rSep = p->cRowSep; 5152 p->n = 0; 5153 c = fgetc(p->in); 5154 if( c==EOF || seenInterrupt ){ 5155 p->cTerm = EOF; 5156 return 0; 5157 } 5158 if( c=='"' ){ 5159 int pc, ppc; 5160 int startLine = p->nLine; 5161 int cQuote = c; 5162 pc = ppc = 0; 5163 while( 1 ){ 5164 c = fgetc(p->in); 5165 if( c==rSep ) p->nLine++; 5166 if( c==cQuote ){ 5167 if( pc==cQuote ){ 5168 pc = 0; 5169 continue; 5170 } 5171 } 5172 if( (c==cSep && pc==cQuote) 5173 || (c==rSep && pc==cQuote) 5174 || (c==rSep && pc=='\r' && ppc==cQuote) 5175 || (c==EOF && pc==cQuote) 5176 ){ 5177 do{ p->n--; }while( p->z[p->n]!=cQuote ); 5178 p->cTerm = c; 5179 break; 5180 } 5181 if( pc==cQuote && c!='\r' ){ 5182 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 5183 p->zFile, p->nLine, cQuote); 5184 } 5185 if( c==EOF ){ 5186 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 5187 p->zFile, startLine, cQuote); 5188 p->cTerm = c; 5189 break; 5190 } 5191 import_append_char(p, c); 5192 ppc = pc; 5193 pc = c; 5194 } 5195 }else{ 5196 /* If this is the first field being parsed and it begins with the 5197 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 5198 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 5199 import_append_char(p, c); 5200 c = fgetc(p->in); 5201 if( (c&0xff)==0xbb ){ 5202 import_append_char(p, c); 5203 c = fgetc(p->in); 5204 if( (c&0xff)==0xbf ){ 5205 p->bNotFirst = 1; 5206 p->n = 0; 5207 return csv_read_one_field(p); 5208 } 5209 } 5210 } 5211 while( c!=EOF && c!=cSep && c!=rSep ){ 5212 import_append_char(p, c); 5213 c = fgetc(p->in); 5214 } 5215 if( c==rSep ){ 5216 p->nLine++; 5217 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 5218 } 5219 p->cTerm = c; 5220 } 5221 if( p->z ) p->z[p->n] = 0; 5222 p->bNotFirst = 1; 5223 return p->z; 5224} 5225 5226/* Read a single field of ASCII delimited text. 5227** 5228** + Input comes from p->in. 5229** + Store results in p->z of length p->n. Space to hold p->z comes 5230** from sqlite3_malloc64(). 5231** + Use p->cSep as the column separator. The default is "\x1F". 5232** + Use p->rSep as the row separator. The default is "\x1E". 5233** + Keep track of the row number in p->nLine. 5234** + Store the character that terminates the field in p->cTerm. Store 5235** EOF on end-of-file. 5236** + Report syntax errors on stderr 5237*/ 5238static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 5239 int c; 5240 int cSep = p->cColSep; 5241 int rSep = p->cRowSep; 5242 p->n = 0; 5243 c = fgetc(p->in); 5244 if( c==EOF || seenInterrupt ){ 5245 p->cTerm = EOF; 5246 return 0; 5247 } 5248 while( c!=EOF && c!=cSep && c!=rSep ){ 5249 import_append_char(p, c); 5250 c = fgetc(p->in); 5251 } 5252 if( c==rSep ){ 5253 p->nLine++; 5254 } 5255 p->cTerm = c; 5256 if( p->z ) p->z[p->n] = 0; 5257 return p->z; 5258} 5259 5260/* 5261** Try to transfer data for table zTable. If an error is seen while 5262** moving forward, try to go backwards. The backwards movement won't 5263** work for WITHOUT ROWID tables. 5264*/ 5265static void tryToCloneData( 5266 ShellState *p, 5267 sqlite3 *newDb, 5268 const char *zTable 5269){ 5270 sqlite3_stmt *pQuery = 0; 5271 sqlite3_stmt *pInsert = 0; 5272 char *zQuery = 0; 5273 char *zInsert = 0; 5274 int rc; 5275 int i, j, n; 5276 int nTable = strlen30(zTable); 5277 int k = 0; 5278 int cnt = 0; 5279 const int spinRate = 10000; 5280 5281 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 5282 shell_check_oom(zQuery); 5283 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5284 if( rc ){ 5285 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5286 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5287 zQuery); 5288 goto end_data_xfer; 5289 } 5290 n = sqlite3_column_count(pQuery); 5291 zInsert = sqlite3_malloc64(200 + nTable + n*3); 5292 shell_check_oom(zInsert); 5293 sqlite3_snprintf(200+nTable,zInsert, 5294 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 5295 i = strlen30(zInsert); 5296 for(j=1; j<n; j++){ 5297 memcpy(zInsert+i, ",?", 2); 5298 i += 2; 5299 } 5300 memcpy(zInsert+i, ");", 3); 5301 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 5302 if( rc ){ 5303 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5304 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 5305 zQuery); 5306 goto end_data_xfer; 5307 } 5308 for(k=0; k<2; k++){ 5309 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5310 for(i=0; i<n; i++){ 5311 switch( sqlite3_column_type(pQuery, i) ){ 5312 case SQLITE_NULL: { 5313 sqlite3_bind_null(pInsert, i+1); 5314 break; 5315 } 5316 case SQLITE_INTEGER: { 5317 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 5318 break; 5319 } 5320 case SQLITE_FLOAT: { 5321 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 5322 break; 5323 } 5324 case SQLITE_TEXT: { 5325 sqlite3_bind_text(pInsert, i+1, 5326 (const char*)sqlite3_column_text(pQuery,i), 5327 -1, SQLITE_STATIC); 5328 break; 5329 } 5330 case SQLITE_BLOB: { 5331 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 5332 sqlite3_column_bytes(pQuery,i), 5333 SQLITE_STATIC); 5334 break; 5335 } 5336 } 5337 } /* End for */ 5338 rc = sqlite3_step(pInsert); 5339 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 5340 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 5341 sqlite3_errmsg(newDb)); 5342 } 5343 sqlite3_reset(pInsert); 5344 cnt++; 5345 if( (cnt%spinRate)==0 ){ 5346 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 5347 fflush(stdout); 5348 } 5349 } /* End while */ 5350 if( rc==SQLITE_DONE ) break; 5351 sqlite3_finalize(pQuery); 5352 sqlite3_free(zQuery); 5353 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 5354 zTable); 5355 shell_check_oom(zQuery); 5356 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5357 if( rc ){ 5358 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 5359 break; 5360 } 5361 } /* End for(k=0...) */ 5362 5363end_data_xfer: 5364 sqlite3_finalize(pQuery); 5365 sqlite3_finalize(pInsert); 5366 sqlite3_free(zQuery); 5367 sqlite3_free(zInsert); 5368} 5369 5370 5371/* 5372** Try to transfer all rows of the schema that match zWhere. For 5373** each row, invoke xForEach() on the object defined by that row. 5374** If an error is encountered while moving forward through the 5375** sqlite_schema table, try again moving backwards. 5376*/ 5377static void tryToCloneSchema( 5378 ShellState *p, 5379 sqlite3 *newDb, 5380 const char *zWhere, 5381 void (*xForEach)(ShellState*,sqlite3*,const char*) 5382){ 5383 sqlite3_stmt *pQuery = 0; 5384 char *zQuery = 0; 5385 int rc; 5386 const unsigned char *zName; 5387 const unsigned char *zSql; 5388 char *zErrMsg = 0; 5389 5390 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5391 " WHERE %s", zWhere); 5392 shell_check_oom(zQuery); 5393 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5394 if( rc ){ 5395 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5396 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5397 zQuery); 5398 goto end_schema_xfer; 5399 } 5400 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5401 zName = sqlite3_column_text(pQuery, 0); 5402 zSql = sqlite3_column_text(pQuery, 1); 5403 if( zName==0 || zSql==0 ) continue; 5404 printf("%s... ", zName); fflush(stdout); 5405 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5406 if( zErrMsg ){ 5407 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5408 sqlite3_free(zErrMsg); 5409 zErrMsg = 0; 5410 } 5411 if( xForEach ){ 5412 xForEach(p, newDb, (const char*)zName); 5413 } 5414 printf("done\n"); 5415 } 5416 if( rc!=SQLITE_DONE ){ 5417 sqlite3_finalize(pQuery); 5418 sqlite3_free(zQuery); 5419 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5420 " WHERE %s ORDER BY rowid DESC", zWhere); 5421 shell_check_oom(zQuery); 5422 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5423 if( rc ){ 5424 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5425 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5426 zQuery); 5427 goto end_schema_xfer; 5428 } 5429 while( sqlite3_step(pQuery)==SQLITE_ROW ){ 5430 zName = sqlite3_column_text(pQuery, 0); 5431 zSql = sqlite3_column_text(pQuery, 1); 5432 if( zName==0 || zSql==0 ) continue; 5433 printf("%s... ", zName); fflush(stdout); 5434 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5435 if( zErrMsg ){ 5436 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5437 sqlite3_free(zErrMsg); 5438 zErrMsg = 0; 5439 } 5440 if( xForEach ){ 5441 xForEach(p, newDb, (const char*)zName); 5442 } 5443 printf("done\n"); 5444 } 5445 } 5446end_schema_xfer: 5447 sqlite3_finalize(pQuery); 5448 sqlite3_free(zQuery); 5449} 5450 5451/* 5452** Open a new database file named "zNewDb". Try to recover as much information 5453** as possible out of the main database (which might be corrupt) and write it 5454** into zNewDb. 5455*/ 5456static void tryToClone(ShellState *p, const char *zNewDb){ 5457 int rc; 5458 sqlite3 *newDb = 0; 5459 if( access(zNewDb,0)==0 ){ 5460 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 5461 return; 5462 } 5463 rc = sqlite3_open(zNewDb, &newDb); 5464 if( rc ){ 5465 utf8_printf(stderr, "Cannot create output database: %s\n", 5466 sqlite3_errmsg(newDb)); 5467 }else{ 5468 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 5469 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 5470 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 5471 tryToCloneSchema(p, newDb, "type!='table'", 0); 5472 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 5473 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 5474 } 5475 close_db(newDb); 5476} 5477 5478/* 5479** Change the output file back to stdout. 5480** 5481** If the p->doXdgOpen flag is set, that means the output was being 5482** redirected to a temporary file named by p->zTempFile. In that case, 5483** launch start/open/xdg-open on that temporary file. 5484*/ 5485static void output_reset(ShellState *p){ 5486 if( p->outfile[0]=='|' ){ 5487#ifndef SQLITE_OMIT_POPEN 5488 pclose(p->out); 5489#endif 5490 }else{ 5491 output_file_close(p->out); 5492#ifndef SQLITE_NOHAVE_SYSTEM 5493 if( p->doXdgOpen ){ 5494 const char *zXdgOpenCmd = 5495#if defined(_WIN32) 5496 "start"; 5497#elif defined(__APPLE__) 5498 "open"; 5499#else 5500 "xdg-open"; 5501#endif 5502 char *zCmd; 5503 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 5504 if( system(zCmd) ){ 5505 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 5506 }else{ 5507 /* Give the start/open/xdg-open command some time to get 5508 ** going before we continue, and potential delete the 5509 ** p->zTempFile data file out from under it */ 5510 sqlite3_sleep(2000); 5511 } 5512 sqlite3_free(zCmd); 5513 outputModePop(p); 5514 p->doXdgOpen = 0; 5515 } 5516#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 5517 } 5518 p->outfile[0] = 0; 5519 p->out = stdout; 5520} 5521 5522/* 5523** Run an SQL command and return the single integer result. 5524*/ 5525static int db_int(ShellState *p, const char *zSql){ 5526 sqlite3_stmt *pStmt; 5527 int res = 0; 5528 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5529 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 5530 res = sqlite3_column_int(pStmt,0); 5531 } 5532 sqlite3_finalize(pStmt); 5533 return res; 5534} 5535 5536/* 5537** Convert a 2-byte or 4-byte big-endian integer into a native integer 5538*/ 5539static unsigned int get2byteInt(unsigned char *a){ 5540 return (a[0]<<8) + a[1]; 5541} 5542static unsigned int get4byteInt(unsigned char *a){ 5543 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 5544} 5545 5546/* 5547** Implementation of the ".dbinfo" command. 5548** 5549** Return 1 on error, 2 to exit, and 0 otherwise. 5550*/ 5551static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 5552 static const struct { const char *zName; int ofst; } aField[] = { 5553 { "file change counter:", 24 }, 5554 { "database page count:", 28 }, 5555 { "freelist page count:", 36 }, 5556 { "schema cookie:", 40 }, 5557 { "schema format:", 44 }, 5558 { "default cache size:", 48 }, 5559 { "autovacuum top root:", 52 }, 5560 { "incremental vacuum:", 64 }, 5561 { "text encoding:", 56 }, 5562 { "user version:", 60 }, 5563 { "application id:", 68 }, 5564 { "software version:", 96 }, 5565 }; 5566 static const struct { const char *zName; const char *zSql; } aQuery[] = { 5567 { "number of tables:", 5568 "SELECT count(*) FROM %s WHERE type='table'" }, 5569 { "number of indexes:", 5570 "SELECT count(*) FROM %s WHERE type='index'" }, 5571 { "number of triggers:", 5572 "SELECT count(*) FROM %s WHERE type='trigger'" }, 5573 { "number of views:", 5574 "SELECT count(*) FROM %s WHERE type='view'" }, 5575 { "schema size:", 5576 "SELECT total(length(sql)) FROM %s" }, 5577 }; 5578 int i, rc; 5579 unsigned iDataVersion; 5580 char *zSchemaTab; 5581 char *zDb = nArg>=2 ? azArg[1] : "main"; 5582 sqlite3_stmt *pStmt = 0; 5583 unsigned char aHdr[100]; 5584 open_db(p, 0); 5585 if( p->db==0 ) return 1; 5586 rc = sqlite3_prepare_v2(p->db, 5587 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 5588 -1, &pStmt, 0); 5589 if( rc ){ 5590 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 5591 sqlite3_finalize(pStmt); 5592 return 1; 5593 } 5594 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 5595 if( sqlite3_step(pStmt)==SQLITE_ROW 5596 && sqlite3_column_bytes(pStmt,0)>100 5597 ){ 5598 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 5599 sqlite3_finalize(pStmt); 5600 }else{ 5601 raw_printf(stderr, "unable to read database header\n"); 5602 sqlite3_finalize(pStmt); 5603 return 1; 5604 } 5605 i = get2byteInt(aHdr+16); 5606 if( i==1 ) i = 65536; 5607 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 5608 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 5609 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 5610 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 5611 for(i=0; i<ArraySize(aField); i++){ 5612 int ofst = aField[i].ofst; 5613 unsigned int val = get4byteInt(aHdr + ofst); 5614 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 5615 switch( ofst ){ 5616 case 56: { 5617 if( val==1 ) raw_printf(p->out, " (utf8)"); 5618 if( val==2 ) raw_printf(p->out, " (utf16le)"); 5619 if( val==3 ) raw_printf(p->out, " (utf16be)"); 5620 } 5621 } 5622 raw_printf(p->out, "\n"); 5623 } 5624 if( zDb==0 ){ 5625 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 5626 }else if( strcmp(zDb,"temp")==0 ){ 5627 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 5628 }else{ 5629 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 5630 } 5631 for(i=0; i<ArraySize(aQuery); i++){ 5632 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 5633 int val = db_int(p, zSql); 5634 sqlite3_free(zSql); 5635 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 5636 } 5637 sqlite3_free(zSchemaTab); 5638 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 5639 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 5640 return 0; 5641} 5642 5643/* 5644** Print the current sqlite3_errmsg() value to stderr and return 1. 5645*/ 5646static int shellDatabaseError(sqlite3 *db){ 5647 const char *zErr = sqlite3_errmsg(db); 5648 utf8_printf(stderr, "Error: %s\n", zErr); 5649 return 1; 5650} 5651 5652/* 5653** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 5654** if they match and FALSE (0) if they do not match. 5655** 5656** Globbing rules: 5657** 5658** '*' Matches any sequence of zero or more characters. 5659** 5660** '?' Matches exactly one character. 5661** 5662** [...] Matches one character from the enclosed list of 5663** characters. 5664** 5665** [^...] Matches one character not in the enclosed list. 5666** 5667** '#' Matches any sequence of one or more digits with an 5668** optional + or - sign in front 5669** 5670** ' ' Any span of whitespace matches any other span of 5671** whitespace. 5672** 5673** Extra whitespace at the end of z[] is ignored. 5674*/ 5675static int testcase_glob(const char *zGlob, const char *z){ 5676 int c, c2; 5677 int invert; 5678 int seen; 5679 5680 while( (c = (*(zGlob++)))!=0 ){ 5681 if( IsSpace(c) ){ 5682 if( !IsSpace(*z) ) return 0; 5683 while( IsSpace(*zGlob) ) zGlob++; 5684 while( IsSpace(*z) ) z++; 5685 }else if( c=='*' ){ 5686 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 5687 if( c=='?' && (*(z++))==0 ) return 0; 5688 } 5689 if( c==0 ){ 5690 return 1; 5691 }else if( c=='[' ){ 5692 while( *z && testcase_glob(zGlob-1,z)==0 ){ 5693 z++; 5694 } 5695 return (*z)!=0; 5696 } 5697 while( (c2 = (*(z++)))!=0 ){ 5698 while( c2!=c ){ 5699 c2 = *(z++); 5700 if( c2==0 ) return 0; 5701 } 5702 if( testcase_glob(zGlob,z) ) return 1; 5703 } 5704 return 0; 5705 }else if( c=='?' ){ 5706 if( (*(z++))==0 ) return 0; 5707 }else if( c=='[' ){ 5708 int prior_c = 0; 5709 seen = 0; 5710 invert = 0; 5711 c = *(z++); 5712 if( c==0 ) return 0; 5713 c2 = *(zGlob++); 5714 if( c2=='^' ){ 5715 invert = 1; 5716 c2 = *(zGlob++); 5717 } 5718 if( c2==']' ){ 5719 if( c==']' ) seen = 1; 5720 c2 = *(zGlob++); 5721 } 5722 while( c2 && c2!=']' ){ 5723 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 5724 c2 = *(zGlob++); 5725 if( c>=prior_c && c<=c2 ) seen = 1; 5726 prior_c = 0; 5727 }else{ 5728 if( c==c2 ){ 5729 seen = 1; 5730 } 5731 prior_c = c2; 5732 } 5733 c2 = *(zGlob++); 5734 } 5735 if( c2==0 || (seen ^ invert)==0 ) return 0; 5736 }else if( c=='#' ){ 5737 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 5738 if( !IsDigit(z[0]) ) return 0; 5739 z++; 5740 while( IsDigit(z[0]) ){ z++; } 5741 }else{ 5742 if( c!=(*(z++)) ) return 0; 5743 } 5744 } 5745 while( IsSpace(*z) ){ z++; } 5746 return *z==0; 5747} 5748 5749 5750/* 5751** Compare the string as a command-line option with either one or two 5752** initial "-" characters. 5753*/ 5754static int optionMatch(const char *zStr, const char *zOpt){ 5755 if( zStr[0]!='-' ) return 0; 5756 zStr++; 5757 if( zStr[0]=='-' ) zStr++; 5758 return strcmp(zStr, zOpt)==0; 5759} 5760 5761/* 5762** Delete a file. 5763*/ 5764int shellDeleteFile(const char *zFilename){ 5765 int rc; 5766#ifdef _WIN32 5767 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 5768 rc = _wunlink(z); 5769 sqlite3_free(z); 5770#else 5771 rc = unlink(zFilename); 5772#endif 5773 return rc; 5774} 5775 5776/* 5777** Try to delete the temporary file (if there is one) and free the 5778** memory used to hold the name of the temp file. 5779*/ 5780static void clearTempFile(ShellState *p){ 5781 if( p->zTempFile==0 ) return; 5782 if( p->doXdgOpen ) return; 5783 if( shellDeleteFile(p->zTempFile) ) return; 5784 sqlite3_free(p->zTempFile); 5785 p->zTempFile = 0; 5786} 5787 5788/* 5789** Create a new temp file name with the given suffix. 5790*/ 5791static void newTempFile(ShellState *p, const char *zSuffix){ 5792 clearTempFile(p); 5793 sqlite3_free(p->zTempFile); 5794 p->zTempFile = 0; 5795 if( p->db ){ 5796 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 5797 } 5798 if( p->zTempFile==0 ){ 5799 /* If p->db is an in-memory database then the TEMPFILENAME file-control 5800 ** will not work and we will need to fallback to guessing */ 5801 char *zTemp; 5802 sqlite3_uint64 r; 5803 sqlite3_randomness(sizeof(r), &r); 5804 zTemp = getenv("TEMP"); 5805 if( zTemp==0 ) zTemp = getenv("TMP"); 5806 if( zTemp==0 ){ 5807#ifdef _WIN32 5808 zTemp = "\\tmp"; 5809#else 5810 zTemp = "/tmp"; 5811#endif 5812 } 5813 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 5814 }else{ 5815 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 5816 } 5817 shell_check_oom(p->zTempFile); 5818} 5819 5820 5821/* 5822** The implementation of SQL scalar function fkey_collate_clause(), used 5823** by the ".lint fkey-indexes" command. This scalar function is always 5824** called with four arguments - the parent table name, the parent column name, 5825** the child table name and the child column name. 5826** 5827** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 5828** 5829** If either of the named tables or columns do not exist, this function 5830** returns an empty string. An empty string is also returned if both tables 5831** and columns exist but have the same default collation sequence. Or, 5832** if both exist but the default collation sequences are different, this 5833** function returns the string " COLLATE <parent-collation>", where 5834** <parent-collation> is the default collation sequence of the parent column. 5835*/ 5836static void shellFkeyCollateClause( 5837 sqlite3_context *pCtx, 5838 int nVal, 5839 sqlite3_value **apVal 5840){ 5841 sqlite3 *db = sqlite3_context_db_handle(pCtx); 5842 const char *zParent; 5843 const char *zParentCol; 5844 const char *zParentSeq; 5845 const char *zChild; 5846 const char *zChildCol; 5847 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 5848 int rc; 5849 5850 assert( nVal==4 ); 5851 zParent = (const char*)sqlite3_value_text(apVal[0]); 5852 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 5853 zChild = (const char*)sqlite3_value_text(apVal[2]); 5854 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 5855 5856 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 5857 rc = sqlite3_table_column_metadata( 5858 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 5859 ); 5860 if( rc==SQLITE_OK ){ 5861 rc = sqlite3_table_column_metadata( 5862 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 5863 ); 5864 } 5865 5866 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 5867 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 5868 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 5869 sqlite3_free(z); 5870 } 5871} 5872 5873 5874/* 5875** The implementation of dot-command ".lint fkey-indexes". 5876*/ 5877static int lintFkeyIndexes( 5878 ShellState *pState, /* Current shell tool state */ 5879 char **azArg, /* Array of arguments passed to dot command */ 5880 int nArg /* Number of entries in azArg[] */ 5881){ 5882 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 5883 FILE *out = pState->out; /* Stream to write non-error output to */ 5884 int bVerbose = 0; /* If -verbose is present */ 5885 int bGroupByParent = 0; /* If -groupbyparent is present */ 5886 int i; /* To iterate through azArg[] */ 5887 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 5888 int rc; /* Return code */ 5889 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 5890 5891 /* 5892 ** This SELECT statement returns one row for each foreign key constraint 5893 ** in the schema of the main database. The column values are: 5894 ** 5895 ** 0. The text of an SQL statement similar to: 5896 ** 5897 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 5898 ** 5899 ** This SELECT is similar to the one that the foreign keys implementation 5900 ** needs to run internally on child tables. If there is an index that can 5901 ** be used to optimize this query, then it can also be used by the FK 5902 ** implementation to optimize DELETE or UPDATE statements on the parent 5903 ** table. 5904 ** 5905 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 5906 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 5907 ** contains an index that can be used to optimize the query. 5908 ** 5909 ** 2. Human readable text that describes the child table and columns. e.g. 5910 ** 5911 ** "child_table(child_key1, child_key2)" 5912 ** 5913 ** 3. Human readable text that describes the parent table and columns. e.g. 5914 ** 5915 ** "parent_table(parent_key1, parent_key2)" 5916 ** 5917 ** 4. A full CREATE INDEX statement for an index that could be used to 5918 ** optimize DELETE or UPDATE statements on the parent table. e.g. 5919 ** 5920 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 5921 ** 5922 ** 5. The name of the parent table. 5923 ** 5924 ** These six values are used by the C logic below to generate the report. 5925 */ 5926 const char *zSql = 5927 "SELECT " 5928 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 5929 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 5930 " || fkey_collate_clause(" 5931 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 5932 ", " 5933 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('" 5934 " || group_concat('*=?', ' AND ') || ')'" 5935 ", " 5936 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 5937 ", " 5938 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 5939 ", " 5940 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 5941 " || ' ON ' || quote(s.name) || '('" 5942 " || group_concat(quote(f.[from]) ||" 5943 " fkey_collate_clause(" 5944 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 5945 " || ');'" 5946 ", " 5947 " f.[table] " 5948 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 5949 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 5950 "GROUP BY s.name, f.id " 5951 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 5952 ; 5953 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)"; 5954 5955 for(i=2; i<nArg; i++){ 5956 int n = strlen30(azArg[i]); 5957 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 5958 bVerbose = 1; 5959 } 5960 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 5961 bGroupByParent = 1; 5962 zIndent = " "; 5963 } 5964 else{ 5965 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 5966 azArg[0], azArg[1] 5967 ); 5968 return SQLITE_ERROR; 5969 } 5970 } 5971 5972 /* Register the fkey_collate_clause() SQL function */ 5973 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 5974 0, shellFkeyCollateClause, 0, 0 5975 ); 5976 5977 5978 if( rc==SQLITE_OK ){ 5979 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 5980 } 5981 if( rc==SQLITE_OK ){ 5982 sqlite3_bind_int(pSql, 1, bGroupByParent); 5983 } 5984 5985 if( rc==SQLITE_OK ){ 5986 int rc2; 5987 char *zPrev = 0; 5988 while( SQLITE_ROW==sqlite3_step(pSql) ){ 5989 int res = -1; 5990 sqlite3_stmt *pExplain = 0; 5991 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 5992 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 5993 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 5994 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 5995 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 5996 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 5997 5998 if( zEQP==0 ) continue; 5999 if( zGlob==0 ) continue; 6000 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 6001 if( rc!=SQLITE_OK ) break; 6002 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 6003 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 6004 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan) 6005 || 0==sqlite3_strglob(zGlobIPK, zPlan)); 6006 } 6007 rc = sqlite3_finalize(pExplain); 6008 if( rc!=SQLITE_OK ) break; 6009 6010 if( res<0 ){ 6011 raw_printf(stderr, "Error: internal error"); 6012 break; 6013 }else{ 6014 if( bGroupByParent 6015 && (bVerbose || res==0) 6016 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 6017 ){ 6018 raw_printf(out, "-- Parent table %s\n", zParent); 6019 sqlite3_free(zPrev); 6020 zPrev = sqlite3_mprintf("%s", zParent); 6021 } 6022 6023 if( res==0 ){ 6024 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 6025 }else if( bVerbose ){ 6026 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 6027 zIndent, zFrom, zTarget 6028 ); 6029 } 6030 } 6031 } 6032 sqlite3_free(zPrev); 6033 6034 if( rc!=SQLITE_OK ){ 6035 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6036 } 6037 6038 rc2 = sqlite3_finalize(pSql); 6039 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 6040 rc = rc2; 6041 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6042 } 6043 }else{ 6044 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6045 } 6046 6047 return rc; 6048} 6049 6050/* 6051** Implementation of ".lint" dot command. 6052*/ 6053static int lintDotCommand( 6054 ShellState *pState, /* Current shell tool state */ 6055 char **azArg, /* Array of arguments passed to dot command */ 6056 int nArg /* Number of entries in azArg[] */ 6057){ 6058 int n; 6059 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 6060 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 6061 return lintFkeyIndexes(pState, azArg, nArg); 6062 6063 usage: 6064 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 6065 raw_printf(stderr, "Where sub-commands are:\n"); 6066 raw_printf(stderr, " fkey-indexes\n"); 6067 return SQLITE_ERROR; 6068} 6069 6070#if !defined SQLITE_OMIT_VIRTUALTABLE 6071static void shellPrepare( 6072 sqlite3 *db, 6073 int *pRc, 6074 const char *zSql, 6075 sqlite3_stmt **ppStmt 6076){ 6077 *ppStmt = 0; 6078 if( *pRc==SQLITE_OK ){ 6079 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 6080 if( rc!=SQLITE_OK ){ 6081 raw_printf(stderr, "sql error: %s (%d)\n", 6082 sqlite3_errmsg(db), sqlite3_errcode(db) 6083 ); 6084 *pRc = rc; 6085 } 6086 } 6087} 6088 6089/* 6090** Create a prepared statement using printf-style arguments for the SQL. 6091** 6092** This routine is could be marked "static". But it is not always used, 6093** depending on compile-time options. By omitting the "static", we avoid 6094** nuisance compiler warnings about "defined but not used". 6095*/ 6096void shellPreparePrintf( 6097 sqlite3 *db, 6098 int *pRc, 6099 sqlite3_stmt **ppStmt, 6100 const char *zFmt, 6101 ... 6102){ 6103 *ppStmt = 0; 6104 if( *pRc==SQLITE_OK ){ 6105 va_list ap; 6106 char *z; 6107 va_start(ap, zFmt); 6108 z = sqlite3_vmprintf(zFmt, ap); 6109 va_end(ap); 6110 if( z==0 ){ 6111 *pRc = SQLITE_NOMEM; 6112 }else{ 6113 shellPrepare(db, pRc, z, ppStmt); 6114 sqlite3_free(z); 6115 } 6116 } 6117} 6118 6119/* Finalize the prepared statement created using shellPreparePrintf(). 6120** 6121** This routine is could be marked "static". But it is not always used, 6122** depending on compile-time options. By omitting the "static", we avoid 6123** nuisance compiler warnings about "defined but not used". 6124*/ 6125void shellFinalize( 6126 int *pRc, 6127 sqlite3_stmt *pStmt 6128){ 6129 if( pStmt ){ 6130 sqlite3 *db = sqlite3_db_handle(pStmt); 6131 int rc = sqlite3_finalize(pStmt); 6132 if( *pRc==SQLITE_OK ){ 6133 if( rc!=SQLITE_OK ){ 6134 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6135 } 6136 *pRc = rc; 6137 } 6138 } 6139} 6140 6141/* Reset the prepared statement created using shellPreparePrintf(). 6142** 6143** This routine is could be marked "static". But it is not always used, 6144** depending on compile-time options. By omitting the "static", we avoid 6145** nuisance compiler warnings about "defined but not used". 6146*/ 6147void shellReset( 6148 int *pRc, 6149 sqlite3_stmt *pStmt 6150){ 6151 int rc = sqlite3_reset(pStmt); 6152 if( *pRc==SQLITE_OK ){ 6153 if( rc!=SQLITE_OK ){ 6154 sqlite3 *db = sqlite3_db_handle(pStmt); 6155 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6156 } 6157 *pRc = rc; 6158 } 6159} 6160#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 6161 6162#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 6163/****************************************************************************** 6164** The ".archive" or ".ar" command. 6165*/ 6166/* 6167** Structure representing a single ".ar" command. 6168*/ 6169typedef struct ArCommand ArCommand; 6170struct ArCommand { 6171 u8 eCmd; /* An AR_CMD_* value */ 6172 u8 bVerbose; /* True if --verbose */ 6173 u8 bZip; /* True if the archive is a ZIP */ 6174 u8 bDryRun; /* True if --dry-run */ 6175 u8 bAppend; /* True if --append */ 6176 u8 bGlob; /* True if --glob */ 6177 u8 fromCmdLine; /* Run from -A instead of .archive */ 6178 int nArg; /* Number of command arguments */ 6179 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 6180 const char *zFile; /* --file argument, or NULL */ 6181 const char *zDir; /* --directory argument, or NULL */ 6182 char **azArg; /* Array of command arguments */ 6183 ShellState *p; /* Shell state */ 6184 sqlite3 *db; /* Database containing the archive */ 6185}; 6186 6187/* 6188** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 6189*/ 6190static int arUsage(FILE *f){ 6191 showHelp(f,"archive"); 6192 return SQLITE_ERROR; 6193} 6194 6195/* 6196** Print an error message for the .ar command to stderr and return 6197** SQLITE_ERROR. 6198*/ 6199static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 6200 va_list ap; 6201 char *z; 6202 va_start(ap, zFmt); 6203 z = sqlite3_vmprintf(zFmt, ap); 6204 va_end(ap); 6205 utf8_printf(stderr, "Error: %s\n", z); 6206 if( pAr->fromCmdLine ){ 6207 utf8_printf(stderr, "Use \"-A\" for more help\n"); 6208 }else{ 6209 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 6210 } 6211 sqlite3_free(z); 6212 return SQLITE_ERROR; 6213} 6214 6215/* 6216** Values for ArCommand.eCmd. 6217*/ 6218#define AR_CMD_CREATE 1 6219#define AR_CMD_UPDATE 2 6220#define AR_CMD_INSERT 3 6221#define AR_CMD_EXTRACT 4 6222#define AR_CMD_LIST 5 6223#define AR_CMD_HELP 6 6224#define AR_CMD_REMOVE 7 6225 6226/* 6227** Other (non-command) switches. 6228*/ 6229#define AR_SWITCH_VERBOSE 8 6230#define AR_SWITCH_FILE 9 6231#define AR_SWITCH_DIRECTORY 10 6232#define AR_SWITCH_APPEND 11 6233#define AR_SWITCH_DRYRUN 12 6234#define AR_SWITCH_GLOB 13 6235 6236static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 6237 switch( eSwitch ){ 6238 case AR_CMD_CREATE: 6239 case AR_CMD_EXTRACT: 6240 case AR_CMD_LIST: 6241 case AR_CMD_REMOVE: 6242 case AR_CMD_UPDATE: 6243 case AR_CMD_INSERT: 6244 case AR_CMD_HELP: 6245 if( pAr->eCmd ){ 6246 return arErrorMsg(pAr, "multiple command options"); 6247 } 6248 pAr->eCmd = eSwitch; 6249 break; 6250 6251 case AR_SWITCH_DRYRUN: 6252 pAr->bDryRun = 1; 6253 break; 6254 case AR_SWITCH_GLOB: 6255 pAr->bGlob = 1; 6256 break; 6257 case AR_SWITCH_VERBOSE: 6258 pAr->bVerbose = 1; 6259 break; 6260 case AR_SWITCH_APPEND: 6261 pAr->bAppend = 1; 6262 /* Fall thru into --file */ 6263 case AR_SWITCH_FILE: 6264 pAr->zFile = zArg; 6265 break; 6266 case AR_SWITCH_DIRECTORY: 6267 pAr->zDir = zArg; 6268 break; 6269 } 6270 6271 return SQLITE_OK; 6272} 6273 6274/* 6275** Parse the command line for an ".ar" command. The results are written into 6276** structure (*pAr). SQLITE_OK is returned if the command line is parsed 6277** successfully, otherwise an error message is written to stderr and 6278** SQLITE_ERROR returned. 6279*/ 6280static int arParseCommand( 6281 char **azArg, /* Array of arguments passed to dot command */ 6282 int nArg, /* Number of entries in azArg[] */ 6283 ArCommand *pAr /* Populate this object */ 6284){ 6285 struct ArSwitch { 6286 const char *zLong; 6287 char cShort; 6288 u8 eSwitch; 6289 u8 bArg; 6290 } aSwitch[] = { 6291 { "create", 'c', AR_CMD_CREATE, 0 }, 6292 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 6293 { "insert", 'i', AR_CMD_INSERT, 0 }, 6294 { "list", 't', AR_CMD_LIST, 0 }, 6295 { "remove", 'r', AR_CMD_REMOVE, 0 }, 6296 { "update", 'u', AR_CMD_UPDATE, 0 }, 6297 { "help", 'h', AR_CMD_HELP, 0 }, 6298 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 6299 { "file", 'f', AR_SWITCH_FILE, 1 }, 6300 { "append", 'a', AR_SWITCH_APPEND, 1 }, 6301 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 6302 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 6303 { "glob", 'g', AR_SWITCH_GLOB, 0 }, 6304 }; 6305 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 6306 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 6307 6308 if( nArg<=1 ){ 6309 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 6310 return arUsage(stderr); 6311 }else{ 6312 char *z = azArg[1]; 6313 if( z[0]!='-' ){ 6314 /* Traditional style [tar] invocation */ 6315 int i; 6316 int iArg = 2; 6317 for(i=0; z[i]; i++){ 6318 const char *zArg = 0; 6319 struct ArSwitch *pOpt; 6320 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6321 if( z[i]==pOpt->cShort ) break; 6322 } 6323 if( pOpt==pEnd ){ 6324 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6325 } 6326 if( pOpt->bArg ){ 6327 if( iArg>=nArg ){ 6328 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 6329 } 6330 zArg = azArg[iArg++]; 6331 } 6332 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6333 } 6334 pAr->nArg = nArg-iArg; 6335 if( pAr->nArg>0 ){ 6336 pAr->azArg = &azArg[iArg]; 6337 } 6338 }else{ 6339 /* Non-traditional invocation */ 6340 int iArg; 6341 for(iArg=1; iArg<nArg; iArg++){ 6342 int n; 6343 z = azArg[iArg]; 6344 if( z[0]!='-' ){ 6345 /* All remaining command line words are command arguments. */ 6346 pAr->azArg = &azArg[iArg]; 6347 pAr->nArg = nArg-iArg; 6348 break; 6349 } 6350 n = strlen30(z); 6351 6352 if( z[1]!='-' ){ 6353 int i; 6354 /* One or more short options */ 6355 for(i=1; i<n; i++){ 6356 const char *zArg = 0; 6357 struct ArSwitch *pOpt; 6358 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6359 if( z[i]==pOpt->cShort ) break; 6360 } 6361 if( pOpt==pEnd ){ 6362 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6363 } 6364 if( pOpt->bArg ){ 6365 if( i<(n-1) ){ 6366 zArg = &z[i+1]; 6367 i = n; 6368 }else{ 6369 if( iArg>=(nArg-1) ){ 6370 return arErrorMsg(pAr, "option requires an argument: %c", 6371 z[i]); 6372 } 6373 zArg = azArg[++iArg]; 6374 } 6375 } 6376 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6377 } 6378 }else if( z[2]=='\0' ){ 6379 /* A -- option, indicating that all remaining command line words 6380 ** are command arguments. */ 6381 pAr->azArg = &azArg[iArg+1]; 6382 pAr->nArg = nArg-iArg-1; 6383 break; 6384 }else{ 6385 /* A long option */ 6386 const char *zArg = 0; /* Argument for option, if any */ 6387 struct ArSwitch *pMatch = 0; /* Matching option */ 6388 struct ArSwitch *pOpt; /* Iterator */ 6389 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6390 const char *zLong = pOpt->zLong; 6391 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 6392 if( pMatch ){ 6393 return arErrorMsg(pAr, "ambiguous option: %s",z); 6394 }else{ 6395 pMatch = pOpt; 6396 } 6397 } 6398 } 6399 6400 if( pMatch==0 ){ 6401 return arErrorMsg(pAr, "unrecognized option: %s", z); 6402 } 6403 if( pMatch->bArg ){ 6404 if( iArg>=(nArg-1) ){ 6405 return arErrorMsg(pAr, "option requires an argument: %s", z); 6406 } 6407 zArg = azArg[++iArg]; 6408 } 6409 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 6410 } 6411 } 6412 } 6413 } 6414 6415 return SQLITE_OK; 6416} 6417 6418/* 6419** This function assumes that all arguments within the ArCommand.azArg[] 6420** array refer to archive members, as for the --extract, --list or --remove 6421** commands. It checks that each of them are "present". If any specified 6422** file is not present in the archive, an error is printed to stderr and an 6423** error code returned. Otherwise, if all specified arguments are present 6424** in the archive, SQLITE_OK is returned. Here, "present" means either an 6425** exact equality when pAr->bGlob is false or a "name GLOB pattern" match 6426** when pAr->bGlob is true. 6427** 6428** This function strips any trailing '/' characters from each argument. 6429** This is consistent with the way the [tar] command seems to work on 6430** Linux. 6431*/ 6432static int arCheckEntries(ArCommand *pAr){ 6433 int rc = SQLITE_OK; 6434 if( pAr->nArg ){ 6435 int i, j; 6436 sqlite3_stmt *pTest = 0; 6437 const char *zSel = (pAr->bGlob) 6438 ? "SELECT name FROM %s WHERE glob($name,name)" 6439 : "SELECT name FROM %s WHERE name=$name"; 6440 6441 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); 6442 j = sqlite3_bind_parameter_index(pTest, "$name"); 6443 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 6444 char *z = pAr->azArg[i]; 6445 int n = strlen30(z); 6446 int bOk = 0; 6447 while( n>0 && z[n-1]=='/' ) n--; 6448 z[n] = '\0'; 6449 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 6450 if( SQLITE_ROW==sqlite3_step(pTest) ){ 6451 bOk = 1; 6452 } 6453 shellReset(&rc, pTest); 6454 if( rc==SQLITE_OK && bOk==0 ){ 6455 utf8_printf(stderr, "not found in archive: %s\n", z); 6456 rc = SQLITE_ERROR; 6457 } 6458 } 6459 shellFinalize(&rc, pTest); 6460 } 6461 return rc; 6462} 6463 6464/* 6465** Format a WHERE clause that can be used against the "sqlar" table to 6466** identify all archive members that match the command arguments held 6467** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 6468** The caller is responsible for eventually calling sqlite3_free() on 6469** any non-NULL (*pzWhere) value. Here, "match" means strict equality 6470** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. 6471*/ 6472static void arWhereClause( 6473 int *pRc, 6474 ArCommand *pAr, 6475 char **pzWhere /* OUT: New WHERE clause */ 6476){ 6477 char *zWhere = 0; 6478 const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; 6479 if( *pRc==SQLITE_OK ){ 6480 if( pAr->nArg==0 ){ 6481 zWhere = sqlite3_mprintf("1"); 6482 }else{ 6483 int i; 6484 const char *zSep = ""; 6485 for(i=0; i<pAr->nArg; i++){ 6486 const char *z = pAr->azArg[i]; 6487 zWhere = sqlite3_mprintf( 6488 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", 6489 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z 6490 ); 6491 if( zWhere==0 ){ 6492 *pRc = SQLITE_NOMEM; 6493 break; 6494 } 6495 zSep = " OR "; 6496 } 6497 } 6498 } 6499 *pzWhere = zWhere; 6500} 6501 6502/* 6503** Implementation of .ar "lisT" command. 6504*/ 6505static int arListCommand(ArCommand *pAr){ 6506 const char *zSql = "SELECT %s FROM %s WHERE %s"; 6507 const char *azCols[] = { 6508 "name", 6509 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 6510 }; 6511 6512 char *zWhere = 0; 6513 sqlite3_stmt *pSql = 0; 6514 int rc; 6515 6516 rc = arCheckEntries(pAr); 6517 arWhereClause(&rc, pAr, &zWhere); 6518 6519 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 6520 pAr->zSrcTable, zWhere); 6521 if( pAr->bDryRun ){ 6522 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6523 }else{ 6524 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6525 if( pAr->bVerbose ){ 6526 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 6527 sqlite3_column_text(pSql, 0), 6528 sqlite3_column_int(pSql, 1), 6529 sqlite3_column_text(pSql, 2), 6530 sqlite3_column_text(pSql, 3) 6531 ); 6532 }else{ 6533 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6534 } 6535 } 6536 } 6537 shellFinalize(&rc, pSql); 6538 sqlite3_free(zWhere); 6539 return rc; 6540} 6541 6542 6543/* 6544** Implementation of .ar "Remove" command. 6545*/ 6546static int arRemoveCommand(ArCommand *pAr){ 6547 int rc = 0; 6548 char *zSql = 0; 6549 char *zWhere = 0; 6550 6551 if( pAr->nArg ){ 6552 /* Verify that args actually exist within the archive before proceeding. 6553 ** And formulate a WHERE clause to match them. */ 6554 rc = arCheckEntries(pAr); 6555 arWhereClause(&rc, pAr, &zWhere); 6556 } 6557 if( rc==SQLITE_OK ){ 6558 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", 6559 pAr->zSrcTable, zWhere); 6560 if( pAr->bDryRun ){ 6561 utf8_printf(pAr->p->out, "%s\n", zSql); 6562 }else{ 6563 char *zErr = 0; 6564 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); 6565 if( rc==SQLITE_OK ){ 6566 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6567 if( rc!=SQLITE_OK ){ 6568 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 6569 }else{ 6570 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); 6571 } 6572 } 6573 if( zErr ){ 6574 utf8_printf(stdout, "ERROR: %s\n", zErr); 6575 sqlite3_free(zErr); 6576 } 6577 } 6578 } 6579 sqlite3_free(zWhere); 6580 sqlite3_free(zSql); 6581 return rc; 6582} 6583 6584/* 6585** Implementation of .ar "eXtract" command. 6586*/ 6587static int arExtractCommand(ArCommand *pAr){ 6588 const char *zSql1 = 6589 "SELECT " 6590 " ($dir || name)," 6591 " writefile(($dir || name), %s, mode, mtime) " 6592 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 6593 " AND name NOT GLOB '*..[/\\]*'"; 6594 6595 const char *azExtraArg[] = { 6596 "sqlar_uncompress(data, sz)", 6597 "data" 6598 }; 6599 6600 sqlite3_stmt *pSql = 0; 6601 int rc = SQLITE_OK; 6602 char *zDir = 0; 6603 char *zWhere = 0; 6604 int i, j; 6605 6606 /* If arguments are specified, check that they actually exist within 6607 ** the archive before proceeding. And formulate a WHERE clause to 6608 ** match them. */ 6609 rc = arCheckEntries(pAr); 6610 arWhereClause(&rc, pAr, &zWhere); 6611 6612 if( rc==SQLITE_OK ){ 6613 if( pAr->zDir ){ 6614 zDir = sqlite3_mprintf("%s/", pAr->zDir); 6615 }else{ 6616 zDir = sqlite3_mprintf(""); 6617 } 6618 if( zDir==0 ) rc = SQLITE_NOMEM; 6619 } 6620 6621 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 6622 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 6623 ); 6624 6625 if( rc==SQLITE_OK ){ 6626 j = sqlite3_bind_parameter_index(pSql, "$dir"); 6627 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 6628 6629 /* Run the SELECT statement twice. The first time, writefile() is called 6630 ** for all archive members that should be extracted. The second time, 6631 ** only for the directories. This is because the timestamps for 6632 ** extracted directories must be reset after they are populated (as 6633 ** populating them changes the timestamp). */ 6634 for(i=0; i<2; i++){ 6635 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 6636 sqlite3_bind_int(pSql, j, i); 6637 if( pAr->bDryRun ){ 6638 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6639 }else{ 6640 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6641 if( i==0 && pAr->bVerbose ){ 6642 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6643 } 6644 } 6645 } 6646 shellReset(&rc, pSql); 6647 } 6648 shellFinalize(&rc, pSql); 6649 } 6650 6651 sqlite3_free(zDir); 6652 sqlite3_free(zWhere); 6653 return rc; 6654} 6655 6656/* 6657** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 6658*/ 6659static int arExecSql(ArCommand *pAr, const char *zSql){ 6660 int rc; 6661 if( pAr->bDryRun ){ 6662 utf8_printf(pAr->p->out, "%s\n", zSql); 6663 rc = SQLITE_OK; 6664 }else{ 6665 char *zErr = 0; 6666 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6667 if( zErr ){ 6668 utf8_printf(stdout, "ERROR: %s\n", zErr); 6669 sqlite3_free(zErr); 6670 } 6671 } 6672 return rc; 6673} 6674 6675 6676/* 6677** Implementation of .ar "create", "insert", and "update" commands. 6678** 6679** create -> Create a new SQL archive 6680** insert -> Insert or reinsert all files listed 6681** update -> Insert files that have changed or that were not 6682** previously in the archive 6683** 6684** Create the "sqlar" table in the database if it does not already exist. 6685** Then add each file in the azFile[] array to the archive. Directories 6686** are added recursively. If argument bVerbose is non-zero, a message is 6687** printed on stdout for each file archived. 6688** 6689** The create command is the same as update, except that it drops 6690** any existing "sqlar" table before beginning. The "insert" command 6691** always overwrites every file named on the command-line, where as 6692** "update" only overwrites if the size or mtime or mode has changed. 6693*/ 6694static int arCreateOrUpdateCommand( 6695 ArCommand *pAr, /* Command arguments and options */ 6696 int bUpdate, /* true for a --create. */ 6697 int bOnlyIfChanged /* Only update if file has changed */ 6698){ 6699 const char *zCreate = 6700 "CREATE TABLE IF NOT EXISTS sqlar(\n" 6701 " name TEXT PRIMARY KEY, -- name of the file\n" 6702 " mode INT, -- access permissions\n" 6703 " mtime INT, -- last modification time\n" 6704 " sz INT, -- original file size\n" 6705 " data BLOB -- compressed content\n" 6706 ")"; 6707 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 6708 const char *zInsertFmt[2] = { 6709 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 6710 " SELECT\n" 6711 " %s,\n" 6712 " mode,\n" 6713 " mtime,\n" 6714 " CASE substr(lsmode(mode),1,1)\n" 6715 " WHEN '-' THEN length(data)\n" 6716 " WHEN 'd' THEN 0\n" 6717 " ELSE -1 END,\n" 6718 " sqlar_compress(data)\n" 6719 " FROM fsdir(%Q,%Q) AS disk\n" 6720 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6721 , 6722 "REPLACE INTO %s(name,mode,mtime,data)\n" 6723 " SELECT\n" 6724 " %s,\n" 6725 " mode,\n" 6726 " mtime,\n" 6727 " data\n" 6728 " FROM fsdir(%Q,%Q) AS disk\n" 6729 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6730 }; 6731 int i; /* For iterating through azFile[] */ 6732 int rc; /* Return code */ 6733 const char *zTab = 0; /* SQL table into which to insert */ 6734 char *zSql; 6735 char zTemp[50]; 6736 char *zExists = 0; 6737 6738 arExecSql(pAr, "PRAGMA page_size=512"); 6739 rc = arExecSql(pAr, "SAVEPOINT ar;"); 6740 if( rc!=SQLITE_OK ) return rc; 6741 zTemp[0] = 0; 6742 if( pAr->bZip ){ 6743 /* Initialize the zipfile virtual table, if necessary */ 6744 if( pAr->zFile ){ 6745 sqlite3_uint64 r; 6746 sqlite3_randomness(sizeof(r),&r); 6747 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 6748 zTab = zTemp; 6749 zSql = sqlite3_mprintf( 6750 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 6751 zTab, pAr->zFile 6752 ); 6753 rc = arExecSql(pAr, zSql); 6754 sqlite3_free(zSql); 6755 }else{ 6756 zTab = "zip"; 6757 } 6758 }else{ 6759 /* Initialize the table for an SQLAR */ 6760 zTab = "sqlar"; 6761 if( bUpdate==0 ){ 6762 rc = arExecSql(pAr, zDrop); 6763 if( rc!=SQLITE_OK ) goto end_ar_transaction; 6764 } 6765 rc = arExecSql(pAr, zCreate); 6766 } 6767 if( bOnlyIfChanged ){ 6768 zExists = sqlite3_mprintf( 6769 " AND NOT EXISTS(" 6770 "SELECT 1 FROM %s AS mem" 6771 " WHERE mem.name=disk.name" 6772 " AND mem.mtime=disk.mtime" 6773 " AND mem.mode=disk.mode)", zTab); 6774 }else{ 6775 zExists = sqlite3_mprintf(""); 6776 } 6777 if( zExists==0 ) rc = SQLITE_NOMEM; 6778 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 6779 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 6780 pAr->bVerbose ? "shell_putsnl(name)" : "name", 6781 pAr->azArg[i], pAr->zDir, zExists); 6782 rc = arExecSql(pAr, zSql2); 6783 sqlite3_free(zSql2); 6784 } 6785end_ar_transaction: 6786 if( rc!=SQLITE_OK ){ 6787 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 6788 }else{ 6789 rc = arExecSql(pAr, "RELEASE ar;"); 6790 if( pAr->bZip && pAr->zFile ){ 6791 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 6792 arExecSql(pAr, zSql); 6793 sqlite3_free(zSql); 6794 } 6795 } 6796 sqlite3_free(zExists); 6797 return rc; 6798} 6799 6800/* 6801** Implementation of ".ar" dot command. 6802*/ 6803static int arDotCommand( 6804 ShellState *pState, /* Current shell tool state */ 6805 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 6806 char **azArg, /* Array of arguments passed to dot command */ 6807 int nArg /* Number of entries in azArg[] */ 6808){ 6809 ArCommand cmd; 6810 int rc; 6811 memset(&cmd, 0, sizeof(cmd)); 6812 cmd.fromCmdLine = fromCmdLine; 6813 rc = arParseCommand(azArg, nArg, &cmd); 6814 if( rc==SQLITE_OK ){ 6815 int eDbType = SHELL_OPEN_UNSPEC; 6816 cmd.p = pState; 6817 cmd.db = pState->db; 6818 if( cmd.zFile ){ 6819 eDbType = deduceDatabaseType(cmd.zFile, 1); 6820 }else{ 6821 eDbType = pState->openMode; 6822 } 6823 if( eDbType==SHELL_OPEN_ZIPFILE ){ 6824 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 6825 if( cmd.zFile==0 ){ 6826 cmd.zSrcTable = sqlite3_mprintf("zip"); 6827 }else{ 6828 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 6829 } 6830 } 6831 cmd.bZip = 1; 6832 }else if( cmd.zFile ){ 6833 int flags; 6834 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 6835 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 6836 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ 6837 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 6838 }else{ 6839 flags = SQLITE_OPEN_READONLY; 6840 } 6841 cmd.db = 0; 6842 if( cmd.bDryRun ){ 6843 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 6844 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 6845 } 6846 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 6847 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 6848 if( rc!=SQLITE_OK ){ 6849 utf8_printf(stderr, "cannot open file: %s (%s)\n", 6850 cmd.zFile, sqlite3_errmsg(cmd.db) 6851 ); 6852 goto end_ar_command; 6853 } 6854 sqlite3_fileio_init(cmd.db, 0, 0); 6855 sqlite3_sqlar_init(cmd.db, 0, 0); 6856 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 6857 shellPutsFunc, 0, 0); 6858 6859 } 6860 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 6861 if( cmd.eCmd!=AR_CMD_CREATE 6862 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 6863 ){ 6864 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 6865 rc = SQLITE_ERROR; 6866 goto end_ar_command; 6867 } 6868 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 6869 } 6870 6871 switch( cmd.eCmd ){ 6872 case AR_CMD_CREATE: 6873 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 6874 break; 6875 6876 case AR_CMD_EXTRACT: 6877 rc = arExtractCommand(&cmd); 6878 break; 6879 6880 case AR_CMD_LIST: 6881 rc = arListCommand(&cmd); 6882 break; 6883 6884 case AR_CMD_HELP: 6885 arUsage(pState->out); 6886 break; 6887 6888 case AR_CMD_INSERT: 6889 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 6890 break; 6891 6892 case AR_CMD_REMOVE: 6893 rc = arRemoveCommand(&cmd); 6894 break; 6895 6896 default: 6897 assert( cmd.eCmd==AR_CMD_UPDATE ); 6898 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 6899 break; 6900 } 6901 } 6902end_ar_command: 6903 if( cmd.db!=pState->db ){ 6904 close_db(cmd.db); 6905 } 6906 sqlite3_free(cmd.zSrcTable); 6907 6908 return rc; 6909} 6910/* End of the ".archive" or ".ar" command logic 6911*******************************************************************************/ 6912#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 6913 6914#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 6915/* 6916** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 6917** Otherwise, the SQL statement or statements in zSql are executed using 6918** database connection db and the error code written to *pRc before 6919** this function returns. 6920*/ 6921static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 6922 int rc = *pRc; 6923 if( rc==SQLITE_OK ){ 6924 char *zErr = 0; 6925 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 6926 if( rc!=SQLITE_OK ){ 6927 raw_printf(stderr, "SQL error: %s\n", zErr); 6928 } 6929 sqlite3_free(zErr); 6930 *pRc = rc; 6931 } 6932} 6933 6934/* 6935** Like shellExec(), except that zFmt is a printf() style format string. 6936*/ 6937static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 6938 char *z = 0; 6939 if( *pRc==SQLITE_OK ){ 6940 va_list ap; 6941 va_start(ap, zFmt); 6942 z = sqlite3_vmprintf(zFmt, ap); 6943 va_end(ap); 6944 if( z==0 ){ 6945 *pRc = SQLITE_NOMEM; 6946 }else{ 6947 shellExec(db, pRc, z); 6948 } 6949 sqlite3_free(z); 6950 } 6951} 6952 6953/* 6954** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 6955** Otherwise, an attempt is made to allocate, zero and return a pointer 6956** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 6957** to SQLITE_NOMEM and NULL returned. 6958*/ 6959static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 6960 void *pRet = 0; 6961 if( *pRc==SQLITE_OK ){ 6962 pRet = sqlite3_malloc64(nByte); 6963 if( pRet==0 ){ 6964 *pRc = SQLITE_NOMEM; 6965 }else{ 6966 memset(pRet, 0, nByte); 6967 } 6968 } 6969 return pRet; 6970} 6971 6972/* 6973** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 6974** Otherwise, zFmt is treated as a printf() style string. The result of 6975** formatting it along with any trailing arguments is written into a 6976** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 6977** It is the responsibility of the caller to eventually free this buffer 6978** using a call to sqlite3_free(). 6979** 6980** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 6981** pointer returned. 6982*/ 6983static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 6984 char *z = 0; 6985 if( *pRc==SQLITE_OK ){ 6986 va_list ap; 6987 va_start(ap, zFmt); 6988 z = sqlite3_vmprintf(zFmt, ap); 6989 va_end(ap); 6990 if( z==0 ){ 6991 *pRc = SQLITE_NOMEM; 6992 } 6993 } 6994 return z; 6995} 6996 6997/* 6998** When running the ".recover" command, each output table, and the special 6999** orphaned row table if it is required, is represented by an instance 7000** of the following struct. 7001*/ 7002typedef struct RecoverTable RecoverTable; 7003struct RecoverTable { 7004 char *zQuoted; /* Quoted version of table name */ 7005 int nCol; /* Number of columns in table */ 7006 char **azlCol; /* Array of column lists */ 7007 int iPk; /* Index of IPK column */ 7008}; 7009 7010/* 7011** Free a RecoverTable object allocated by recoverFindTable() or 7012** recoverOrphanTable(). 7013*/ 7014static void recoverFreeTable(RecoverTable *pTab){ 7015 if( pTab ){ 7016 sqlite3_free(pTab->zQuoted); 7017 if( pTab->azlCol ){ 7018 int i; 7019 for(i=0; i<=pTab->nCol; i++){ 7020 sqlite3_free(pTab->azlCol[i]); 7021 } 7022 sqlite3_free(pTab->azlCol); 7023 } 7024 sqlite3_free(pTab); 7025 } 7026} 7027 7028/* 7029** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 7030** Otherwise, it allocates and returns a RecoverTable object based on the 7031** final four arguments passed to this function. It is the responsibility 7032** of the caller to eventually free the returned object using 7033** recoverFreeTable(). 7034*/ 7035static RecoverTable *recoverNewTable( 7036 int *pRc, /* IN/OUT: Error code */ 7037 const char *zName, /* Name of table */ 7038 const char *zSql, /* CREATE TABLE statement */ 7039 int bIntkey, 7040 int nCol 7041){ 7042 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 7043 int rc = *pRc; 7044 RecoverTable *pTab = 0; 7045 7046 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 7047 if( rc==SQLITE_OK ){ 7048 int nSqlCol = 0; 7049 int bSqlIntkey = 0; 7050 sqlite3_stmt *pStmt = 0; 7051 7052 rc = sqlite3_open("", &dbtmp); 7053 if( rc==SQLITE_OK ){ 7054 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 7055 shellIdQuote, 0, 0); 7056 } 7057 if( rc==SQLITE_OK ){ 7058 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 7059 } 7060 if( rc==SQLITE_OK ){ 7061 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 7062 if( rc==SQLITE_ERROR ){ 7063 rc = SQLITE_OK; 7064 goto finished; 7065 } 7066 } 7067 shellPreparePrintf(dbtmp, &rc, &pStmt, 7068 "SELECT count(*) FROM pragma_table_info(%Q)", zName 7069 ); 7070 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7071 nSqlCol = sqlite3_column_int(pStmt, 0); 7072 } 7073 shellFinalize(&rc, pStmt); 7074 7075 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 7076 goto finished; 7077 } 7078 7079 shellPreparePrintf(dbtmp, &rc, &pStmt, 7080 "SELECT (" 7081 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 7082 ") FROM sqlite_schema WHERE name = %Q", zName 7083 ); 7084 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7085 bSqlIntkey = sqlite3_column_int(pStmt, 0); 7086 } 7087 shellFinalize(&rc, pStmt); 7088 7089 if( bIntkey==bSqlIntkey ){ 7090 int i; 7091 const char *zPk = "_rowid_"; 7092 sqlite3_stmt *pPkFinder = 0; 7093 7094 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 7095 ** set zPk to the name of the PK column, and pTab->iPk to the index 7096 ** of the column, where columns are 0-numbered from left to right. 7097 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 7098 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 7099 pTab->iPk = -2; 7100 if( bIntkey ){ 7101 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 7102 "SELECT cid, name FROM pragma_table_info(%Q) " 7103 " WHERE pk=1 AND type='integer' COLLATE nocase" 7104 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 7105 , zName, zName 7106 ); 7107 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 7108 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 7109 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 7110 if( zPk==0 ){ zPk = "_"; /* Defensive. Should never happen */ } 7111 } 7112 } 7113 7114 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 7115 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 7116 pTab->nCol = nSqlCol; 7117 7118 if( bIntkey ){ 7119 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 7120 }else{ 7121 pTab->azlCol[0] = shellMPrintf(&rc, ""); 7122 } 7123 i = 1; 7124 shellPreparePrintf(dbtmp, &rc, &pStmt, 7125 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 7126 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 7127 "FROM pragma_table_info(%Q)", 7128 bIntkey ? ", " : "", pTab->iPk, 7129 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 7130 zName 7131 ); 7132 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7133 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 7134 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 7135 i++; 7136 } 7137 shellFinalize(&rc, pStmt); 7138 7139 shellFinalize(&rc, pPkFinder); 7140 } 7141 } 7142 7143 finished: 7144 sqlite3_close(dbtmp); 7145 *pRc = rc; 7146 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 7147 recoverFreeTable(pTab); 7148 pTab = 0; 7149 } 7150 return pTab; 7151} 7152 7153/* 7154** This function is called to search the schema recovered from the 7155** sqlite_schema table of the (possibly) corrupt database as part 7156** of a ".recover" command. Specifically, for a table with root page 7157** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 7158** table must be a WITHOUT ROWID table, or if non-zero, not one of 7159** those. 7160** 7161** If a table is found, a (RecoverTable*) object is returned. Or, if 7162** no such table is found, but bIntkey is false and iRoot is the 7163** root page of an index in the recovered schema, then (*pbNoop) is 7164** set to true and NULL returned. Or, if there is no such table or 7165** index, NULL is returned and (*pbNoop) set to 0, indicating that 7166** the caller should write data to the orphans table. 7167*/ 7168static RecoverTable *recoverFindTable( 7169 ShellState *pState, /* Shell state object */ 7170 int *pRc, /* IN/OUT: Error code */ 7171 int iRoot, /* Root page of table */ 7172 int bIntkey, /* True for an intkey table */ 7173 int nCol, /* Number of columns in table */ 7174 int *pbNoop /* OUT: True if iRoot is root of index */ 7175){ 7176 sqlite3_stmt *pStmt = 0; 7177 RecoverTable *pRet = 0; 7178 int bNoop = 0; 7179 const char *zSql = 0; 7180 const char *zName = 0; 7181 7182 /* Search the recovered schema for an object with root page iRoot. */ 7183 shellPreparePrintf(pState->db, pRc, &pStmt, 7184 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 7185 ); 7186 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7187 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 7188 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 7189 bNoop = 1; 7190 break; 7191 } 7192 if( sqlite3_stricmp(zType, "table")==0 ){ 7193 zName = (const char*)sqlite3_column_text(pStmt, 1); 7194 zSql = (const char*)sqlite3_column_text(pStmt, 2); 7195 if( zName!=0 && zSql!=0 ){ 7196 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 7197 break; 7198 } 7199 } 7200 } 7201 7202 shellFinalize(pRc, pStmt); 7203 *pbNoop = bNoop; 7204 return pRet; 7205} 7206 7207/* 7208** Return a RecoverTable object representing the orphans table. 7209*/ 7210static RecoverTable *recoverOrphanTable( 7211 ShellState *pState, /* Shell state object */ 7212 int *pRc, /* IN/OUT: Error code */ 7213 const char *zLostAndFound, /* Base name for orphans table */ 7214 int nCol /* Number of user data columns */ 7215){ 7216 RecoverTable *pTab = 0; 7217 if( nCol>=0 && *pRc==SQLITE_OK ){ 7218 int i; 7219 7220 /* This block determines the name of the orphan table. The prefered 7221 ** name is zLostAndFound. But if that clashes with another name 7222 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 7223 ** and so on until a non-clashing name is found. */ 7224 int iTab = 0; 7225 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); 7226 sqlite3_stmt *pTest = 0; 7227 shellPrepare(pState->db, pRc, 7228 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest 7229 ); 7230 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 7231 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ 7232 shellReset(pRc, pTest); 7233 sqlite3_free(zTab); 7234 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); 7235 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 7236 } 7237 shellFinalize(pRc, pTest); 7238 7239 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); 7240 if( pTab ){ 7241 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); 7242 pTab->nCol = nCol; 7243 pTab->iPk = -2; 7244 if( nCol>0 ){ 7245 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); 7246 if( pTab->azlCol ){ 7247 pTab->azlCol[nCol] = shellMPrintf(pRc, ""); 7248 for(i=nCol-1; i>=0; i--){ 7249 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); 7250 } 7251 } 7252 } 7253 7254 if( *pRc!=SQLITE_OK ){ 7255 recoverFreeTable(pTab); 7256 pTab = 0; 7257 }else{ 7258 raw_printf(pState->out, 7259 "CREATE TABLE %s(rootpgno INTEGER, " 7260 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted 7261 ); 7262 for(i=0; i<nCol; i++){ 7263 raw_printf(pState->out, ", c%d", i); 7264 } 7265 raw_printf(pState->out, ");\n"); 7266 } 7267 } 7268 sqlite3_free(zTab); 7269 } 7270 return pTab; 7271} 7272 7273/* 7274** This function is called to recover data from the database. A script 7275** to construct a new database containing all recovered data is output 7276** on stream pState->out. 7277*/ 7278static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 7279 int rc = SQLITE_OK; 7280 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ 7281 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ 7282 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ 7283 const char *zRecoveryDb = ""; /* Name of "recovery" database */ 7284 const char *zLostAndFound = "lost_and_found"; 7285 int i; 7286 int nOrphan = -1; 7287 RecoverTable *pOrphan = 0; 7288 7289 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ 7290 int bRowids = 1; /* 0 if --no-rowids */ 7291 for(i=1; i<nArg; i++){ 7292 char *z = azArg[i]; 7293 int n; 7294 if( z[0]=='-' && z[1]=='-' ) z++; 7295 n = strlen30(z); 7296 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ 7297 bFreelist = 0; 7298 }else 7299 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 7300 i++; 7301 zRecoveryDb = azArg[i]; 7302 }else 7303 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 7304 i++; 7305 zLostAndFound = azArg[i]; 7306 }else 7307 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 7308 bRowids = 0; 7309 } 7310 else{ 7311 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); 7312 showHelp(pState->out, azArg[0]); 7313 return 1; 7314 } 7315 } 7316 7317 shellExecPrintf(pState->db, &rc, 7318 /* Attach an in-memory database named 'recovery'. Create an indexed 7319 ** cache of the sqlite_dbptr virtual table. */ 7320 "PRAGMA writable_schema = on;" 7321 "ATTACH %Q AS recovery;" 7322 "DROP TABLE IF EXISTS recovery.dbptr;" 7323 "DROP TABLE IF EXISTS recovery.freelist;" 7324 "DROP TABLE IF EXISTS recovery.map;" 7325 "DROP TABLE IF EXISTS recovery.schema;" 7326 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb 7327 ); 7328 7329 if( bFreelist ){ 7330 shellExec(pState->db, &rc, 7331 "WITH trunk(pgno) AS (" 7332 " SELECT shell_int32(" 7333 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " 7334 " WHERE x>0" 7335 " UNION" 7336 " SELECT shell_int32(" 7337 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " 7338 " FROM trunk WHERE x>0" 7339 ")," 7340 "freelist(data, n, freepgno) AS (" 7341 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " 7342 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" 7343 " UNION ALL" 7344 " SELECT data, n-1, shell_int32(data, 2+n) " 7345 " FROM freelist WHERE n>=0" 7346 ")" 7347 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" 7348 ); 7349 } 7350 7351 /* If this is an auto-vacuum database, add all pointer-map pages to 7352 ** the freelist table. Do this regardless of whether or not 7353 ** --freelist-corrupt was specified. */ 7354 shellExec(pState->db, &rc, 7355 "WITH ptrmap(pgno) AS (" 7356 " SELECT 2 WHERE shell_int32(" 7357 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" 7358 " )" 7359 " UNION ALL " 7360 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " 7361 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" 7362 ")" 7363 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" 7364 ); 7365 7366 shellExec(pState->db, &rc, 7367 "CREATE TABLE recovery.dbptr(" 7368 " pgno, child, PRIMARY KEY(child, pgno)" 7369 ") WITHOUT ROWID;" 7370 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " 7371 " SELECT * FROM sqlite_dbptr" 7372 " WHERE pgno NOT IN freelist AND child NOT IN freelist;" 7373 7374 /* Delete any pointer to page 1. This ensures that page 1 is considered 7375 ** a root page, regardless of how corrupt the db is. */ 7376 "DELETE FROM recovery.dbptr WHERE child = 1;" 7377 7378 /* Delete all pointers to any pages that have more than one pointer 7379 ** to them. Such pages will be treated as root pages when recovering 7380 ** data. */ 7381 "DELETE FROM recovery.dbptr WHERE child IN (" 7382 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" 7383 ");" 7384 7385 /* Create the "map" table that will (eventually) contain instructions 7386 ** for dealing with each page in the db that contains one or more 7387 ** records. */ 7388 "CREATE TABLE recovery.map(" 7389 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" 7390 ");" 7391 7392 /* Populate table [map]. If there are circular loops of pages in the 7393 ** database, the following adds all pages in such a loop to the map 7394 ** as individual root pages. This could be handled better. */ 7395 "WITH pages(i, maxlen) AS (" 7396 " SELECT page_count, (" 7397 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" 7398 " ) FROM pragma_page_count WHERE page_count>0" 7399 " UNION ALL" 7400 " SELECT i-1, (" 7401 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" 7402 " ) FROM pages WHERE i>=2" 7403 ")" 7404 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " 7405 " SELECT i, maxlen, NULL, (" 7406 " WITH p(orig, pgno, parent) AS (" 7407 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" 7408 " UNION " 7409 " SELECT i, p.parent, " 7410 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" 7411 " )" 7412 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" 7413 ") " 7414 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" 7415 "UPDATE recovery.map AS o SET intkey = (" 7416 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" 7417 ");" 7418 7419 /* Extract data from page 1 and any linked pages into table 7420 ** recovery.schema. With the same schema as an sqlite_schema table. */ 7421 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 7422 "INSERT INTO recovery.schema SELECT " 7423 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 7424 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 7425 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 7426 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 7427 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 7428 "FROM sqlite_dbdata WHERE pgno IN (" 7429 " SELECT pgno FROM recovery.map WHERE root=1" 7430 ")" 7431 "GROUP BY pgno, cell;" 7432 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" 7433 ); 7434 7435 /* Open a transaction, then print out all non-virtual, non-"sqlite_%" 7436 ** CREATE TABLE statements that extracted from the existing schema. */ 7437 if( rc==SQLITE_OK ){ 7438 sqlite3_stmt *pStmt = 0; 7439 /* ".recover" might output content in an order which causes immediate 7440 ** foreign key constraints to be violated. So disable foreign-key 7441 ** constraint enforcement to prevent problems when running the output 7442 ** script. */ 7443 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); 7444 raw_printf(pState->out, "BEGIN;\n"); 7445 raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); 7446 shellPrepare(pState->db, &rc, 7447 "SELECT sql FROM recovery.schema " 7448 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt 7449 ); 7450 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7451 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); 7452 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", 7453 &zCreateTable[12] 7454 ); 7455 } 7456 shellFinalize(&rc, pStmt); 7457 } 7458 7459 /* Figure out if an orphan table will be required. And if so, how many 7460 ** user columns it should contain */ 7461 shellPrepare(pState->db, &rc, 7462 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" 7463 , &pLoop 7464 ); 7465 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 7466 nOrphan = sqlite3_column_int(pLoop, 0); 7467 } 7468 shellFinalize(&rc, pLoop); 7469 pLoop = 0; 7470 7471 shellPrepare(pState->db, &rc, 7472 "SELECT pgno FROM recovery.map WHERE root=?", &pPages 7473 ); 7474 7475 shellPrepare(pState->db, &rc, 7476 "SELECT max(field), group_concat(shell_escape_crnl(quote" 7477 "(case when (? AND field<0) then NULL else value end)" 7478 "), ', ')" 7479 ", min(field) " 7480 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" 7481 "GROUP BY cell", &pCells 7482 ); 7483 7484 /* Loop through each root page. */ 7485 shellPrepare(pState->db, &rc, 7486 "SELECT root, intkey, max(maxlen) FROM recovery.map" 7487 " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" 7488 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" 7489 ")", &pLoop 7490 ); 7491 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 7492 int iRoot = sqlite3_column_int(pLoop, 0); 7493 int bIntkey = sqlite3_column_int(pLoop, 1); 7494 int nCol = sqlite3_column_int(pLoop, 2); 7495 int bNoop = 0; 7496 RecoverTable *pTab; 7497 7498 assert( bIntkey==0 || bIntkey==1 ); 7499 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); 7500 if( bNoop || rc ) continue; 7501 if( pTab==0 ){ 7502 if( pOrphan==0 ){ 7503 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 7504 } 7505 pTab = pOrphan; 7506 if( pTab==0 ) break; 7507 } 7508 7509 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ 7510 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); 7511 } 7512 sqlite3_bind_int(pPages, 1, iRoot); 7513 if( bRowids==0 && pTab->iPk<0 ){ 7514 sqlite3_bind_int(pCells, 1, 1); 7515 }else{ 7516 sqlite3_bind_int(pCells, 1, 0); 7517 } 7518 sqlite3_bind_int(pCells, 3, pTab->iPk); 7519 7520 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ 7521 int iPgno = sqlite3_column_int(pPages, 0); 7522 sqlite3_bind_int(pCells, 2, iPgno); 7523 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ 7524 int nField = sqlite3_column_int(pCells, 0); 7525 int iMin = sqlite3_column_int(pCells, 2); 7526 const char *zVal = (const char*)sqlite3_column_text(pCells, 1); 7527 7528 RecoverTable *pTab2 = pTab; 7529 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ 7530 if( pOrphan==0 ){ 7531 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 7532 } 7533 pTab2 = pOrphan; 7534 if( pTab2==0 ) break; 7535 } 7536 7537 nField = nField+1; 7538 if( pTab2==pOrphan ){ 7539 raw_printf(pState->out, 7540 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", 7541 pTab2->zQuoted, iRoot, iPgno, nField, 7542 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] 7543 ); 7544 }else{ 7545 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", 7546 pTab2->zQuoted, pTab2->azlCol[nField], zVal 7547 ); 7548 } 7549 } 7550 shellReset(&rc, pCells); 7551 } 7552 shellReset(&rc, pPages); 7553 if( pTab!=pOrphan ) recoverFreeTable(pTab); 7554 } 7555 shellFinalize(&rc, pLoop); 7556 shellFinalize(&rc, pPages); 7557 shellFinalize(&rc, pCells); 7558 recoverFreeTable(pOrphan); 7559 7560 /* The rest of the schema */ 7561 if( rc==SQLITE_OK ){ 7562 sqlite3_stmt *pStmt = 0; 7563 shellPrepare(pState->db, &rc, 7564 "SELECT sql, name FROM recovery.schema " 7565 "WHERE sql NOT LIKE 'create table%'", &pStmt 7566 ); 7567 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7568 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); 7569 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ 7570 const char *zName = (const char*)sqlite3_column_text(pStmt, 1); 7571 char *zPrint = shellMPrintf(&rc, 7572 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 7573 zName, zName, zSql 7574 ); 7575 raw_printf(pState->out, "%s;\n", zPrint); 7576 sqlite3_free(zPrint); 7577 }else{ 7578 raw_printf(pState->out, "%s;\n", zSql); 7579 } 7580 } 7581 shellFinalize(&rc, pStmt); 7582 } 7583 7584 if( rc==SQLITE_OK ){ 7585 raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); 7586 raw_printf(pState->out, "COMMIT;\n"); 7587 } 7588 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); 7589 return rc; 7590} 7591#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 7592 7593/* 7594** If an input line begins with "." then invoke this routine to 7595** process that line. 7596** 7597** Return 1 on error, 2 to exit, and 0 otherwise. 7598*/ 7599static int do_meta_command(char *zLine, ShellState *p){ 7600 int h = 1; 7601 int nArg = 0; 7602 int n, c; 7603 int rc = 0; 7604 char *azArg[52]; 7605 7606#ifndef SQLITE_OMIT_VIRTUALTABLE 7607 if( p->expert.pExpert ){ 7608 expertFinish(p, 1, 0); 7609 } 7610#endif 7611 7612 /* Parse the input line into tokens. 7613 */ 7614 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 7615 while( IsSpace(zLine[h]) ){ h++; } 7616 if( zLine[h]==0 ) break; 7617 if( zLine[h]=='\'' || zLine[h]=='"' ){ 7618 int delim = zLine[h++]; 7619 azArg[nArg++] = &zLine[h]; 7620 while( zLine[h] && zLine[h]!=delim ){ 7621 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 7622 h++; 7623 } 7624 if( zLine[h]==delim ){ 7625 zLine[h++] = 0; 7626 } 7627 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 7628 }else{ 7629 azArg[nArg++] = &zLine[h]; 7630 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 7631 if( zLine[h] ) zLine[h++] = 0; 7632 resolve_backslashes(azArg[nArg-1]); 7633 } 7634 } 7635 azArg[nArg] = 0; 7636 7637 /* Process the input line. 7638 */ 7639 if( nArg==0 ) return 0; /* no tokens, no error */ 7640 n = strlen30(azArg[0]); 7641 c = azArg[0][0]; 7642 clearTempFile(p); 7643 7644#ifndef SQLITE_OMIT_AUTHORIZATION 7645 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 7646 if( nArg!=2 ){ 7647 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 7648 rc = 1; 7649 goto meta_command_exit; 7650 } 7651 open_db(p, 0); 7652 if( booleanValue(azArg[1]) ){ 7653 sqlite3_set_authorizer(p->db, shellAuth, p); 7654 }else if( p->bSafeModePersist ){ 7655 sqlite3_set_authorizer(p->db, safeModeAuth, p); 7656 }else{ 7657 sqlite3_set_authorizer(p->db, 0, 0); 7658 } 7659 }else 7660#endif 7661 7662#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 7663 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 7664 open_db(p, 0); 7665 failIfSafeMode(p, "cannot run .archive in safe mode"); 7666 rc = arDotCommand(p, 0, azArg, nArg); 7667 }else 7668#endif 7669 7670 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 7671 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 7672 ){ 7673 const char *zDestFile = 0; 7674 const char *zDb = 0; 7675 sqlite3 *pDest; 7676 sqlite3_backup *pBackup; 7677 int j; 7678 int bAsync = 0; 7679 const char *zVfs = 0; 7680 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 7681 for(j=1; j<nArg; j++){ 7682 const char *z = azArg[j]; 7683 if( z[0]=='-' ){ 7684 if( z[1]=='-' ) z++; 7685 if( strcmp(z, "-append")==0 ){ 7686 zVfs = "apndvfs"; 7687 }else 7688 if( strcmp(z, "-async")==0 ){ 7689 bAsync = 1; 7690 }else 7691 { 7692 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 7693 return 1; 7694 } 7695 }else if( zDestFile==0 ){ 7696 zDestFile = azArg[j]; 7697 }else if( zDb==0 ){ 7698 zDb = zDestFile; 7699 zDestFile = azArg[j]; 7700 }else{ 7701 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 7702 return 1; 7703 } 7704 } 7705 if( zDestFile==0 ){ 7706 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 7707 return 1; 7708 } 7709 if( zDb==0 ) zDb = "main"; 7710 rc = sqlite3_open_v2(zDestFile, &pDest, 7711 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 7712 if( rc!=SQLITE_OK ){ 7713 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 7714 close_db(pDest); 7715 return 1; 7716 } 7717 if( bAsync ){ 7718 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 7719 0, 0, 0); 7720 } 7721 open_db(p, 0); 7722 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 7723 if( pBackup==0 ){ 7724 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 7725 close_db(pDest); 7726 return 1; 7727 } 7728 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 7729 sqlite3_backup_finish(pBackup); 7730 if( rc==SQLITE_DONE ){ 7731 rc = 0; 7732 }else{ 7733 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 7734 rc = 1; 7735 } 7736 close_db(pDest); 7737 }else 7738 7739 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 7740 if( nArg==2 ){ 7741 bail_on_error = booleanValue(azArg[1]); 7742 }else{ 7743 raw_printf(stderr, "Usage: .bail on|off\n"); 7744 rc = 1; 7745 } 7746 }else 7747 7748 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 7749 if( nArg==2 ){ 7750 if( booleanValue(azArg[1]) ){ 7751 setBinaryMode(p->out, 1); 7752 }else{ 7753 setTextMode(p->out, 1); 7754 } 7755 }else{ 7756 raw_printf(stderr, "Usage: .binary on|off\n"); 7757 rc = 1; 7758 } 7759 }else 7760 7761 /* The undocumented ".breakpoint" command causes a call to the no-op 7762 ** routine named test_breakpoint(). 7763 */ 7764 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 7765 test_breakpoint(); 7766 }else 7767 7768 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 7769 failIfSafeMode(p, "cannot run .cd in safe mode"); 7770 if( nArg==2 ){ 7771#if defined(_WIN32) || defined(WIN32) 7772 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 7773 rc = !SetCurrentDirectoryW(z); 7774 sqlite3_free(z); 7775#else 7776 rc = chdir(azArg[1]); 7777#endif 7778 if( rc ){ 7779 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 7780 rc = 1; 7781 } 7782 }else{ 7783 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 7784 rc = 1; 7785 } 7786 }else 7787 7788 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 7789 if( nArg==2 ){ 7790 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 7791 }else{ 7792 raw_printf(stderr, "Usage: .changes on|off\n"); 7793 rc = 1; 7794 } 7795 }else 7796 7797 /* Cancel output redirection, if it is currently set (by .testcase) 7798 ** Then read the content of the testcase-out.txt file and compare against 7799 ** azArg[1]. If there are differences, report an error and exit. 7800 */ 7801 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 7802 char *zRes = 0; 7803 output_reset(p); 7804 if( nArg!=2 ){ 7805 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 7806 rc = 2; 7807 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 7808 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 7809 rc = 2; 7810 }else if( testcase_glob(azArg[1],zRes)==0 ){ 7811 utf8_printf(stderr, 7812 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 7813 p->zTestcase, azArg[1], zRes); 7814 rc = 1; 7815 }else{ 7816 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 7817 p->nCheck++; 7818 } 7819 sqlite3_free(zRes); 7820 }else 7821 7822 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 7823 failIfSafeMode(p, "cannot run .clone in safe mode"); 7824 if( nArg==2 ){ 7825 tryToClone(p, azArg[1]); 7826 }else{ 7827 raw_printf(stderr, "Usage: .clone FILENAME\n"); 7828 rc = 1; 7829 } 7830 }else 7831 7832 if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){ 7833 if( nArg==1 ){ 7834 /* List available connections */ 7835 int i; 7836 for(i=0; i<ArraySize(p->aAuxDb); i++){ 7837 const char *zFile = p->aAuxDb[i].zDbFilename; 7838 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){ 7839 zFile = "(not open)"; 7840 }else if( zFile==0 ){ 7841 zFile = "(memory)"; 7842 }else if( zFile[0]==0 ){ 7843 zFile = "(temporary-file)"; 7844 } 7845 if( p->pAuxDb == &p->aAuxDb[i] ){ 7846 utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile); 7847 }else if( p->aAuxDb[i].db!=0 ){ 7848 utf8_printf(stdout, " %d: %s\n", i, zFile); 7849 } 7850 } 7851 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){ 7852 int i = azArg[1][0] - '0'; 7853 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){ 7854 p->pAuxDb->db = p->db; 7855 p->pAuxDb = &p->aAuxDb[i]; 7856 globalDb = p->db = p->pAuxDb->db; 7857 p->pAuxDb->db = 0; 7858 } 7859 }else if( nArg==3 && strcmp(azArg[1], "close")==0 7860 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){ 7861 int i = azArg[2][0] - '0'; 7862 if( i<0 || i>=ArraySize(p->aAuxDb) ){ 7863 /* No-op */ 7864 }else if( p->pAuxDb == &p->aAuxDb[i] ){ 7865 raw_printf(stderr, "cannot close the active database connection\n"); 7866 rc = 1; 7867 }else if( p->aAuxDb[i].db ){ 7868 session_close_all(p, i); 7869 close_db(p->aAuxDb[i].db); 7870 p->aAuxDb[i].db = 0; 7871 } 7872 }else{ 7873 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n"); 7874 rc = 1; 7875 } 7876 }else 7877 7878 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 7879 char **azName = 0; 7880 int nName = 0; 7881 sqlite3_stmt *pStmt; 7882 int i; 7883 open_db(p, 0); 7884 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 7885 if( rc ){ 7886 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 7887 rc = 1; 7888 }else{ 7889 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 7890 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1); 7891 const char *zFile = (const char*)sqlite3_column_text(pStmt,2); 7892 if( zSchema==0 || zFile==0 ) continue; 7893 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 7894 shell_check_oom(azName); 7895 azName[nName*2] = strdup(zSchema); 7896 azName[nName*2+1] = strdup(zFile); 7897 nName++; 7898 } 7899 } 7900 sqlite3_finalize(pStmt); 7901 for(i=0; i<nName; i++){ 7902 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 7903 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 7904 const char *z = azName[i*2+1]; 7905 utf8_printf(p->out, "%s: %s %s%s\n", 7906 azName[i*2], 7907 z && z[0] ? z : "\"\"", 7908 bRdonly ? "r/o" : "r/w", 7909 eTxn==SQLITE_TXN_NONE ? "" : 7910 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 7911 free(azName[i*2]); 7912 free(azName[i*2+1]); 7913 } 7914 sqlite3_free(azName); 7915 }else 7916 7917 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 7918 static const struct DbConfigChoices { 7919 const char *zName; 7920 int op; 7921 } aDbConfig[] = { 7922 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 7923 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 7924 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 7925 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 7926 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 7927 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 7928 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 7929 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 7930 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 7931 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 7932 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 7933 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 7934 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 7935 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 7936 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 7937 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 7938 }; 7939 int ii, v; 7940 open_db(p, 0); 7941 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 7942 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 7943 if( nArg>=3 ){ 7944 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 7945 } 7946 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 7947 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 7948 if( nArg>1 ) break; 7949 } 7950 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 7951 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 7952 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 7953 } 7954 }else 7955 7956 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 7957 rc = shell_dbinfo_command(p, nArg, azArg); 7958 }else 7959 7960#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 7961 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 7962 open_db(p, 0); 7963 rc = recoverDatabaseCmd(p, nArg, azArg); 7964 }else 7965#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 7966 7967 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 7968 char *zLike = 0; 7969 char *zSql; 7970 int i; 7971 int savedShowHeader = p->showHeader; 7972 int savedShellFlags = p->shellFlgs; 7973 ShellClearFlag(p, 7974 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 7975 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 7976 for(i=1; i<nArg; i++){ 7977 if( azArg[i][0]=='-' ){ 7978 const char *z = azArg[i]+1; 7979 if( z[0]=='-' ) z++; 7980 if( strcmp(z,"preserve-rowids")==0 ){ 7981#ifdef SQLITE_OMIT_VIRTUALTABLE 7982 raw_printf(stderr, "The --preserve-rowids option is not compatible" 7983 " with SQLITE_OMIT_VIRTUALTABLE\n"); 7984 rc = 1; 7985 sqlite3_free(zLike); 7986 goto meta_command_exit; 7987#else 7988 ShellSetFlag(p, SHFLG_PreserveRowid); 7989#endif 7990 }else 7991 if( strcmp(z,"newlines")==0 ){ 7992 ShellSetFlag(p, SHFLG_Newlines); 7993 }else 7994 if( strcmp(z,"data-only")==0 ){ 7995 ShellSetFlag(p, SHFLG_DumpDataOnly); 7996 }else 7997 if( strcmp(z,"nosys")==0 ){ 7998 ShellSetFlag(p, SHFLG_DumpNoSys); 7999 }else 8000 { 8001 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 8002 rc = 1; 8003 sqlite3_free(zLike); 8004 goto meta_command_exit; 8005 } 8006 }else{ 8007 /* azArg[i] contains a LIKE pattern. This ".dump" request should 8008 ** only dump data for tables for which either the table name matches 8009 ** the LIKE pattern, or the table appears to be a shadow table of 8010 ** a virtual table for which the name matches the LIKE pattern. 8011 */ 8012 char *zExpr = sqlite3_mprintf( 8013 "name LIKE %Q ESCAPE '\\' OR EXISTS (" 8014 " SELECT 1 FROM sqlite_schema WHERE " 8015 " name LIKE %Q ESCAPE '\\' AND" 8016 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" 8017 " substr(o.name, 1, length(name)+1) == (name||'_')" 8018 ")", azArg[i], azArg[i] 8019 ); 8020 8021 if( zLike ){ 8022 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); 8023 }else{ 8024 zLike = zExpr; 8025 } 8026 } 8027 } 8028 8029 open_db(p, 0); 8030 8031 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8032 /* When playing back a "dump", the content might appear in an order 8033 ** which causes immediate foreign key constraints to be violated. 8034 ** So disable foreign-key constraint enforcement to prevent problems. */ 8035 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 8036 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 8037 } 8038 p->writableSchema = 0; 8039 p->showHeader = 0; 8040 /* Set writable_schema=ON since doing so forces SQLite to initialize 8041 ** as much of the schema as it can even if the sqlite_schema table is 8042 ** corrupt. */ 8043 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 8044 p->nErr = 0; 8045 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 8046 zSql = sqlite3_mprintf( 8047 "SELECT name, type, sql FROM sqlite_schema AS o " 8048 "WHERE (%s) AND type=='table'" 8049 " AND sql NOT NULL" 8050 " ORDER BY tbl_name='sqlite_sequence', rowid", 8051 zLike 8052 ); 8053 run_schema_dump_query(p,zSql); 8054 sqlite3_free(zSql); 8055 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8056 zSql = sqlite3_mprintf( 8057 "SELECT sql FROM sqlite_schema AS o " 8058 "WHERE (%s) AND sql NOT NULL" 8059 " AND type IN ('index','trigger','view')", 8060 zLike 8061 ); 8062 run_table_dump_query(p, zSql); 8063 sqlite3_free(zSql); 8064 } 8065 sqlite3_free(zLike); 8066 if( p->writableSchema ){ 8067 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 8068 p->writableSchema = 0; 8069 } 8070 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 8071 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 8072 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8073 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 8074 } 8075 p->showHeader = savedShowHeader; 8076 p->shellFlgs = savedShellFlags; 8077 }else 8078 8079 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 8080 if( nArg==2 ){ 8081 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 8082 }else{ 8083 raw_printf(stderr, "Usage: .echo on|off\n"); 8084 rc = 1; 8085 } 8086 }else 8087 8088 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 8089 if( nArg==2 ){ 8090 p->autoEQPtest = 0; 8091 if( p->autoEQPtrace ){ 8092 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 8093 p->autoEQPtrace = 0; 8094 } 8095 if( strcmp(azArg[1],"full")==0 ){ 8096 p->autoEQP = AUTOEQP_full; 8097 }else if( strcmp(azArg[1],"trigger")==0 ){ 8098 p->autoEQP = AUTOEQP_trigger; 8099#ifdef SQLITE_DEBUG 8100 }else if( strcmp(azArg[1],"test")==0 ){ 8101 p->autoEQP = AUTOEQP_on; 8102 p->autoEQPtest = 1; 8103 }else if( strcmp(azArg[1],"trace")==0 ){ 8104 p->autoEQP = AUTOEQP_full; 8105 p->autoEQPtrace = 1; 8106 open_db(p, 0); 8107 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 8108 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 8109#endif 8110 }else{ 8111 p->autoEQP = (u8)booleanValue(azArg[1]); 8112 } 8113 }else{ 8114 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 8115 rc = 1; 8116 } 8117 }else 8118 8119 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 8120 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 8121 rc = 2; 8122 }else 8123 8124 /* The ".explain" command is automatic now. It is largely pointless. It 8125 ** retained purely for backwards compatibility */ 8126 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 8127 int val = 1; 8128 if( nArg>=2 ){ 8129 if( strcmp(azArg[1],"auto")==0 ){ 8130 val = 99; 8131 }else{ 8132 val = booleanValue(azArg[1]); 8133 } 8134 } 8135 if( val==1 && p->mode!=MODE_Explain ){ 8136 p->normalMode = p->mode; 8137 p->mode = MODE_Explain; 8138 p->autoExplain = 0; 8139 }else if( val==0 ){ 8140 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8141 p->autoExplain = 0; 8142 }else if( val==99 ){ 8143 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8144 p->autoExplain = 1; 8145 } 8146 }else 8147 8148#ifndef SQLITE_OMIT_VIRTUALTABLE 8149 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 8150 if( p->bSafeMode ){ 8151 raw_printf(stderr, 8152 "Cannot run experimental commands such as \"%s\" in safe mode\n", 8153 azArg[0]); 8154 rc = 1; 8155 }else{ 8156 open_db(p, 0); 8157 expertDotCommand(p, azArg, nArg); 8158 } 8159 }else 8160#endif 8161 8162 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 8163 static const struct { 8164 const char *zCtrlName; /* Name of a test-control option */ 8165 int ctrlCode; /* Integer code for that option */ 8166 const char *zUsage; /* Usage notes */ 8167 } aCtrl[] = { 8168 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 8169 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" }, 8170 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 8171 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 8172 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 8173 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 8174 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 8175 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 8176 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 8177 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 8178 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 8179 }; 8180 int filectrl = -1; 8181 int iCtrl = -1; 8182 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 8183 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 8184 int n2, i; 8185 const char *zCmd = 0; 8186 const char *zSchema = 0; 8187 8188 open_db(p, 0); 8189 zCmd = nArg>=2 ? azArg[1] : "help"; 8190 8191 if( zCmd[0]=='-' 8192 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 8193 && nArg>=4 8194 ){ 8195 zSchema = azArg[2]; 8196 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 8197 nArg -= 2; 8198 zCmd = azArg[1]; 8199 } 8200 8201 /* The argument can optionally begin with "-" or "--" */ 8202 if( zCmd[0]=='-' && zCmd[1] ){ 8203 zCmd++; 8204 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 8205 } 8206 8207 /* --help lists all file-controls */ 8208 if( strcmp(zCmd,"help")==0 ){ 8209 utf8_printf(p->out, "Available file-controls:\n"); 8210 for(i=0; i<ArraySize(aCtrl); i++){ 8211 utf8_printf(p->out, " .filectrl %s %s\n", 8212 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 8213 } 8214 rc = 1; 8215 goto meta_command_exit; 8216 } 8217 8218 /* convert filectrl text option to value. allow any unique prefix 8219 ** of the option name, or a numerical value. */ 8220 n2 = strlen30(zCmd); 8221 for(i=0; i<ArraySize(aCtrl); i++){ 8222 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 8223 if( filectrl<0 ){ 8224 filectrl = aCtrl[i].ctrlCode; 8225 iCtrl = i; 8226 }else{ 8227 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 8228 "Use \".filectrl --help\" for help\n", zCmd); 8229 rc = 1; 8230 goto meta_command_exit; 8231 } 8232 } 8233 } 8234 if( filectrl<0 ){ 8235 utf8_printf(stderr,"Error: unknown file-control: %s\n" 8236 "Use \".filectrl --help\" for help\n", zCmd); 8237 }else{ 8238 switch(filectrl){ 8239 case SQLITE_FCNTL_SIZE_LIMIT: { 8240 if( nArg!=2 && nArg!=3 ) break; 8241 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 8242 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 8243 isOk = 1; 8244 break; 8245 } 8246 case SQLITE_FCNTL_LOCK_TIMEOUT: 8247 case SQLITE_FCNTL_CHUNK_SIZE: { 8248 int x; 8249 if( nArg!=3 ) break; 8250 x = (int)integerValue(azArg[2]); 8251 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8252 isOk = 2; 8253 break; 8254 } 8255 case SQLITE_FCNTL_PERSIST_WAL: 8256 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 8257 int x; 8258 if( nArg!=2 && nArg!=3 ) break; 8259 x = nArg==3 ? booleanValue(azArg[2]) : -1; 8260 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8261 iRes = x; 8262 isOk = 1; 8263 break; 8264 } 8265 case SQLITE_FCNTL_DATA_VERSION: 8266 case SQLITE_FCNTL_HAS_MOVED: { 8267 int x; 8268 if( nArg!=2 ) break; 8269 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8270 iRes = x; 8271 isOk = 1; 8272 break; 8273 } 8274 case SQLITE_FCNTL_TEMPFILENAME: { 8275 char *z = 0; 8276 if( nArg!=2 ) break; 8277 sqlite3_file_control(p->db, zSchema, filectrl, &z); 8278 if( z ){ 8279 utf8_printf(p->out, "%s\n", z); 8280 sqlite3_free(z); 8281 } 8282 isOk = 2; 8283 break; 8284 } 8285 case SQLITE_FCNTL_RESERVE_BYTES: { 8286 int x; 8287 if( nArg>=3 ){ 8288 x = atoi(azArg[2]); 8289 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8290 } 8291 x = -1; 8292 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8293 utf8_printf(p->out,"%d\n", x); 8294 isOk = 2; 8295 break; 8296 } 8297 } 8298 } 8299 if( isOk==0 && iCtrl>=0 ){ 8300 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 8301 rc = 1; 8302 }else if( isOk==1 ){ 8303 char zBuf[100]; 8304 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 8305 raw_printf(p->out, "%s\n", zBuf); 8306 } 8307 }else 8308 8309 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 8310 ShellState data; 8311 int doStats = 0; 8312 memcpy(&data, p, sizeof(data)); 8313 data.showHeader = 0; 8314 data.cMode = data.mode = MODE_Semi; 8315 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 8316 data.cMode = data.mode = MODE_Pretty; 8317 nArg = 1; 8318 } 8319 if( nArg!=1 ){ 8320 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 8321 rc = 1; 8322 goto meta_command_exit; 8323 } 8324 open_db(p, 0); 8325 rc = sqlite3_exec(p->db, 8326 "SELECT sql FROM" 8327 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 8328 " FROM sqlite_schema UNION ALL" 8329 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 8330 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 8331 "ORDER BY x", 8332 callback, &data, 0 8333 ); 8334 if( rc==SQLITE_OK ){ 8335 sqlite3_stmt *pStmt; 8336 rc = sqlite3_prepare_v2(p->db, 8337 "SELECT rowid FROM sqlite_schema" 8338 " WHERE name GLOB 'sqlite_stat[134]'", 8339 -1, &pStmt, 0); 8340 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 8341 sqlite3_finalize(pStmt); 8342 } 8343 if( doStats==0 ){ 8344 raw_printf(p->out, "/* No STAT tables available */\n"); 8345 }else{ 8346 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8347 data.cMode = data.mode = MODE_Insert; 8348 data.zDestTable = "sqlite_stat1"; 8349 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); 8350 data.zDestTable = "sqlite_stat4"; 8351 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0); 8352 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8353 } 8354 }else 8355 8356 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 8357 if( nArg==2 ){ 8358 p->showHeader = booleanValue(azArg[1]); 8359 p->shellFlgs |= SHFLG_HeaderSet; 8360 }else{ 8361 raw_printf(stderr, "Usage: .headers on|off\n"); 8362 rc = 1; 8363 } 8364 }else 8365 8366 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 8367 if( nArg>=2 ){ 8368 n = showHelp(p->out, azArg[1]); 8369 if( n==0 ){ 8370 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 8371 } 8372 }else{ 8373 showHelp(p->out, 0); 8374 } 8375 }else 8376 8377 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 8378 char *zTable = 0; /* Insert data into this table */ 8379 char *zFile = 0; /* Name of file to extra content from */ 8380 sqlite3_stmt *pStmt = NULL; /* A statement */ 8381 int nCol; /* Number of columns in the table */ 8382 int nByte; /* Number of bytes in an SQL string */ 8383 int i, j; /* Loop counters */ 8384 int needCommit; /* True to COMMIT or ROLLBACK at end */ 8385 int nSep; /* Number of bytes in p->colSeparator[] */ 8386 char *zSql; /* An SQL statement */ 8387 ImportCtx sCtx; /* Reader context */ 8388 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 8389 int eVerbose = 0; /* Larger for more console output */ 8390 int nSkip = 0; /* Initial lines to skip */ 8391 int useOutputMode = 1; /* Use output mode to determine separators */ 8392 8393 failIfSafeMode(p, "cannot run .import in safe mode"); 8394 memset(&sCtx, 0, sizeof(sCtx)); 8395 sCtx.z = sqlite3_malloc64(120); 8396 if( sCtx.z==0 ){ 8397 import_cleanup(&sCtx); 8398 shell_out_of_memory(); 8399 } 8400 if( p->mode==MODE_Ascii ){ 8401 xRead = ascii_read_one_field; 8402 }else{ 8403 xRead = csv_read_one_field; 8404 } 8405 for(i=1; i<nArg; i++){ 8406 char *z = azArg[i]; 8407 if( z[0]=='-' && z[1]=='-' ) z++; 8408 if( z[0]!='-' ){ 8409 if( zFile==0 ){ 8410 zFile = z; 8411 }else if( zTable==0 ){ 8412 zTable = z; 8413 }else{ 8414 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 8415 showHelp(p->out, "import"); 8416 rc = 1; 8417 goto meta_command_exit; 8418 } 8419 }else if( strcmp(z,"-v")==0 ){ 8420 eVerbose++; 8421 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 8422 nSkip = integerValue(azArg[++i]); 8423 }else if( strcmp(z,"-ascii")==0 ){ 8424 sCtx.cColSep = SEP_Unit[0]; 8425 sCtx.cRowSep = SEP_Record[0]; 8426 xRead = ascii_read_one_field; 8427 useOutputMode = 0; 8428 }else if( strcmp(z,"-csv")==0 ){ 8429 sCtx.cColSep = ','; 8430 sCtx.cRowSep = '\n'; 8431 xRead = csv_read_one_field; 8432 useOutputMode = 0; 8433 }else{ 8434 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 8435 showHelp(p->out, "import"); 8436 rc = 1; 8437 goto meta_command_exit; 8438 } 8439 } 8440 if( zTable==0 ){ 8441 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 8442 zFile==0 ? "FILE" : "TABLE"); 8443 showHelp(p->out, "import"); 8444 rc = 1; 8445 goto meta_command_exit; 8446 } 8447 seenInterrupt = 0; 8448 open_db(p, 0); 8449 if( useOutputMode ){ 8450 /* If neither the --csv or --ascii options are specified, then set 8451 ** the column and row separator characters from the output mode. */ 8452 nSep = strlen30(p->colSeparator); 8453 if( nSep==0 ){ 8454 raw_printf(stderr, 8455 "Error: non-null column separator required for import\n"); 8456 rc = 1; 8457 goto meta_command_exit; 8458 } 8459 if( nSep>1 ){ 8460 raw_printf(stderr, 8461 "Error: multi-character column separators not allowed" 8462 " for import\n"); 8463 rc = 1; 8464 goto meta_command_exit; 8465 } 8466 nSep = strlen30(p->rowSeparator); 8467 if( nSep==0 ){ 8468 raw_printf(stderr, 8469 "Error: non-null row separator required for import\n"); 8470 rc = 1; 8471 goto meta_command_exit; 8472 } 8473 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 8474 /* When importing CSV (only), if the row separator is set to the 8475 ** default output row separator, change it to the default input 8476 ** row separator. This avoids having to maintain different input 8477 ** and output row separators. */ 8478 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8479 nSep = strlen30(p->rowSeparator); 8480 } 8481 if( nSep>1 ){ 8482 raw_printf(stderr, "Error: multi-character row separators not allowed" 8483 " for import\n"); 8484 rc = 1; 8485 goto meta_command_exit; 8486 } 8487 sCtx.cColSep = p->colSeparator[0]; 8488 sCtx.cRowSep = p->rowSeparator[0]; 8489 } 8490 sCtx.zFile = zFile; 8491 sCtx.nLine = 1; 8492 if( sCtx.zFile[0]=='|' ){ 8493#ifdef SQLITE_OMIT_POPEN 8494 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 8495 rc = 1; 8496 goto meta_command_exit; 8497#else 8498 sCtx.in = popen(sCtx.zFile+1, "r"); 8499 sCtx.zFile = "<pipe>"; 8500 sCtx.xCloser = pclose; 8501#endif 8502 }else{ 8503 sCtx.in = fopen(sCtx.zFile, "rb"); 8504 sCtx.xCloser = fclose; 8505 } 8506 if( sCtx.in==0 ){ 8507 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 8508 rc = 1; 8509 import_cleanup(&sCtx); 8510 goto meta_command_exit; 8511 } 8512 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 8513 char zSep[2]; 8514 zSep[1] = 0; 8515 zSep[0] = sCtx.cColSep; 8516 utf8_printf(p->out, "Column separator "); 8517 output_c_string(p->out, zSep); 8518 utf8_printf(p->out, ", row separator "); 8519 zSep[0] = sCtx.cRowSep; 8520 output_c_string(p->out, zSep); 8521 utf8_printf(p->out, "\n"); 8522 } 8523 while( (nSkip--)>0 ){ 8524 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 8525 } 8526 zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 8527 if( zSql==0 ){ 8528 import_cleanup(&sCtx); 8529 shell_out_of_memory(); 8530 } 8531 nByte = strlen30(zSql); 8532 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8533 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 8534 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 8535 char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable); 8536 char cSep = '('; 8537 while( xRead(&sCtx) ){ 8538 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 8539 cSep = ','; 8540 if( sCtx.cTerm!=sCtx.cColSep ) break; 8541 } 8542 if( cSep=='(' ){ 8543 sqlite3_free(zCreate); 8544 import_cleanup(&sCtx); 8545 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 8546 rc = 1; 8547 goto meta_command_exit; 8548 } 8549 zCreate = sqlite3_mprintf("%z\n)", zCreate); 8550 if( eVerbose>=1 ){ 8551 utf8_printf(p->out, "%s\n", zCreate); 8552 } 8553 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 8554 sqlite3_free(zCreate); 8555 if( rc ){ 8556 utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable, 8557 sqlite3_errmsg(p->db)); 8558 import_cleanup(&sCtx); 8559 rc = 1; 8560 goto meta_command_exit; 8561 } 8562 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8563 } 8564 sqlite3_free(zSql); 8565 if( rc ){ 8566 if (pStmt) sqlite3_finalize(pStmt); 8567 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 8568 import_cleanup(&sCtx); 8569 rc = 1; 8570 goto meta_command_exit; 8571 } 8572 nCol = sqlite3_column_count(pStmt); 8573 sqlite3_finalize(pStmt); 8574 pStmt = 0; 8575 if( nCol==0 ) return 0; /* no columns, no error */ 8576 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 8577 if( zSql==0 ){ 8578 import_cleanup(&sCtx); 8579 shell_out_of_memory(); 8580 } 8581 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 8582 j = strlen30(zSql); 8583 for(i=1; i<nCol; i++){ 8584 zSql[j++] = ','; 8585 zSql[j++] = '?'; 8586 } 8587 zSql[j++] = ')'; 8588 zSql[j] = 0; 8589 if( eVerbose>=2 ){ 8590 utf8_printf(p->out, "Insert using: %s\n", zSql); 8591 } 8592 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8593 sqlite3_free(zSql); 8594 if( rc ){ 8595 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 8596 if (pStmt) sqlite3_finalize(pStmt); 8597 import_cleanup(&sCtx); 8598 rc = 1; 8599 goto meta_command_exit; 8600 } 8601 needCommit = sqlite3_get_autocommit(p->db); 8602 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 8603 do{ 8604 int startLine = sCtx.nLine; 8605 for(i=0; i<nCol; i++){ 8606 char *z = xRead(&sCtx); 8607 /* 8608 ** Did we reach end-of-file before finding any columns? 8609 ** If so, stop instead of NULL filling the remaining columns. 8610 */ 8611 if( z==0 && i==0 ) break; 8612 /* 8613 ** Did we reach end-of-file OR end-of-line before finding any 8614 ** columns in ASCII mode? If so, stop instead of NULL filling 8615 ** the remaining columns. 8616 */ 8617 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 8618 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 8619 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 8620 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 8621 "filling the rest with NULL\n", 8622 sCtx.zFile, startLine, nCol, i+1); 8623 i += 2; 8624 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 8625 } 8626 } 8627 if( sCtx.cTerm==sCtx.cColSep ){ 8628 do{ 8629 xRead(&sCtx); 8630 i++; 8631 }while( sCtx.cTerm==sCtx.cColSep ); 8632 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 8633 "extras ignored\n", 8634 sCtx.zFile, startLine, nCol, i); 8635 } 8636 if( i>=nCol ){ 8637 sqlite3_step(pStmt); 8638 rc = sqlite3_reset(pStmt); 8639 if( rc!=SQLITE_OK ){ 8640 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 8641 startLine, sqlite3_errmsg(p->db)); 8642 sCtx.nErr++; 8643 }else{ 8644 sCtx.nRow++; 8645 } 8646 } 8647 }while( sCtx.cTerm!=EOF ); 8648 8649 import_cleanup(&sCtx); 8650 sqlite3_finalize(pStmt); 8651 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 8652 if( eVerbose>0 ){ 8653 utf8_printf(p->out, 8654 "Added %d rows with %d errors using %d lines of input\n", 8655 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 8656 } 8657 }else 8658 8659#ifndef SQLITE_UNTESTABLE 8660 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 8661 char *zSql; 8662 char *zCollist = 0; 8663 sqlite3_stmt *pStmt; 8664 int tnum = 0; 8665 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 8666 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 8667 int i; 8668 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 8669 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 8670 " .imposter off\n"); 8671 /* Also allowed, but not documented: 8672 ** 8673 ** .imposter TABLE IMPOSTER 8674 ** 8675 ** where TABLE is a WITHOUT ROWID table. In that case, the 8676 ** imposter is another WITHOUT ROWID table with the columns in 8677 ** storage order. */ 8678 rc = 1; 8679 goto meta_command_exit; 8680 } 8681 open_db(p, 0); 8682 if( nArg==2 ){ 8683 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 8684 goto meta_command_exit; 8685 } 8686 zSql = sqlite3_mprintf( 8687 "SELECT rootpage, 0 FROM sqlite_schema" 8688 " WHERE name='%q' AND type='index'" 8689 "UNION ALL " 8690 "SELECT rootpage, 1 FROM sqlite_schema" 8691 " WHERE name='%q' AND type='table'" 8692 " AND sql LIKE '%%without%%rowid%%'", 8693 azArg[1], azArg[1] 8694 ); 8695 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8696 sqlite3_free(zSql); 8697 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 8698 tnum = sqlite3_column_int(pStmt, 0); 8699 isWO = sqlite3_column_int(pStmt, 1); 8700 } 8701 sqlite3_finalize(pStmt); 8702 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 8703 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8704 sqlite3_free(zSql); 8705 i = 0; 8706 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 8707 char zLabel[20]; 8708 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 8709 i++; 8710 if( zCol==0 ){ 8711 if( sqlite3_column_int(pStmt,1)==-1 ){ 8712 zCol = "_ROWID_"; 8713 }else{ 8714 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 8715 zCol = zLabel; 8716 } 8717 } 8718 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 8719 lenPK = (int)strlen(zCollist); 8720 } 8721 if( zCollist==0 ){ 8722 zCollist = sqlite3_mprintf("\"%w\"", zCol); 8723 }else{ 8724 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 8725 } 8726 } 8727 sqlite3_finalize(pStmt); 8728 if( i==0 || tnum==0 ){ 8729 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 8730 rc = 1; 8731 sqlite3_free(zCollist); 8732 goto meta_command_exit; 8733 } 8734 if( lenPK==0 ) lenPK = 100000; 8735 zSql = sqlite3_mprintf( 8736 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 8737 azArg[2], zCollist, lenPK, zCollist); 8738 sqlite3_free(zCollist); 8739 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 8740 if( rc==SQLITE_OK ){ 8741 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 8742 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 8743 if( rc ){ 8744 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 8745 }else{ 8746 utf8_printf(stdout, "%s;\n", zSql); 8747 raw_printf(stdout, 8748 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 8749 azArg[1], isWO ? "table" : "index" 8750 ); 8751 } 8752 }else{ 8753 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 8754 rc = 1; 8755 } 8756 sqlite3_free(zSql); 8757 }else 8758#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 8759 8760#ifdef SQLITE_ENABLE_IOTRACE 8761 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 8762 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 8763 if( iotrace && iotrace!=stdout ) fclose(iotrace); 8764 iotrace = 0; 8765 if( nArg<2 ){ 8766 sqlite3IoTrace = 0; 8767 }else if( strcmp(azArg[1], "-")==0 ){ 8768 sqlite3IoTrace = iotracePrintf; 8769 iotrace = stdout; 8770 }else{ 8771 iotrace = fopen(azArg[1], "w"); 8772 if( iotrace==0 ){ 8773 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 8774 sqlite3IoTrace = 0; 8775 rc = 1; 8776 }else{ 8777 sqlite3IoTrace = iotracePrintf; 8778 } 8779 } 8780 }else 8781#endif 8782 8783 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 8784 static const struct { 8785 const char *zLimitName; /* Name of a limit */ 8786 int limitCode; /* Integer code for that limit */ 8787 } aLimit[] = { 8788 { "length", SQLITE_LIMIT_LENGTH }, 8789 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 8790 { "column", SQLITE_LIMIT_COLUMN }, 8791 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 8792 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 8793 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 8794 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 8795 { "attached", SQLITE_LIMIT_ATTACHED }, 8796 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 8797 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 8798 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 8799 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 8800 }; 8801 int i, n2; 8802 open_db(p, 0); 8803 if( nArg==1 ){ 8804 for(i=0; i<ArraySize(aLimit); i++){ 8805 printf("%20s %d\n", aLimit[i].zLimitName, 8806 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 8807 } 8808 }else if( nArg>3 ){ 8809 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 8810 rc = 1; 8811 goto meta_command_exit; 8812 }else{ 8813 int iLimit = -1; 8814 n2 = strlen30(azArg[1]); 8815 for(i=0; i<ArraySize(aLimit); i++){ 8816 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 8817 if( iLimit<0 ){ 8818 iLimit = i; 8819 }else{ 8820 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 8821 rc = 1; 8822 goto meta_command_exit; 8823 } 8824 } 8825 } 8826 if( iLimit<0 ){ 8827 utf8_printf(stderr, "unknown limit: \"%s\"\n" 8828 "enter \".limits\" with no arguments for a list.\n", 8829 azArg[1]); 8830 rc = 1; 8831 goto meta_command_exit; 8832 } 8833 if( nArg==3 ){ 8834 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 8835 (int)integerValue(azArg[2])); 8836 } 8837 printf("%20s %d\n", aLimit[iLimit].zLimitName, 8838 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 8839 } 8840 }else 8841 8842 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 8843 open_db(p, 0); 8844 lintDotCommand(p, azArg, nArg); 8845 }else 8846 8847#ifndef SQLITE_OMIT_LOAD_EXTENSION 8848 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 8849 const char *zFile, *zProc; 8850 char *zErrMsg = 0; 8851 failIfSafeMode(p, "cannot run .load in safe mode"); 8852 if( nArg<2 ){ 8853 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 8854 rc = 1; 8855 goto meta_command_exit; 8856 } 8857 zFile = azArg[1]; 8858 zProc = nArg>=3 ? azArg[2] : 0; 8859 open_db(p, 0); 8860 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 8861 if( rc!=SQLITE_OK ){ 8862 utf8_printf(stderr, "Error: %s\n", zErrMsg); 8863 sqlite3_free(zErrMsg); 8864 rc = 1; 8865 } 8866 }else 8867#endif 8868 8869 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 8870 failIfSafeMode(p, "cannot run .log in safe mode"); 8871 if( nArg!=2 ){ 8872 raw_printf(stderr, "Usage: .log FILENAME\n"); 8873 rc = 1; 8874 }else{ 8875 const char *zFile = azArg[1]; 8876 output_file_close(p->pLog); 8877 p->pLog = output_file_open(zFile, 0); 8878 } 8879 }else 8880 8881 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 8882 const char *zMode = nArg>=2 ? azArg[1] : ""; 8883 int n2 = strlen30(zMode); 8884 int c2 = zMode[0]; 8885 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 8886 p->mode = MODE_Line; 8887 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8888 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 8889 p->mode = MODE_Column; 8890 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 8891 p->showHeader = 1; 8892 } 8893 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8894 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 8895 p->mode = MODE_List; 8896 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 8897 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8898 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 8899 p->mode = MODE_Html; 8900 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 8901 p->mode = MODE_Tcl; 8902 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 8903 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8904 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 8905 p->mode = MODE_Csv; 8906 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 8907 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 8908 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 8909 p->mode = MODE_List; 8910 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 8911 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 8912 p->mode = MODE_Insert; 8913 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 8914 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 8915 p->mode = MODE_Quote; 8916 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 8917 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8918 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 8919 p->mode = MODE_Ascii; 8920 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 8921 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 8922 }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ 8923 p->mode = MODE_Markdown; 8924 }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ 8925 p->mode = MODE_Table; 8926 }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ 8927 p->mode = MODE_Box; 8928 }else if( c2=='c' && strncmp(azArg[1],"count",n2)==0 ){ 8929 p->mode = MODE_Count; 8930 }else if( c2=='o' && strncmp(azArg[1],"off",n2)==0 ){ 8931 p->mode = MODE_Off; 8932 }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ 8933 p->mode = MODE_Json; 8934 }else if( nArg==1 ){ 8935 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 8936 }else{ 8937 raw_printf(stderr, "Error: mode should be one of: " 8938 "ascii box column csv html insert json line list markdown " 8939 "quote table tabs tcl\n"); 8940 rc = 1; 8941 } 8942 p->cMode = p->mode; 8943 }else 8944 8945 if( c=='n' && strcmp(azArg[0], "nonce")==0 ){ 8946 if( nArg!=2 ){ 8947 raw_printf(stderr, "Usage: .nonce NONCE\n"); 8948 rc = 1; 8949 }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ 8950 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", 8951 p->lineno, azArg[1]); 8952 exit(1); 8953 }else{ 8954 p->bSafeMode = 0; 8955 return 0; /* Return immediately to bypass the safe mode reset 8956 ** at the end of this procedure */ 8957 } 8958 }else 8959 8960 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 8961 if( nArg==2 ){ 8962 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 8963 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 8964 }else{ 8965 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 8966 rc = 1; 8967 } 8968 }else 8969 8970 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 8971 const char *zFN = 0; /* Pointer to constant filename */ 8972 char *zNewFilename = 0; /* Name of the database file to open */ 8973 int iName = 1; /* Index in azArg[] of the filename */ 8974 int newFlag = 0; /* True to delete file before opening */ 8975 int openMode = SHELL_OPEN_UNSPEC; 8976 8977 /* Check for command-line arguments */ 8978 for(iName=1; iName<nArg; iName++){ 8979 const char *z = azArg[iName]; 8980 if( optionMatch(z,"new") ){ 8981 newFlag = 1; 8982#ifdef SQLITE_HAVE_ZLIB 8983 }else if( optionMatch(z, "zip") ){ 8984 openMode = SHELL_OPEN_ZIPFILE; 8985#endif 8986 }else if( optionMatch(z, "append") ){ 8987 openMode = SHELL_OPEN_APPENDVFS; 8988 }else if( optionMatch(z, "readonly") ){ 8989 openMode = SHELL_OPEN_READONLY; 8990 }else if( optionMatch(z, "nofollow") ){ 8991 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 8992#ifndef SQLITE_OMIT_DESERIALIZE 8993 }else if( optionMatch(z, "deserialize") ){ 8994 openMode = SHELL_OPEN_DESERIALIZE; 8995 }else if( optionMatch(z, "hexdb") ){ 8996 openMode = SHELL_OPEN_HEXDB; 8997 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 8998 p->szMax = integerValue(azArg[++iName]); 8999#endif /* SQLITE_OMIT_DESERIALIZE */ 9000 }else if( z[0]=='-' ){ 9001 utf8_printf(stderr, "unknown option: %s\n", z); 9002 rc = 1; 9003 goto meta_command_exit; 9004 }else if( zFN ){ 9005 utf8_printf(stderr, "extra argument: \"%s\"\n", z); 9006 rc = 1; 9007 goto meta_command_exit; 9008 }else{ 9009 zFN = z; 9010 } 9011 } 9012 9013 /* Close the existing database */ 9014 session_close_all(p, -1); 9015 close_db(p->db); 9016 p->db = 0; 9017 p->pAuxDb->zDbFilename = 0; 9018 sqlite3_free(p->pAuxDb->zFreeOnClose); 9019 p->pAuxDb->zFreeOnClose = 0; 9020 p->openMode = openMode; 9021 p->openFlags = 0; 9022 p->szMax = 0; 9023 9024 /* If a filename is specified, try to open it first */ 9025 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){ 9026 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN); 9027 if( p->bSafeMode 9028 && p->openMode!=SHELL_OPEN_HEXDB 9029 && zFN 9030 && strcmp(zFN,":memory:")!=0 9031 ){ 9032 failIfSafeMode(p, "cannot open disk-based database files in safe mode"); 9033 } 9034 if( zFN ){ 9035 zNewFilename = sqlite3_mprintf("%s", zFN); 9036 shell_check_oom(zNewFilename); 9037 }else{ 9038 zNewFilename = 0; 9039 } 9040 p->pAuxDb->zDbFilename = zNewFilename; 9041 open_db(p, OPEN_DB_KEEPALIVE); 9042 if( p->db==0 ){ 9043 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 9044 sqlite3_free(zNewFilename); 9045 }else{ 9046 p->pAuxDb->zFreeOnClose = zNewFilename; 9047 } 9048 } 9049 if( p->db==0 ){ 9050 /* As a fall-back open a TEMP database */ 9051 p->pAuxDb->zDbFilename = 0; 9052 open_db(p, 0); 9053 } 9054 }else 9055 9056 if( (c=='o' 9057 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 9058 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 9059 ){ 9060 char *zFile = 0; 9061 int bTxtMode = 0; 9062 int i; 9063 int eMode = 0; 9064 int bBOM = 0; 9065 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 9066 9067 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 9068 if( c=='e' ){ 9069 eMode = 'x'; 9070 bOnce = 2; 9071 }else if( strncmp(azArg[0],"once",n)==0 ){ 9072 bOnce = 1; 9073 } 9074 for(i=1; i<nArg; i++){ 9075 char *z = azArg[i]; 9076 if( z[0]=='-' ){ 9077 if( z[1]=='-' ) z++; 9078 if( strcmp(z,"-bom")==0 ){ 9079 bBOM = 1; 9080 }else if( c!='e' && strcmp(z,"-x")==0 ){ 9081 eMode = 'x'; /* spreadsheet */ 9082 }else if( c!='e' && strcmp(z,"-e")==0 ){ 9083 eMode = 'e'; /* text editor */ 9084 }else{ 9085 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 9086 azArg[i]); 9087 showHelp(p->out, azArg[0]); 9088 rc = 1; 9089 goto meta_command_exit; 9090 } 9091 }else if( zFile==0 && eMode!='e' && eMode!='x' ){ 9092 zFile = sqlite3_mprintf("%s", z); 9093 if( zFile && zFile[0]=='|' ){ 9094 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]); 9095 break; 9096 } 9097 }else{ 9098 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 9099 azArg[i]); 9100 showHelp(p->out, azArg[0]); 9101 rc = 1; 9102 sqlite3_free(zFile); 9103 goto meta_command_exit; 9104 } 9105 } 9106 if( zFile==0 ){ 9107 zFile = sqlite3_mprintf("stdout"); 9108 } 9109 if( bOnce ){ 9110 p->outCount = 2; 9111 }else{ 9112 p->outCount = 0; 9113 } 9114 output_reset(p); 9115#ifndef SQLITE_NOHAVE_SYSTEM 9116 if( eMode=='e' || eMode=='x' ){ 9117 p->doXdgOpen = 1; 9118 outputModePush(p); 9119 if( eMode=='x' ){ 9120 /* spreadsheet mode. Output as CSV. */ 9121 newTempFile(p, "csv"); 9122 ShellClearFlag(p, SHFLG_Echo); 9123 p->mode = MODE_Csv; 9124 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 9125 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 9126 }else{ 9127 /* text editor mode */ 9128 newTempFile(p, "txt"); 9129 bTxtMode = 1; 9130 } 9131 sqlite3_free(zFile); 9132 zFile = sqlite3_mprintf("%s", p->zTempFile); 9133 } 9134#endif /* SQLITE_NOHAVE_SYSTEM */ 9135 shell_check_oom(zFile); 9136 if( zFile[0]=='|' ){ 9137#ifdef SQLITE_OMIT_POPEN 9138 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9139 rc = 1; 9140 p->out = stdout; 9141#else 9142 p->out = popen(zFile + 1, "w"); 9143 if( p->out==0 ){ 9144 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 9145 p->out = stdout; 9146 rc = 1; 9147 }else{ 9148 if( bBOM ) fprintf(p->out,"\357\273\277"); 9149 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9150 } 9151#endif 9152 }else{ 9153 p->out = output_file_open(zFile, bTxtMode); 9154 if( p->out==0 ){ 9155 if( strcmp(zFile,"off")!=0 ){ 9156 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 9157 } 9158 p->out = stdout; 9159 rc = 1; 9160 } else { 9161 if( bBOM ) fprintf(p->out,"\357\273\277"); 9162 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9163 } 9164 } 9165 sqlite3_free(zFile); 9166 }else 9167 9168 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 9169 open_db(p,0); 9170 if( nArg<=1 ) goto parameter_syntax_error; 9171 9172 /* .parameter clear 9173 ** Clear all bind parameters by dropping the TEMP table that holds them. 9174 */ 9175 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 9176 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 9177 0, 0, 0); 9178 }else 9179 9180 /* .parameter list 9181 ** List all bind parameters. 9182 */ 9183 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 9184 sqlite3_stmt *pStmt = 0; 9185 int rx; 9186 int len = 0; 9187 rx = sqlite3_prepare_v2(p->db, 9188 "SELECT max(length(key)) " 9189 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9190 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9191 len = sqlite3_column_int(pStmt, 0); 9192 if( len>40 ) len = 40; 9193 } 9194 sqlite3_finalize(pStmt); 9195 pStmt = 0; 9196 if( len ){ 9197 rx = sqlite3_prepare_v2(p->db, 9198 "SELECT key, quote(value) " 9199 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9200 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9201 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 9202 sqlite3_column_text(pStmt,1)); 9203 } 9204 sqlite3_finalize(pStmt); 9205 } 9206 }else 9207 9208 /* .parameter init 9209 ** Make sure the TEMP table used to hold bind parameters exists. 9210 ** Create it if necessary. 9211 */ 9212 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 9213 bind_table_init(p); 9214 }else 9215 9216 /* .parameter set NAME VALUE 9217 ** Set or reset a bind parameter. NAME should be the full parameter 9218 ** name exactly as it appears in the query. (ex: $abc, @def). The 9219 ** VALUE can be in either SQL literal notation, or if not it will be 9220 ** understood to be a text string. 9221 */ 9222 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 9223 int rx; 9224 char *zSql; 9225 sqlite3_stmt *pStmt; 9226 const char *zKey = azArg[2]; 9227 const char *zValue = azArg[3]; 9228 bind_table_init(p); 9229 zSql = sqlite3_mprintf( 9230 "REPLACE INTO temp.sqlite_parameters(key,value)" 9231 "VALUES(%Q,%s);", zKey, zValue); 9232 shell_check_oom(zSql); 9233 pStmt = 0; 9234 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9235 sqlite3_free(zSql); 9236 if( rx!=SQLITE_OK ){ 9237 sqlite3_finalize(pStmt); 9238 pStmt = 0; 9239 zSql = sqlite3_mprintf( 9240 "REPLACE INTO temp.sqlite_parameters(key,value)" 9241 "VALUES(%Q,%Q);", zKey, zValue); 9242 shell_check_oom(zSql); 9243 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9244 sqlite3_free(zSql); 9245 if( rx!=SQLITE_OK ){ 9246 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 9247 sqlite3_finalize(pStmt); 9248 pStmt = 0; 9249 rc = 1; 9250 } 9251 } 9252 sqlite3_step(pStmt); 9253 sqlite3_finalize(pStmt); 9254 }else 9255 9256 /* .parameter unset NAME 9257 ** Remove the NAME binding from the parameter binding table, if it 9258 ** exists. 9259 */ 9260 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 9261 char *zSql = sqlite3_mprintf( 9262 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 9263 shell_check_oom(zSql); 9264 sqlite3_exec(p->db, zSql, 0, 0, 0); 9265 sqlite3_free(zSql); 9266 }else 9267 /* If no command name matches, show a syntax error */ 9268 parameter_syntax_error: 9269 showHelp(p->out, "parameter"); 9270 }else 9271 9272 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 9273 int i; 9274 for(i=1; i<nArg; i++){ 9275 if( i>1 ) raw_printf(p->out, " "); 9276 utf8_printf(p->out, "%s", azArg[i]); 9277 } 9278 raw_printf(p->out, "\n"); 9279 }else 9280 9281#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 9282 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 9283 int i; 9284 int nn = 0; 9285 p->flgProgress = 0; 9286 p->mxProgress = 0; 9287 p->nProgress = 0; 9288 for(i=1; i<nArg; i++){ 9289 const char *z = azArg[i]; 9290 if( z[0]=='-' ){ 9291 z++; 9292 if( z[0]=='-' ) z++; 9293 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 9294 p->flgProgress |= SHELL_PROGRESS_QUIET; 9295 continue; 9296 } 9297 if( strcmp(z,"reset")==0 ){ 9298 p->flgProgress |= SHELL_PROGRESS_RESET; 9299 continue; 9300 } 9301 if( strcmp(z,"once")==0 ){ 9302 p->flgProgress |= SHELL_PROGRESS_ONCE; 9303 continue; 9304 } 9305 if( strcmp(z,"limit")==0 ){ 9306 if( i+1>=nArg ){ 9307 utf8_printf(stderr, "Error: missing argument on --limit\n"); 9308 rc = 1; 9309 goto meta_command_exit; 9310 }else{ 9311 p->mxProgress = (int)integerValue(azArg[++i]); 9312 } 9313 continue; 9314 } 9315 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 9316 rc = 1; 9317 goto meta_command_exit; 9318 }else{ 9319 nn = (int)integerValue(z); 9320 } 9321 } 9322 open_db(p, 0); 9323 sqlite3_progress_handler(p->db, nn, progress_handler, p); 9324 }else 9325#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 9326 9327 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 9328 if( nArg >= 2) { 9329 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 9330 } 9331 if( nArg >= 3) { 9332 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 9333 } 9334 }else 9335 9336 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 9337 rc = 2; 9338 }else 9339 9340 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 9341 FILE *inSaved = p->in; 9342 int savedLineno = p->lineno; 9343 failIfSafeMode(p, "cannot run .read in safe mode"); 9344 if( nArg!=2 ){ 9345 raw_printf(stderr, "Usage: .read FILE\n"); 9346 rc = 1; 9347 goto meta_command_exit; 9348 } 9349 if( azArg[1][0]=='|' ){ 9350#ifdef SQLITE_OMIT_POPEN 9351 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9352 rc = 1; 9353 p->out = stdout; 9354#else 9355 p->in = popen(azArg[1]+1, "r"); 9356 if( p->in==0 ){ 9357 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 9358 rc = 1; 9359 }else{ 9360 rc = process_input(p); 9361 pclose(p->in); 9362 } 9363#endif 9364 }else if( (p->in = openChrSource(azArg[1]))==0 ){ 9365 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 9366 rc = 1; 9367 }else{ 9368 rc = process_input(p); 9369 fclose(p->in); 9370 } 9371 p->in = inSaved; 9372 p->lineno = savedLineno; 9373 }else 9374 9375 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 9376 const char *zSrcFile; 9377 const char *zDb; 9378 sqlite3 *pSrc; 9379 sqlite3_backup *pBackup; 9380 int nTimeout = 0; 9381 9382 failIfSafeMode(p, "cannot run .restore in safe mode"); 9383 if( nArg==2 ){ 9384 zSrcFile = azArg[1]; 9385 zDb = "main"; 9386 }else if( nArg==3 ){ 9387 zSrcFile = azArg[2]; 9388 zDb = azArg[1]; 9389 }else{ 9390 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 9391 rc = 1; 9392 goto meta_command_exit; 9393 } 9394 rc = sqlite3_open(zSrcFile, &pSrc); 9395 if( rc!=SQLITE_OK ){ 9396 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 9397 close_db(pSrc); 9398 return 1; 9399 } 9400 open_db(p, 0); 9401 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 9402 if( pBackup==0 ){ 9403 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9404 close_db(pSrc); 9405 return 1; 9406 } 9407 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 9408 || rc==SQLITE_BUSY ){ 9409 if( rc==SQLITE_BUSY ){ 9410 if( nTimeout++ >= 3 ) break; 9411 sqlite3_sleep(100); 9412 } 9413 } 9414 sqlite3_backup_finish(pBackup); 9415 if( rc==SQLITE_DONE ){ 9416 rc = 0; 9417 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 9418 raw_printf(stderr, "Error: source database is busy\n"); 9419 rc = 1; 9420 }else{ 9421 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9422 rc = 1; 9423 } 9424 close_db(pSrc); 9425 }else 9426 9427 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 9428 if( nArg==2 ){ 9429 p->scanstatsOn = (u8)booleanValue(azArg[1]); 9430#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 9431 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 9432#endif 9433 }else{ 9434 raw_printf(stderr, "Usage: .scanstats on|off\n"); 9435 rc = 1; 9436 } 9437 }else 9438 9439 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 9440 ShellText sSelect; 9441 ShellState data; 9442 char *zErrMsg = 0; 9443 const char *zDiv = "("; 9444 const char *zName = 0; 9445 int iSchema = 0; 9446 int bDebug = 0; 9447 int bNoSystemTabs = 0; 9448 int ii; 9449 9450 open_db(p, 0); 9451 memcpy(&data, p, sizeof(data)); 9452 data.showHeader = 0; 9453 data.cMode = data.mode = MODE_Semi; 9454 initText(&sSelect); 9455 for(ii=1; ii<nArg; ii++){ 9456 if( optionMatch(azArg[ii],"indent") ){ 9457 data.cMode = data.mode = MODE_Pretty; 9458 }else if( optionMatch(azArg[ii],"debug") ){ 9459 bDebug = 1; 9460 }else if( optionMatch(azArg[ii],"nosys") ){ 9461 bNoSystemTabs = 1; 9462 }else if( azArg[ii][0]=='-' ){ 9463 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]); 9464 rc = 1; 9465 goto meta_command_exit; 9466 }else if( zName==0 ){ 9467 zName = azArg[ii]; 9468 }else{ 9469 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 9470 rc = 1; 9471 goto meta_command_exit; 9472 } 9473 } 9474 if( zName!=0 ){ 9475 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 9476 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 9477 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 9478 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 9479 if( isSchema ){ 9480 char *new_argv[2], *new_colv[2]; 9481 new_argv[0] = sqlite3_mprintf( 9482 "CREATE TABLE %s (\n" 9483 " type text,\n" 9484 " name text,\n" 9485 " tbl_name text,\n" 9486 " rootpage integer,\n" 9487 " sql text\n" 9488 ")", zName); 9489 shell_check_oom(new_argv[0]); 9490 new_argv[1] = 0; 9491 new_colv[0] = "sql"; 9492 new_colv[1] = 0; 9493 callback(&data, 1, new_argv, new_colv); 9494 sqlite3_free(new_argv[0]); 9495 } 9496 } 9497 if( zDiv ){ 9498 sqlite3_stmt *pStmt = 0; 9499 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 9500 -1, &pStmt, 0); 9501 if( rc ){ 9502 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9503 sqlite3_finalize(pStmt); 9504 rc = 1; 9505 goto meta_command_exit; 9506 } 9507 appendText(&sSelect, "SELECT sql FROM", 0); 9508 iSchema = 0; 9509 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 9510 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 9511 char zScNum[30]; 9512 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 9513 appendText(&sSelect, zDiv, 0); 9514 zDiv = " UNION ALL "; 9515 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 9516 if( sqlite3_stricmp(zDb, "main")!=0 ){ 9517 appendText(&sSelect, zDb, '\''); 9518 }else{ 9519 appendText(&sSelect, "NULL", 0); 9520 } 9521 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 9522 appendText(&sSelect, zScNum, 0); 9523 appendText(&sSelect, " AS snum, ", 0); 9524 appendText(&sSelect, zDb, '\''); 9525 appendText(&sSelect, " AS sname FROM ", 0); 9526 appendText(&sSelect, zDb, quoteChar(zDb)); 9527 appendText(&sSelect, ".sqlite_schema", 0); 9528 } 9529 sqlite3_finalize(pStmt); 9530#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 9531 if( zName ){ 9532 appendText(&sSelect, 9533 " UNION ALL SELECT shell_module_schema(name)," 9534 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 9535 0); 9536 } 9537#endif 9538 appendText(&sSelect, ") WHERE ", 0); 9539 if( zName ){ 9540 char *zQarg = sqlite3_mprintf("%Q", zName); 9541 shell_check_oom(zQarg); 9542 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 9543 strchr(zName, '[') != 0; 9544 if( strchr(zName, '.') ){ 9545 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 9546 }else{ 9547 appendText(&sSelect, "lower(tbl_name)", 0); 9548 } 9549 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 9550 appendText(&sSelect, zQarg, 0); 9551 if( !bGlob ){ 9552 appendText(&sSelect, " ESCAPE '\\' ", 0); 9553 } 9554 appendText(&sSelect, " AND ", 0); 9555 sqlite3_free(zQarg); 9556 } 9557 if( bNoSystemTabs ){ 9558 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 9559 } 9560 appendText(&sSelect, "sql IS NOT NULL" 9561 " ORDER BY snum, rowid", 0); 9562 if( bDebug ){ 9563 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 9564 }else{ 9565 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 9566 } 9567 freeText(&sSelect); 9568 } 9569 if( zErrMsg ){ 9570 utf8_printf(stderr,"Error: %s\n", zErrMsg); 9571 sqlite3_free(zErrMsg); 9572 rc = 1; 9573 }else if( rc != SQLITE_OK ){ 9574 raw_printf(stderr,"Error: querying schema information\n"); 9575 rc = 1; 9576 }else{ 9577 rc = 0; 9578 } 9579 }else 9580 9581 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 9582 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 9583 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x); 9584 }else 9585 9586#if defined(SQLITE_ENABLE_SESSION) 9587 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 9588 struct AuxDb *pAuxDb = p->pAuxDb; 9589 OpenSession *pSession = &pAuxDb->aSession[0]; 9590 char **azCmd = &azArg[1]; 9591 int iSes = 0; 9592 int nCmd = nArg - 1; 9593 int i; 9594 if( nArg<=1 ) goto session_syntax_error; 9595 open_db(p, 0); 9596 if( nArg>=3 ){ 9597 for(iSes=0; iSes<pAuxDb->nSession; iSes++){ 9598 if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; 9599 } 9600 if( iSes<pAuxDb->nSession ){ 9601 pSession = &pAuxDb->aSession[iSes]; 9602 azCmd++; 9603 nCmd--; 9604 }else{ 9605 pSession = &pAuxDb->aSession[0]; 9606 iSes = 0; 9607 } 9608 } 9609 9610 /* .session attach TABLE 9611 ** Invoke the sqlite3session_attach() interface to attach a particular 9612 ** table so that it is never filtered. 9613 */ 9614 if( strcmp(azCmd[0],"attach")==0 ){ 9615 if( nCmd!=2 ) goto session_syntax_error; 9616 if( pSession->p==0 ){ 9617 session_not_open: 9618 raw_printf(stderr, "ERROR: No sessions are open\n"); 9619 }else{ 9620 rc = sqlite3session_attach(pSession->p, azCmd[1]); 9621 if( rc ){ 9622 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 9623 rc = 0; 9624 } 9625 } 9626 }else 9627 9628 /* .session changeset FILE 9629 ** .session patchset FILE 9630 ** Write a changeset or patchset into a file. The file is overwritten. 9631 */ 9632 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 9633 FILE *out = 0; 9634 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); 9635 if( nCmd!=2 ) goto session_syntax_error; 9636 if( pSession->p==0 ) goto session_not_open; 9637 out = fopen(azCmd[1], "wb"); 9638 if( out==0 ){ 9639 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 9640 azCmd[1]); 9641 }else{ 9642 int szChng; 9643 void *pChng; 9644 if( azCmd[0][0]=='c' ){ 9645 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 9646 }else{ 9647 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 9648 } 9649 if( rc ){ 9650 printf("Error: error code %d\n", rc); 9651 rc = 0; 9652 } 9653 if( pChng 9654 && fwrite(pChng, szChng, 1, out)!=1 ){ 9655 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 9656 szChng); 9657 } 9658 sqlite3_free(pChng); 9659 fclose(out); 9660 } 9661 }else 9662 9663 /* .session close 9664 ** Close the identified session 9665 */ 9666 if( strcmp(azCmd[0], "close")==0 ){ 9667 if( nCmd!=1 ) goto session_syntax_error; 9668 if( pAuxDb->nSession ){ 9669 session_close(pSession); 9670 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; 9671 } 9672 }else 9673 9674 /* .session enable ?BOOLEAN? 9675 ** Query or set the enable flag 9676 */ 9677 if( strcmp(azCmd[0], "enable")==0 ){ 9678 int ii; 9679 if( nCmd>2 ) goto session_syntax_error; 9680 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 9681 if( pAuxDb->nSession ){ 9682 ii = sqlite3session_enable(pSession->p, ii); 9683 utf8_printf(p->out, "session %s enable flag = %d\n", 9684 pSession->zName, ii); 9685 } 9686 }else 9687 9688 /* .session filter GLOB .... 9689 ** Set a list of GLOB patterns of table names to be excluded. 9690 */ 9691 if( strcmp(azCmd[0], "filter")==0 ){ 9692 int ii, nByte; 9693 if( nCmd<2 ) goto session_syntax_error; 9694 if( pAuxDb->nSession ){ 9695 for(ii=0; ii<pSession->nFilter; ii++){ 9696 sqlite3_free(pSession->azFilter[ii]); 9697 } 9698 sqlite3_free(pSession->azFilter); 9699 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 9700 pSession->azFilter = sqlite3_malloc( nByte ); 9701 if( pSession->azFilter==0 ){ 9702 raw_printf(stderr, "Error: out or memory\n"); 9703 exit(1); 9704 } 9705 for(ii=1; ii<nCmd; ii++){ 9706 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 9707 shell_check_oom(x); 9708 } 9709 pSession->nFilter = ii-1; 9710 } 9711 }else 9712 9713 /* .session indirect ?BOOLEAN? 9714 ** Query or set the indirect flag 9715 */ 9716 if( strcmp(azCmd[0], "indirect")==0 ){ 9717 int ii; 9718 if( nCmd>2 ) goto session_syntax_error; 9719 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 9720 if( pAuxDb->nSession ){ 9721 ii = sqlite3session_indirect(pSession->p, ii); 9722 utf8_printf(p->out, "session %s indirect flag = %d\n", 9723 pSession->zName, ii); 9724 } 9725 }else 9726 9727 /* .session isempty 9728 ** Determine if the session is empty 9729 */ 9730 if( strcmp(azCmd[0], "isempty")==0 ){ 9731 int ii; 9732 if( nCmd!=1 ) goto session_syntax_error; 9733 if( pAuxDb->nSession ){ 9734 ii = sqlite3session_isempty(pSession->p); 9735 utf8_printf(p->out, "session %s isempty flag = %d\n", 9736 pSession->zName, ii); 9737 } 9738 }else 9739 9740 /* .session list 9741 ** List all currently open sessions 9742 */ 9743 if( strcmp(azCmd[0],"list")==0 ){ 9744 for(i=0; i<pAuxDb->nSession; i++){ 9745 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName); 9746 } 9747 }else 9748 9749 /* .session open DB NAME 9750 ** Open a new session called NAME on the attached database DB. 9751 ** DB is normally "main". 9752 */ 9753 if( strcmp(azCmd[0],"open")==0 ){ 9754 char *zName; 9755 if( nCmd!=3 ) goto session_syntax_error; 9756 zName = azCmd[2]; 9757 if( zName[0]==0 ) goto session_syntax_error; 9758 for(i=0; i<pAuxDb->nSession; i++){ 9759 if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ 9760 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 9761 goto meta_command_exit; 9762 } 9763 } 9764 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ 9765 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); 9766 goto meta_command_exit; 9767 } 9768 pSession = &pAuxDb->aSession[pAuxDb->nSession]; 9769 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 9770 if( rc ){ 9771 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 9772 rc = 0; 9773 goto meta_command_exit; 9774 } 9775 pSession->nFilter = 0; 9776 sqlite3session_table_filter(pSession->p, session_filter, pSession); 9777 pAuxDb->nSession++; 9778 pSession->zName = sqlite3_mprintf("%s", zName); 9779 shell_check_oom(pSession->zName); 9780 }else 9781 /* If no command name matches, show a syntax error */ 9782 session_syntax_error: 9783 showHelp(p->out, "session"); 9784 }else 9785#endif 9786 9787#ifdef SQLITE_DEBUG 9788 /* Undocumented commands for internal testing. Subject to change 9789 ** without notice. */ 9790 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 9791 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 9792 int i, v; 9793 for(i=1; i<nArg; i++){ 9794 v = booleanValue(azArg[i]); 9795 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 9796 } 9797 } 9798 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 9799 int i; sqlite3_int64 v; 9800 for(i=1; i<nArg; i++){ 9801 char zBuf[200]; 9802 v = integerValue(azArg[i]); 9803 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 9804 utf8_printf(p->out, "%s", zBuf); 9805 } 9806 } 9807 }else 9808#endif 9809 9810 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 9811 int bIsInit = 0; /* True to initialize the SELFTEST table */ 9812 int bVerbose = 0; /* Verbose output */ 9813 int bSelftestExists; /* True if SELFTEST already exists */ 9814 int i, k; /* Loop counters */ 9815 int nTest = 0; /* Number of tests runs */ 9816 int nErr = 0; /* Number of errors seen */ 9817 ShellText str; /* Answer for a query */ 9818 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 9819 9820 open_db(p,0); 9821 for(i=1; i<nArg; i++){ 9822 const char *z = azArg[i]; 9823 if( z[0]=='-' && z[1]=='-' ) z++; 9824 if( strcmp(z,"-init")==0 ){ 9825 bIsInit = 1; 9826 }else 9827 if( strcmp(z,"-v")==0 ){ 9828 bVerbose++; 9829 }else 9830 { 9831 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 9832 azArg[i], azArg[0]); 9833 raw_printf(stderr, "Should be one of: --init -v\n"); 9834 rc = 1; 9835 goto meta_command_exit; 9836 } 9837 } 9838 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 9839 != SQLITE_OK ){ 9840 bSelftestExists = 0; 9841 }else{ 9842 bSelftestExists = 1; 9843 } 9844 if( bIsInit ){ 9845 createSelftestTable(p); 9846 bSelftestExists = 1; 9847 } 9848 initText(&str); 9849 appendText(&str, "x", 0); 9850 for(k=bSelftestExists; k>=0; k--){ 9851 if( k==1 ){ 9852 rc = sqlite3_prepare_v2(p->db, 9853 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 9854 -1, &pStmt, 0); 9855 }else{ 9856 rc = sqlite3_prepare_v2(p->db, 9857 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 9858 " (1,'run','PRAGMA integrity_check','ok')", 9859 -1, &pStmt, 0); 9860 } 9861 if( rc ){ 9862 raw_printf(stderr, "Error querying the selftest table\n"); 9863 rc = 1; 9864 sqlite3_finalize(pStmt); 9865 goto meta_command_exit; 9866 } 9867 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 9868 int tno = sqlite3_column_int(pStmt, 0); 9869 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 9870 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 9871 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 9872 9873 if( zOp==0 ) continue; 9874 if( zSql==0 ) continue; 9875 if( zAns==0 ) continue; 9876 k = 0; 9877 if( bVerbose>0 ){ 9878 printf("%d: %s %s\n", tno, zOp, zSql); 9879 } 9880 if( strcmp(zOp,"memo")==0 ){ 9881 utf8_printf(p->out, "%s\n", zSql); 9882 }else 9883 if( strcmp(zOp,"run")==0 ){ 9884 char *zErrMsg = 0; 9885 str.n = 0; 9886 str.z[0] = 0; 9887 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 9888 nTest++; 9889 if( bVerbose ){ 9890 utf8_printf(p->out, "Result: %s\n", str.z); 9891 } 9892 if( rc || zErrMsg ){ 9893 nErr++; 9894 rc = 1; 9895 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 9896 sqlite3_free(zErrMsg); 9897 }else if( strcmp(zAns,str.z)!=0 ){ 9898 nErr++; 9899 rc = 1; 9900 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 9901 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 9902 } 9903 }else 9904 { 9905 utf8_printf(stderr, 9906 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 9907 rc = 1; 9908 break; 9909 } 9910 } /* End loop over rows of content from SELFTEST */ 9911 sqlite3_finalize(pStmt); 9912 } /* End loop over k */ 9913 freeText(&str); 9914 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 9915 }else 9916 9917 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 9918 if( nArg<2 || nArg>3 ){ 9919 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 9920 rc = 1; 9921 } 9922 if( nArg>=2 ){ 9923 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 9924 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 9925 } 9926 if( nArg>=3 ){ 9927 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 9928 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 9929 } 9930 }else 9931 9932 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 9933 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 9934 int i; /* Loop counter */ 9935 int bSchema = 0; /* Also hash the schema */ 9936 int bSeparate = 0; /* Hash each table separately */ 9937 int iSize = 224; /* Hash algorithm to use */ 9938 int bDebug = 0; /* Only show the query that would have run */ 9939 sqlite3_stmt *pStmt; /* For querying tables names */ 9940 char *zSql; /* SQL to be run */ 9941 char *zSep; /* Separator */ 9942 ShellText sSql; /* Complete SQL for the query to run the hash */ 9943 ShellText sQuery; /* Set of queries used to read all content */ 9944 open_db(p, 0); 9945 for(i=1; i<nArg; i++){ 9946 const char *z = azArg[i]; 9947 if( z[0]=='-' ){ 9948 z++; 9949 if( z[0]=='-' ) z++; 9950 if( strcmp(z,"schema")==0 ){ 9951 bSchema = 1; 9952 }else 9953 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 9954 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 9955 ){ 9956 iSize = atoi(&z[5]); 9957 }else 9958 if( strcmp(z,"debug")==0 ){ 9959 bDebug = 1; 9960 }else 9961 { 9962 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 9963 azArg[i], azArg[0]); 9964 showHelp(p->out, azArg[0]); 9965 rc = 1; 9966 goto meta_command_exit; 9967 } 9968 }else if( zLike ){ 9969 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 9970 rc = 1; 9971 goto meta_command_exit; 9972 }else{ 9973 zLike = z; 9974 bSeparate = 1; 9975 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 9976 } 9977 } 9978 if( bSchema ){ 9979 zSql = "SELECT lower(name) FROM sqlite_schema" 9980 " WHERE type='table' AND coalesce(rootpage,0)>1" 9981 " UNION ALL SELECT 'sqlite_schema'" 9982 " ORDER BY 1 collate nocase"; 9983 }else{ 9984 zSql = "SELECT lower(name) FROM sqlite_schema" 9985 " WHERE type='table' AND coalesce(rootpage,0)>1" 9986 " AND name NOT LIKE 'sqlite_%'" 9987 " ORDER BY 1 collate nocase"; 9988 } 9989 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9990 initText(&sQuery); 9991 initText(&sSql); 9992 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 9993 zSep = "VALUES("; 9994 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 9995 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 9996 if( zTab==0 ) continue; 9997 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 9998 if( strncmp(zTab, "sqlite_",7)!=0 ){ 9999 appendText(&sQuery,"SELECT * FROM ", 0); 10000 appendText(&sQuery,zTab,'"'); 10001 appendText(&sQuery," NOT INDEXED;", 0); 10002 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 10003 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 10004 " ORDER BY name;", 0); 10005 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 10006 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 10007 " ORDER BY name;", 0); 10008 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 10009 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 10010 " ORDER BY tbl,idx;", 0); 10011 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 10012 appendText(&sQuery, "SELECT * FROM ", 0); 10013 appendText(&sQuery, zTab, 0); 10014 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 10015 } 10016 appendText(&sSql, zSep, 0); 10017 appendText(&sSql, sQuery.z, '\''); 10018 sQuery.n = 0; 10019 appendText(&sSql, ",", 0); 10020 appendText(&sSql, zTab, '\''); 10021 zSep = "),("; 10022 } 10023 sqlite3_finalize(pStmt); 10024 if( bSeparate ){ 10025 zSql = sqlite3_mprintf( 10026 "%s))" 10027 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 10028 " FROM [sha3sum$query]", 10029 sSql.z, iSize); 10030 }else{ 10031 zSql = sqlite3_mprintf( 10032 "%s))" 10033 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 10034 " FROM [sha3sum$query]", 10035 sSql.z, iSize); 10036 } 10037 shell_check_oom(zSql); 10038 freeText(&sQuery); 10039 freeText(&sSql); 10040 if( bDebug ){ 10041 utf8_printf(p->out, "%s\n", zSql); 10042 }else{ 10043 shell_exec(p, zSql, 0); 10044 } 10045 sqlite3_free(zSql); 10046 }else 10047 10048#ifndef SQLITE_NOHAVE_SYSTEM 10049 if( c=='s' 10050 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 10051 ){ 10052 char *zCmd; 10053 int i, x; 10054 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 10055 if( nArg<2 ){ 10056 raw_printf(stderr, "Usage: .system COMMAND\n"); 10057 rc = 1; 10058 goto meta_command_exit; 10059 } 10060 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 10061 for(i=2; i<nArg && zCmd!=0; i++){ 10062 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 10063 zCmd, azArg[i]); 10064 } 10065 x = zCmd!=0 ? system(zCmd) : 1; 10066 sqlite3_free(zCmd); 10067 if( x ) raw_printf(stderr, "System command returns %d\n", x); 10068 }else 10069#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 10070 10071 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 10072 static const char *azBool[] = { "off", "on", "trigger", "full"}; 10073 const char *zOut; 10074 int i; 10075 if( nArg!=1 ){ 10076 raw_printf(stderr, "Usage: .show\n"); 10077 rc = 1; 10078 goto meta_command_exit; 10079 } 10080 utf8_printf(p->out, "%12.12s: %s\n","echo", 10081 azBool[ShellHasFlag(p, SHFLG_Echo)]); 10082 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 10083 utf8_printf(p->out, "%12.12s: %s\n","explain", 10084 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 10085 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 10086 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 10087 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 10088 output_c_string(p->out, p->nullValue); 10089 raw_printf(p->out, "\n"); 10090 utf8_printf(p->out,"%12.12s: %s\n","output", 10091 strlen30(p->outfile) ? p->outfile : "stdout"); 10092 utf8_printf(p->out,"%12.12s: ", "colseparator"); 10093 output_c_string(p->out, p->colSeparator); 10094 raw_printf(p->out, "\n"); 10095 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 10096 output_c_string(p->out, p->rowSeparator); 10097 raw_printf(p->out, "\n"); 10098 switch( p->statsOn ){ 10099 case 0: zOut = "off"; break; 10100 default: zOut = "on"; break; 10101 case 2: zOut = "stmt"; break; 10102 case 3: zOut = "vmstep"; break; 10103 } 10104 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut); 10105 utf8_printf(p->out, "%12.12s: ", "width"); 10106 for (i=0;i<p->nWidth;i++) { 10107 raw_printf(p->out, "%d ", p->colWidth[i]); 10108 } 10109 raw_printf(p->out, "\n"); 10110 utf8_printf(p->out, "%12.12s: %s\n", "filename", 10111 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); 10112 }else 10113 10114 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 10115 if( nArg==2 ){ 10116 if( strcmp(azArg[1],"stmt")==0 ){ 10117 p->statsOn = 2; 10118 }else if( strcmp(azArg[1],"vmstep")==0 ){ 10119 p->statsOn = 3; 10120 }else{ 10121 p->statsOn = (u8)booleanValue(azArg[1]); 10122 } 10123 }else if( nArg==1 ){ 10124 display_stats(p->db, p, 0); 10125 }else{ 10126 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n"); 10127 rc = 1; 10128 } 10129 }else 10130 10131 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 10132 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 10133 || strncmp(azArg[0], "indexes", n)==0) ) 10134 ){ 10135 sqlite3_stmt *pStmt; 10136 char **azResult; 10137 int nRow, nAlloc; 10138 int ii; 10139 ShellText s; 10140 initText(&s); 10141 open_db(p, 0); 10142 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 10143 if( rc ){ 10144 sqlite3_finalize(pStmt); 10145 return shellDatabaseError(p->db); 10146 } 10147 10148 if( nArg>2 && c=='i' ){ 10149 /* It is an historical accident that the .indexes command shows an error 10150 ** when called with the wrong number of arguments whereas the .tables 10151 ** command does not. */ 10152 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 10153 rc = 1; 10154 sqlite3_finalize(pStmt); 10155 goto meta_command_exit; 10156 } 10157 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 10158 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 10159 if( zDbName==0 ) continue; 10160 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 10161 if( sqlite3_stricmp(zDbName, "main")==0 ){ 10162 appendText(&s, "SELECT name FROM ", 0); 10163 }else{ 10164 appendText(&s, "SELECT ", 0); 10165 appendText(&s, zDbName, '\''); 10166 appendText(&s, "||'.'||name FROM ", 0); 10167 } 10168 appendText(&s, zDbName, '"'); 10169 appendText(&s, ".sqlite_schema ", 0); 10170 if( c=='t' ){ 10171 appendText(&s," WHERE type IN ('table','view')" 10172 " AND name NOT LIKE 'sqlite_%'" 10173 " AND name LIKE ?1", 0); 10174 }else{ 10175 appendText(&s," WHERE type='index'" 10176 " AND tbl_name LIKE ?1", 0); 10177 } 10178 } 10179 rc = sqlite3_finalize(pStmt); 10180 if( rc==SQLITE_OK ){ 10181 appendText(&s, " ORDER BY 1", 0); 10182 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 10183 } 10184 freeText(&s); 10185 if( rc ) return shellDatabaseError(p->db); 10186 10187 /* Run the SQL statement prepared by the above block. Store the results 10188 ** as an array of nul-terminated strings in azResult[]. */ 10189 nRow = nAlloc = 0; 10190 azResult = 0; 10191 if( nArg>1 ){ 10192 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 10193 }else{ 10194 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 10195 } 10196 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 10197 if( nRow>=nAlloc ){ 10198 char **azNew; 10199 int n2 = nAlloc*2 + 10; 10200 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 10201 shell_check_oom(azNew); 10202 nAlloc = n2; 10203 azResult = azNew; 10204 } 10205 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 10206 shell_check_oom(azResult[nRow]); 10207 nRow++; 10208 } 10209 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 10210 rc = shellDatabaseError(p->db); 10211 } 10212 10213 /* Pretty-print the contents of array azResult[] to the output */ 10214 if( rc==0 && nRow>0 ){ 10215 int len, maxlen = 0; 10216 int i, j; 10217 int nPrintCol, nPrintRow; 10218 for(i=0; i<nRow; i++){ 10219 len = strlen30(azResult[i]); 10220 if( len>maxlen ) maxlen = len; 10221 } 10222 nPrintCol = 80/(maxlen+2); 10223 if( nPrintCol<1 ) nPrintCol = 1; 10224 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 10225 for(i=0; i<nPrintRow; i++){ 10226 for(j=i; j<nRow; j+=nPrintRow){ 10227 char *zSp = j<nPrintRow ? "" : " "; 10228 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 10229 azResult[j] ? azResult[j]:""); 10230 } 10231 raw_printf(p->out, "\n"); 10232 } 10233 } 10234 10235 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 10236 sqlite3_free(azResult); 10237 }else 10238 10239 /* Begin redirecting output to the file "testcase-out.txt" */ 10240 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 10241 output_reset(p); 10242 p->out = output_file_open("testcase-out.txt", 0); 10243 if( p->out==0 ){ 10244 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 10245 } 10246 if( nArg>=2 ){ 10247 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 10248 }else{ 10249 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 10250 } 10251 }else 10252 10253#ifndef SQLITE_UNTESTABLE 10254 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 10255 static const struct { 10256 const char *zCtrlName; /* Name of a test-control option */ 10257 int ctrlCode; /* Integer code for that option */ 10258 int unSafe; /* Not valid for --safe mode */ 10259 const char *zUsage; /* Usage notes */ 10260 } aCtrl[] = { 10261 { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" }, 10262 { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" }, 10263 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/ 10264 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/ 10265 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" }, 10266 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" }, 10267 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/ 10268 { "imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, 10269 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, 10270 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, 10271 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, 10272 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, 10273#ifdef YYCOVERAGE 10274 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" }, 10275#endif 10276 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " }, 10277 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" }, 10278 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" }, 10279 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" }, 10280 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" }, 10281 { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" }, 10282 { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" }, 10283 }; 10284 int testctrl = -1; 10285 int iCtrl = -1; 10286 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 10287 int isOk = 0; 10288 int i, n2; 10289 const char *zCmd = 0; 10290 10291 open_db(p, 0); 10292 zCmd = nArg>=2 ? azArg[1] : "help"; 10293 10294 /* The argument can optionally begin with "-" or "--" */ 10295 if( zCmd[0]=='-' && zCmd[1] ){ 10296 zCmd++; 10297 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 10298 } 10299 10300 /* --help lists all test-controls */ 10301 if( strcmp(zCmd,"help")==0 ){ 10302 utf8_printf(p->out, "Available test-controls:\n"); 10303 for(i=0; i<ArraySize(aCtrl); i++){ 10304 utf8_printf(p->out, " .testctrl %s %s\n", 10305 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 10306 } 10307 rc = 1; 10308 goto meta_command_exit; 10309 } 10310 10311 /* convert testctrl text option to value. allow any unique prefix 10312 ** of the option name, or a numerical value. */ 10313 n2 = strlen30(zCmd); 10314 for(i=0; i<ArraySize(aCtrl); i++){ 10315 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 10316 if( testctrl<0 ){ 10317 testctrl = aCtrl[i].ctrlCode; 10318 iCtrl = i; 10319 }else{ 10320 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 10321 "Use \".testctrl --help\" for help\n", zCmd); 10322 rc = 1; 10323 goto meta_command_exit; 10324 } 10325 } 10326 } 10327 if( testctrl<0 ){ 10328 utf8_printf(stderr,"Error: unknown test-control: %s\n" 10329 "Use \".testctrl --help\" for help\n", zCmd); 10330 }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){ 10331 utf8_printf(stderr, 10332 "line %d: \".testctrl %s\" may not be used in safe mode\n", 10333 p->lineno, aCtrl[iCtrl].zCtrlName); 10334 exit(1); 10335 }else{ 10336 switch(testctrl){ 10337 10338 /* sqlite3_test_control(int, db, int) */ 10339 case SQLITE_TESTCTRL_OPTIMIZATIONS: 10340 if( nArg==3 ){ 10341 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0); 10342 rc2 = sqlite3_test_control(testctrl, p->db, opt); 10343 isOk = 3; 10344 } 10345 break; 10346 10347 /* sqlite3_test_control(int) */ 10348 case SQLITE_TESTCTRL_PRNG_SAVE: 10349 case SQLITE_TESTCTRL_PRNG_RESTORE: 10350 case SQLITE_TESTCTRL_BYTEORDER: 10351 if( nArg==2 ){ 10352 rc2 = sqlite3_test_control(testctrl); 10353 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 10354 } 10355 break; 10356 10357 /* sqlite3_test_control(int, uint) */ 10358 case SQLITE_TESTCTRL_PENDING_BYTE: 10359 if( nArg==3 ){ 10360 unsigned int opt = (unsigned int)integerValue(azArg[2]); 10361 rc2 = sqlite3_test_control(testctrl, opt); 10362 isOk = 3; 10363 } 10364 break; 10365 10366 /* sqlite3_test_control(int, int, sqlite3*) */ 10367 case SQLITE_TESTCTRL_PRNG_SEED: 10368 if( nArg==3 || nArg==4 ){ 10369 int ii = (int)integerValue(azArg[2]); 10370 sqlite3 *db; 10371 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 10372 sqlite3_randomness(sizeof(ii),&ii); 10373 printf("-- random seed: %d\n", ii); 10374 } 10375 if( nArg==3 ){ 10376 db = 0; 10377 }else{ 10378 db = p->db; 10379 /* Make sure the schema has been loaded */ 10380 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 10381 } 10382 rc2 = sqlite3_test_control(testctrl, ii, db); 10383 isOk = 3; 10384 } 10385 break; 10386 10387 /* sqlite3_test_control(int, int) */ 10388 case SQLITE_TESTCTRL_ASSERT: 10389 case SQLITE_TESTCTRL_ALWAYS: 10390 if( nArg==3 ){ 10391 int opt = booleanValue(azArg[2]); 10392 rc2 = sqlite3_test_control(testctrl, opt); 10393 isOk = 1; 10394 } 10395 break; 10396 10397 /* sqlite3_test_control(int, int) */ 10398 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 10399 case SQLITE_TESTCTRL_NEVER_CORRUPT: 10400 if( nArg==3 ){ 10401 int opt = booleanValue(azArg[2]); 10402 rc2 = sqlite3_test_control(testctrl, opt); 10403 isOk = 3; 10404 } 10405 break; 10406 10407 /* sqlite3_test_control(sqlite3*) */ 10408 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 10409 rc2 = sqlite3_test_control(testctrl, p->db); 10410 isOk = 3; 10411 break; 10412 10413 case SQLITE_TESTCTRL_IMPOSTER: 10414 if( nArg==5 ){ 10415 rc2 = sqlite3_test_control(testctrl, p->db, 10416 azArg[2], 10417 integerValue(azArg[3]), 10418 integerValue(azArg[4])); 10419 isOk = 3; 10420 } 10421 break; 10422 10423 case SQLITE_TESTCTRL_SEEK_COUNT: { 10424 u64 x = 0; 10425 rc2 = sqlite3_test_control(testctrl, p->db, &x); 10426 utf8_printf(p->out, "%llu\n", x); 10427 isOk = 3; 10428 break; 10429 } 10430 10431#ifdef YYCOVERAGE 10432 case SQLITE_TESTCTRL_PARSER_COVERAGE: { 10433 if( nArg==2 ){ 10434 sqlite3_test_control(testctrl, p->out); 10435 isOk = 3; 10436 } 10437 break; 10438 } 10439#endif 10440#ifdef SQLITE_DEBUG 10441 case SQLITE_TESTCTRL_TUNE: { 10442 if( nArg==4 ){ 10443 int id = (int)integerValue(azArg[2]); 10444 int val = (int)integerValue(azArg[3]); 10445 sqlite3_test_control(testctrl, id, &val); 10446 isOk = 3; 10447 }else if( nArg==3 ){ 10448 int id = (int)integerValue(azArg[2]); 10449 sqlite3_test_control(testctrl, -id, &rc2); 10450 isOk = 1; 10451 }else if( nArg==2 ){ 10452 int id = 1; 10453 while(1){ 10454 int val = 0; 10455 rc2 = sqlite3_test_control(testctrl, -id, &val); 10456 if( rc2!=SQLITE_OK ) break; 10457 if( id>1 ) utf8_printf(p->out, " "); 10458 utf8_printf(p->out, "%d: %d", id, val); 10459 id++; 10460 } 10461 if( id>1 ) utf8_printf(p->out, "\n"); 10462 isOk = 3; 10463 } 10464 break; 10465 } 10466#endif 10467 case SQLITE_TESTCTRL_SORTER_MMAP: 10468 if( nArg==3 ){ 10469 int opt = (unsigned int)integerValue(azArg[2]); 10470 rc2 = sqlite3_test_control(testctrl, p->db, opt); 10471 isOk = 3; 10472 } 10473 break; 10474 } 10475 } 10476 if( isOk==0 && iCtrl>=0 ){ 10477 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 10478 rc = 1; 10479 }else if( isOk==1 ){ 10480 raw_printf(p->out, "%d\n", rc2); 10481 }else if( isOk==2 ){ 10482 raw_printf(p->out, "0x%08x\n", rc2); 10483 } 10484 }else 10485#endif /* !defined(SQLITE_UNTESTABLE) */ 10486 10487 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 10488 open_db(p, 0); 10489 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 10490 }else 10491 10492 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 10493 if( nArg==2 ){ 10494 enableTimer = booleanValue(azArg[1]); 10495 if( enableTimer && !HAS_TIMER ){ 10496 raw_printf(stderr, "Error: timer not available on this system.\n"); 10497 enableTimer = 0; 10498 } 10499 }else{ 10500 raw_printf(stderr, "Usage: .timer on|off\n"); 10501 rc = 1; 10502 } 10503 }else 10504 10505#ifndef SQLITE_OMIT_TRACE 10506 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 10507 int mType = 0; 10508 int jj; 10509 open_db(p, 0); 10510 for(jj=1; jj<nArg; jj++){ 10511 const char *z = azArg[jj]; 10512 if( z[0]=='-' ){ 10513 if( optionMatch(z, "expanded") ){ 10514 p->eTraceType = SHELL_TRACE_EXPANDED; 10515 } 10516#ifdef SQLITE_ENABLE_NORMALIZE 10517 else if( optionMatch(z, "normalized") ){ 10518 p->eTraceType = SHELL_TRACE_NORMALIZED; 10519 } 10520#endif 10521 else if( optionMatch(z, "plain") ){ 10522 p->eTraceType = SHELL_TRACE_PLAIN; 10523 } 10524 else if( optionMatch(z, "profile") ){ 10525 mType |= SQLITE_TRACE_PROFILE; 10526 } 10527 else if( optionMatch(z, "row") ){ 10528 mType |= SQLITE_TRACE_ROW; 10529 } 10530 else if( optionMatch(z, "stmt") ){ 10531 mType |= SQLITE_TRACE_STMT; 10532 } 10533 else if( optionMatch(z, "close") ){ 10534 mType |= SQLITE_TRACE_CLOSE; 10535 } 10536 else { 10537 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 10538 rc = 1; 10539 goto meta_command_exit; 10540 } 10541 }else{ 10542 output_file_close(p->traceOut); 10543 p->traceOut = output_file_open(azArg[1], 0); 10544 } 10545 } 10546 if( p->traceOut==0 ){ 10547 sqlite3_trace_v2(p->db, 0, 0, 0); 10548 }else{ 10549 if( mType==0 ) mType = SQLITE_TRACE_STMT; 10550 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 10551 } 10552 }else 10553#endif /* !defined(SQLITE_OMIT_TRACE) */ 10554 10555#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 10556 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 10557 int ii; 10558 int lenOpt; 10559 char *zOpt; 10560 if( nArg<2 ){ 10561 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 10562 rc = 1; 10563 goto meta_command_exit; 10564 } 10565 open_db(p, 0); 10566 zOpt = azArg[1]; 10567 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 10568 lenOpt = (int)strlen(zOpt); 10569 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 10570 assert( azArg[nArg]==0 ); 10571 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 10572 }else{ 10573 for(ii=1; ii<nArg; ii++){ 10574 sqlite3_create_module(p->db, azArg[ii], 0, 0); 10575 } 10576 } 10577 }else 10578#endif 10579 10580#if SQLITE_USER_AUTHENTICATION 10581 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 10582 if( nArg<2 ){ 10583 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 10584 rc = 1; 10585 goto meta_command_exit; 10586 } 10587 open_db(p, 0); 10588 if( strcmp(azArg[1],"login")==0 ){ 10589 if( nArg!=4 ){ 10590 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 10591 rc = 1; 10592 goto meta_command_exit; 10593 } 10594 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 10595 strlen30(azArg[3])); 10596 if( rc ){ 10597 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 10598 rc = 1; 10599 } 10600 }else if( strcmp(azArg[1],"add")==0 ){ 10601 if( nArg!=5 ){ 10602 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 10603 rc = 1; 10604 goto meta_command_exit; 10605 } 10606 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 10607 booleanValue(azArg[4])); 10608 if( rc ){ 10609 raw_printf(stderr, "User-Add failed: %d\n", rc); 10610 rc = 1; 10611 } 10612 }else if( strcmp(azArg[1],"edit")==0 ){ 10613 if( nArg!=5 ){ 10614 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 10615 rc = 1; 10616 goto meta_command_exit; 10617 } 10618 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 10619 booleanValue(azArg[4])); 10620 if( rc ){ 10621 raw_printf(stderr, "User-Edit failed: %d\n", rc); 10622 rc = 1; 10623 } 10624 }else if( strcmp(azArg[1],"delete")==0 ){ 10625 if( nArg!=3 ){ 10626 raw_printf(stderr, "Usage: .user delete USER\n"); 10627 rc = 1; 10628 goto meta_command_exit; 10629 } 10630 rc = sqlite3_user_delete(p->db, azArg[2]); 10631 if( rc ){ 10632 raw_printf(stderr, "User-Delete failed: %d\n", rc); 10633 rc = 1; 10634 } 10635 }else{ 10636 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 10637 rc = 1; 10638 goto meta_command_exit; 10639 } 10640 }else 10641#endif /* SQLITE_USER_AUTHENTICATION */ 10642 10643 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 10644 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 10645 sqlite3_libversion(), sqlite3_sourceid()); 10646#if SQLITE_HAVE_ZLIB 10647 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 10648#endif 10649#define CTIMEOPT_VAL_(opt) #opt 10650#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 10651#if defined(__clang__) && defined(__clang_major__) 10652 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 10653 CTIMEOPT_VAL(__clang_minor__) "." 10654 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 10655#elif defined(_MSC_VER) 10656 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 10657#elif defined(__GNUC__) && defined(__VERSION__) 10658 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 10659#endif 10660 }else 10661 10662 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 10663 const char *zDbName = nArg==2 ? azArg[1] : "main"; 10664 sqlite3_vfs *pVfs = 0; 10665 if( p->db ){ 10666 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 10667 if( pVfs ){ 10668 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 10669 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 10670 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 10671 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 10672 } 10673 } 10674 }else 10675 10676 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 10677 sqlite3_vfs *pVfs; 10678 sqlite3_vfs *pCurrent = 0; 10679 if( p->db ){ 10680 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 10681 } 10682 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 10683 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 10684 pVfs==pCurrent ? " <--- CURRENT" : ""); 10685 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 10686 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 10687 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 10688 if( pVfs->pNext ){ 10689 raw_printf(p->out, "-----------------------------------\n"); 10690 } 10691 } 10692 }else 10693 10694 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 10695 const char *zDbName = nArg==2 ? azArg[1] : "main"; 10696 char *zVfsName = 0; 10697 if( p->db ){ 10698 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 10699 if( zVfsName ){ 10700 utf8_printf(p->out, "%s\n", zVfsName); 10701 sqlite3_free(zVfsName); 10702 } 10703 } 10704 }else 10705 10706 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 10707 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 10708 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x); 10709 }else 10710 10711 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 10712 int j; 10713 assert( nArg<=ArraySize(azArg) ); 10714 p->nWidth = nArg-1; 10715 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); 10716 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 10717 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 10718 for(j=1; j<nArg; j++){ 10719 p->colWidth[j-1] = (int)integerValue(azArg[j]); 10720 } 10721 }else 10722 10723 { 10724 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 10725 " \"%s\". Enter \".help\" for help\n", azArg[0]); 10726 rc = 1; 10727 } 10728 10729meta_command_exit: 10730 if( p->outCount ){ 10731 p->outCount--; 10732 if( p->outCount==0 ) output_reset(p); 10733 } 10734 p->bSafeMode = p->bSafeModePersist; 10735 return rc; 10736} 10737 10738/* Line scan result and intermediate states (supporting scan resumption) 10739*/ 10740#ifndef CHAR_BIT 10741# define CHAR_BIT 8 10742#endif 10743typedef enum { 10744 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT, 10745 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT, 10746 QSS_Start = 0 10747} QuickScanState; 10748#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask)) 10749#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start) 10750#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start) 10751#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark) 10752#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi) 10753 10754/* 10755** Scan line for classification to guide shell's handling. 10756** The scan is resumable for subsequent lines when prior 10757** return values are passed as the 2nd argument. 10758*/ 10759static QuickScanState quickscan(char *zLine, QuickScanState qss){ 10760 char cin; 10761 char cWait = (char)qss; /* intentional narrowing loss */ 10762 if( cWait==0 ){ 10763 PlainScan: 10764 assert( cWait==0 ); 10765 while( (cin = *zLine++)!=0 ){ 10766 if( IsSpace(cin) ) 10767 continue; 10768 switch (cin){ 10769 case '-': 10770 if( *zLine!='-' ) 10771 break; 10772 while((cin = *++zLine)!=0 ) 10773 if( cin=='\n') 10774 goto PlainScan; 10775 return qss; 10776 case ';': 10777 qss |= QSS_EndingSemi; 10778 continue; 10779 case '/': 10780 if( *zLine=='*' ){ 10781 ++zLine; 10782 cWait = '*'; 10783 qss = QSS_SETV(qss, cWait); 10784 goto TermScan; 10785 } 10786 break; 10787 case '[': 10788 cin = ']'; 10789 /* fall thru */ 10790 case '`': case '\'': case '"': 10791 cWait = cin; 10792 qss = QSS_HasDark | cWait; 10793 goto TermScan; 10794 default: 10795 break; 10796 } 10797 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark; 10798 } 10799 }else{ 10800 TermScan: 10801 while( (cin = *zLine++)!=0 ){ 10802 if( cin==cWait ){ 10803 switch( cWait ){ 10804 case '*': 10805 if( *zLine != '/' ) 10806 continue; 10807 ++zLine; 10808 cWait = 0; 10809 qss = QSS_SETV(qss, 0); 10810 goto PlainScan; 10811 case '`': case '\'': case '"': 10812 if(*zLine==cWait){ 10813 ++zLine; 10814 continue; 10815 } 10816 /* fall thru */ 10817 case ']': 10818 cWait = 0; 10819 qss = QSS_SETV(qss, 0); 10820 goto PlainScan; 10821 default: assert(0); 10822 } 10823 } 10824 } 10825 } 10826 return qss; 10827} 10828 10829/* 10830** Return TRUE if the line typed in is an SQL command terminator other 10831** than a semi-colon. The SQL Server style "go" command is understood 10832** as is the Oracle "/". 10833*/ 10834static int line_is_command_terminator(char *zLine){ 10835 while( IsSpace(zLine[0]) ){ zLine++; }; 10836 if( zLine[0]=='/' ) 10837 zLine += 1; /* Oracle */ 10838 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' ) 10839 zLine += 2; /* SQL Server */ 10840 else 10841 return 0; 10842 return quickscan(zLine,QSS_Start)==QSS_Start; 10843} 10844 10845/* 10846** We need a default sqlite3_complete() implementation to use in case 10847** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 10848** any arbitrary text is a complete SQL statement. This is not very 10849** user-friendly, but it does seem to work. 10850*/ 10851#ifdef SQLITE_OMIT_COMPLETE 10852#define sqlite3_complete(x) 1 10853#endif 10854 10855/* 10856** Return true if zSql is a complete SQL statement. Return false if it 10857** ends in the middle of a string literal or C-style comment. 10858*/ 10859static int line_is_complete(char *zSql, int nSql){ 10860 int rc; 10861 if( zSql==0 ) return 1; 10862 zSql[nSql] = ';'; 10863 zSql[nSql+1] = 0; 10864 rc = sqlite3_complete(zSql); 10865 zSql[nSql] = 0; 10866 return rc; 10867} 10868 10869/* 10870** Run a single line of SQL. Return the number of errors. 10871*/ 10872static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 10873 int rc; 10874 char *zErrMsg = 0; 10875 10876 open_db(p, 0); 10877 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 10878 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 10879 BEGIN_TIMER; 10880 rc = shell_exec(p, zSql, &zErrMsg); 10881 END_TIMER; 10882 if( rc || zErrMsg ){ 10883 char zPrefix[100]; 10884 if( in!=0 || !stdin_is_interactive ){ 10885 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 10886 "Error: near line %d:", startline); 10887 }else{ 10888 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 10889 } 10890 if( zErrMsg!=0 ){ 10891 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 10892 sqlite3_free(zErrMsg); 10893 zErrMsg = 0; 10894 }else{ 10895 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 10896 } 10897 return 1; 10898 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 10899 char zLineBuf[2000]; 10900 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, 10901 "changes: %lld total_changes: %lld", 10902 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); 10903 raw_printf(p->out, "%s\n", zLineBuf); 10904 } 10905 return 0; 10906} 10907 10908 10909/* 10910** Read input from *in and process it. If *in==0 then input 10911** is interactive - the user is typing it it. Otherwise, input 10912** is coming from a file or device. A prompt is issued and history 10913** is saved only if input is interactive. An interrupt signal will 10914** cause this routine to exit immediately, unless input is interactive. 10915** 10916** Return the number of errors. 10917*/ 10918static int process_input(ShellState *p){ 10919 char *zLine = 0; /* A single input line */ 10920 char *zSql = 0; /* Accumulated SQL text */ 10921 int nLine; /* Length of current line */ 10922 int nSql = 0; /* Bytes of zSql[] used */ 10923 int nAlloc = 0; /* Allocated zSql[] space */ 10924 int rc; /* Error code */ 10925 int errCnt = 0; /* Number of errors seen */ 10926 int startline = 0; /* Line number for start of current input */ 10927 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */ 10928 10929 p->lineno = 0; 10930 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 10931 fflush(p->out); 10932 zLine = one_input_line(p->in, zLine, nSql>0); 10933 if( zLine==0 ){ 10934 /* End of input */ 10935 if( p->in==0 && stdin_is_interactive ) printf("\n"); 10936 break; 10937 } 10938 if( seenInterrupt ){ 10939 if( p->in!=0 ) break; 10940 seenInterrupt = 0; 10941 } 10942 p->lineno++; 10943 if( QSS_INPLAIN(qss) 10944 && line_is_command_terminator(zLine) 10945 && line_is_complete(zSql, nSql) ){ 10946 memcpy(zLine,";",2); 10947 } 10948 qss = quickscan(zLine, qss); 10949 if( QSS_PLAINWHITE(qss) && nSql==0 ){ 10950 if( ShellHasFlag(p, SHFLG_Echo) ) 10951 printf("%s\n", zLine); 10952 /* Just swallow single-line whitespace */ 10953 qss = QSS_Start; 10954 continue; 10955 } 10956 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 10957 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 10958 if( zLine[0]=='.' ){ 10959 rc = do_meta_command(zLine, p); 10960 if( rc==2 ){ /* exit requested */ 10961 break; 10962 }else if( rc ){ 10963 errCnt++; 10964 } 10965 } 10966 qss = QSS_Start; 10967 continue; 10968 } 10969 /* No single-line dispositions remain; accumulate line(s). */ 10970 nLine = strlen30(zLine); 10971 if( nSql+nLine+2>=nAlloc ){ 10972 /* Grow buffer by half-again increments when big. */ 10973 nAlloc = nSql+(nSql>>1)+nLine+100; 10974 zSql = realloc(zSql, nAlloc); 10975 shell_check_oom(zSql); 10976 } 10977 if( nSql==0 ){ 10978 int i; 10979 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 10980 assert( nAlloc>0 && zSql!=0 ); 10981 memcpy(zSql, zLine+i, nLine+1-i); 10982 startline = p->lineno; 10983 nSql = nLine-i; 10984 }else{ 10985 zSql[nSql++] = '\n'; 10986 memcpy(zSql+nSql, zLine, nLine+1); 10987 nSql += nLine; 10988 } 10989 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ 10990 errCnt += runOneSqlLine(p, zSql, p->in, startline); 10991 nSql = 0; 10992 if( p->outCount ){ 10993 output_reset(p); 10994 p->outCount = 0; 10995 }else{ 10996 clearTempFile(p); 10997 } 10998 p->bSafeMode = p->bSafeModePersist; 10999 qss = QSS_Start; 11000 }else if( nSql && QSS_PLAINWHITE(qss) ){ 11001 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 11002 nSql = 0; 11003 qss = QSS_Start; 11004 } 11005 } 11006 if( nSql && QSS_PLAINDARK(qss) ){ 11007 errCnt += runOneSqlLine(p, zSql, p->in, startline); 11008 } 11009 free(zSql); 11010 free(zLine); 11011 return errCnt>0; 11012} 11013 11014/* 11015** Return a pathname which is the user's home directory. A 11016** 0 return indicates an error of some kind. 11017*/ 11018static char *find_home_dir(int clearFlag){ 11019 static char *home_dir = NULL; 11020 if( clearFlag ){ 11021 free(home_dir); 11022 home_dir = 0; 11023 return 0; 11024 } 11025 if( home_dir ) return home_dir; 11026 11027#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 11028 && !defined(__RTP__) && !defined(_WRS_KERNEL) 11029 { 11030 struct passwd *pwent; 11031 uid_t uid = getuid(); 11032 if( (pwent=getpwuid(uid)) != NULL) { 11033 home_dir = pwent->pw_dir; 11034 } 11035 } 11036#endif 11037 11038#if defined(_WIN32_WCE) 11039 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 11040 */ 11041 home_dir = "/"; 11042#else 11043 11044#if defined(_WIN32) || defined(WIN32) 11045 if (!home_dir) { 11046 home_dir = getenv("USERPROFILE"); 11047 } 11048#endif 11049 11050 if (!home_dir) { 11051 home_dir = getenv("HOME"); 11052 } 11053 11054#if defined(_WIN32) || defined(WIN32) 11055 if (!home_dir) { 11056 char *zDrive, *zPath; 11057 int n; 11058 zDrive = getenv("HOMEDRIVE"); 11059 zPath = getenv("HOMEPATH"); 11060 if( zDrive && zPath ){ 11061 n = strlen30(zDrive) + strlen30(zPath) + 1; 11062 home_dir = malloc( n ); 11063 if( home_dir==0 ) return 0; 11064 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 11065 return home_dir; 11066 } 11067 home_dir = "c:\\"; 11068 } 11069#endif 11070 11071#endif /* !_WIN32_WCE */ 11072 11073 if( home_dir ){ 11074 int n = strlen30(home_dir) + 1; 11075 char *z = malloc( n ); 11076 if( z ) memcpy(z, home_dir, n); 11077 home_dir = z; 11078 } 11079 11080 return home_dir; 11081} 11082 11083/* 11084** Read input from the file given by sqliterc_override. Or if that 11085** parameter is NULL, take input from ~/.sqliterc 11086** 11087** Returns the number of errors. 11088*/ 11089static void process_sqliterc( 11090 ShellState *p, /* Configuration data */ 11091 const char *sqliterc_override /* Name of config file. NULL to use default */ 11092){ 11093 char *home_dir = NULL; 11094 const char *sqliterc = sqliterc_override; 11095 char *zBuf = 0; 11096 FILE *inSaved = p->in; 11097 int savedLineno = p->lineno; 11098 11099 if (sqliterc == NULL) { 11100 home_dir = find_home_dir(0); 11101 if( home_dir==0 ){ 11102 raw_printf(stderr, "-- warning: cannot find home directory;" 11103 " cannot read ~/.sqliterc\n"); 11104 return; 11105 } 11106 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 11107 shell_check_oom(zBuf); 11108 sqliterc = zBuf; 11109 } 11110 p->in = fopen(sqliterc,"rb"); 11111 if( p->in ){ 11112 if( stdin_is_interactive ){ 11113 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 11114 } 11115 if( process_input(p) && bail_on_error ) exit(1); 11116 fclose(p->in); 11117 }else if( sqliterc_override!=0 ){ 11118 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc); 11119 if( bail_on_error ) exit(1); 11120 } 11121 p->in = inSaved; 11122 p->lineno = savedLineno; 11123 sqlite3_free(zBuf); 11124} 11125 11126/* 11127** Show available command line options 11128*/ 11129static const char zOptions[] = 11130#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 11131 " -A ARGS... run \".archive ARGS\" and exit\n" 11132#endif 11133 " -append append the database to the end of the file\n" 11134 " -ascii set output mode to 'ascii'\n" 11135 " -bail stop after hitting an error\n" 11136 " -batch force batch I/O\n" 11137 " -box set output mode to 'box'\n" 11138 " -column set output mode to 'column'\n" 11139 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 11140 " -csv set output mode to 'csv'\n" 11141#if !defined(SQLITE_OMIT_DESERIALIZE) 11142 " -deserialize open the database using sqlite3_deserialize()\n" 11143#endif 11144 " -echo print commands before execution\n" 11145 " -init FILENAME read/process named file\n" 11146 " -[no]header turn headers on or off\n" 11147#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11148 " -heap SIZE Size of heap for memsys3 or memsys5\n" 11149#endif 11150 " -help show this message\n" 11151 " -html set output mode to HTML\n" 11152 " -interactive force interactive I/O\n" 11153 " -json set output mode to 'json'\n" 11154 " -line set output mode to 'line'\n" 11155 " -list set output mode to 'list'\n" 11156 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 11157 " -markdown set output mode to 'markdown'\n" 11158#if !defined(SQLITE_OMIT_DESERIALIZE) 11159 " -maxsize N maximum size for a --deserialize database\n" 11160#endif 11161 " -memtrace trace all memory allocations and deallocations\n" 11162 " -mmap N default mmap size set to N\n" 11163#ifdef SQLITE_ENABLE_MULTIPLEX 11164 " -multiplex enable the multiplexor VFS\n" 11165#endif 11166 " -newline SEP set output row separator. Default: '\\n'\n" 11167 " -nofollow refuse to open symbolic links to database files\n" 11168 " -nonce STRING set the safe-mode escape nonce\n" 11169 " -nullvalue TEXT set text string for NULL values. Default ''\n" 11170 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 11171 " -quote set output mode to 'quote'\n" 11172 " -readonly open the database read-only\n" 11173 " -safe enable safe-mode\n" 11174 " -separator SEP set output column separator. Default: '|'\n" 11175#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11176 " -sorterref SIZE sorter references threshold size\n" 11177#endif 11178 " -stats print memory stats before each finalize\n" 11179 " -table set output mode to 'table'\n" 11180 " -tabs set output mode to 'tabs'\n" 11181 " -version show SQLite version\n" 11182 " -vfs NAME use NAME as the default VFS\n" 11183#ifdef SQLITE_ENABLE_VFSTRACE 11184 " -vfstrace enable tracing of all VFS calls\n" 11185#endif 11186#ifdef SQLITE_HAVE_ZLIB 11187 " -zip open the file as a ZIP Archive\n" 11188#endif 11189; 11190static void usage(int showDetail){ 11191 utf8_printf(stderr, 11192 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 11193 "FILENAME is the name of an SQLite database. A new database is created\n" 11194 "if the file does not previously exist.\n", Argv0); 11195 if( showDetail ){ 11196 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 11197 }else{ 11198 raw_printf(stderr, "Use the -help option for additional information\n"); 11199 } 11200 exit(1); 11201} 11202 11203/* 11204** Internal check: Verify that the SQLite is uninitialized. Print a 11205** error message if it is initialized. 11206*/ 11207static void verify_uninitialized(void){ 11208 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 11209 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 11210 " initialization.\n"); 11211 } 11212} 11213 11214/* 11215** Initialize the state information in data 11216*/ 11217static void main_init(ShellState *data) { 11218 memset(data, 0, sizeof(*data)); 11219 data->normalMode = data->cMode = data->mode = MODE_List; 11220 data->autoExplain = 1; 11221 data->pAuxDb = &data->aAuxDb[0]; 11222 memcpy(data->colSeparator,SEP_Column, 2); 11223 memcpy(data->rowSeparator,SEP_Row, 2); 11224 data->showHeader = 0; 11225 data->shellFlgs = SHFLG_Lookaside; 11226 verify_uninitialized(); 11227 sqlite3_config(SQLITE_CONFIG_URI, 1); 11228 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 11229 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 11230 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 11231 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 11232} 11233 11234/* 11235** Output text to the console in a font that attracts extra attention. 11236*/ 11237#ifdef _WIN32 11238static void printBold(const char *zText){ 11239#if !SQLITE_OS_WINRT 11240 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 11241 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 11242 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 11243 SetConsoleTextAttribute(out, 11244 FOREGROUND_RED|FOREGROUND_INTENSITY 11245 ); 11246#endif 11247 printf("%s", zText); 11248#if !SQLITE_OS_WINRT 11249 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 11250#endif 11251} 11252#else 11253static void printBold(const char *zText){ 11254 printf("\033[1m%s\033[0m", zText); 11255} 11256#endif 11257 11258/* 11259** Get the argument to an --option. Throw an error and die if no argument 11260** is available. 11261*/ 11262static char *cmdline_option_value(int argc, char **argv, int i){ 11263 if( i==argc ){ 11264 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 11265 argv[0], argv[argc-1]); 11266 exit(1); 11267 } 11268 return argv[i]; 11269} 11270 11271#ifndef SQLITE_SHELL_IS_UTF8 11272# if (defined(_WIN32) || defined(WIN32)) \ 11273 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__))) 11274# define SQLITE_SHELL_IS_UTF8 (0) 11275# else 11276# define SQLITE_SHELL_IS_UTF8 (1) 11277# endif 11278#endif 11279 11280#if SQLITE_SHELL_IS_UTF8 11281int SQLITE_CDECL main(int argc, char **argv){ 11282#else 11283int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 11284 char **argv; 11285#endif 11286 char *zErrMsg = 0; 11287 ShellState data; 11288 const char *zInitFile = 0; 11289 int i; 11290 int rc = 0; 11291 int warnInmemoryDb = 0; 11292 int readStdin = 1; 11293 int nCmd = 0; 11294 char **azCmd = 0; 11295 const char *zVfs = 0; /* Value of -vfs command-line option */ 11296#if !SQLITE_SHELL_IS_UTF8 11297 char **argvToFree = 0; 11298 int argcToFree = 0; 11299#endif 11300 11301 setBinaryMode(stdin, 0); 11302 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 11303 stdin_is_interactive = isatty(0); 11304 stdout_is_console = isatty(1); 11305 11306#if !defined(_WIN32_WCE) 11307 if( getenv("SQLITE_DEBUG_BREAK") ){ 11308 if( isatty(0) && isatty(2) ){ 11309 fprintf(stderr, 11310 "attach debugger to process %d and press any key to continue.\n", 11311 GETPID()); 11312 fgetc(stdin); 11313 }else{ 11314#if defined(_WIN32) || defined(WIN32) 11315#if SQLITE_OS_WINRT 11316 __debugbreak(); 11317#else 11318 DebugBreak(); 11319#endif 11320#elif defined(SIGTRAP) 11321 raise(SIGTRAP); 11322#endif 11323 } 11324 } 11325#endif 11326 11327#if USE_SYSTEM_SQLITE+0!=1 11328 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 11329 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 11330 sqlite3_sourceid(), SQLITE_SOURCE_ID); 11331 exit(1); 11332 } 11333#endif 11334 main_init(&data); 11335 11336 /* On Windows, we must translate command-line arguments into UTF-8. 11337 ** The SQLite memory allocator subsystem has to be enabled in order to 11338 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 11339 ** subsequent sqlite3_config() calls will work. So copy all results into 11340 ** memory that does not come from the SQLite memory allocator. 11341 */ 11342#if !SQLITE_SHELL_IS_UTF8 11343 sqlite3_initialize(); 11344 argvToFree = malloc(sizeof(argv[0])*argc*2); 11345 shell_check_oom(argvToFree); 11346 argcToFree = argc; 11347 argv = argvToFree + argc; 11348 for(i=0; i<argc; i++){ 11349 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 11350 int n; 11351 shell_check_oom(z); 11352 n = (int)strlen(z); 11353 argv[i] = malloc( n+1 ); 11354 shell_check_oom(argv[i]); 11355 memcpy(argv[i], z, n+1); 11356 argvToFree[i] = argv[i]; 11357 sqlite3_free(z); 11358 } 11359 sqlite3_shutdown(); 11360#endif 11361 11362 assert( argc>=1 && argv && argv[0] ); 11363 Argv0 = argv[0]; 11364 11365 /* Make sure we have a valid signal handler early, before anything 11366 ** else is done. 11367 */ 11368#ifdef SIGINT 11369 signal(SIGINT, interrupt_handler); 11370#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 11371 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 11372#endif 11373 11374#ifdef SQLITE_SHELL_DBNAME_PROC 11375 { 11376 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 11377 ** of a C-function that will provide the name of the database file. Use 11378 ** this compile-time option to embed this shell program in larger 11379 ** applications. */ 11380 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 11381 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); 11382 warnInmemoryDb = 0; 11383 } 11384#endif 11385 11386 /* Do an initial pass through the command-line argument to locate 11387 ** the name of the database file, the name of the initialization file, 11388 ** the size of the alternative malloc heap, 11389 ** and the first command to execute. 11390 */ 11391 verify_uninitialized(); 11392 for(i=1; i<argc; i++){ 11393 char *z; 11394 z = argv[i]; 11395 if( z[0]!='-' ){ 11396 if( data.aAuxDb->zDbFilename==0 ){ 11397 data.aAuxDb->zDbFilename = z; 11398 }else{ 11399 /* Excesss arguments are interpreted as SQL (or dot-commands) and 11400 ** mean that nothing is read from stdin */ 11401 readStdin = 0; 11402 nCmd++; 11403 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 11404 shell_check_oom(azCmd); 11405 azCmd[nCmd-1] = z; 11406 } 11407 } 11408 if( z[1]=='-' ) z++; 11409 if( strcmp(z,"-separator")==0 11410 || strcmp(z,"-nullvalue")==0 11411 || strcmp(z,"-newline")==0 11412 || strcmp(z,"-cmd")==0 11413 ){ 11414 (void)cmdline_option_value(argc, argv, ++i); 11415 }else if( strcmp(z,"-init")==0 ){ 11416 zInitFile = cmdline_option_value(argc, argv, ++i); 11417 }else if( strcmp(z,"-batch")==0 ){ 11418 /* Need to check for batch mode here to so we can avoid printing 11419 ** informational messages (like from process_sqliterc) before 11420 ** we do the actual processing of arguments later in a second pass. 11421 */ 11422 stdin_is_interactive = 0; 11423 }else if( strcmp(z,"-heap")==0 ){ 11424#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11425 const char *zSize; 11426 sqlite3_int64 szHeap; 11427 11428 zSize = cmdline_option_value(argc, argv, ++i); 11429 szHeap = integerValue(zSize); 11430 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 11431 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 11432#else 11433 (void)cmdline_option_value(argc, argv, ++i); 11434#endif 11435 }else if( strcmp(z,"-pagecache")==0 ){ 11436 sqlite3_int64 n, sz; 11437 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11438 if( sz>70000 ) sz = 70000; 11439 if( sz<0 ) sz = 0; 11440 n = integerValue(cmdline_option_value(argc,argv,++i)); 11441 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 11442 n = 0xffffffffffffLL/sz; 11443 } 11444 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 11445 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 11446 data.shellFlgs |= SHFLG_Pagecache; 11447 }else if( strcmp(z,"-lookaside")==0 ){ 11448 int n, sz; 11449 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11450 if( sz<0 ) sz = 0; 11451 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11452 if( n<0 ) n = 0; 11453 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 11454 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 11455 }else if( strcmp(z,"-threadsafe")==0 ){ 11456 int n; 11457 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11458 switch( n ){ 11459 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break; 11460 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break; 11461 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break; 11462 } 11463#ifdef SQLITE_ENABLE_VFSTRACE 11464 }else if( strcmp(z,"-vfstrace")==0 ){ 11465 extern int vfstrace_register( 11466 const char *zTraceName, 11467 const char *zOldVfsName, 11468 int (*xOut)(const char*,void*), 11469 void *pOutArg, 11470 int makeDefault 11471 ); 11472 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 11473#endif 11474#ifdef SQLITE_ENABLE_MULTIPLEX 11475 }else if( strcmp(z,"-multiplex")==0 ){ 11476 extern int sqlite3_multiple_initialize(const char*,int); 11477 sqlite3_multiplex_initialize(0, 1); 11478#endif 11479 }else if( strcmp(z,"-mmap")==0 ){ 11480 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11481 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 11482#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11483 }else if( strcmp(z,"-sorterref")==0 ){ 11484 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11485 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 11486#endif 11487 }else if( strcmp(z,"-vfs")==0 ){ 11488 zVfs = cmdline_option_value(argc, argv, ++i); 11489#ifdef SQLITE_HAVE_ZLIB 11490 }else if( strcmp(z,"-zip")==0 ){ 11491 data.openMode = SHELL_OPEN_ZIPFILE; 11492#endif 11493 }else if( strcmp(z,"-append")==0 ){ 11494 data.openMode = SHELL_OPEN_APPENDVFS; 11495#ifndef SQLITE_OMIT_DESERIALIZE 11496 }else if( strcmp(z,"-deserialize")==0 ){ 11497 data.openMode = SHELL_OPEN_DESERIALIZE; 11498 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 11499 data.szMax = integerValue(argv[++i]); 11500#endif 11501 }else if( strcmp(z,"-readonly")==0 ){ 11502 data.openMode = SHELL_OPEN_READONLY; 11503 }else if( strcmp(z,"-nofollow")==0 ){ 11504 data.openFlags = SQLITE_OPEN_NOFOLLOW; 11505#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 11506 }else if( strncmp(z, "-A",2)==0 ){ 11507 /* All remaining command-line arguments are passed to the ".archive" 11508 ** command, so ignore them */ 11509 break; 11510#endif 11511 }else if( strcmp(z, "-memtrace")==0 ){ 11512 sqlite3MemTraceActivate(stderr); 11513 }else if( strcmp(z,"-bail")==0 ){ 11514 bail_on_error = 1; 11515 }else if( strcmp(z,"-nonce")==0 ){ 11516 free(data.zNonce); 11517 data.zNonce = strdup(argv[++i]); 11518 }else if( strcmp(z,"-safe")==0 ){ 11519 /* no-op - catch this on the second pass */ 11520 } 11521 } 11522 verify_uninitialized(); 11523 11524 11525#ifdef SQLITE_SHELL_INIT_PROC 11526 { 11527 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 11528 ** of a C-function that will perform initialization actions on SQLite that 11529 ** occur just before or after sqlite3_initialize(). Use this compile-time 11530 ** option to embed this shell program in larger applications. */ 11531 extern void SQLITE_SHELL_INIT_PROC(void); 11532 SQLITE_SHELL_INIT_PROC(); 11533 } 11534#else 11535 /* All the sqlite3_config() calls have now been made. So it is safe 11536 ** to call sqlite3_initialize() and process any command line -vfs option. */ 11537 sqlite3_initialize(); 11538#endif 11539 11540 if( zVfs ){ 11541 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 11542 if( pVfs ){ 11543 sqlite3_vfs_register(pVfs, 1); 11544 }else{ 11545 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 11546 exit(1); 11547 } 11548 } 11549 11550 if( data.pAuxDb->zDbFilename==0 ){ 11551#ifndef SQLITE_OMIT_MEMORYDB 11552 data.pAuxDb->zDbFilename = ":memory:"; 11553 warnInmemoryDb = argc==1; 11554#else 11555 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 11556 return 1; 11557#endif 11558 } 11559 data.out = stdout; 11560 sqlite3_appendvfs_init(0,0,0); 11561 11562 /* Go ahead and open the database file if it already exists. If the 11563 ** file does not exist, delay opening it. This prevents empty database 11564 ** files from being created if a user mistypes the database name argument 11565 ** to the sqlite command-line tool. 11566 */ 11567 if( access(data.pAuxDb->zDbFilename, 0)==0 ){ 11568 open_db(&data, 0); 11569 } 11570 11571 /* Process the initialization file if there is one. If no -init option 11572 ** is given on the command line, look for a file named ~/.sqliterc and 11573 ** try to process it. 11574 */ 11575 process_sqliterc(&data,zInitFile); 11576 11577 /* Make a second pass through the command-line argument and set 11578 ** options. This second pass is delayed until after the initialization 11579 ** file is processed so that the command-line arguments will override 11580 ** settings in the initialization file. 11581 */ 11582 for(i=1; i<argc; i++){ 11583 char *z = argv[i]; 11584 if( z[0]!='-' ) continue; 11585 if( z[1]=='-' ){ z++; } 11586 if( strcmp(z,"-init")==0 ){ 11587 i++; 11588 }else if( strcmp(z,"-html")==0 ){ 11589 data.mode = MODE_Html; 11590 }else if( strcmp(z,"-list")==0 ){ 11591 data.mode = MODE_List; 11592 }else if( strcmp(z,"-quote")==0 ){ 11593 data.mode = MODE_Quote; 11594 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 11595 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 11596 }else if( strcmp(z,"-line")==0 ){ 11597 data.mode = MODE_Line; 11598 }else if( strcmp(z,"-column")==0 ){ 11599 data.mode = MODE_Column; 11600 }else if( strcmp(z,"-json")==0 ){ 11601 data.mode = MODE_Json; 11602 }else if( strcmp(z,"-markdown")==0 ){ 11603 data.mode = MODE_Markdown; 11604 }else if( strcmp(z,"-table")==0 ){ 11605 data.mode = MODE_Table; 11606 }else if( strcmp(z,"-box")==0 ){ 11607 data.mode = MODE_Box; 11608 }else if( strcmp(z,"-csv")==0 ){ 11609 data.mode = MODE_Csv; 11610 memcpy(data.colSeparator,",",2); 11611#ifdef SQLITE_HAVE_ZLIB 11612 }else if( strcmp(z,"-zip")==0 ){ 11613 data.openMode = SHELL_OPEN_ZIPFILE; 11614#endif 11615 }else if( strcmp(z,"-append")==0 ){ 11616 data.openMode = SHELL_OPEN_APPENDVFS; 11617#ifndef SQLITE_OMIT_DESERIALIZE 11618 }else if( strcmp(z,"-deserialize")==0 ){ 11619 data.openMode = SHELL_OPEN_DESERIALIZE; 11620 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 11621 data.szMax = integerValue(argv[++i]); 11622#endif 11623 }else if( strcmp(z,"-readonly")==0 ){ 11624 data.openMode = SHELL_OPEN_READONLY; 11625 }else if( strcmp(z,"-nofollow")==0 ){ 11626 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 11627 }else if( strcmp(z,"-ascii")==0 ){ 11628 data.mode = MODE_Ascii; 11629 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit); 11630 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record); 11631 }else if( strcmp(z,"-tabs")==0 ){ 11632 data.mode = MODE_List; 11633 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab); 11634 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 11635 }else if( strcmp(z,"-separator")==0 ){ 11636 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 11637 "%s",cmdline_option_value(argc,argv,++i)); 11638 }else if( strcmp(z,"-newline")==0 ){ 11639 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 11640 "%s",cmdline_option_value(argc,argv,++i)); 11641 }else if( strcmp(z,"-nullvalue")==0 ){ 11642 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 11643 "%s",cmdline_option_value(argc,argv,++i)); 11644 }else if( strcmp(z,"-header")==0 ){ 11645 data.showHeader = 1; 11646 ShellSetFlag(&data, SHFLG_HeaderSet); 11647 }else if( strcmp(z,"-noheader")==0 ){ 11648 data.showHeader = 0; 11649 ShellSetFlag(&data, SHFLG_HeaderSet); 11650 }else if( strcmp(z,"-echo")==0 ){ 11651 ShellSetFlag(&data, SHFLG_Echo); 11652 }else if( strcmp(z,"-eqp")==0 ){ 11653 data.autoEQP = AUTOEQP_on; 11654 }else if( strcmp(z,"-eqpfull")==0 ){ 11655 data.autoEQP = AUTOEQP_full; 11656 }else if( strcmp(z,"-stats")==0 ){ 11657 data.statsOn = 1; 11658 }else if( strcmp(z,"-scanstats")==0 ){ 11659 data.scanstatsOn = 1; 11660 }else if( strcmp(z,"-backslash")==0 ){ 11661 /* Undocumented command-line option: -backslash 11662 ** Causes C-style backslash escapes to be evaluated in SQL statements 11663 ** prior to sending the SQL into SQLite. Useful for injecting 11664 ** crazy bytes in the middle of SQL statements for testing and debugging. 11665 */ 11666 ShellSetFlag(&data, SHFLG_Backslash); 11667 }else if( strcmp(z,"-bail")==0 ){ 11668 /* No-op. The bail_on_error flag should already be set. */ 11669 }else if( strcmp(z,"-version")==0 ){ 11670 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 11671 return 0; 11672 }else if( strcmp(z,"-interactive")==0 ){ 11673 stdin_is_interactive = 1; 11674 }else if( strcmp(z,"-batch")==0 ){ 11675 stdin_is_interactive = 0; 11676 }else if( strcmp(z,"-heap")==0 ){ 11677 i++; 11678 }else if( strcmp(z,"-pagecache")==0 ){ 11679 i+=2; 11680 }else if( strcmp(z,"-lookaside")==0 ){ 11681 i+=2; 11682 }else if( strcmp(z,"-threadsafe")==0 ){ 11683 i+=2; 11684 }else if( strcmp(z,"-nonce")==0 ){ 11685 i += 2; 11686 }else if( strcmp(z,"-mmap")==0 ){ 11687 i++; 11688 }else if( strcmp(z,"-memtrace")==0 ){ 11689 i++; 11690#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11691 }else if( strcmp(z,"-sorterref")==0 ){ 11692 i++; 11693#endif 11694 }else if( strcmp(z,"-vfs")==0 ){ 11695 i++; 11696#ifdef SQLITE_ENABLE_VFSTRACE 11697 }else if( strcmp(z,"-vfstrace")==0 ){ 11698 i++; 11699#endif 11700#ifdef SQLITE_ENABLE_MULTIPLEX 11701 }else if( strcmp(z,"-multiplex")==0 ){ 11702 i++; 11703#endif 11704 }else if( strcmp(z,"-help")==0 ){ 11705 usage(1); 11706 }else if( strcmp(z,"-cmd")==0 ){ 11707 /* Run commands that follow -cmd first and separately from commands 11708 ** that simply appear on the command-line. This seems goofy. It would 11709 ** be better if all commands ran in the order that they appear. But 11710 ** we retain the goofy behavior for historical compatibility. */ 11711 if( i==argc-1 ) break; 11712 z = cmdline_option_value(argc,argv,++i); 11713 if( z[0]=='.' ){ 11714 rc = do_meta_command(z, &data); 11715 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 11716 }else{ 11717 open_db(&data, 0); 11718 rc = shell_exec(&data, z, &zErrMsg); 11719 if( zErrMsg!=0 ){ 11720 utf8_printf(stderr,"Error: %s\n", zErrMsg); 11721 if( bail_on_error ) return rc!=0 ? rc : 1; 11722 }else if( rc!=0 ){ 11723 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 11724 if( bail_on_error ) return rc; 11725 } 11726 } 11727#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 11728 }else if( strncmp(z, "-A", 2)==0 ){ 11729 if( nCmd>0 ){ 11730 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 11731 " with \"%s\"\n", z); 11732 return 1; 11733 } 11734 open_db(&data, OPEN_DB_ZIPFILE); 11735 if( z[2] ){ 11736 argv[i] = &z[2]; 11737 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 11738 }else{ 11739 arDotCommand(&data, 1, argv+i, argc-i); 11740 } 11741 readStdin = 0; 11742 break; 11743#endif 11744 }else if( strcmp(z,"-safe")==0 ){ 11745 data.bSafeMode = data.bSafeModePersist = 1; 11746 }else{ 11747 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 11748 raw_printf(stderr,"Use -help for a list of options.\n"); 11749 return 1; 11750 } 11751 data.cMode = data.mode; 11752 } 11753 11754 if( !readStdin ){ 11755 /* Run all arguments that do not begin with '-' as if they were separate 11756 ** command-line inputs, except for the argToSkip argument which contains 11757 ** the database filename. 11758 */ 11759 for(i=0; i<nCmd; i++){ 11760 if( azCmd[i][0]=='.' ){ 11761 rc = do_meta_command(azCmd[i], &data); 11762 if( rc ){ 11763 free(azCmd); 11764 return rc==2 ? 0 : rc; 11765 } 11766 }else{ 11767 open_db(&data, 0); 11768 rc = shell_exec(&data, azCmd[i], &zErrMsg); 11769 if( zErrMsg || rc ){ 11770 if( zErrMsg!=0 ){ 11771 utf8_printf(stderr,"Error: %s\n", zErrMsg); 11772 }else{ 11773 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 11774 } 11775 sqlite3_free(zErrMsg); 11776 free(azCmd); 11777 return rc!=0 ? rc : 1; 11778 } 11779 } 11780 } 11781 }else{ 11782 /* Run commands received from standard input 11783 */ 11784 if( stdin_is_interactive ){ 11785 char *zHome; 11786 char *zHistory; 11787 int nHistory; 11788 printf( 11789 "SQLite version %s %.19s\n" /*extra-version-info*/ 11790 "Enter \".help\" for usage hints.\n", 11791 sqlite3_libversion(), sqlite3_sourceid() 11792 ); 11793 if( warnInmemoryDb ){ 11794 printf("Connected to a "); 11795 printBold("transient in-memory database"); 11796 printf(".\nUse \".open FILENAME\" to reopen on a " 11797 "persistent database.\n"); 11798 } 11799 zHistory = getenv("SQLITE_HISTORY"); 11800 if( zHistory ){ 11801 zHistory = strdup(zHistory); 11802 }else if( (zHome = find_home_dir(0))!=0 ){ 11803 nHistory = strlen30(zHome) + 20; 11804 if( (zHistory = malloc(nHistory))!=0 ){ 11805 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 11806 } 11807 } 11808 if( zHistory ){ shell_read_history(zHistory); } 11809#if HAVE_READLINE || HAVE_EDITLINE 11810 rl_attempted_completion_function = readline_completion; 11811#elif HAVE_LINENOISE 11812 linenoiseSetCompletionCallback(linenoise_completion); 11813#endif 11814 data.in = 0; 11815 rc = process_input(&data); 11816 if( zHistory ){ 11817 shell_stifle_history(2000); 11818 shell_write_history(zHistory); 11819 free(zHistory); 11820 } 11821 }else{ 11822 data.in = stdin; 11823 rc = process_input(&data); 11824 } 11825 } 11826 free(azCmd); 11827 set_table_name(&data, 0); 11828 if( data.db ){ 11829 session_close_all(&data, -1); 11830 close_db(data.db); 11831 } 11832 for(i=0; i<ArraySize(data.aAuxDb); i++){ 11833 sqlite3_free(data.aAuxDb[i].zFreeOnClose); 11834 if( data.aAuxDb[i].db ){ 11835 session_close_all(&data, i); 11836 close_db(data.aAuxDb[i].db); 11837 } 11838 } 11839 find_home_dir(1); 11840 output_reset(&data); 11841 data.doXdgOpen = 0; 11842 clearTempFile(&data); 11843#if !SQLITE_SHELL_IS_UTF8 11844 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 11845 free(argvToFree); 11846#endif 11847 free(data.colWidth); 11848 free(data.zNonce); 11849 /* Clear the global data structure so that valgrind will detect memory 11850 ** leaks */ 11851 memset(&data, 0, sizeof(data)); 11852 return rc; 11853} 11854