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#ifdef SQLITE_DEBUG 431/* 432** Out-of-memory simulator variables 433*/ 434static unsigned int oomCounter = 0; /* Simulate OOM when equals 1 */ 435static unsigned int oomRepeat = 0; /* Number of OOMs in a row */ 436static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */ 437#endif /* SQLITE_DEBUG */ 438 439/* 440** This is the name of our program. It is set in main(), used 441** in a number of other places, mostly for error messages. 442*/ 443static char *Argv0; 444 445/* 446** Prompt strings. Initialized in main. Settable with 447** .prompt main continue 448*/ 449static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 450static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 451 452/* 453** Render output like fprintf(). Except, if the output is going to the 454** console and if this is running on a Windows machine, translate the 455** output from UTF-8 into MBCS. 456*/ 457#if defined(_WIN32) || defined(WIN32) 458void utf8_printf(FILE *out, const char *zFormat, ...){ 459 va_list ap; 460 va_start(ap, zFormat); 461 if( stdout_is_console && (out==stdout || out==stderr) ){ 462 char *z1 = sqlite3_vmprintf(zFormat, ap); 463 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 464 sqlite3_free(z1); 465 fputs(z2, out); 466 sqlite3_free(z2); 467 }else{ 468 vfprintf(out, zFormat, ap); 469 } 470 va_end(ap); 471} 472#elif !defined(utf8_printf) 473# define utf8_printf fprintf 474#endif 475 476/* 477** Render output like fprintf(). This should not be used on anything that 478** includes string formatting (e.g. "%s"). 479*/ 480#if !defined(raw_printf) 481# define raw_printf fprintf 482#endif 483 484/* Indicate out-of-memory and exit. */ 485static void shell_out_of_memory(void){ 486 raw_printf(stderr,"Error: out of memory\n"); 487 exit(1); 488} 489 490/* Check a pointer to see if it is NULL. If it is NULL, exit with an 491** out-of-memory error. 492*/ 493static void shell_check_oom(void *p){ 494 if( p==0 ) shell_out_of_memory(); 495} 496 497#ifdef SQLITE_DEBUG 498/* This routine is called when a simulated OOM occurs. It is broken 499** out as a separate routine to make it easy to set a breakpoint on 500** the OOM 501*/ 502void shellOomFault(void){ 503 if( oomRepeat>0 ){ 504 oomRepeat--; 505 }else{ 506 oomCounter--; 507 } 508} 509#endif /* SQLITE_DEBUG */ 510 511#ifdef SQLITE_DEBUG 512/* This routine is a replacement malloc() that is used to simulate 513** Out-Of-Memory (OOM) errors for testing purposes. 514*/ 515static void *oomMalloc(int nByte){ 516 if( oomCounter ){ 517 if( oomCounter==1 ){ 518 shellOomFault(); 519 return 0; 520 }else{ 521 oomCounter--; 522 } 523 } 524 return defaultMalloc(nByte); 525} 526#endif /* SQLITE_DEBUG */ 527 528#ifdef SQLITE_DEBUG 529/* Register the OOM simulator. This must occur before any memory 530** allocations */ 531static void registerOomSimulator(void){ 532 sqlite3_mem_methods mem; 533 sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem); 534 defaultMalloc = mem.xMalloc; 535 mem.xMalloc = oomMalloc; 536 sqlite3_config(SQLITE_CONFIG_MALLOC, &mem); 537} 538#endif 539 540/* 541** Write I/O traces to the following stream. 542*/ 543#ifdef SQLITE_ENABLE_IOTRACE 544static FILE *iotrace = 0; 545#endif 546 547/* 548** This routine works like printf in that its first argument is a 549** format string and subsequent arguments are values to be substituted 550** in place of % fields. The result of formatting this string 551** is written to iotrace. 552*/ 553#ifdef SQLITE_ENABLE_IOTRACE 554static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 555 va_list ap; 556 char *z; 557 if( iotrace==0 ) return; 558 va_start(ap, zFormat); 559 z = sqlite3_vmprintf(zFormat, ap); 560 va_end(ap); 561 utf8_printf(iotrace, "%s", z); 562 sqlite3_free(z); 563} 564#endif 565 566/* 567** Output string zUtf to stream pOut as w characters. If w is negative, 568** then right-justify the text. W is the width in UTF-8 characters, not 569** in bytes. This is different from the %*.*s specification in printf 570** since with %*.*s the width is measured in bytes, not characters. 571*/ 572static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 573 int i; 574 int n; 575 int aw = w<0 ? -w : w; 576 for(i=n=0; zUtf[i]; i++){ 577 if( (zUtf[i]&0xc0)!=0x80 ){ 578 n++; 579 if( n==aw ){ 580 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 581 break; 582 } 583 } 584 } 585 if( n>=aw ){ 586 utf8_printf(pOut, "%.*s", i, zUtf); 587 }else if( w<0 ){ 588 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 589 }else{ 590 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 591 } 592} 593 594 595/* 596** Determines if a string is a number of not. 597*/ 598static int isNumber(const char *z, int *realnum){ 599 if( *z=='-' || *z=='+' ) z++; 600 if( !IsDigit(*z) ){ 601 return 0; 602 } 603 z++; 604 if( realnum ) *realnum = 0; 605 while( IsDigit(*z) ){ z++; } 606 if( *z=='.' ){ 607 z++; 608 if( !IsDigit(*z) ) return 0; 609 while( IsDigit(*z) ){ z++; } 610 if( realnum ) *realnum = 1; 611 } 612 if( *z=='e' || *z=='E' ){ 613 z++; 614 if( *z=='+' || *z=='-' ) z++; 615 if( !IsDigit(*z) ) return 0; 616 while( IsDigit(*z) ){ z++; } 617 if( realnum ) *realnum = 1; 618 } 619 return *z==0; 620} 621 622/* 623** Compute a string length that is limited to what can be stored in 624** lower 30 bits of a 32-bit signed integer. 625*/ 626static int strlen30(const char *z){ 627 const char *z2 = z; 628 while( *z2 ){ z2++; } 629 return 0x3fffffff & (int)(z2 - z); 630} 631 632/* 633** Return the length of a string in characters. Multibyte UTF8 characters 634** count as a single character. 635*/ 636static int strlenChar(const char *z){ 637 int n = 0; 638 while( *z ){ 639 if( (0xc0&*(z++))!=0x80 ) n++; 640 } 641 return n; 642} 643 644/* 645** Return open FILE * if zFile exists, can be opened for read 646** and is an ordinary file or a character stream source. 647** Otherwise return 0. 648*/ 649static FILE * openChrSource(const char *zFile){ 650#ifdef _WIN32 651 struct _stat x = {0}; 652# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) 653 /* On Windows, open first, then check the stream nature. This order 654 ** is necessary because _stat() and sibs, when checking a named pipe, 655 ** effectively break the pipe as its supplier sees it. */ 656 FILE *rv = fopen(zFile, "rb"); 657 if( rv==0 ) return 0; 658 if( _fstat(_fileno(rv), &x) != 0 659 || !STAT_CHR_SRC(x.st_mode)){ 660 fclose(rv); 661 rv = 0; 662 } 663 return rv; 664#else 665 struct stat x = {0}; 666 int rc = stat(zFile, &x); 667# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) 668 if( rc!=0 ) return 0; 669 if( STAT_CHR_SRC(x.st_mode) ){ 670 return fopen(zFile, "rb"); 671 }else{ 672 return 0; 673 } 674#endif 675#undef STAT_CHR_SRC 676} 677 678/* 679** This routine reads a line of text from FILE in, stores 680** the text in memory obtained from malloc() and returns a pointer 681** to the text. NULL is returned at end of file, or if malloc() 682** fails. 683** 684** If zLine is not NULL then it is a malloced buffer returned from 685** a previous call to this routine that may be reused. 686*/ 687static char *local_getline(char *zLine, FILE *in){ 688 int nLine = zLine==0 ? 0 : 100; 689 int n = 0; 690 691 while( 1 ){ 692 if( n+100>nLine ){ 693 nLine = nLine*2 + 100; 694 zLine = realloc(zLine, nLine); 695 shell_check_oom(zLine); 696 } 697 if( fgets(&zLine[n], nLine - n, in)==0 ){ 698 if( n==0 ){ 699 free(zLine); 700 return 0; 701 } 702 zLine[n] = 0; 703 break; 704 } 705 while( zLine[n] ) n++; 706 if( n>0 && zLine[n-1]=='\n' ){ 707 n--; 708 if( n>0 && zLine[n-1]=='\r' ) n--; 709 zLine[n] = 0; 710 break; 711 } 712 } 713#if defined(_WIN32) || defined(WIN32) 714 /* For interactive input on Windows systems, translate the 715 ** multi-byte characterset characters into UTF-8. */ 716 if( stdin_is_interactive && in==stdin ){ 717 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 718 if( zTrans ){ 719 int nTrans = strlen30(zTrans)+1; 720 if( nTrans>nLine ){ 721 zLine = realloc(zLine, nTrans); 722 shell_check_oom(zLine); 723 } 724 memcpy(zLine, zTrans, nTrans); 725 sqlite3_free(zTrans); 726 } 727 } 728#endif /* defined(_WIN32) || defined(WIN32) */ 729 return zLine; 730} 731 732/* 733** Retrieve a single line of input text. 734** 735** If in==0 then read from standard input and prompt before each line. 736** If isContinuation is true, then a continuation prompt is appropriate. 737** If isContinuation is zero, then the main prompt should be used. 738** 739** If zPrior is not NULL then it is a buffer from a prior call to this 740** routine that can be reused. 741** 742** The result is stored in space obtained from malloc() and must either 743** be freed by the caller or else passed back into this routine via the 744** zPrior argument for reuse. 745*/ 746static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 747 char *zPrompt; 748 char *zResult; 749 if( in!=0 ){ 750 zResult = local_getline(zPrior, in); 751 }else{ 752 zPrompt = isContinuation ? continuePrompt : mainPrompt; 753#if SHELL_USE_LOCAL_GETLINE 754 printf("%s", zPrompt); 755 fflush(stdout); 756 zResult = local_getline(zPrior, stdin); 757#else 758 free(zPrior); 759 zResult = shell_readline(zPrompt); 760 if( zResult && *zResult ) shell_add_history(zResult); 761#endif 762 } 763 return zResult; 764} 765 766 767/* 768** Return the value of a hexadecimal digit. Return -1 if the input 769** is not a hex digit. 770*/ 771static int hexDigitValue(char c){ 772 if( c>='0' && c<='9' ) return c - '0'; 773 if( c>='a' && c<='f' ) return c - 'a' + 10; 774 if( c>='A' && c<='F' ) return c - 'A' + 10; 775 return -1; 776} 777 778/* 779** Interpret zArg as an integer value, possibly with suffixes. 780*/ 781static sqlite3_int64 integerValue(const char *zArg){ 782 sqlite3_int64 v = 0; 783 static const struct { char *zSuffix; int iMult; } aMult[] = { 784 { "KiB", 1024 }, 785 { "MiB", 1024*1024 }, 786 { "GiB", 1024*1024*1024 }, 787 { "KB", 1000 }, 788 { "MB", 1000000 }, 789 { "GB", 1000000000 }, 790 { "K", 1000 }, 791 { "M", 1000000 }, 792 { "G", 1000000000 }, 793 }; 794 int i; 795 int isNeg = 0; 796 if( zArg[0]=='-' ){ 797 isNeg = 1; 798 zArg++; 799 }else if( zArg[0]=='+' ){ 800 zArg++; 801 } 802 if( zArg[0]=='0' && zArg[1]=='x' ){ 803 int x; 804 zArg += 2; 805 while( (x = hexDigitValue(zArg[0]))>=0 ){ 806 v = (v<<4) + x; 807 zArg++; 808 } 809 }else{ 810 while( IsDigit(zArg[0]) ){ 811 v = v*10 + zArg[0] - '0'; 812 zArg++; 813 } 814 } 815 for(i=0; i<ArraySize(aMult); i++){ 816 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 817 v *= aMult[i].iMult; 818 break; 819 } 820 } 821 return isNeg? -v : v; 822} 823 824/* 825** A variable length string to which one can append text. 826*/ 827typedef struct ShellText ShellText; 828struct ShellText { 829 char *z; 830 int n; 831 int nAlloc; 832}; 833 834/* 835** Initialize and destroy a ShellText object 836*/ 837static void initText(ShellText *p){ 838 memset(p, 0, sizeof(*p)); 839} 840static void freeText(ShellText *p){ 841 free(p->z); 842 initText(p); 843} 844 845/* zIn is either a pointer to a NULL-terminated string in memory obtained 846** from malloc(), or a NULL pointer. The string pointed to by zAppend is 847** added to zIn, and the result returned in memory obtained from malloc(). 848** zIn, if it was not NULL, is freed. 849** 850** If the third argument, quote, is not '\0', then it is used as a 851** quote character for zAppend. 852*/ 853static void appendText(ShellText *p, char const *zAppend, char quote){ 854 int len; 855 int i; 856 int nAppend = strlen30(zAppend); 857 858 len = nAppend+p->n+1; 859 if( quote ){ 860 len += 2; 861 for(i=0; i<nAppend; i++){ 862 if( zAppend[i]==quote ) len++; 863 } 864 } 865 866 if( p->z==0 || p->n+len>=p->nAlloc ){ 867 p->nAlloc = p->nAlloc*2 + len + 20; 868 p->z = realloc(p->z, p->nAlloc); 869 shell_check_oom(p->z); 870 } 871 872 if( quote ){ 873 char *zCsr = p->z+p->n; 874 *zCsr++ = quote; 875 for(i=0; i<nAppend; i++){ 876 *zCsr++ = zAppend[i]; 877 if( zAppend[i]==quote ) *zCsr++ = quote; 878 } 879 *zCsr++ = quote; 880 p->n = (int)(zCsr - p->z); 881 *zCsr = '\0'; 882 }else{ 883 memcpy(p->z+p->n, zAppend, nAppend); 884 p->n += nAppend; 885 p->z[p->n] = '\0'; 886 } 887} 888 889/* 890** Attempt to determine if identifier zName needs to be quoted, either 891** because it contains non-alphanumeric characters, or because it is an 892** SQLite keyword. Be conservative in this estimate: When in doubt assume 893** that quoting is required. 894** 895** Return '"' if quoting is required. Return 0 if no quoting is required. 896*/ 897static char quoteChar(const char *zName){ 898 int i; 899 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 900 for(i=0; zName[i]; i++){ 901 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 902 } 903 return sqlite3_keyword_check(zName, i) ? '"' : 0; 904} 905 906/* 907** Construct a fake object name and column list to describe the structure 908** of the view, virtual table, or table valued function zSchema.zName. 909*/ 910static char *shellFakeSchema( 911 sqlite3 *db, /* The database connection containing the vtab */ 912 const char *zSchema, /* Schema of the database holding the vtab */ 913 const char *zName /* The name of the virtual table */ 914){ 915 sqlite3_stmt *pStmt = 0; 916 char *zSql; 917 ShellText s; 918 char cQuote; 919 char *zDiv = "("; 920 int nRow = 0; 921 922 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 923 zSchema ? zSchema : "main", zName); 924 shell_check_oom(zSql); 925 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 926 sqlite3_free(zSql); 927 initText(&s); 928 if( zSchema ){ 929 cQuote = quoteChar(zSchema); 930 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 931 appendText(&s, zSchema, cQuote); 932 appendText(&s, ".", 0); 933 } 934 cQuote = quoteChar(zName); 935 appendText(&s, zName, cQuote); 936 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 937 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 938 nRow++; 939 appendText(&s, zDiv, 0); 940 zDiv = ","; 941 cQuote = quoteChar(zCol); 942 appendText(&s, zCol, cQuote); 943 } 944 appendText(&s, ")", 0); 945 sqlite3_finalize(pStmt); 946 if( nRow==0 ){ 947 freeText(&s); 948 s.z = 0; 949 } 950 return s.z; 951} 952 953/* 954** SQL function: shell_module_schema(X) 955** 956** Return a fake schema for the table-valued function or eponymous virtual 957** table X. 958*/ 959static void shellModuleSchema( 960 sqlite3_context *pCtx, 961 int nVal, 962 sqlite3_value **apVal 963){ 964 const char *zName; 965 char *zFake; 966 UNUSED_PARAMETER(nVal); 967 zName = (const char*)sqlite3_value_text(apVal[0]); 968 zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0; 969 if( zFake ){ 970 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 971 -1, sqlite3_free); 972 free(zFake); 973 } 974} 975 976/* 977** SQL function: shell_add_schema(S,X) 978** 979** Add the schema name X to the CREATE statement in S and return the result. 980** Examples: 981** 982** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 983** 984** Also works on 985** 986** CREATE INDEX 987** CREATE UNIQUE INDEX 988** CREATE VIEW 989** CREATE TRIGGER 990** CREATE VIRTUAL TABLE 991** 992** This UDF is used by the .schema command to insert the schema name of 993** attached databases into the middle of the sqlite_schema.sql field. 994*/ 995static void shellAddSchemaName( 996 sqlite3_context *pCtx, 997 int nVal, 998 sqlite3_value **apVal 999){ 1000 static const char *aPrefix[] = { 1001 "TABLE", 1002 "INDEX", 1003 "UNIQUE INDEX", 1004 "VIEW", 1005 "TRIGGER", 1006 "VIRTUAL TABLE" 1007 }; 1008 int i = 0; 1009 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 1010 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 1011 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 1012 sqlite3 *db = sqlite3_context_db_handle(pCtx); 1013 UNUSED_PARAMETER(nVal); 1014 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 1015 for(i=0; i<ArraySize(aPrefix); i++){ 1016 int n = strlen30(aPrefix[i]); 1017 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 1018 char *z = 0; 1019 char *zFake = 0; 1020 if( zSchema ){ 1021 char cQuote = quoteChar(zSchema); 1022 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 1023 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 1024 }else{ 1025 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 1026 } 1027 } 1028 if( zName 1029 && aPrefix[i][0]=='V' 1030 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 1031 ){ 1032 if( z==0 ){ 1033 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 1034 }else{ 1035 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 1036 } 1037 free(zFake); 1038 } 1039 if( z ){ 1040 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 1041 return; 1042 } 1043 } 1044 } 1045 } 1046 sqlite3_result_value(pCtx, apVal[0]); 1047} 1048 1049/* 1050** The source code for several run-time loadable extensions is inserted 1051** below by the ../tool/mkshellc.tcl script. Before processing that included 1052** code, we need to override some macros to make the included program code 1053** work here in the middle of this regular program. 1054*/ 1055#define SQLITE_EXTENSION_INIT1 1056#define SQLITE_EXTENSION_INIT2(X) (void)(X) 1057 1058#if defined(_WIN32) && defined(_MSC_VER) 1059INCLUDE test_windirent.h 1060INCLUDE test_windirent.c 1061#define dirent DIRENT 1062#endif 1063INCLUDE ../ext/misc/shathree.c 1064INCLUDE ../ext/misc/fileio.c 1065INCLUDE ../ext/misc/completion.c 1066INCLUDE ../ext/misc/appendvfs.c 1067INCLUDE ../ext/misc/memtrace.c 1068INCLUDE ../ext/misc/uint.c 1069INCLUDE ../ext/misc/decimal.c 1070INCLUDE ../ext/misc/ieee754.c 1071INCLUDE ../ext/misc/series.c 1072INCLUDE ../ext/misc/regexp.c 1073#ifdef SQLITE_HAVE_ZLIB 1074INCLUDE ../ext/misc/zipfile.c 1075INCLUDE ../ext/misc/sqlar.c 1076#endif 1077INCLUDE ../ext/expert/sqlite3expert.h 1078INCLUDE ../ext/expert/sqlite3expert.c 1079 1080#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 1081INCLUDE ../ext/misc/dbdata.c 1082#endif 1083 1084#if defined(SQLITE_ENABLE_SESSION) 1085/* 1086** State information for a single open session 1087*/ 1088typedef struct OpenSession OpenSession; 1089struct OpenSession { 1090 char *zName; /* Symbolic name for this session */ 1091 int nFilter; /* Number of xFilter rejection GLOB patterns */ 1092 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 1093 sqlite3_session *p; /* The open session */ 1094}; 1095#endif 1096 1097typedef struct ExpertInfo ExpertInfo; 1098struct ExpertInfo { 1099 sqlite3expert *pExpert; 1100 int bVerbose; 1101}; 1102 1103/* A single line in the EQP output */ 1104typedef struct EQPGraphRow EQPGraphRow; 1105struct EQPGraphRow { 1106 int iEqpId; /* ID for this row */ 1107 int iParentId; /* ID of the parent row */ 1108 EQPGraphRow *pNext; /* Next row in sequence */ 1109 char zText[1]; /* Text to display for this row */ 1110}; 1111 1112/* All EQP output is collected into an instance of the following */ 1113typedef struct EQPGraph EQPGraph; 1114struct EQPGraph { 1115 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 1116 EQPGraphRow *pLast; /* Last element of the pRow list */ 1117 char zPrefix[100]; /* Graph prefix */ 1118}; 1119 1120/* 1121** State information about the database connection is contained in an 1122** instance of the following structure. 1123*/ 1124typedef struct ShellState ShellState; 1125struct ShellState { 1126 sqlite3 *db; /* The database */ 1127 u8 autoExplain; /* Automatically turn on .explain mode */ 1128 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 1129 u8 autoEQPtest; /* autoEQP is in test mode */ 1130 u8 autoEQPtrace; /* autoEQP is in trace mode */ 1131 u8 scanstatsOn; /* True to display scan stats before each finalize */ 1132 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 1133 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 1134 u8 nEqpLevel; /* Depth of the EQP output graph */ 1135 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 1136 u8 bSafeMode; /* True to prohibit unsafe operations */ 1137 u8 bSafeModePersist; /* The long-term value of bSafeMode */ 1138 unsigned statsOn; /* True to display memory stats before each finalize */ 1139 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 1140 int outCount; /* Revert to stdout when reaching zero */ 1141 int cnt; /* Number of records displayed so far */ 1142 int lineno; /* Line number of last line read from in */ 1143 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 1144 FILE *in; /* Read commands from this stream */ 1145 FILE *out; /* Write results here */ 1146 FILE *traceOut; /* Output for sqlite3_trace() */ 1147 int nErr; /* Number of errors seen */ 1148 int mode; /* An output mode setting */ 1149 int modePrior; /* Saved mode */ 1150 int cMode; /* temporary output mode for the current query */ 1151 int normalMode; /* Output mode before ".explain on" */ 1152 int writableSchema; /* True if PRAGMA writable_schema=ON */ 1153 int showHeader; /* True to show column names in List or Column mode */ 1154 int nCheck; /* Number of ".check" commands run */ 1155 unsigned nProgress; /* Number of progress callbacks encountered */ 1156 unsigned mxProgress; /* Maximum progress callbacks before failing */ 1157 unsigned flgProgress; /* Flags for the progress callback */ 1158 unsigned shellFlgs; /* Various flags */ 1159 unsigned priorShFlgs; /* Saved copy of flags */ 1160 sqlite3_int64 szMax; /* --maxsize argument to .open */ 1161 char *zDestTable; /* Name of destination table when MODE_Insert */ 1162 char *zTempFile; /* Temporary file that might need deleting */ 1163 char zTestcase[30]; /* Name of current test case */ 1164 char colSeparator[20]; /* Column separator character for several modes */ 1165 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 1166 char colSepPrior[20]; /* Saved column separator */ 1167 char rowSepPrior[20]; /* Saved row separator */ 1168 int *colWidth; /* Requested width of each column in columnar modes */ 1169 int *actualWidth; /* Actual width of each column */ 1170 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 1171 char nullValue[20]; /* The text to print when a NULL comes back from 1172 ** the database */ 1173 char outfile[FILENAME_MAX]; /* Filename for *out */ 1174 sqlite3_stmt *pStmt; /* Current statement if any. */ 1175 FILE *pLog; /* Write log output here */ 1176 struct AuxDb { /* Storage space for auxiliary database connections */ 1177 sqlite3 *db; /* Connection pointer */ 1178 const char *zDbFilename; /* Filename used to open the connection */ 1179 char *zFreeOnClose; /* Free this memory allocation on close */ 1180#if defined(SQLITE_ENABLE_SESSION) 1181 int nSession; /* Number of active sessions */ 1182 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 1183#endif 1184 } aAuxDb[5], /* Array of all database connections */ 1185 *pAuxDb; /* Currently active database connection */ 1186 int *aiIndent; /* Array of indents used in MODE_Explain */ 1187 int nIndent; /* Size of array aiIndent[] */ 1188 int iIndent; /* Index of current op in aiIndent[] */ 1189 char *zNonce; /* Nonce for temporary safe-mode excapes */ 1190 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 1191 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 1192}; 1193 1194 1195/* Allowed values for ShellState.autoEQP 1196*/ 1197#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 1198#define AUTOEQP_on 1 /* Automatic EQP is on */ 1199#define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 1200#define AUTOEQP_full 3 /* Show full EXPLAIN */ 1201 1202/* Allowed values for ShellState.openMode 1203*/ 1204#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 1205#define SHELL_OPEN_NORMAL 1 /* Normal database file */ 1206#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 1207#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 1208#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 1209#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 1210#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 1211 1212/* Allowed values for ShellState.eTraceType 1213*/ 1214#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 1215#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 1216#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 1217 1218/* Bits in the ShellState.flgProgress variable */ 1219#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 1220#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 1221 ** callback limit is reached, and for each 1222 ** top-level SQL statement */ 1223#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 1224 1225/* 1226** These are the allowed shellFlgs values 1227*/ 1228#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 1229#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 1230#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 1231#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 1232#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 1233#define SHFLG_CountChanges 0x00000020 /* .changes setting */ 1234#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 1235#define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ 1236#define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 1237#define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 1238 1239/* 1240** Macros for testing and setting shellFlgs 1241*/ 1242#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 1243#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 1244#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 1245 1246/* 1247** These are the allowed modes. 1248*/ 1249#define MODE_Line 0 /* One column per line. Blank line between records */ 1250#define MODE_Column 1 /* One record per line in neat columns */ 1251#define MODE_List 2 /* One record per line with a separator */ 1252#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 1253#define MODE_Html 4 /* Generate an XHTML table */ 1254#define MODE_Insert 5 /* Generate SQL "insert" statements */ 1255#define MODE_Quote 6 /* Quote values as for SQL */ 1256#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 1257#define MODE_Csv 8 /* Quote strings, numbers are plain */ 1258#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 1259#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 1260#define MODE_Pretty 11 /* Pretty-print schemas */ 1261#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 1262#define MODE_Json 13 /* Output JSON */ 1263#define MODE_Markdown 14 /* Markdown formatting */ 1264#define MODE_Table 15 /* MySQL-style table formatting */ 1265#define MODE_Box 16 /* Unicode box-drawing characters */ 1266#define MODE_Count 17 /* Output only a count of the rows of output */ 1267#define MODE_Off 18 /* No query output shown */ 1268 1269static const char *modeDescr[] = { 1270 "line", 1271 "column", 1272 "list", 1273 "semi", 1274 "html", 1275 "insert", 1276 "quote", 1277 "tcl", 1278 "csv", 1279 "explain", 1280 "ascii", 1281 "prettyprint", 1282 "eqp", 1283 "json", 1284 "markdown", 1285 "table", 1286 "box", 1287 "count", 1288 "off" 1289}; 1290 1291/* 1292** These are the column/row/line separators used by the various 1293** import/export modes. 1294*/ 1295#define SEP_Column "|" 1296#define SEP_Row "\n" 1297#define SEP_Tab "\t" 1298#define SEP_Space " " 1299#define SEP_Comma "," 1300#define SEP_CrLf "\r\n" 1301#define SEP_Unit "\x1F" 1302#define SEP_Record "\x1E" 1303 1304/* 1305** A callback for the sqlite3_log() interface. 1306*/ 1307static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 1308 ShellState *p = (ShellState*)pArg; 1309 if( p->pLog==0 ) return; 1310 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 1311 fflush(p->pLog); 1312} 1313 1314/* 1315** SQL function: shell_putsnl(X) 1316** 1317** Write the text X to the screen (or whatever output is being directed) 1318** adding a newline at the end, and then return X. 1319*/ 1320static void shellPutsFunc( 1321 sqlite3_context *pCtx, 1322 int nVal, 1323 sqlite3_value **apVal 1324){ 1325 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 1326 (void)nVal; 1327 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 1328 sqlite3_result_value(pCtx, apVal[0]); 1329} 1330 1331/* 1332** If in safe mode, print an error message described by the arguments 1333** and exit immediately. 1334*/ 1335static void failIfSafeMode( 1336 ShellState *p, 1337 const char *zErrMsg, 1338 ... 1339){ 1340 if( p->bSafeMode ){ 1341 va_list ap; 1342 char *zMsg; 1343 va_start(ap, zErrMsg); 1344 zMsg = sqlite3_vmprintf(zErrMsg, ap); 1345 va_end(ap); 1346 raw_printf(stderr, "line %d: ", p->lineno); 1347 utf8_printf(stderr, "%s\n", zMsg); 1348 exit(1); 1349 } 1350} 1351 1352/* 1353** SQL function: edit(VALUE) 1354** edit(VALUE,EDITOR) 1355** 1356** These steps: 1357** 1358** (1) Write VALUE into a temporary file. 1359** (2) Run program EDITOR on that temporary file. 1360** (3) Read the temporary file back and return its content as the result. 1361** (4) Delete the temporary file 1362** 1363** If the EDITOR argument is omitted, use the value in the VISUAL 1364** environment variable. If still there is no EDITOR, through an error. 1365** 1366** Also throw an error if the EDITOR program returns a non-zero exit code. 1367*/ 1368#ifndef SQLITE_NOHAVE_SYSTEM 1369static void editFunc( 1370 sqlite3_context *context, 1371 int argc, 1372 sqlite3_value **argv 1373){ 1374 const char *zEditor; 1375 char *zTempFile = 0; 1376 sqlite3 *db; 1377 char *zCmd = 0; 1378 int bBin; 1379 int rc; 1380 int hasCRNL = 0; 1381 FILE *f = 0; 1382 sqlite3_int64 sz; 1383 sqlite3_int64 x; 1384 unsigned char *p = 0; 1385 1386 if( argc==2 ){ 1387 zEditor = (const char*)sqlite3_value_text(argv[1]); 1388 }else{ 1389 zEditor = getenv("VISUAL"); 1390 } 1391 if( zEditor==0 ){ 1392 sqlite3_result_error(context, "no editor for edit()", -1); 1393 return; 1394 } 1395 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 1396 sqlite3_result_error(context, "NULL input to edit()", -1); 1397 return; 1398 } 1399 db = sqlite3_context_db_handle(context); 1400 zTempFile = 0; 1401 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 1402 if( zTempFile==0 ){ 1403 sqlite3_uint64 r = 0; 1404 sqlite3_randomness(sizeof(r), &r); 1405 zTempFile = sqlite3_mprintf("temp%llx", r); 1406 if( zTempFile==0 ){ 1407 sqlite3_result_error_nomem(context); 1408 return; 1409 } 1410 } 1411 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 1412 /* When writing the file to be edited, do \n to \r\n conversions on systems 1413 ** that want \r\n line endings */ 1414 f = fopen(zTempFile, bBin ? "wb" : "w"); 1415 if( f==0 ){ 1416 sqlite3_result_error(context, "edit() cannot open temp file", -1); 1417 goto edit_func_end; 1418 } 1419 sz = sqlite3_value_bytes(argv[0]); 1420 if( bBin ){ 1421 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 1422 }else{ 1423 const char *z = (const char*)sqlite3_value_text(argv[0]); 1424 /* Remember whether or not the value originally contained \r\n */ 1425 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 1426 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 1427 } 1428 fclose(f); 1429 f = 0; 1430 if( x!=sz ){ 1431 sqlite3_result_error(context, "edit() could not write the whole file", -1); 1432 goto edit_func_end; 1433 } 1434 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 1435 if( zCmd==0 ){ 1436 sqlite3_result_error_nomem(context); 1437 goto edit_func_end; 1438 } 1439 rc = system(zCmd); 1440 sqlite3_free(zCmd); 1441 if( rc ){ 1442 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 1443 goto edit_func_end; 1444 } 1445 f = fopen(zTempFile, "rb"); 1446 if( f==0 ){ 1447 sqlite3_result_error(context, 1448 "edit() cannot reopen temp file after edit", -1); 1449 goto edit_func_end; 1450 } 1451 fseek(f, 0, SEEK_END); 1452 sz = ftell(f); 1453 rewind(f); 1454 p = sqlite3_malloc64( sz+1 ); 1455 if( p==0 ){ 1456 sqlite3_result_error_nomem(context); 1457 goto edit_func_end; 1458 } 1459 x = fread(p, 1, (size_t)sz, f); 1460 fclose(f); 1461 f = 0; 1462 if( x!=sz ){ 1463 sqlite3_result_error(context, "could not read back the whole file", -1); 1464 goto edit_func_end; 1465 } 1466 if( bBin ){ 1467 sqlite3_result_blob64(context, p, sz, sqlite3_free); 1468 }else{ 1469 sqlite3_int64 i, j; 1470 if( hasCRNL ){ 1471 /* If the original contains \r\n then do no conversions back to \n */ 1472 }else{ 1473 /* If the file did not originally contain \r\n then convert any new 1474 ** \r\n back into \n */ 1475 for(i=j=0; i<sz; i++){ 1476 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 1477 p[j++] = p[i]; 1478 } 1479 sz = j; 1480 p[sz] = 0; 1481 } 1482 sqlite3_result_text64(context, (const char*)p, sz, 1483 sqlite3_free, SQLITE_UTF8); 1484 } 1485 p = 0; 1486 1487edit_func_end: 1488 if( f ) fclose(f); 1489 unlink(zTempFile); 1490 sqlite3_free(zTempFile); 1491 sqlite3_free(p); 1492} 1493#endif /* SQLITE_NOHAVE_SYSTEM */ 1494 1495/* 1496** Save or restore the current output mode 1497*/ 1498static void outputModePush(ShellState *p){ 1499 p->modePrior = p->mode; 1500 p->priorShFlgs = p->shellFlgs; 1501 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 1502 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 1503} 1504static void outputModePop(ShellState *p){ 1505 p->mode = p->modePrior; 1506 p->shellFlgs = p->priorShFlgs; 1507 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 1508 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 1509} 1510 1511/* 1512** Output the given string as a hex-encoded blob (eg. X'1234' ) 1513*/ 1514static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 1515 int i; 1516 char *zBlob = (char *)pBlob; 1517 raw_printf(out,"X'"); 1518 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 1519 raw_printf(out,"'"); 1520} 1521 1522/* 1523** Find a string that is not found anywhere in z[]. Return a pointer 1524** to that string. 1525** 1526** Try to use zA and zB first. If both of those are already found in z[] 1527** then make up some string and store it in the buffer zBuf. 1528*/ 1529static const char *unused_string( 1530 const char *z, /* Result must not appear anywhere in z */ 1531 const char *zA, const char *zB, /* Try these first */ 1532 char *zBuf /* Space to store a generated string */ 1533){ 1534 unsigned i = 0; 1535 if( strstr(z, zA)==0 ) return zA; 1536 if( strstr(z, zB)==0 ) return zB; 1537 do{ 1538 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 1539 }while( strstr(z,zBuf)!=0 ); 1540 return zBuf; 1541} 1542 1543/* 1544** Output the given string as a quoted string using SQL quoting conventions. 1545** 1546** See also: output_quoted_escaped_string() 1547*/ 1548static void output_quoted_string(FILE *out, const char *z){ 1549 int i; 1550 char c; 1551 setBinaryMode(out, 1); 1552 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1553 if( c==0 ){ 1554 utf8_printf(out,"'%s'",z); 1555 }else{ 1556 raw_printf(out, "'"); 1557 while( *z ){ 1558 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1559 if( c=='\'' ) i++; 1560 if( i ){ 1561 utf8_printf(out, "%.*s", i, z); 1562 z += i; 1563 } 1564 if( c=='\'' ){ 1565 raw_printf(out, "'"); 1566 continue; 1567 } 1568 if( c==0 ){ 1569 break; 1570 } 1571 z++; 1572 } 1573 raw_printf(out, "'"); 1574 } 1575 setTextMode(out, 1); 1576} 1577 1578/* 1579** Output the given string as a quoted string using SQL quoting conventions. 1580** Additionallly , escape the "\n" and "\r" characters so that they do not 1581** get corrupted by end-of-line translation facilities in some operating 1582** systems. 1583** 1584** This is like output_quoted_string() but with the addition of the \r\n 1585** escape mechanism. 1586*/ 1587static void output_quoted_escaped_string(FILE *out, const char *z){ 1588 int i; 1589 char c; 1590 setBinaryMode(out, 1); 1591 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 1592 if( c==0 ){ 1593 utf8_printf(out,"'%s'",z); 1594 }else{ 1595 const char *zNL = 0; 1596 const char *zCR = 0; 1597 int nNL = 0; 1598 int nCR = 0; 1599 char zBuf1[20], zBuf2[20]; 1600 for(i=0; z[i]; i++){ 1601 if( z[i]=='\n' ) nNL++; 1602 if( z[i]=='\r' ) nCR++; 1603 } 1604 if( nNL ){ 1605 raw_printf(out, "replace("); 1606 zNL = unused_string(z, "\\n", "\\012", zBuf1); 1607 } 1608 if( nCR ){ 1609 raw_printf(out, "replace("); 1610 zCR = unused_string(z, "\\r", "\\015", zBuf2); 1611 } 1612 raw_printf(out, "'"); 1613 while( *z ){ 1614 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 1615 if( c=='\'' ) i++; 1616 if( i ){ 1617 utf8_printf(out, "%.*s", i, z); 1618 z += i; 1619 } 1620 if( c=='\'' ){ 1621 raw_printf(out, "'"); 1622 continue; 1623 } 1624 if( c==0 ){ 1625 break; 1626 } 1627 z++; 1628 if( c=='\n' ){ 1629 raw_printf(out, "%s", zNL); 1630 continue; 1631 } 1632 raw_printf(out, "%s", zCR); 1633 } 1634 raw_printf(out, "'"); 1635 if( nCR ){ 1636 raw_printf(out, ",'%s',char(13))", zCR); 1637 } 1638 if( nNL ){ 1639 raw_printf(out, ",'%s',char(10))", zNL); 1640 } 1641 } 1642 setTextMode(out, 1); 1643} 1644 1645/* 1646** Output the given string as a quoted according to C or TCL quoting rules. 1647*/ 1648static void output_c_string(FILE *out, const char *z){ 1649 unsigned int c; 1650 fputc('"', out); 1651 while( (c = *(z++))!=0 ){ 1652 if( c=='\\' ){ 1653 fputc(c, out); 1654 fputc(c, out); 1655 }else if( c=='"' ){ 1656 fputc('\\', out); 1657 fputc('"', out); 1658 }else if( c=='\t' ){ 1659 fputc('\\', out); 1660 fputc('t', out); 1661 }else if( c=='\n' ){ 1662 fputc('\\', out); 1663 fputc('n', out); 1664 }else if( c=='\r' ){ 1665 fputc('\\', out); 1666 fputc('r', out); 1667 }else if( !isprint(c&0xff) ){ 1668 raw_printf(out, "\\%03o", c&0xff); 1669 }else{ 1670 fputc(c, out); 1671 } 1672 } 1673 fputc('"', out); 1674} 1675 1676/* 1677** Output the given string as a quoted according to JSON quoting rules. 1678*/ 1679static void output_json_string(FILE *out, const char *z, int n){ 1680 unsigned int c; 1681 if( n<0 ) n = (int)strlen(z); 1682 fputc('"', out); 1683 while( n-- ){ 1684 c = *(z++); 1685 if( c=='\\' || c=='"' ){ 1686 fputc('\\', out); 1687 fputc(c, out); 1688 }else if( c<=0x1f ){ 1689 fputc('\\', out); 1690 if( c=='\b' ){ 1691 fputc('b', out); 1692 }else if( c=='\f' ){ 1693 fputc('f', out); 1694 }else if( c=='\n' ){ 1695 fputc('n', out); 1696 }else if( c=='\r' ){ 1697 fputc('r', out); 1698 }else if( c=='\t' ){ 1699 fputc('t', out); 1700 }else{ 1701 raw_printf(out, "u%04x",c); 1702 } 1703 }else{ 1704 fputc(c, out); 1705 } 1706 } 1707 fputc('"', out); 1708} 1709 1710/* 1711** Output the given string with characters that are special to 1712** HTML escaped. 1713*/ 1714static void output_html_string(FILE *out, const char *z){ 1715 int i; 1716 if( z==0 ) z = ""; 1717 while( *z ){ 1718 for(i=0; z[i] 1719 && z[i]!='<' 1720 && z[i]!='&' 1721 && z[i]!='>' 1722 && z[i]!='\"' 1723 && z[i]!='\''; 1724 i++){} 1725 if( i>0 ){ 1726 utf8_printf(out,"%.*s",i,z); 1727 } 1728 if( z[i]=='<' ){ 1729 raw_printf(out,"<"); 1730 }else if( z[i]=='&' ){ 1731 raw_printf(out,"&"); 1732 }else if( z[i]=='>' ){ 1733 raw_printf(out,">"); 1734 }else if( z[i]=='\"' ){ 1735 raw_printf(out,"""); 1736 }else if( z[i]=='\'' ){ 1737 raw_printf(out,"'"); 1738 }else{ 1739 break; 1740 } 1741 z += i + 1; 1742 } 1743} 1744 1745/* 1746** If a field contains any character identified by a 1 in the following 1747** array, then the string must be quoted for CSV. 1748*/ 1749static const char needCsvQuote[] = { 1750 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1751 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1752 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1753 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1754 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1756 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1757 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1758 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1759 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1760 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1761 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1762 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1763 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1764 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1765 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1766}; 1767 1768/* 1769** Output a single term of CSV. Actually, p->colSeparator is used for 1770** the separator, which may or may not be a comma. p->nullValue is 1771** the null value. Strings are quoted if necessary. The separator 1772** is only issued if bSep is true. 1773*/ 1774static void output_csv(ShellState *p, const char *z, int bSep){ 1775 FILE *out = p->out; 1776 if( z==0 ){ 1777 utf8_printf(out,"%s",p->nullValue); 1778 }else{ 1779 unsigned i; 1780 for(i=0; z[i]; i++){ 1781 if( needCsvQuote[((unsigned char*)z)[i]] ){ 1782 i = 0; 1783 break; 1784 } 1785 } 1786 if( i==0 || strstr(z, p->colSeparator)!=0 ){ 1787 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 1788 shell_check_oom(zQuoted); 1789 utf8_printf(out, "%s", zQuoted); 1790 sqlite3_free(zQuoted); 1791 }else{ 1792 utf8_printf(out, "%s", z); 1793 } 1794 } 1795 if( bSep ){ 1796 utf8_printf(p->out, "%s", p->colSeparator); 1797 } 1798} 1799 1800/* 1801** This routine runs when the user presses Ctrl-C 1802*/ 1803static void interrupt_handler(int NotUsed){ 1804 UNUSED_PARAMETER(NotUsed); 1805 seenInterrupt++; 1806 if( seenInterrupt>2 ) exit(1); 1807 if( globalDb ) sqlite3_interrupt(globalDb); 1808} 1809 1810#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 1811/* 1812** This routine runs for console events (e.g. Ctrl-C) on Win32 1813*/ 1814static BOOL WINAPI ConsoleCtrlHandler( 1815 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 1816){ 1817 if( dwCtrlType==CTRL_C_EVENT ){ 1818 interrupt_handler(0); 1819 return TRUE; 1820 } 1821 return FALSE; 1822} 1823#endif 1824 1825#ifndef SQLITE_OMIT_AUTHORIZATION 1826/* 1827** This authorizer runs in safe mode. 1828*/ 1829static int safeModeAuth( 1830 void *pClientData, 1831 int op, 1832 const char *zA1, 1833 const char *zA2, 1834 const char *zA3, 1835 const char *zA4 1836){ 1837 ShellState *p = (ShellState*)pClientData; 1838 static const char *azProhibitedFunctions[] = { 1839 "edit", 1840 "fts3_tokenizer", 1841 "load_extension", 1842 "readfile", 1843 "writefile", 1844 "zipfile", 1845 "zipfile_cds", 1846 }; 1847 UNUSED_PARAMETER(zA2); 1848 UNUSED_PARAMETER(zA3); 1849 UNUSED_PARAMETER(zA4); 1850 switch( op ){ 1851 case SQLITE_ATTACH: { 1852 failIfSafeMode(p, "cannot run ATTACH in safe mode"); 1853 break; 1854 } 1855 case SQLITE_FUNCTION: { 1856 int i; 1857 for(i=0; i<ArraySize(azProhibitedFunctions); i++){ 1858 if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){ 1859 failIfSafeMode(p, "cannot use the %s() function in safe mode", 1860 azProhibitedFunctions[i]); 1861 } 1862 } 1863 break; 1864 } 1865 } 1866 return SQLITE_OK; 1867} 1868 1869/* 1870** When the ".auth ON" is set, the following authorizer callback is 1871** invoked. It always returns SQLITE_OK. 1872*/ 1873static int shellAuth( 1874 void *pClientData, 1875 int op, 1876 const char *zA1, 1877 const char *zA2, 1878 const char *zA3, 1879 const char *zA4 1880){ 1881 ShellState *p = (ShellState*)pClientData; 1882 static const char *azAction[] = { 0, 1883 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 1884 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 1885 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 1886 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 1887 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 1888 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 1889 "PRAGMA", "READ", "SELECT", 1890 "TRANSACTION", "UPDATE", "ATTACH", 1891 "DETACH", "ALTER_TABLE", "REINDEX", 1892 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 1893 "FUNCTION", "SAVEPOINT", "RECURSIVE" 1894 }; 1895 int i; 1896 const char *az[4]; 1897 az[0] = zA1; 1898 az[1] = zA2; 1899 az[2] = zA3; 1900 az[3] = zA4; 1901 utf8_printf(p->out, "authorizer: %s", azAction[op]); 1902 for(i=0; i<4; i++){ 1903 raw_printf(p->out, " "); 1904 if( az[i] ){ 1905 output_c_string(p->out, az[i]); 1906 }else{ 1907 raw_printf(p->out, "NULL"); 1908 } 1909 } 1910 raw_printf(p->out, "\n"); 1911 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); 1912 return SQLITE_OK; 1913} 1914#endif 1915 1916/* 1917** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 1918** 1919** This routine converts some CREATE TABLE statements for shadow tables 1920** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 1921*/ 1922static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 1923 if( z==0 ) return; 1924 if( zTail==0 ) return; 1925 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 1926 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 1927 }else{ 1928 utf8_printf(out, "%s%s", z, zTail); 1929 } 1930} 1931static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 1932 char c = z[n]; 1933 z[n] = 0; 1934 printSchemaLine(out, z, zTail); 1935 z[n] = c; 1936} 1937 1938/* 1939** Return true if string z[] has nothing but whitespace and comments to the 1940** end of the first line. 1941*/ 1942static int wsToEol(const char *z){ 1943 int i; 1944 for(i=0; z[i]; i++){ 1945 if( z[i]=='\n' ) return 1; 1946 if( IsSpace(z[i]) ) continue; 1947 if( z[i]=='-' && z[i+1]=='-' ) return 1; 1948 return 0; 1949 } 1950 return 1; 1951} 1952 1953/* 1954** Add a new entry to the EXPLAIN QUERY PLAN data 1955*/ 1956static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 1957 EQPGraphRow *pNew; 1958 int nText = strlen30(zText); 1959 if( p->autoEQPtest ){ 1960 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 1961 } 1962 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 1963 shell_check_oom(pNew); 1964 pNew->iEqpId = iEqpId; 1965 pNew->iParentId = p2; 1966 memcpy(pNew->zText, zText, nText+1); 1967 pNew->pNext = 0; 1968 if( p->sGraph.pLast ){ 1969 p->sGraph.pLast->pNext = pNew; 1970 }else{ 1971 p->sGraph.pRow = pNew; 1972 } 1973 p->sGraph.pLast = pNew; 1974} 1975 1976/* 1977** Free and reset the EXPLAIN QUERY PLAN data that has been collected 1978** in p->sGraph. 1979*/ 1980static void eqp_reset(ShellState *p){ 1981 EQPGraphRow *pRow, *pNext; 1982 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 1983 pNext = pRow->pNext; 1984 sqlite3_free(pRow); 1985 } 1986 memset(&p->sGraph, 0, sizeof(p->sGraph)); 1987} 1988 1989/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 1990** pOld, or return the first such line if pOld is NULL 1991*/ 1992static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 1993 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 1994 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 1995 return pRow; 1996} 1997 1998/* Render a single level of the graph that has iEqpId as its parent. Called 1999** recursively to render sublevels. 2000*/ 2001static void eqp_render_level(ShellState *p, int iEqpId){ 2002 EQPGraphRow *pRow, *pNext; 2003 int n = strlen30(p->sGraph.zPrefix); 2004 char *z; 2005 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 2006 pNext = eqp_next_row(p, iEqpId, pRow); 2007 z = pRow->zText; 2008 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 2009 pNext ? "|--" : "`--", z); 2010 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 2011 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 2012 eqp_render_level(p, pRow->iEqpId); 2013 p->sGraph.zPrefix[n] = 0; 2014 } 2015 } 2016} 2017 2018/* 2019** Display and reset the EXPLAIN QUERY PLAN data 2020*/ 2021static void eqp_render(ShellState *p){ 2022 EQPGraphRow *pRow = p->sGraph.pRow; 2023 if( pRow ){ 2024 if( pRow->zText[0]=='-' ){ 2025 if( pRow->pNext==0 ){ 2026 eqp_reset(p); 2027 return; 2028 } 2029 utf8_printf(p->out, "%s\n", pRow->zText+3); 2030 p->sGraph.pRow = pRow->pNext; 2031 sqlite3_free(pRow); 2032 }else{ 2033 utf8_printf(p->out, "QUERY PLAN\n"); 2034 } 2035 p->sGraph.zPrefix[0] = 0; 2036 eqp_render_level(p, 0); 2037 eqp_reset(p); 2038 } 2039} 2040 2041#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 2042/* 2043** Progress handler callback. 2044*/ 2045static int progress_handler(void *pClientData) { 2046 ShellState *p = (ShellState*)pClientData; 2047 p->nProgress++; 2048 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 2049 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 2050 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 2051 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 2052 return 1; 2053 } 2054 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 2055 raw_printf(p->out, "Progress %u\n", p->nProgress); 2056 } 2057 return 0; 2058} 2059#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 2060 2061/* 2062** Print N dashes 2063*/ 2064static void print_dashes(FILE *out, int N){ 2065 const char zDash[] = "--------------------------------------------------"; 2066 const int nDash = sizeof(zDash) - 1; 2067 while( N>nDash ){ 2068 fputs(zDash, out); 2069 N -= nDash; 2070 } 2071 raw_printf(out, "%.*s", N, zDash); 2072} 2073 2074/* 2075** Print a markdown or table-style row separator using ascii-art 2076*/ 2077static void print_row_separator( 2078 ShellState *p, 2079 int nArg, 2080 const char *zSep 2081){ 2082 int i; 2083 if( nArg>0 ){ 2084 fputs(zSep, p->out); 2085 print_dashes(p->out, p->actualWidth[0]+2); 2086 for(i=1; i<nArg; i++){ 2087 fputs(zSep, p->out); 2088 print_dashes(p->out, p->actualWidth[i]+2); 2089 } 2090 fputs(zSep, p->out); 2091 } 2092 fputs("\n", p->out); 2093} 2094 2095/* 2096** This is the callback routine that the shell 2097** invokes for each row of a query result. 2098*/ 2099static int shell_callback( 2100 void *pArg, 2101 int nArg, /* Number of result columns */ 2102 char **azArg, /* Text of each result column */ 2103 char **azCol, /* Column names */ 2104 int *aiType /* Column types. Might be NULL */ 2105){ 2106 int i; 2107 ShellState *p = (ShellState*)pArg; 2108 2109 if( azArg==0 ) return 0; 2110 switch( p->cMode ){ 2111 case MODE_Count: 2112 case MODE_Off: { 2113 break; 2114 } 2115 case MODE_Line: { 2116 int w = 5; 2117 if( azArg==0 ) break; 2118 for(i=0; i<nArg; i++){ 2119 int len = strlen30(azCol[i] ? azCol[i] : ""); 2120 if( len>w ) w = len; 2121 } 2122 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 2123 for(i=0; i<nArg; i++){ 2124 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 2125 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 2126 } 2127 break; 2128 } 2129 case MODE_Explain: { 2130 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 2131 if( nArg>ArraySize(aExplainWidth) ){ 2132 nArg = ArraySize(aExplainWidth); 2133 } 2134 if( p->cnt++==0 ){ 2135 for(i=0; i<nArg; i++){ 2136 int w = aExplainWidth[i]; 2137 utf8_width_print(p->out, w, azCol[i]); 2138 fputs(i==nArg-1 ? "\n" : " ", p->out); 2139 } 2140 for(i=0; i<nArg; i++){ 2141 int w = aExplainWidth[i]; 2142 print_dashes(p->out, w); 2143 fputs(i==nArg-1 ? "\n" : " ", p->out); 2144 } 2145 } 2146 if( azArg==0 ) break; 2147 for(i=0; i<nArg; i++){ 2148 int w = aExplainWidth[i]; 2149 if( i==nArg-1 ) w = 0; 2150 if( azArg[i] && strlenChar(azArg[i])>w ){ 2151 w = strlenChar(azArg[i]); 2152 } 2153 if( i==1 && p->aiIndent && p->pStmt ){ 2154 if( p->iIndent<p->nIndent ){ 2155 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 2156 } 2157 p->iIndent++; 2158 } 2159 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 2160 fputs(i==nArg-1 ? "\n" : " ", p->out); 2161 } 2162 break; 2163 } 2164 case MODE_Semi: { /* .schema and .fullschema output */ 2165 printSchemaLine(p->out, azArg[0], ";\n"); 2166 break; 2167 } 2168 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 2169 char *z; 2170 int j; 2171 int nParen = 0; 2172 char cEnd = 0; 2173 char c; 2174 int nLine = 0; 2175 assert( nArg==1 ); 2176 if( azArg[0]==0 ) break; 2177 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 2178 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 2179 ){ 2180 utf8_printf(p->out, "%s;\n", azArg[0]); 2181 break; 2182 } 2183 z = sqlite3_mprintf("%s", azArg[0]); 2184 shell_check_oom(z); 2185 j = 0; 2186 for(i=0; IsSpace(z[i]); i++){} 2187 for(; (c = z[i])!=0; i++){ 2188 if( IsSpace(c) ){ 2189 if( z[j-1]=='\r' ) z[j-1] = '\n'; 2190 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 2191 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 2192 j--; 2193 } 2194 z[j++] = c; 2195 } 2196 while( j>0 && IsSpace(z[j-1]) ){ j--; } 2197 z[j] = 0; 2198 if( strlen30(z)>=79 ){ 2199 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 2200 if( c==cEnd ){ 2201 cEnd = 0; 2202 }else if( c=='"' || c=='\'' || c=='`' ){ 2203 cEnd = c; 2204 }else if( c=='[' ){ 2205 cEnd = ']'; 2206 }else if( c=='-' && z[i+1]=='-' ){ 2207 cEnd = '\n'; 2208 }else if( c=='(' ){ 2209 nParen++; 2210 }else if( c==')' ){ 2211 nParen--; 2212 if( nLine>0 && nParen==0 && j>0 ){ 2213 printSchemaLineN(p->out, z, j, "\n"); 2214 j = 0; 2215 } 2216 } 2217 z[j++] = c; 2218 if( nParen==1 && cEnd==0 2219 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 2220 ){ 2221 if( c=='\n' ) j--; 2222 printSchemaLineN(p->out, z, j, "\n "); 2223 j = 0; 2224 nLine++; 2225 while( IsSpace(z[i+1]) ){ i++; } 2226 } 2227 } 2228 z[j] = 0; 2229 } 2230 printSchemaLine(p->out, z, ";\n"); 2231 sqlite3_free(z); 2232 break; 2233 } 2234 case MODE_List: { 2235 if( p->cnt++==0 && p->showHeader ){ 2236 for(i=0; i<nArg; i++){ 2237 utf8_printf(p->out,"%s%s",azCol[i], 2238 i==nArg-1 ? p->rowSeparator : p->colSeparator); 2239 } 2240 } 2241 if( azArg==0 ) break; 2242 for(i=0; i<nArg; i++){ 2243 char *z = azArg[i]; 2244 if( z==0 ) z = p->nullValue; 2245 utf8_printf(p->out, "%s", z); 2246 if( i<nArg-1 ){ 2247 utf8_printf(p->out, "%s", p->colSeparator); 2248 }else{ 2249 utf8_printf(p->out, "%s", p->rowSeparator); 2250 } 2251 } 2252 break; 2253 } 2254 case MODE_Html: { 2255 if( p->cnt++==0 && p->showHeader ){ 2256 raw_printf(p->out,"<TR>"); 2257 for(i=0; i<nArg; i++){ 2258 raw_printf(p->out,"<TH>"); 2259 output_html_string(p->out, azCol[i]); 2260 raw_printf(p->out,"</TH>\n"); 2261 } 2262 raw_printf(p->out,"</TR>\n"); 2263 } 2264 if( azArg==0 ) break; 2265 raw_printf(p->out,"<TR>"); 2266 for(i=0; i<nArg; i++){ 2267 raw_printf(p->out,"<TD>"); 2268 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2269 raw_printf(p->out,"</TD>\n"); 2270 } 2271 raw_printf(p->out,"</TR>\n"); 2272 break; 2273 } 2274 case MODE_Tcl: { 2275 if( p->cnt++==0 && p->showHeader ){ 2276 for(i=0; i<nArg; i++){ 2277 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 2278 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2279 } 2280 utf8_printf(p->out, "%s", p->rowSeparator); 2281 } 2282 if( azArg==0 ) break; 2283 for(i=0; i<nArg; i++){ 2284 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2285 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2286 } 2287 utf8_printf(p->out, "%s", p->rowSeparator); 2288 break; 2289 } 2290 case MODE_Csv: { 2291 setBinaryMode(p->out, 1); 2292 if( p->cnt++==0 && p->showHeader ){ 2293 for(i=0; i<nArg; i++){ 2294 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 2295 } 2296 utf8_printf(p->out, "%s", p->rowSeparator); 2297 } 2298 if( nArg>0 ){ 2299 for(i=0; i<nArg; i++){ 2300 output_csv(p, azArg[i], i<nArg-1); 2301 } 2302 utf8_printf(p->out, "%s", p->rowSeparator); 2303 } 2304 setTextMode(p->out, 1); 2305 break; 2306 } 2307 case MODE_Insert: { 2308 if( azArg==0 ) break; 2309 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 2310 if( p->showHeader ){ 2311 raw_printf(p->out,"("); 2312 for(i=0; i<nArg; i++){ 2313 if( i>0 ) raw_printf(p->out, ","); 2314 if( quoteChar(azCol[i]) ){ 2315 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 2316 shell_check_oom(z); 2317 utf8_printf(p->out, "%s", z); 2318 sqlite3_free(z); 2319 }else{ 2320 raw_printf(p->out, "%s", azCol[i]); 2321 } 2322 } 2323 raw_printf(p->out,")"); 2324 } 2325 p->cnt++; 2326 for(i=0; i<nArg; i++){ 2327 raw_printf(p->out, i>0 ? "," : " VALUES("); 2328 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2329 utf8_printf(p->out,"NULL"); 2330 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2331 if( ShellHasFlag(p, SHFLG_Newlines) ){ 2332 output_quoted_string(p->out, azArg[i]); 2333 }else{ 2334 output_quoted_escaped_string(p->out, azArg[i]); 2335 } 2336 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2337 utf8_printf(p->out,"%s", azArg[i]); 2338 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2339 char z[50]; 2340 double r = sqlite3_column_double(p->pStmt, i); 2341 sqlite3_uint64 ur; 2342 memcpy(&ur,&r,sizeof(r)); 2343 if( ur==0x7ff0000000000000LL ){ 2344 raw_printf(p->out, "1e999"); 2345 }else if( ur==0xfff0000000000000LL ){ 2346 raw_printf(p->out, "-1e999"); 2347 }else{ 2348 sqlite3_snprintf(50,z,"%!.20g", r); 2349 raw_printf(p->out, "%s", z); 2350 } 2351 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2352 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2353 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2354 output_hex_blob(p->out, pBlob, nBlob); 2355 }else if( isNumber(azArg[i], 0) ){ 2356 utf8_printf(p->out,"%s", azArg[i]); 2357 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 2358 output_quoted_string(p->out, azArg[i]); 2359 }else{ 2360 output_quoted_escaped_string(p->out, azArg[i]); 2361 } 2362 } 2363 raw_printf(p->out,");\n"); 2364 break; 2365 } 2366 case MODE_Json: { 2367 if( azArg==0 ) break; 2368 if( p->cnt==0 ){ 2369 fputs("[{", p->out); 2370 }else{ 2371 fputs(",\n{", p->out); 2372 } 2373 p->cnt++; 2374 for(i=0; i<nArg; i++){ 2375 output_json_string(p->out, azCol[i], -1); 2376 putc(':', p->out); 2377 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2378 fputs("null",p->out); 2379 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2380 char z[50]; 2381 double r = sqlite3_column_double(p->pStmt, i); 2382 sqlite3_uint64 ur; 2383 memcpy(&ur,&r,sizeof(r)); 2384 if( ur==0x7ff0000000000000LL ){ 2385 raw_printf(p->out, "1e999"); 2386 }else if( ur==0xfff0000000000000LL ){ 2387 raw_printf(p->out, "-1e999"); 2388 }else{ 2389 sqlite3_snprintf(50,z,"%!.20g", r); 2390 raw_printf(p->out, "%s", z); 2391 } 2392 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2393 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2394 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2395 output_json_string(p->out, pBlob, nBlob); 2396 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2397 output_json_string(p->out, azArg[i], -1); 2398 }else{ 2399 utf8_printf(p->out,"%s", azArg[i]); 2400 } 2401 if( i<nArg-1 ){ 2402 putc(',', p->out); 2403 } 2404 } 2405 putc('}', p->out); 2406 break; 2407 } 2408 case MODE_Quote: { 2409 if( azArg==0 ) break; 2410 if( p->cnt==0 && p->showHeader ){ 2411 for(i=0; i<nArg; i++){ 2412 if( i>0 ) fputs(p->colSeparator, p->out); 2413 output_quoted_string(p->out, azCol[i]); 2414 } 2415 fputs(p->rowSeparator, p->out); 2416 } 2417 p->cnt++; 2418 for(i=0; i<nArg; i++){ 2419 if( i>0 ) fputs(p->colSeparator, p->out); 2420 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2421 utf8_printf(p->out,"NULL"); 2422 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2423 output_quoted_string(p->out, azArg[i]); 2424 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2425 utf8_printf(p->out,"%s", azArg[i]); 2426 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2427 char z[50]; 2428 double r = sqlite3_column_double(p->pStmt, i); 2429 sqlite3_snprintf(50,z,"%!.20g", r); 2430 raw_printf(p->out, "%s", z); 2431 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2432 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2433 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2434 output_hex_blob(p->out, pBlob, nBlob); 2435 }else if( isNumber(azArg[i], 0) ){ 2436 utf8_printf(p->out,"%s", azArg[i]); 2437 }else{ 2438 output_quoted_string(p->out, azArg[i]); 2439 } 2440 } 2441 fputs(p->rowSeparator, p->out); 2442 break; 2443 } 2444 case MODE_Ascii: { 2445 if( p->cnt++==0 && p->showHeader ){ 2446 for(i=0; i<nArg; i++){ 2447 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2448 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 2449 } 2450 utf8_printf(p->out, "%s", p->rowSeparator); 2451 } 2452 if( azArg==0 ) break; 2453 for(i=0; i<nArg; i++){ 2454 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2455 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 2456 } 2457 utf8_printf(p->out, "%s", p->rowSeparator); 2458 break; 2459 } 2460 case MODE_EQP: { 2461 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 2462 break; 2463 } 2464 } 2465 return 0; 2466} 2467 2468/* 2469** This is the callback routine that the SQLite library 2470** invokes for each row of a query result. 2471*/ 2472static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 2473 /* since we don't have type info, call the shell_callback with a NULL value */ 2474 return shell_callback(pArg, nArg, azArg, azCol, NULL); 2475} 2476 2477/* 2478** This is the callback routine from sqlite3_exec() that appends all 2479** output onto the end of a ShellText object. 2480*/ 2481static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 2482 ShellText *p = (ShellText*)pArg; 2483 int i; 2484 UNUSED_PARAMETER(az); 2485 if( azArg==0 ) return 0; 2486 if( p->n ) appendText(p, "|", 0); 2487 for(i=0; i<nArg; i++){ 2488 if( i ) appendText(p, ",", 0); 2489 if( azArg[i] ) appendText(p, azArg[i], 0); 2490 } 2491 return 0; 2492} 2493 2494/* 2495** Generate an appropriate SELFTEST table in the main database. 2496*/ 2497static void createSelftestTable(ShellState *p){ 2498 char *zErrMsg = 0; 2499 sqlite3_exec(p->db, 2500 "SAVEPOINT selftest_init;\n" 2501 "CREATE TABLE IF NOT EXISTS selftest(\n" 2502 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 2503 " op TEXT,\n" /* Operator: memo run */ 2504 " cmd TEXT,\n" /* Command text */ 2505 " ans TEXT\n" /* Desired answer */ 2506 ");" 2507 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 2508 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 2509 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 2510 " 'memo','Tests generated by --init');\n" 2511 "INSERT INTO [_shell$self]\n" 2512 " SELECT 'run',\n" 2513 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 2514 "FROM sqlite_schema ORDER BY 2'',224))',\n" 2515 " hex(sha3_query('SELECT type,name,tbl_name,sql " 2516 "FROM sqlite_schema ORDER BY 2',224));\n" 2517 "INSERT INTO [_shell$self]\n" 2518 " SELECT 'run'," 2519 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 2520 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 2521 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 2522 " FROM (\n" 2523 " SELECT name FROM sqlite_schema\n" 2524 " WHERE type='table'\n" 2525 " AND name<>'selftest'\n" 2526 " AND coalesce(rootpage,0)>0\n" 2527 " )\n" 2528 " ORDER BY name;\n" 2529 "INSERT INTO [_shell$self]\n" 2530 " VALUES('run','PRAGMA integrity_check','ok');\n" 2531 "INSERT INTO selftest(tno,op,cmd,ans)" 2532 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 2533 "DROP TABLE [_shell$self];" 2534 ,0,0,&zErrMsg); 2535 if( zErrMsg ){ 2536 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 2537 sqlite3_free(zErrMsg); 2538 } 2539 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 2540} 2541 2542 2543/* 2544** Set the destination table field of the ShellState structure to 2545** the name of the table given. Escape any quote characters in the 2546** table name. 2547*/ 2548static void set_table_name(ShellState *p, const char *zName){ 2549 int i, n; 2550 char cQuote; 2551 char *z; 2552 2553 if( p->zDestTable ){ 2554 free(p->zDestTable); 2555 p->zDestTable = 0; 2556 } 2557 if( zName==0 ) return; 2558 cQuote = quoteChar(zName); 2559 n = strlen30(zName); 2560 if( cQuote ) n += n+2; 2561 z = p->zDestTable = malloc( n+1 ); 2562 shell_check_oom(z); 2563 n = 0; 2564 if( cQuote ) z[n++] = cQuote; 2565 for(i=0; zName[i]; i++){ 2566 z[n++] = zName[i]; 2567 if( zName[i]==cQuote ) z[n++] = cQuote; 2568 } 2569 if( cQuote ) z[n++] = cQuote; 2570 z[n] = 0; 2571} 2572 2573 2574/* 2575** Execute a query statement that will generate SQL output. Print 2576** the result columns, comma-separated, on a line and then add a 2577** semicolon terminator to the end of that line. 2578** 2579** If the number of columns is 1 and that column contains text "--" 2580** then write the semicolon on a separate line. That way, if a 2581** "--" comment occurs at the end of the statement, the comment 2582** won't consume the semicolon terminator. 2583*/ 2584static int run_table_dump_query( 2585 ShellState *p, /* Query context */ 2586 const char *zSelect /* SELECT statement to extract content */ 2587){ 2588 sqlite3_stmt *pSelect; 2589 int rc; 2590 int nResult; 2591 int i; 2592 const char *z; 2593 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 2594 if( rc!=SQLITE_OK || !pSelect ){ 2595 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2596 sqlite3_errmsg(p->db)); 2597 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2598 return rc; 2599 } 2600 rc = sqlite3_step(pSelect); 2601 nResult = sqlite3_column_count(pSelect); 2602 while( rc==SQLITE_ROW ){ 2603 z = (const char*)sqlite3_column_text(pSelect, 0); 2604 utf8_printf(p->out, "%s", z); 2605 for(i=1; i<nResult; i++){ 2606 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 2607 } 2608 if( z==0 ) z = ""; 2609 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 2610 if( z[0] ){ 2611 raw_printf(p->out, "\n;\n"); 2612 }else{ 2613 raw_printf(p->out, ";\n"); 2614 } 2615 rc = sqlite3_step(pSelect); 2616 } 2617 rc = sqlite3_finalize(pSelect); 2618 if( rc!=SQLITE_OK ){ 2619 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2620 sqlite3_errmsg(p->db)); 2621 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2622 } 2623 return rc; 2624} 2625 2626/* 2627** Allocate space and save off string indicating current error. 2628*/ 2629static char *save_err_msg( 2630 sqlite3 *db, /* Database to query */ 2631 const char *zWhen, /* Qualifier (format) wrapper */ 2632 int rc /* Error code returned from API */ 2633){ 2634 char *zErr; 2635 if( zWhen==0 ) zWhen = "%s (%d)"; 2636 zErr = sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc); 2637 shell_check_oom(zErr); 2638 return zErr; 2639} 2640 2641#ifdef __linux__ 2642/* 2643** Attempt to display I/O stats on Linux using /proc/PID/io 2644*/ 2645static void displayLinuxIoStats(FILE *out){ 2646 FILE *in; 2647 char z[200]; 2648 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 2649 in = fopen(z, "rb"); 2650 if( in==0 ) return; 2651 while( fgets(z, sizeof(z), in)!=0 ){ 2652 static const struct { 2653 const char *zPattern; 2654 const char *zDesc; 2655 } aTrans[] = { 2656 { "rchar: ", "Bytes received by read():" }, 2657 { "wchar: ", "Bytes sent to write():" }, 2658 { "syscr: ", "Read() system calls:" }, 2659 { "syscw: ", "Write() system calls:" }, 2660 { "read_bytes: ", "Bytes read from storage:" }, 2661 { "write_bytes: ", "Bytes written to storage:" }, 2662 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 2663 }; 2664 int i; 2665 for(i=0; i<ArraySize(aTrans); i++){ 2666 int n = strlen30(aTrans[i].zPattern); 2667 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 2668 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 2669 break; 2670 } 2671 } 2672 } 2673 fclose(in); 2674} 2675#endif 2676 2677/* 2678** Display a single line of status using 64-bit values. 2679*/ 2680static void displayStatLine( 2681 ShellState *p, /* The shell context */ 2682 char *zLabel, /* Label for this one line */ 2683 char *zFormat, /* Format for the result */ 2684 int iStatusCtrl, /* Which status to display */ 2685 int bReset /* True to reset the stats */ 2686){ 2687 sqlite3_int64 iCur = -1; 2688 sqlite3_int64 iHiwtr = -1; 2689 int i, nPercent; 2690 char zLine[200]; 2691 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 2692 for(i=0, nPercent=0; zFormat[i]; i++){ 2693 if( zFormat[i]=='%' ) nPercent++; 2694 } 2695 if( nPercent>1 ){ 2696 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 2697 }else{ 2698 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 2699 } 2700 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 2701} 2702 2703/* 2704** Display memory stats. 2705*/ 2706static int display_stats( 2707 sqlite3 *db, /* Database to query */ 2708 ShellState *pArg, /* Pointer to ShellState */ 2709 int bReset /* True to reset the stats */ 2710){ 2711 int iCur; 2712 int iHiwtr; 2713 FILE *out; 2714 if( pArg==0 || pArg->out==0 ) return 0; 2715 out = pArg->out; 2716 2717 if( pArg->pStmt && pArg->statsOn==2 ){ 2718 int nCol, i, x; 2719 sqlite3_stmt *pStmt = pArg->pStmt; 2720 char z[100]; 2721 nCol = sqlite3_column_count(pStmt); 2722 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 2723 for(i=0; i<nCol; i++){ 2724 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 2725 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 2726#ifndef SQLITE_OMIT_DECLTYPE 2727 sqlite3_snprintf(30, z+x, "declared type:"); 2728 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 2729#endif 2730#ifdef SQLITE_ENABLE_COLUMN_METADATA 2731 sqlite3_snprintf(30, z+x, "database name:"); 2732 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 2733 sqlite3_snprintf(30, z+x, "table name:"); 2734 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 2735 sqlite3_snprintf(30, z+x, "origin name:"); 2736 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 2737#endif 2738 } 2739 } 2740 2741 if( pArg->statsOn==3 ){ 2742 if( pArg->pStmt ){ 2743 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2744 raw_printf(pArg->out, "VM-steps: %d\n", iCur); 2745 } 2746 return 0; 2747 } 2748 2749 displayStatLine(pArg, "Memory Used:", 2750 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 2751 displayStatLine(pArg, "Number of Outstanding Allocations:", 2752 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 2753 if( pArg->shellFlgs & SHFLG_Pagecache ){ 2754 displayStatLine(pArg, "Number of Pcache Pages Used:", 2755 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 2756 } 2757 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 2758 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 2759 displayStatLine(pArg, "Largest Allocation:", 2760 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 2761 displayStatLine(pArg, "Largest Pcache Allocation:", 2762 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 2763#ifdef YYTRACKMAXSTACKDEPTH 2764 displayStatLine(pArg, "Deepest Parser Stack:", 2765 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 2766#endif 2767 2768 if( db ){ 2769 if( pArg->shellFlgs & SHFLG_Lookaside ){ 2770 iHiwtr = iCur = -1; 2771 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 2772 &iCur, &iHiwtr, bReset); 2773 raw_printf(pArg->out, 2774 "Lookaside Slots Used: %d (max %d)\n", 2775 iCur, iHiwtr); 2776 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 2777 &iCur, &iHiwtr, bReset); 2778 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 2779 iHiwtr); 2780 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 2781 &iCur, &iHiwtr, bReset); 2782 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 2783 iHiwtr); 2784 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 2785 &iCur, &iHiwtr, bReset); 2786 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 2787 iHiwtr); 2788 } 2789 iHiwtr = iCur = -1; 2790 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 2791 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 2792 iCur); 2793 iHiwtr = iCur = -1; 2794 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 2795 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 2796 iHiwtr = iCur = -1; 2797 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 2798 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 2799 iHiwtr = iCur = -1; 2800 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 2801 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 2802 iHiwtr = iCur = -1; 2803 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 2804 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 2805 iHiwtr = iCur = -1; 2806 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 2807 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 2808 iCur); 2809 iHiwtr = iCur = -1; 2810 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 2811 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 2812 iCur); 2813 } 2814 2815 if( pArg->pStmt ){ 2816 int iHit, iMiss; 2817 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 2818 bReset); 2819 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 2820 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 2821 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 2822 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 2823 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 2824 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset); 2825 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset); 2826 if( iHit || iMiss ){ 2827 raw_printf(pArg->out, "Bloom filter bypass taken: %d/%d\n", 2828 iHit, iHit+iMiss); 2829 } 2830 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2831 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 2832 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 2833 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 2834 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 2835 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 2836 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 2837 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 2838 } 2839 2840#ifdef __linux__ 2841 displayLinuxIoStats(pArg->out); 2842#endif 2843 2844 /* Do not remove this machine readable comment: extra-stats-output-here */ 2845 2846 return 0; 2847} 2848 2849/* 2850** Display scan stats. 2851*/ 2852static void display_scanstats( 2853 sqlite3 *db, /* Database to query */ 2854 ShellState *pArg /* Pointer to ShellState */ 2855){ 2856#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 2857 UNUSED_PARAMETER(db); 2858 UNUSED_PARAMETER(pArg); 2859#else 2860 int i, k, n, mx; 2861 raw_printf(pArg->out, "-------- scanstats --------\n"); 2862 mx = 0; 2863 for(k=0; k<=mx; k++){ 2864 double rEstLoop = 1.0; 2865 for(i=n=0; 1; i++){ 2866 sqlite3_stmt *p = pArg->pStmt; 2867 sqlite3_int64 nLoop, nVisit; 2868 double rEst; 2869 int iSid; 2870 const char *zExplain; 2871 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 2872 break; 2873 } 2874 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 2875 if( iSid>mx ) mx = iSid; 2876 if( iSid!=k ) continue; 2877 if( n==0 ){ 2878 rEstLoop = (double)nLoop; 2879 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 2880 } 2881 n++; 2882 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 2883 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 2884 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 2885 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 2886 rEstLoop *= rEst; 2887 raw_printf(pArg->out, 2888 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 2889 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 2890 ); 2891 } 2892 } 2893 raw_printf(pArg->out, "---------------------------\n"); 2894#endif 2895} 2896 2897/* 2898** Parameter azArray points to a zero-terminated array of strings. zStr 2899** points to a single nul-terminated string. Return non-zero if zStr 2900** is equal, according to strcmp(), to any of the strings in the array. 2901** Otherwise, return zero. 2902*/ 2903static int str_in_array(const char *zStr, const char **azArray){ 2904 int i; 2905 for(i=0; azArray[i]; i++){ 2906 if( 0==strcmp(zStr, azArray[i]) ) return 1; 2907 } 2908 return 0; 2909} 2910 2911/* 2912** If compiled statement pSql appears to be an EXPLAIN statement, allocate 2913** and populate the ShellState.aiIndent[] array with the number of 2914** spaces each opcode should be indented before it is output. 2915** 2916** The indenting rules are: 2917** 2918** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 2919** all opcodes that occur between the p2 jump destination and the opcode 2920** itself by 2 spaces. 2921** 2922** * For each "Goto", if the jump destination is earlier in the program 2923** and ends on one of: 2924** Yield SeekGt SeekLt RowSetRead Rewind 2925** or if the P1 parameter is one instead of zero, 2926** then indent all opcodes between the earlier instruction 2927** and "Goto" by 2 spaces. 2928*/ 2929static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 2930 const char *zSql; /* The text of the SQL statement */ 2931 const char *z; /* Used to check if this is an EXPLAIN */ 2932 int *abYield = 0; /* True if op is an OP_Yield */ 2933 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 2934 int iOp; /* Index of operation in p->aiIndent[] */ 2935 2936 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 2937 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 2938 "Rewind", 0 }; 2939 const char *azGoto[] = { "Goto", 0 }; 2940 2941 /* Try to figure out if this is really an EXPLAIN statement. If this 2942 ** cannot be verified, return early. */ 2943 if( sqlite3_column_count(pSql)!=8 ){ 2944 p->cMode = p->mode; 2945 return; 2946 } 2947 zSql = sqlite3_sql(pSql); 2948 if( zSql==0 ) return; 2949 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 2950 if( sqlite3_strnicmp(z, "explain", 7) ){ 2951 p->cMode = p->mode; 2952 return; 2953 } 2954 2955 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 2956 int i; 2957 int iAddr = sqlite3_column_int(pSql, 0); 2958 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 2959 2960 /* Set p2 to the P2 field of the current opcode. Then, assuming that 2961 ** p2 is an instruction address, set variable p2op to the index of that 2962 ** instruction in the aiIndent[] array. p2 and p2op may be different if 2963 ** the current instruction is part of a sub-program generated by an 2964 ** SQL trigger or foreign key. */ 2965 int p2 = sqlite3_column_int(pSql, 3); 2966 int p2op = (p2 + (iOp-iAddr)); 2967 2968 /* Grow the p->aiIndent array as required */ 2969 if( iOp>=nAlloc ){ 2970 if( iOp==0 ){ 2971 /* Do further verfication that this is explain output. Abort if 2972 ** it is not */ 2973 static const char *explainCols[] = { 2974 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 2975 int jj; 2976 for(jj=0; jj<ArraySize(explainCols); jj++){ 2977 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 2978 p->cMode = p->mode; 2979 sqlite3_reset(pSql); 2980 return; 2981 } 2982 } 2983 } 2984 nAlloc += 100; 2985 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 2986 shell_check_oom(p->aiIndent); 2987 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 2988 shell_check_oom(abYield); 2989 } 2990 abYield[iOp] = str_in_array(zOp, azYield); 2991 p->aiIndent[iOp] = 0; 2992 p->nIndent = iOp+1; 2993 2994 if( str_in_array(zOp, azNext) ){ 2995 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2996 } 2997 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 2998 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 2999 ){ 3000 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 3001 } 3002 } 3003 3004 p->iIndent = 0; 3005 sqlite3_free(abYield); 3006 sqlite3_reset(pSql); 3007} 3008 3009/* 3010** Free the array allocated by explain_data_prepare(). 3011*/ 3012static void explain_data_delete(ShellState *p){ 3013 sqlite3_free(p->aiIndent); 3014 p->aiIndent = 0; 3015 p->nIndent = 0; 3016 p->iIndent = 0; 3017} 3018 3019/* 3020** Disable and restore .wheretrace and .selecttrace settings. 3021*/ 3022static unsigned int savedSelectTrace; 3023static unsigned int savedWhereTrace; 3024static void disable_debug_trace_modes(void){ 3025 unsigned int zero = 0; 3026 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace); 3027 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero); 3028 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace); 3029 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero); 3030} 3031static void restore_debug_trace_modes(void){ 3032 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace); 3033 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace); 3034} 3035 3036/* Create the TEMP table used to store parameter bindings */ 3037static void bind_table_init(ShellState *p){ 3038 int wrSchema = 0; 3039 int defensiveMode = 0; 3040 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 3041 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 3042 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 3043 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 3044 sqlite3_exec(p->db, 3045 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 3046 " key TEXT PRIMARY KEY,\n" 3047 " value\n" 3048 ") WITHOUT ROWID;", 3049 0, 0, 0); 3050 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 3051 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 3052} 3053 3054/* 3055** Bind parameters on a prepared statement. 3056** 3057** Parameter bindings are taken from a TEMP table of the form: 3058** 3059** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 3060** WITHOUT ROWID; 3061** 3062** No bindings occur if this table does not exist. The name of the table 3063** begins with "sqlite_" so that it will not collide with ordinary application 3064** tables. The table must be in the TEMP schema. 3065*/ 3066static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 3067 int nVar; 3068 int i; 3069 int rc; 3070 sqlite3_stmt *pQ = 0; 3071 3072 nVar = sqlite3_bind_parameter_count(pStmt); 3073 if( nVar==0 ) return; /* Nothing to do */ 3074 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 3075 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 3076 return; /* Parameter table does not exist */ 3077 } 3078 rc = sqlite3_prepare_v2(pArg->db, 3079 "SELECT value FROM temp.sqlite_parameters" 3080 " WHERE key=?1", -1, &pQ, 0); 3081 if( rc || pQ==0 ) return; 3082 for(i=1; i<=nVar; i++){ 3083 char zNum[30]; 3084 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 3085 if( zVar==0 ){ 3086 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 3087 zVar = zNum; 3088 } 3089 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 3090 if( sqlite3_step(pQ)==SQLITE_ROW ){ 3091 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 3092 }else{ 3093 sqlite3_bind_null(pStmt, i); 3094 } 3095 sqlite3_reset(pQ); 3096 } 3097 sqlite3_finalize(pQ); 3098} 3099 3100/* 3101** UTF8 box-drawing characters. Imagine box lines like this: 3102** 3103** 1 3104** | 3105** 4 --+-- 2 3106** | 3107** 3 3108** 3109** Each box characters has between 2 and 4 of the lines leading from 3110** the center. The characters are here identified by the numbers of 3111** their corresponding lines. 3112*/ 3113#define BOX_24 "\342\224\200" /* U+2500 --- */ 3114#define BOX_13 "\342\224\202" /* U+2502 | */ 3115#define BOX_23 "\342\224\214" /* U+250c ,- */ 3116#define BOX_34 "\342\224\220" /* U+2510 -, */ 3117#define BOX_12 "\342\224\224" /* U+2514 '- */ 3118#define BOX_14 "\342\224\230" /* U+2518 -' */ 3119#define BOX_123 "\342\224\234" /* U+251c |- */ 3120#define BOX_134 "\342\224\244" /* U+2524 -| */ 3121#define BOX_234 "\342\224\254" /* U+252c -,- */ 3122#define BOX_124 "\342\224\264" /* U+2534 -'- */ 3123#define BOX_1234 "\342\224\274" /* U+253c -|- */ 3124 3125/* Draw horizontal line N characters long using unicode box 3126** characters 3127*/ 3128static void print_box_line(FILE *out, int N){ 3129 const char zDash[] = 3130 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 3131 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 3132 const int nDash = sizeof(zDash) - 1; 3133 N *= 3; 3134 while( N>nDash ){ 3135 utf8_printf(out, zDash); 3136 N -= nDash; 3137 } 3138 utf8_printf(out, "%.*s", N, zDash); 3139} 3140 3141/* 3142** Draw a horizontal separator for a MODE_Box table. 3143*/ 3144static void print_box_row_separator( 3145 ShellState *p, 3146 int nArg, 3147 const char *zSep1, 3148 const char *zSep2, 3149 const char *zSep3 3150){ 3151 int i; 3152 if( nArg>0 ){ 3153 utf8_printf(p->out, "%s", zSep1); 3154 print_box_line(p->out, p->actualWidth[0]+2); 3155 for(i=1; i<nArg; i++){ 3156 utf8_printf(p->out, "%s", zSep2); 3157 print_box_line(p->out, p->actualWidth[i]+2); 3158 } 3159 utf8_printf(p->out, "%s", zSep3); 3160 } 3161 fputs("\n", p->out); 3162} 3163 3164 3165 3166/* 3167** Run a prepared statement and output the result in one of the 3168** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 3169** or MODE_Box. 3170** 3171** This is different from ordinary exec_prepared_stmt() in that 3172** it has to run the entire query and gather the results into memory 3173** first, in order to determine column widths, before providing 3174** any output. 3175*/ 3176static void exec_prepared_stmt_columnar( 3177 ShellState *p, /* Pointer to ShellState */ 3178 sqlite3_stmt *pStmt /* Statment to run */ 3179){ 3180 sqlite3_int64 nRow = 0; 3181 int nColumn = 0; 3182 char **azData = 0; 3183 sqlite3_int64 nAlloc = 0; 3184 const char *z; 3185 int rc; 3186 sqlite3_int64 i, nData; 3187 int j, nTotal, w, n; 3188 const char *colSep = 0; 3189 const char *rowSep = 0; 3190 3191 rc = sqlite3_step(pStmt); 3192 if( rc!=SQLITE_ROW ) return; 3193 nColumn = sqlite3_column_count(pStmt); 3194 nAlloc = nColumn*4; 3195 if( nAlloc<=0 ) nAlloc = 1; 3196 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 3197 shell_check_oom(azData); 3198 for(i=0; i<nColumn; i++){ 3199 azData[i] = strdup(sqlite3_column_name(pStmt,i)); 3200 } 3201 do{ 3202 if( (nRow+2)*nColumn >= nAlloc ){ 3203 nAlloc *= 2; 3204 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 3205 shell_check_oom(azData); 3206 } 3207 nRow++; 3208 for(i=0; i<nColumn; i++){ 3209 z = (const char*)sqlite3_column_text(pStmt,i); 3210 azData[nRow*nColumn + i] = z ? strdup(z) : 0; 3211 } 3212 }while( sqlite3_step(pStmt)==SQLITE_ROW ); 3213 if( nColumn>p->nWidth ){ 3214 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); 3215 shell_check_oom(p->colWidth); 3216 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 3217 p->nWidth = nColumn; 3218 p->actualWidth = &p->colWidth[nColumn]; 3219 } 3220 memset(p->actualWidth, 0, nColumn*sizeof(int)); 3221 for(i=0; i<nColumn; i++){ 3222 w = p->colWidth[i]; 3223 if( w<0 ) w = -w; 3224 p->actualWidth[i] = w; 3225 } 3226 nTotal = nColumn*(nRow+1); 3227 for(i=0; i<nTotal; i++){ 3228 z = azData[i]; 3229 if( z==0 ) z = p->nullValue; 3230 n = strlenChar(z); 3231 j = i%nColumn; 3232 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 3233 } 3234 if( seenInterrupt ) goto columnar_end; 3235 if( nColumn==0 ) goto columnar_end; 3236 switch( p->cMode ){ 3237 case MODE_Column: { 3238 colSep = " "; 3239 rowSep = "\n"; 3240 if( p->showHeader ){ 3241 for(i=0; i<nColumn; i++){ 3242 w = p->actualWidth[i]; 3243 if( p->colWidth[i]<0 ) w = -w; 3244 utf8_width_print(p->out, w, azData[i]); 3245 fputs(i==nColumn-1?"\n":" ", p->out); 3246 } 3247 for(i=0; i<nColumn; i++){ 3248 print_dashes(p->out, p->actualWidth[i]); 3249 fputs(i==nColumn-1?"\n":" ", p->out); 3250 } 3251 } 3252 break; 3253 } 3254 case MODE_Table: { 3255 colSep = " | "; 3256 rowSep = " |\n"; 3257 print_row_separator(p, nColumn, "+"); 3258 fputs("| ", p->out); 3259 for(i=0; i<nColumn; i++){ 3260 w = p->actualWidth[i]; 3261 n = strlenChar(azData[i]); 3262 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3263 fputs(i==nColumn-1?" |\n":" | ", p->out); 3264 } 3265 print_row_separator(p, nColumn, "+"); 3266 break; 3267 } 3268 case MODE_Markdown: { 3269 colSep = " | "; 3270 rowSep = " |\n"; 3271 fputs("| ", p->out); 3272 for(i=0; i<nColumn; i++){ 3273 w = p->actualWidth[i]; 3274 n = strlenChar(azData[i]); 3275 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3276 fputs(i==nColumn-1?" |\n":" | ", p->out); 3277 } 3278 print_row_separator(p, nColumn, "|"); 3279 break; 3280 } 3281 case MODE_Box: { 3282 colSep = " " BOX_13 " "; 3283 rowSep = " " BOX_13 "\n"; 3284 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 3285 utf8_printf(p->out, BOX_13 " "); 3286 for(i=0; i<nColumn; i++){ 3287 w = p->actualWidth[i]; 3288 n = strlenChar(azData[i]); 3289 utf8_printf(p->out, "%*s%s%*s%s", 3290 (w-n)/2, "", azData[i], (w-n+1)/2, "", 3291 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 3292 } 3293 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 3294 break; 3295 } 3296 } 3297 for(i=nColumn, j=0; i<nTotal; i++, j++){ 3298 if( j==0 && p->cMode!=MODE_Column ){ 3299 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 3300 } 3301 z = azData[i]; 3302 if( z==0 ) z = p->nullValue; 3303 w = p->actualWidth[j]; 3304 if( p->colWidth[j]<0 ) w = -w; 3305 utf8_width_print(p->out, w, z); 3306 if( j==nColumn-1 ){ 3307 utf8_printf(p->out, "%s", rowSep); 3308 j = -1; 3309 if( seenInterrupt ) goto columnar_end; 3310 }else{ 3311 utf8_printf(p->out, "%s", colSep); 3312 } 3313 } 3314 if( p->cMode==MODE_Table ){ 3315 print_row_separator(p, nColumn, "+"); 3316 }else if( p->cMode==MODE_Box ){ 3317 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 3318 } 3319columnar_end: 3320 if( seenInterrupt ){ 3321 utf8_printf(p->out, "Interrupt\n"); 3322 } 3323 nData = (nRow+1)*nColumn; 3324 for(i=0; i<nData; i++) free(azData[i]); 3325 sqlite3_free(azData); 3326} 3327 3328/* 3329** Run a prepared statement 3330*/ 3331static void exec_prepared_stmt( 3332 ShellState *pArg, /* Pointer to ShellState */ 3333 sqlite3_stmt *pStmt /* Statment to run */ 3334){ 3335 int rc; 3336 sqlite3_uint64 nRow = 0; 3337 3338 if( pArg->cMode==MODE_Column 3339 || pArg->cMode==MODE_Table 3340 || pArg->cMode==MODE_Box 3341 || pArg->cMode==MODE_Markdown 3342 ){ 3343 exec_prepared_stmt_columnar(pArg, pStmt); 3344 return; 3345 } 3346 3347 /* perform the first step. this will tell us if we 3348 ** have a result set or not and how wide it is. 3349 */ 3350 rc = sqlite3_step(pStmt); 3351 /* if we have a result set... */ 3352 if( SQLITE_ROW == rc ){ 3353 /* allocate space for col name ptr, value ptr, and type */ 3354 int nCol = sqlite3_column_count(pStmt); 3355 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 3356 if( !pData ){ 3357 shell_out_of_memory(); 3358 }else{ 3359 char **azCols = (char **)pData; /* Names of result columns */ 3360 char **azVals = &azCols[nCol]; /* Results */ 3361 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 3362 int i, x; 3363 assert(sizeof(int) <= sizeof(char *)); 3364 /* save off ptrs to column names */ 3365 for(i=0; i<nCol; i++){ 3366 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 3367 } 3368 do{ 3369 nRow++; 3370 /* extract the data and data types */ 3371 for(i=0; i<nCol; i++){ 3372 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 3373 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 3374 azVals[i] = ""; 3375 }else{ 3376 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 3377 } 3378 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 3379 rc = SQLITE_NOMEM; 3380 break; /* from for */ 3381 } 3382 } /* end for */ 3383 3384 /* if data and types extracted successfully... */ 3385 if( SQLITE_ROW == rc ){ 3386 /* call the supplied callback with the result row data */ 3387 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 3388 rc = SQLITE_ABORT; 3389 }else{ 3390 rc = sqlite3_step(pStmt); 3391 } 3392 } 3393 } while( SQLITE_ROW == rc ); 3394 sqlite3_free(pData); 3395 if( pArg->cMode==MODE_Json ){ 3396 fputs("]\n", pArg->out); 3397 }else if( pArg->cMode==MODE_Count ){ 3398 printf("%llu row%s\n", nRow, nRow!=1 ? "s" : ""); 3399 } 3400 } 3401 } 3402} 3403 3404#ifndef SQLITE_OMIT_VIRTUALTABLE 3405/* 3406** This function is called to process SQL if the previous shell command 3407** was ".expert". It passes the SQL in the second argument directly to 3408** the sqlite3expert object. 3409** 3410** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3411** code. In this case, (*pzErr) may be set to point to a buffer containing 3412** an English language error message. It is the responsibility of the 3413** caller to eventually free this buffer using sqlite3_free(). 3414*/ 3415static int expertHandleSQL( 3416 ShellState *pState, 3417 const char *zSql, 3418 char **pzErr 3419){ 3420 assert( pState->expert.pExpert ); 3421 assert( pzErr==0 || *pzErr==0 ); 3422 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 3423} 3424 3425/* 3426** This function is called either to silently clean up the object 3427** created by the ".expert" command (if bCancel==1), or to generate a 3428** report from it and then clean it up (if bCancel==0). 3429** 3430** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3431** code. In this case, (*pzErr) may be set to point to a buffer containing 3432** an English language error message. It is the responsibility of the 3433** caller to eventually free this buffer using sqlite3_free(). 3434*/ 3435static int expertFinish( 3436 ShellState *pState, 3437 int bCancel, 3438 char **pzErr 3439){ 3440 int rc = SQLITE_OK; 3441 sqlite3expert *p = pState->expert.pExpert; 3442 assert( p ); 3443 assert( bCancel || pzErr==0 || *pzErr==0 ); 3444 if( bCancel==0 ){ 3445 FILE *out = pState->out; 3446 int bVerbose = pState->expert.bVerbose; 3447 3448 rc = sqlite3_expert_analyze(p, pzErr); 3449 if( rc==SQLITE_OK ){ 3450 int nQuery = sqlite3_expert_count(p); 3451 int i; 3452 3453 if( bVerbose ){ 3454 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 3455 raw_printf(out, "-- Candidates -----------------------------\n"); 3456 raw_printf(out, "%s\n", zCand); 3457 } 3458 for(i=0; i<nQuery; i++){ 3459 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 3460 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 3461 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 3462 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 3463 if( bVerbose ){ 3464 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 3465 raw_printf(out, "%s\n\n", zSql); 3466 } 3467 raw_printf(out, "%s\n", zIdx); 3468 raw_printf(out, "%s\n", zEQP); 3469 } 3470 } 3471 } 3472 sqlite3_expert_destroy(p); 3473 pState->expert.pExpert = 0; 3474 return rc; 3475} 3476 3477/* 3478** Implementation of ".expert" dot command. 3479*/ 3480static int expertDotCommand( 3481 ShellState *pState, /* Current shell tool state */ 3482 char **azArg, /* Array of arguments passed to dot command */ 3483 int nArg /* Number of entries in azArg[] */ 3484){ 3485 int rc = SQLITE_OK; 3486 char *zErr = 0; 3487 int i; 3488 int iSample = 0; 3489 3490 assert( pState->expert.pExpert==0 ); 3491 memset(&pState->expert, 0, sizeof(ExpertInfo)); 3492 3493 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 3494 char *z = azArg[i]; 3495 int n; 3496 if( z[0]=='-' && z[1]=='-' ) z++; 3497 n = strlen30(z); 3498 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 3499 pState->expert.bVerbose = 1; 3500 } 3501 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 3502 if( i==(nArg-1) ){ 3503 raw_printf(stderr, "option requires an argument: %s\n", z); 3504 rc = SQLITE_ERROR; 3505 }else{ 3506 iSample = (int)integerValue(azArg[++i]); 3507 if( iSample<0 || iSample>100 ){ 3508 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 3509 rc = SQLITE_ERROR; 3510 } 3511 } 3512 } 3513 else{ 3514 raw_printf(stderr, "unknown option: %s\n", z); 3515 rc = SQLITE_ERROR; 3516 } 3517 } 3518 3519 if( rc==SQLITE_OK ){ 3520 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 3521 if( pState->expert.pExpert==0 ){ 3522 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory"); 3523 rc = SQLITE_ERROR; 3524 }else{ 3525 sqlite3_expert_config( 3526 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 3527 ); 3528 } 3529 } 3530 sqlite3_free(zErr); 3531 3532 return rc; 3533} 3534#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 3535 3536/* 3537** Execute a statement or set of statements. Print 3538** any result rows/columns depending on the current mode 3539** set via the supplied callback. 3540** 3541** This is very similar to SQLite's built-in sqlite3_exec() 3542** function except it takes a slightly different callback 3543** and callback data argument. 3544*/ 3545static int shell_exec( 3546 ShellState *pArg, /* Pointer to ShellState */ 3547 const char *zSql, /* SQL to be evaluated */ 3548 char **pzErrMsg /* Error msg written here */ 3549){ 3550 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 3551 int rc = SQLITE_OK; /* Return Code */ 3552 int rc2; 3553 const char *zLeftover; /* Tail of unprocessed SQL */ 3554 sqlite3 *db = pArg->db; 3555 3556 if( pzErrMsg ){ 3557 *pzErrMsg = NULL; 3558 } 3559 3560#ifndef SQLITE_OMIT_VIRTUALTABLE 3561 if( pArg->expert.pExpert ){ 3562 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 3563 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 3564 } 3565#endif 3566 3567 while( zSql[0] && (SQLITE_OK == rc) ){ 3568 static const char *zStmtSql; 3569 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 3570 if( SQLITE_OK != rc ){ 3571 if( pzErrMsg ){ 3572 *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)", rc); 3573 } 3574 }else{ 3575 if( !pStmt ){ 3576 /* this happens for a comment or white-space */ 3577 zSql = zLeftover; 3578 while( IsSpace(zSql[0]) ) zSql++; 3579 continue; 3580 } 3581 zStmtSql = sqlite3_sql(pStmt); 3582 if( zStmtSql==0 ) zStmtSql = ""; 3583 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 3584 3585 /* save off the prepared statment handle and reset row count */ 3586 if( pArg ){ 3587 pArg->pStmt = pStmt; 3588 pArg->cnt = 0; 3589 } 3590 3591 /* echo the sql statement if echo on */ 3592 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 3593 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 3594 } 3595 3596 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 3597 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 3598 sqlite3_stmt *pExplain; 3599 char *zEQP; 3600 int triggerEQP = 0; 3601 disable_debug_trace_modes(); 3602 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 3603 if( pArg->autoEQP>=AUTOEQP_trigger ){ 3604 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 3605 } 3606 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 3607 shell_check_oom(zEQP); 3608 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3609 if( rc==SQLITE_OK ){ 3610 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 3611 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 3612 int iEqpId = sqlite3_column_int(pExplain, 0); 3613 int iParentId = sqlite3_column_int(pExplain, 1); 3614 if( zEQPLine==0 ) zEQPLine = ""; 3615 if( zEQPLine[0]=='-' ) eqp_render(pArg); 3616 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 3617 } 3618 eqp_render(pArg); 3619 } 3620 sqlite3_finalize(pExplain); 3621 sqlite3_free(zEQP); 3622 if( pArg->autoEQP>=AUTOEQP_full ){ 3623 /* Also do an EXPLAIN for ".eqp full" mode */ 3624 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 3625 shell_check_oom(zEQP); 3626 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3627 if( rc==SQLITE_OK ){ 3628 pArg->cMode = MODE_Explain; 3629 explain_data_prepare(pArg, pExplain); 3630 exec_prepared_stmt(pArg, pExplain); 3631 explain_data_delete(pArg); 3632 } 3633 sqlite3_finalize(pExplain); 3634 sqlite3_free(zEQP); 3635 } 3636 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 3637 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 3638 /* Reprepare pStmt before reactiving trace modes */ 3639 sqlite3_finalize(pStmt); 3640 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 3641 if( pArg ) pArg->pStmt = pStmt; 3642 } 3643 restore_debug_trace_modes(); 3644 } 3645 3646 if( pArg ){ 3647 pArg->cMode = pArg->mode; 3648 if( pArg->autoExplain ){ 3649 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 3650 pArg->cMode = MODE_Explain; 3651 } 3652 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 3653 pArg->cMode = MODE_EQP; 3654 } 3655 } 3656 3657 /* If the shell is currently in ".explain" mode, gather the extra 3658 ** data required to add indents to the output.*/ 3659 if( pArg->cMode==MODE_Explain ){ 3660 explain_data_prepare(pArg, pStmt); 3661 } 3662 } 3663 3664 bind_prepared_stmt(pArg, pStmt); 3665 exec_prepared_stmt(pArg, pStmt); 3666 explain_data_delete(pArg); 3667 eqp_render(pArg); 3668 3669 /* print usage stats if stats on */ 3670 if( pArg && pArg->statsOn ){ 3671 display_stats(db, pArg, 0); 3672 } 3673 3674 /* print loop-counters if required */ 3675 if( pArg && pArg->scanstatsOn ){ 3676 display_scanstats(db, pArg); 3677 } 3678 3679 /* Finalize the statement just executed. If this fails, save a 3680 ** copy of the error message. Otherwise, set zSql to point to the 3681 ** next statement to execute. */ 3682 rc2 = sqlite3_finalize(pStmt); 3683 if( rc!=SQLITE_NOMEM ) rc = rc2; 3684 if( rc==SQLITE_OK ){ 3685 zSql = zLeftover; 3686 while( IsSpace(zSql[0]) ) zSql++; 3687 }else if( pzErrMsg ){ 3688 *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc); 3689 } 3690 3691 /* clear saved stmt handle */ 3692 if( pArg ){ 3693 pArg->pStmt = NULL; 3694 } 3695 } 3696 } /* end while */ 3697 3698 return rc; 3699} 3700 3701/* 3702** Release memory previously allocated by tableColumnList(). 3703*/ 3704static void freeColumnList(char **azCol){ 3705 int i; 3706 for(i=1; azCol[i]; i++){ 3707 sqlite3_free(azCol[i]); 3708 } 3709 /* azCol[0] is a static string */ 3710 sqlite3_free(azCol); 3711} 3712 3713/* 3714** Return a list of pointers to strings which are the names of all 3715** columns in table zTab. The memory to hold the names is dynamically 3716** allocated and must be released by the caller using a subsequent call 3717** to freeColumnList(). 3718** 3719** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 3720** value that needs to be preserved, then azCol[0] is filled in with the 3721** name of the rowid column. 3722** 3723** The first regular column in the table is azCol[1]. The list is terminated 3724** by an entry with azCol[i]==0. 3725*/ 3726static char **tableColumnList(ShellState *p, const char *zTab){ 3727 char **azCol = 0; 3728 sqlite3_stmt *pStmt; 3729 char *zSql; 3730 int nCol = 0; 3731 int nAlloc = 0; 3732 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 3733 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 3734 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 3735 int rc; 3736 3737 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 3738 shell_check_oom(zSql); 3739 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3740 sqlite3_free(zSql); 3741 if( rc ) return 0; 3742 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 3743 if( nCol>=nAlloc-2 ){ 3744 nAlloc = nAlloc*2 + nCol + 10; 3745 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 3746 shell_check_oom(azCol); 3747 } 3748 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 3749 shell_check_oom(azCol[nCol]); 3750 if( sqlite3_column_int(pStmt, 5) ){ 3751 nPK++; 3752 if( nPK==1 3753 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 3754 "INTEGER")==0 3755 ){ 3756 isIPK = 1; 3757 }else{ 3758 isIPK = 0; 3759 } 3760 } 3761 } 3762 sqlite3_finalize(pStmt); 3763 if( azCol==0 ) return 0; 3764 azCol[0] = 0; 3765 azCol[nCol+1] = 0; 3766 3767 /* The decision of whether or not a rowid really needs to be preserved 3768 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 3769 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 3770 ** rowids on tables where the rowid is inaccessible because there are other 3771 ** columns in the table named "rowid", "_rowid_", and "oid". 3772 */ 3773 if( preserveRowid && isIPK ){ 3774 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 3775 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 3776 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 3777 ** ROWID aliases. To distinguish these cases, check to see if 3778 ** there is a "pk" entry in "PRAGMA index_list". There will be 3779 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 3780 */ 3781 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 3782 " WHERE origin='pk'", zTab); 3783 shell_check_oom(zSql); 3784 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3785 sqlite3_free(zSql); 3786 if( rc ){ 3787 freeColumnList(azCol); 3788 return 0; 3789 } 3790 rc = sqlite3_step(pStmt); 3791 sqlite3_finalize(pStmt); 3792 preserveRowid = rc==SQLITE_ROW; 3793 } 3794 if( preserveRowid ){ 3795 /* Only preserve the rowid if we can find a name to use for the 3796 ** rowid */ 3797 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 3798 int i, j; 3799 for(j=0; j<3; j++){ 3800 for(i=1; i<=nCol; i++){ 3801 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 3802 } 3803 if( i>nCol ){ 3804 /* At this point, we know that azRowid[j] is not the name of any 3805 ** ordinary column in the table. Verify that azRowid[j] is a valid 3806 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 3807 ** tables will fail this last check */ 3808 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 3809 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 3810 break; 3811 } 3812 } 3813 } 3814 return azCol; 3815} 3816 3817/* 3818** Toggle the reverse_unordered_selects setting. 3819*/ 3820static void toggleSelectOrder(sqlite3 *db){ 3821 sqlite3_stmt *pStmt = 0; 3822 int iSetting = 0; 3823 char zStmt[100]; 3824 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 3825 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 3826 iSetting = sqlite3_column_int(pStmt, 0); 3827 } 3828 sqlite3_finalize(pStmt); 3829 sqlite3_snprintf(sizeof(zStmt), zStmt, 3830 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 3831 sqlite3_exec(db, zStmt, 0, 0, 0); 3832} 3833 3834/* 3835** This is a different callback routine used for dumping the database. 3836** Each row received by this callback consists of a table name, 3837** the table type ("index" or "table") and SQL to create the table. 3838** This routine should print text sufficient to recreate the table. 3839*/ 3840static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 3841 int rc; 3842 const char *zTable; 3843 const char *zType; 3844 const char *zSql; 3845 ShellState *p = (ShellState *)pArg; 3846 int dataOnly; 3847 int noSys; 3848 3849 UNUSED_PARAMETER(azNotUsed); 3850 if( nArg!=3 || azArg==0 ) return 0; 3851 zTable = azArg[0]; 3852 zType = azArg[1]; 3853 zSql = azArg[2]; 3854 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 3855 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 3856 3857 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 3858 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 3859 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 3860 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 3861 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 3862 return 0; 3863 }else if( dataOnly ){ 3864 /* no-op */ 3865 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 3866 char *zIns; 3867 if( !p->writableSchema ){ 3868 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 3869 p->writableSchema = 1; 3870 } 3871 zIns = sqlite3_mprintf( 3872 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 3873 "VALUES('table','%q','%q',0,'%q');", 3874 zTable, zTable, zSql); 3875 shell_check_oom(zIns); 3876 utf8_printf(p->out, "%s\n", zIns); 3877 sqlite3_free(zIns); 3878 return 0; 3879 }else{ 3880 printSchemaLine(p->out, zSql, ";\n"); 3881 } 3882 3883 if( strcmp(zType, "table")==0 ){ 3884 ShellText sSelect; 3885 ShellText sTable; 3886 char **azCol; 3887 int i; 3888 char *savedDestTable; 3889 int savedMode; 3890 3891 azCol = tableColumnList(p, zTable); 3892 if( azCol==0 ){ 3893 p->nErr++; 3894 return 0; 3895 } 3896 3897 /* Always quote the table name, even if it appears to be pure ascii, 3898 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 3899 initText(&sTable); 3900 appendText(&sTable, zTable, quoteChar(zTable)); 3901 /* If preserving the rowid, add a column list after the table name. 3902 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 3903 ** instead of the usual "INSERT INTO tab VALUES(...)". 3904 */ 3905 if( azCol[0] ){ 3906 appendText(&sTable, "(", 0); 3907 appendText(&sTable, azCol[0], 0); 3908 for(i=1; azCol[i]; i++){ 3909 appendText(&sTable, ",", 0); 3910 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 3911 } 3912 appendText(&sTable, ")", 0); 3913 } 3914 3915 /* Build an appropriate SELECT statement */ 3916 initText(&sSelect); 3917 appendText(&sSelect, "SELECT ", 0); 3918 if( azCol[0] ){ 3919 appendText(&sSelect, azCol[0], 0); 3920 appendText(&sSelect, ",", 0); 3921 } 3922 for(i=1; azCol[i]; i++){ 3923 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 3924 if( azCol[i+1] ){ 3925 appendText(&sSelect, ",", 0); 3926 } 3927 } 3928 freeColumnList(azCol); 3929 appendText(&sSelect, " FROM ", 0); 3930 appendText(&sSelect, zTable, quoteChar(zTable)); 3931 3932 savedDestTable = p->zDestTable; 3933 savedMode = p->mode; 3934 p->zDestTable = sTable.z; 3935 p->mode = p->cMode = MODE_Insert; 3936 rc = shell_exec(p, sSelect.z, 0); 3937 if( (rc&0xff)==SQLITE_CORRUPT ){ 3938 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3939 toggleSelectOrder(p->db); 3940 shell_exec(p, sSelect.z, 0); 3941 toggleSelectOrder(p->db); 3942 } 3943 p->zDestTable = savedDestTable; 3944 p->mode = savedMode; 3945 freeText(&sTable); 3946 freeText(&sSelect); 3947 if( rc ) p->nErr++; 3948 } 3949 return 0; 3950} 3951 3952/* 3953** Run zQuery. Use dump_callback() as the callback routine so that 3954** the contents of the query are output as SQL statements. 3955** 3956** If we get a SQLITE_CORRUPT error, rerun the query after appending 3957** "ORDER BY rowid DESC" to the end. 3958*/ 3959static int run_schema_dump_query( 3960 ShellState *p, 3961 const char *zQuery 3962){ 3963 int rc; 3964 char *zErr = 0; 3965 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 3966 if( rc==SQLITE_CORRUPT ){ 3967 char *zQ2; 3968 int len = strlen30(zQuery); 3969 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3970 if( zErr ){ 3971 utf8_printf(p->out, "/****** %s ******/\n", zErr); 3972 sqlite3_free(zErr); 3973 zErr = 0; 3974 } 3975 zQ2 = malloc( len+100 ); 3976 if( zQ2==0 ) return rc; 3977 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 3978 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 3979 if( rc ){ 3980 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 3981 }else{ 3982 rc = SQLITE_CORRUPT; 3983 } 3984 sqlite3_free(zErr); 3985 free(zQ2); 3986 } 3987 return rc; 3988} 3989 3990/* 3991** Text of help messages. 3992** 3993** The help text for each individual command begins with a line that starts 3994** with ".". Subsequent lines are supplimental information. 3995** 3996** There must be two or more spaces between the end of the command and the 3997** start of the description of what that command does. 3998*/ 3999static const char *(azHelp[]) = { 4000#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 4001 ".archive ... Manage SQL archives", 4002 " Each command must have exactly one of the following options:", 4003 " -c, --create Create a new archive", 4004 " -u, --update Add or update files with changed mtime", 4005 " -i, --insert Like -u but always add even if unchanged", 4006 " -r, --remove Remove files from archive", 4007 " -t, --list List contents of archive", 4008 " -x, --extract Extract files from archive", 4009 " Optional arguments:", 4010 " -v, --verbose Print each filename as it is processed", 4011 " -f FILE, --file FILE Use archive FILE (default is current db)", 4012 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 4013 " -C DIR, --directory DIR Read/extract files from directory DIR", 4014 " -g, --glob Use glob matching for names in archive", 4015 " -n, --dryrun Show the SQL that would have occurred", 4016 " Examples:", 4017 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 4018 " .ar -tf ARCHIVE # List members of ARCHIVE", 4019 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 4020 " See also:", 4021 " http://sqlite.org/cli.html#sqlite_archive_support", 4022#endif 4023#ifndef SQLITE_OMIT_AUTHORIZATION 4024 ".auth ON|OFF Show authorizer callbacks", 4025#endif 4026 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 4027 " --append Use the appendvfs", 4028 " --async Write to FILE without journal and fsync()", 4029 ".bail on|off Stop after hitting an error. Default OFF", 4030 ".binary on|off Turn binary output on or off. Default OFF", 4031 ".cd DIRECTORY Change the working directory to DIRECTORY", 4032 ".changes on|off Show number of rows changed by SQL", 4033 ".check GLOB Fail if output since .testcase does not match", 4034 ".clone NEWDB Clone data into NEWDB from the existing database", 4035 ".connection [close] [#] Open or close an auxiliary database connection", 4036 ".databases List names and files of attached databases", 4037 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 4038 ".dbinfo ?DB? Show status information about the database", 4039 ".dump ?OBJECTS? Render database content as SQL", 4040 " Options:", 4041 " --data-only Output only INSERT statements", 4042 " --newlines Allow unescaped newline characters in output", 4043 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 4044 " --preserve-rowids Include ROWID values in the output", 4045 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump", 4046 " Additional LIKE patterns can be given in subsequent arguments", 4047 ".echo on|off Turn command echo on or off", 4048 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 4049 " Other Modes:", 4050#ifdef SQLITE_DEBUG 4051 " test Show raw EXPLAIN QUERY PLAN output", 4052 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 4053#endif 4054 " trigger Like \"full\" but also show trigger bytecode", 4055 ".excel Display the output of next command in spreadsheet", 4056 " --bom Put a UTF8 byte-order mark on intermediate file", 4057 ".exit ?CODE? Exit this program with return-code CODE", 4058 ".expert EXPERIMENTAL. Suggest indexes for queries", 4059 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 4060 ".filectrl CMD ... Run various sqlite3_file_control() operations", 4061 " --schema SCHEMA Use SCHEMA instead of \"main\"", 4062 " --help Show CMD details", 4063 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 4064 ".headers on|off Turn display of headers on or off", 4065 ".help ?-all? ?PATTERN? Show help text for PATTERN", 4066 ".import FILE TABLE Import data from FILE into TABLE", 4067 " Options:", 4068 " --ascii Use \\037 and \\036 as column and row separators", 4069 " --csv Use , and \\n as column and row separators", 4070 " --skip N Skip the first N rows of input", 4071 " -v \"Verbose\" - increase auxiliary output", 4072 " Notes:", 4073 " * If TABLE does not exist, it is created. The first row of input", 4074 " determines the column names.", 4075 " * If neither --csv or --ascii are used, the input mode is derived", 4076 " from the \".mode\" output mode", 4077 " * If FILE begins with \"|\" then it is a command that generates the", 4078 " input text.", 4079#ifndef SQLITE_OMIT_TEST_CONTROL 4080 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 4081#endif 4082 ".indexes ?TABLE? Show names of indexes", 4083 " If TABLE is specified, only show indexes for", 4084 " tables matching TABLE using the LIKE operator.", 4085#ifdef SQLITE_ENABLE_IOTRACE 4086 ".iotrace FILE Enable I/O diagnostic logging to FILE", 4087#endif 4088 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 4089 ".lint OPTIONS Report potential schema issues.", 4090 " Options:", 4091 " fkey-indexes Find missing foreign key indexes", 4092#ifndef SQLITE_OMIT_LOAD_EXTENSION 4093 ".load FILE ?ENTRY? Load an extension library", 4094#endif 4095 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 4096 ".mode MODE ?TABLE? Set output mode", 4097 " MODE is one of:", 4098 " ascii Columns/rows delimited by 0x1F and 0x1E", 4099 " box Tables using unicode box-drawing characters", 4100 " csv Comma-separated values", 4101 " column Output in columns. (See .width)", 4102 " html HTML <table> code", 4103 " insert SQL insert statements for TABLE", 4104 " json Results in a JSON array", 4105 " line One value per line", 4106 " list Values delimited by \"|\"", 4107 " markdown Markdown table format", 4108 " quote Escape answers as for SQL", 4109 " table ASCII-art table", 4110 " tabs Tab-separated values", 4111 " tcl TCL list elements", 4112 ".nonce STRING Disable safe mode for one command if the nonce matches", 4113 ".nullvalue STRING Use STRING in place of NULL values", 4114 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 4115 " If FILE begins with '|' then open as a pipe", 4116 " --bom Put a UTF8 byte-order mark at the beginning", 4117 " -e Send output to the system text editor", 4118 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 4119#ifdef SQLITE_DEBUG 4120 ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", 4121#endif 4122 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 4123 " Options:", 4124 " --append Use appendvfs to append database to the end of FILE", 4125#ifndef SQLITE_OMIT_DESERIALIZE 4126 " --deserialize Load into memory using sqlite3_deserialize()", 4127 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 4128 " --maxsize N Maximum size for --hexdb or --deserialized database", 4129#endif 4130 " --new Initialize FILE to an empty database", 4131 " --nofollow Do not follow symbolic links", 4132 " --readonly Open FILE readonly", 4133 " --zip FILE is a ZIP archive", 4134 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 4135 " If FILE begins with '|' then open it as a pipe.", 4136 " Options:", 4137 " --bom Prefix output with a UTF8 byte-order mark", 4138 " -e Send output to the system text editor", 4139 " -x Send output as CSV to a spreadsheet", 4140 ".parameter CMD ... Manage SQL parameter bindings", 4141 " clear Erase all bindings", 4142 " init Initialize the TEMP table that holds bindings", 4143 " list List the current parameter bindings", 4144 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 4145 " PARAMETER should start with one of: $ : @ ?", 4146 " unset PARAMETER Remove PARAMETER from the binding table", 4147 ".print STRING... Print literal STRING", 4148#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 4149 ".progress N Invoke progress handler after every N opcodes", 4150 " --limit N Interrupt after N progress callbacks", 4151 " --once Do no more than one progress interrupt", 4152 " --quiet|-q No output except at interrupts", 4153 " --reset Reset the count for each input and interrupt", 4154#endif 4155 ".prompt MAIN CONTINUE Replace the standard prompts", 4156 ".quit Exit this program", 4157 ".read FILE Read input from FILE", 4158#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4159 ".recover Recover as much data as possible from corrupt db.", 4160 " --freelist-corrupt Assume the freelist is corrupt", 4161 " --recovery-db NAME Store recovery metadata in database file NAME", 4162 " --lost-and-found TABLE Alternative name for the lost-and-found table", 4163 " --no-rowids Do not attempt to recover rowid values", 4164 " that are not also INTEGER PRIMARY KEYs", 4165#endif 4166 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 4167 ".save FILE Write in-memory database into FILE", 4168 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 4169 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 4170 " Options:", 4171 " --indent Try to pretty-print the schema", 4172 " --nosys Omit objects whose names start with \"sqlite_\"", 4173 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 4174 " Options:", 4175 " --init Create a new SELFTEST table", 4176 " -v Verbose output", 4177 ".separator COL ?ROW? Change the column and row separators", 4178#if defined(SQLITE_ENABLE_SESSION) 4179 ".session ?NAME? CMD ... Create or control sessions", 4180 " Subcommands:", 4181 " attach TABLE Attach TABLE", 4182 " changeset FILE Write a changeset into FILE", 4183 " close Close one session", 4184 " enable ?BOOLEAN? Set or query the enable bit", 4185 " filter GLOB... Reject tables matching GLOBs", 4186 " indirect ?BOOLEAN? Mark or query the indirect status", 4187 " isempty Query whether the session is empty", 4188 " list List currently open session names", 4189 " open DB NAME Open a new session on DB", 4190 " patchset FILE Write a patchset into FILE", 4191 " If ?NAME? is omitted, the first defined session is used.", 4192#endif 4193 ".sha3sum ... Compute a SHA3 hash of database content", 4194 " Options:", 4195 " --schema Also hash the sqlite_schema table", 4196 " --sha3-224 Use the sha3-224 algorithm", 4197 " --sha3-256 Use the sha3-256 algorithm (default)", 4198 " --sha3-384 Use the sha3-384 algorithm", 4199 " --sha3-512 Use the sha3-512 algorithm", 4200 " Any other argument is a LIKE pattern for tables to hash", 4201#ifndef SQLITE_NOHAVE_SYSTEM 4202 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 4203#endif 4204 ".show Show the current values for various settings", 4205 ".stats ?ARG? Show stats or turn stats on or off", 4206 " off Turn off automatic stat display", 4207 " on Turn on automatic stat display", 4208 " stmt Show statement stats", 4209 " vmstep Show the virtual machine step count only", 4210#ifndef SQLITE_NOHAVE_SYSTEM 4211 ".system CMD ARGS... Run CMD ARGS... in a system shell", 4212#endif 4213 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 4214 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 4215 ".testctrl CMD ... Run various sqlite3_test_control() operations", 4216 " Run \".testctrl\" with no arguments for details", 4217 ".timeout MS Try opening locked tables for MS milliseconds", 4218 ".timer on|off Turn SQL timer on or off", 4219#ifndef SQLITE_OMIT_TRACE 4220 ".trace ?OPTIONS? Output each SQL statement as it is run", 4221 " FILE Send output to FILE", 4222 " stdout Send output to stdout", 4223 " stderr Send output to stderr", 4224 " off Disable tracing", 4225 " --expanded Expand query parameters", 4226#ifdef SQLITE_ENABLE_NORMALIZE 4227 " --normalized Normal the SQL statements", 4228#endif 4229 " --plain Show SQL as it is input", 4230 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 4231 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 4232 " --row Trace each row (SQLITE_TRACE_ROW)", 4233 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 4234#endif /* SQLITE_OMIT_TRACE */ 4235#ifdef SQLITE_DEBUG 4236 ".unmodule NAME ... Unregister virtual table modules", 4237 " --allexcept Unregister everything except those named", 4238#endif 4239 ".vfsinfo ?AUX? Information about the top-level VFS", 4240 ".vfslist List all available VFSes", 4241 ".vfsname ?AUX? Print the name of the VFS stack", 4242 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 4243 " Negative values right-justify", 4244}; 4245 4246/* 4247** Output help text. 4248** 4249** zPattern describes the set of commands for which help text is provided. 4250** If zPattern is NULL, then show all commands, but only give a one-line 4251** description of each. 4252** 4253** Return the number of matches. 4254*/ 4255static int showHelp(FILE *out, const char *zPattern){ 4256 int i = 0; 4257 int j = 0; 4258 int n = 0; 4259 char *zPat; 4260 if( zPattern==0 4261 || zPattern[0]=='0' 4262 || strcmp(zPattern,"-a")==0 4263 || strcmp(zPattern,"-all")==0 4264 || strcmp(zPattern,"--all")==0 4265 ){ 4266 /* Show all commands, but only one line per command */ 4267 if( zPattern==0 ) zPattern = ""; 4268 for(i=0; i<ArraySize(azHelp); i++){ 4269 if( azHelp[i][0]=='.' || zPattern[0] ){ 4270 utf8_printf(out, "%s\n", azHelp[i]); 4271 n++; 4272 } 4273 } 4274 }else{ 4275 /* Look for commands that for which zPattern is an exact prefix */ 4276 zPat = sqlite3_mprintf(".%s*", zPattern); 4277 shell_check_oom(zPat); 4278 for(i=0; i<ArraySize(azHelp); i++){ 4279 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 4280 utf8_printf(out, "%s\n", azHelp[i]); 4281 j = i+1; 4282 n++; 4283 } 4284 } 4285 sqlite3_free(zPat); 4286 if( n ){ 4287 if( n==1 ){ 4288 /* when zPattern is a prefix of exactly one command, then include the 4289 ** details of that command, which should begin at offset j */ 4290 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 4291 utf8_printf(out, "%s\n", azHelp[j]); 4292 j++; 4293 } 4294 } 4295 return n; 4296 } 4297 /* Look for commands that contain zPattern anywhere. Show the complete 4298 ** text of all commands that match. */ 4299 zPat = sqlite3_mprintf("%%%s%%", zPattern); 4300 shell_check_oom(zPat); 4301 for(i=0; i<ArraySize(azHelp); i++){ 4302 if( azHelp[i][0]=='.' ) j = i; 4303 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 4304 utf8_printf(out, "%s\n", azHelp[j]); 4305 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 4306 j++; 4307 utf8_printf(out, "%s\n", azHelp[j]); 4308 } 4309 i = j; 4310 n++; 4311 } 4312 } 4313 sqlite3_free(zPat); 4314 } 4315 return n; 4316} 4317 4318/* Forward reference */ 4319static int process_input(ShellState *p); 4320 4321/* 4322** Read the content of file zName into memory obtained from sqlite3_malloc64() 4323** and return a pointer to the buffer. The caller is responsible for freeing 4324** the memory. 4325** 4326** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 4327** read. 4328** 4329** For convenience, a nul-terminator byte is always appended to the data read 4330** from the file before the buffer is returned. This byte is not included in 4331** the final value of (*pnByte), if applicable. 4332** 4333** NULL is returned if any error is encountered. The final value of *pnByte 4334** is undefined in this case. 4335*/ 4336static char *readFile(const char *zName, int *pnByte){ 4337 FILE *in = fopen(zName, "rb"); 4338 long nIn; 4339 size_t nRead; 4340 char *pBuf; 4341 if( in==0 ) return 0; 4342 fseek(in, 0, SEEK_END); 4343 nIn = ftell(in); 4344 rewind(in); 4345 pBuf = sqlite3_malloc64( nIn+1 ); 4346 if( pBuf==0 ){ fclose(in); return 0; } 4347 nRead = fread(pBuf, nIn, 1, in); 4348 fclose(in); 4349 if( nRead!=1 ){ 4350 sqlite3_free(pBuf); 4351 return 0; 4352 } 4353 pBuf[nIn] = 0; 4354 if( pnByte ) *pnByte = nIn; 4355 return pBuf; 4356} 4357 4358#if defined(SQLITE_ENABLE_SESSION) 4359/* 4360** Close a single OpenSession object and release all of its associated 4361** resources. 4362*/ 4363static void session_close(OpenSession *pSession){ 4364 int i; 4365 sqlite3session_delete(pSession->p); 4366 sqlite3_free(pSession->zName); 4367 for(i=0; i<pSession->nFilter; i++){ 4368 sqlite3_free(pSession->azFilter[i]); 4369 } 4370 sqlite3_free(pSession->azFilter); 4371 memset(pSession, 0, sizeof(OpenSession)); 4372} 4373#endif 4374 4375/* 4376** Close all OpenSession objects and release all associated resources. 4377*/ 4378#if defined(SQLITE_ENABLE_SESSION) 4379static void session_close_all(ShellState *p, int i){ 4380 int j; 4381 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; 4382 for(j=0; j<pAuxDb->nSession; j++){ 4383 session_close(&pAuxDb->aSession[j]); 4384 } 4385 pAuxDb->nSession = 0; 4386} 4387#else 4388# define session_close_all(X,Y) 4389#endif 4390 4391/* 4392** Implementation of the xFilter function for an open session. Omit 4393** any tables named by ".session filter" but let all other table through. 4394*/ 4395#if defined(SQLITE_ENABLE_SESSION) 4396static int session_filter(void *pCtx, const char *zTab){ 4397 OpenSession *pSession = (OpenSession*)pCtx; 4398 int i; 4399 for(i=0; i<pSession->nFilter; i++){ 4400 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 4401 } 4402 return 1; 4403} 4404#endif 4405 4406/* 4407** Try to deduce the type of file for zName based on its content. Return 4408** one of the SHELL_OPEN_* constants. 4409** 4410** If the file does not exist or is empty but its name looks like a ZIP 4411** archive and the dfltZip flag is true, then assume it is a ZIP archive. 4412** Otherwise, assume an ordinary database regardless of the filename if 4413** the type cannot be determined from content. 4414*/ 4415int deduceDatabaseType(const char *zName, int dfltZip){ 4416 FILE *f = fopen(zName, "rb"); 4417 size_t n; 4418 int rc = SHELL_OPEN_UNSPEC; 4419 char zBuf[100]; 4420 if( f==0 ){ 4421 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4422 return SHELL_OPEN_ZIPFILE; 4423 }else{ 4424 return SHELL_OPEN_NORMAL; 4425 } 4426 } 4427 n = fread(zBuf, 16, 1, f); 4428 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 4429 fclose(f); 4430 return SHELL_OPEN_NORMAL; 4431 } 4432 fseek(f, -25, SEEK_END); 4433 n = fread(zBuf, 25, 1, f); 4434 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 4435 rc = SHELL_OPEN_APPENDVFS; 4436 }else{ 4437 fseek(f, -22, SEEK_END); 4438 n = fread(zBuf, 22, 1, f); 4439 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 4440 && zBuf[3]==0x06 ){ 4441 rc = SHELL_OPEN_ZIPFILE; 4442 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4443 rc = SHELL_OPEN_ZIPFILE; 4444 } 4445 } 4446 fclose(f); 4447 return rc; 4448} 4449 4450#ifndef SQLITE_OMIT_DESERIALIZE 4451/* 4452** Reconstruct an in-memory database using the output from the "dbtotxt" 4453** program. Read content from the file in p->aAuxDb[].zDbFilename. 4454** If p->aAuxDb[].zDbFilename is 0, then read from standard input. 4455*/ 4456static unsigned char *readHexDb(ShellState *p, int *pnData){ 4457 unsigned char *a = 0; 4458 int nLine; 4459 int n = 0; 4460 int pgsz = 0; 4461 int iOffset = 0; 4462 int j, k; 4463 int rc; 4464 FILE *in; 4465 const char *zDbFilename = p->pAuxDb->zDbFilename; 4466 unsigned int x[16]; 4467 char zLine[1000]; 4468 if( zDbFilename ){ 4469 in = fopen(zDbFilename, "r"); 4470 if( in==0 ){ 4471 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename); 4472 return 0; 4473 } 4474 nLine = 0; 4475 }else{ 4476 in = p->in; 4477 nLine = p->lineno; 4478 if( in==0 ) in = stdin; 4479 } 4480 *pnData = 0; 4481 nLine++; 4482 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 4483 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 4484 if( rc!=2 ) goto readHexDb_error; 4485 if( n<0 ) goto readHexDb_error; 4486 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 4487 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 4488 a = sqlite3_malloc( n ? n : 1 ); 4489 shell_check_oom(a); 4490 memset(a, 0, n); 4491 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 4492 utf8_printf(stderr, "invalid pagesize\n"); 4493 goto readHexDb_error; 4494 } 4495 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 4496 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 4497 if( rc==2 ){ 4498 iOffset = k; 4499 continue; 4500 } 4501 if( strncmp(zLine, "| end ", 6)==0 ){ 4502 break; 4503 } 4504 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 4505 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 4506 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 4507 if( rc==17 ){ 4508 k = iOffset+j; 4509 if( k+16<=n && k>=0 ){ 4510 int ii; 4511 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 4512 } 4513 } 4514 } 4515 *pnData = n; 4516 if( in!=p->in ){ 4517 fclose(in); 4518 }else{ 4519 p->lineno = nLine; 4520 } 4521 return a; 4522 4523readHexDb_error: 4524 if( in!=p->in ){ 4525 fclose(in); 4526 }else{ 4527 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 4528 nLine++; 4529 if(strncmp(zLine, "| end ", 6)==0 ) break; 4530 } 4531 p->lineno = nLine; 4532 } 4533 sqlite3_free(a); 4534 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 4535 return 0; 4536} 4537#endif /* SQLITE_OMIT_DESERIALIZE */ 4538 4539/* 4540** Scalar function "shell_int32". The first argument to this function 4541** must be a blob. The second a non-negative integer. This function 4542** reads and returns a 32-bit big-endian integer from byte 4543** offset (4*<arg2>) of the blob. 4544*/ 4545static void shellInt32( 4546 sqlite3_context *context, 4547 int argc, 4548 sqlite3_value **argv 4549){ 4550 const unsigned char *pBlob; 4551 int nBlob; 4552 int iInt; 4553 4554 UNUSED_PARAMETER(argc); 4555 nBlob = sqlite3_value_bytes(argv[0]); 4556 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 4557 iInt = sqlite3_value_int(argv[1]); 4558 4559 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 4560 const unsigned char *a = &pBlob[iInt*4]; 4561 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 4562 + ((sqlite3_int64)a[1]<<16) 4563 + ((sqlite3_int64)a[2]<< 8) 4564 + ((sqlite3_int64)a[3]<< 0); 4565 sqlite3_result_int64(context, iVal); 4566 } 4567} 4568 4569/* 4570** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 4571** using "..." with internal double-quote characters doubled. 4572*/ 4573static void shellIdQuote( 4574 sqlite3_context *context, 4575 int argc, 4576 sqlite3_value **argv 4577){ 4578 const char *zName = (const char*)sqlite3_value_text(argv[0]); 4579 UNUSED_PARAMETER(argc); 4580 if( zName ){ 4581 char *z = sqlite3_mprintf("\"%w\"", zName); 4582 sqlite3_result_text(context, z, -1, sqlite3_free); 4583 } 4584} 4585 4586/* 4587** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 4588*/ 4589static void shellUSleepFunc( 4590 sqlite3_context *context, 4591 int argcUnused, 4592 sqlite3_value **argv 4593){ 4594 int sleep = sqlite3_value_int(argv[0]); 4595 (void)argcUnused; 4596 sqlite3_sleep(sleep/1000); 4597 sqlite3_result_int(context, sleep); 4598} 4599 4600/* 4601** Scalar function "shell_escape_crnl" used by the .recover command. 4602** The argument passed to this function is the output of built-in 4603** function quote(). If the first character of the input is "'", 4604** indicating that the value passed to quote() was a text value, 4605** then this function searches the input for "\n" and "\r" characters 4606** and adds a wrapper similar to the following: 4607** 4608** replace(replace(<input>, '\n', char(10), '\r', char(13)); 4609** 4610** Or, if the first character of the input is not "'", then a copy 4611** of the input is returned. 4612*/ 4613static void shellEscapeCrnl( 4614 sqlite3_context *context, 4615 int argc, 4616 sqlite3_value **argv 4617){ 4618 const char *zText = (const char*)sqlite3_value_text(argv[0]); 4619 UNUSED_PARAMETER(argc); 4620 if( zText[0]=='\'' ){ 4621 int nText = sqlite3_value_bytes(argv[0]); 4622 int i; 4623 char zBuf1[20]; 4624 char zBuf2[20]; 4625 const char *zNL = 0; 4626 const char *zCR = 0; 4627 int nCR = 0; 4628 int nNL = 0; 4629 4630 for(i=0; zText[i]; i++){ 4631 if( zNL==0 && zText[i]=='\n' ){ 4632 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 4633 nNL = (int)strlen(zNL); 4634 } 4635 if( zCR==0 && zText[i]=='\r' ){ 4636 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 4637 nCR = (int)strlen(zCR); 4638 } 4639 } 4640 4641 if( zNL || zCR ){ 4642 int iOut = 0; 4643 i64 nMax = (nNL > nCR) ? nNL : nCR; 4644 i64 nAlloc = nMax * nText + (nMax+64)*2; 4645 char *zOut = (char*)sqlite3_malloc64(nAlloc); 4646 if( zOut==0 ){ 4647 sqlite3_result_error_nomem(context); 4648 return; 4649 } 4650 4651 if( zNL && zCR ){ 4652 memcpy(&zOut[iOut], "replace(replace(", 16); 4653 iOut += 16; 4654 }else{ 4655 memcpy(&zOut[iOut], "replace(", 8); 4656 iOut += 8; 4657 } 4658 for(i=0; zText[i]; i++){ 4659 if( zText[i]=='\n' ){ 4660 memcpy(&zOut[iOut], zNL, nNL); 4661 iOut += nNL; 4662 }else if( zText[i]=='\r' ){ 4663 memcpy(&zOut[iOut], zCR, nCR); 4664 iOut += nCR; 4665 }else{ 4666 zOut[iOut] = zText[i]; 4667 iOut++; 4668 } 4669 } 4670 4671 if( zNL ){ 4672 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4673 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 4674 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 4675 } 4676 if( zCR ){ 4677 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4678 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 4679 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 4680 } 4681 4682 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 4683 sqlite3_free(zOut); 4684 return; 4685 } 4686 } 4687 4688 sqlite3_result_value(context, argv[0]); 4689} 4690 4691/* Flags for open_db(). 4692** 4693** The default behavior of open_db() is to exit(1) if the database fails to 4694** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 4695** but still returns without calling exit. 4696** 4697** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 4698** ZIP archive if the file does not exist or is empty and its name matches 4699** the *.zip pattern. 4700*/ 4701#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 4702#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 4703 4704/* 4705** Make sure the database is open. If it is not, then open it. If 4706** the database fails to open, print an error message and exit. 4707*/ 4708static void open_db(ShellState *p, int openFlags){ 4709 if( p->db==0 ){ 4710 const char *zDbFilename = p->pAuxDb->zDbFilename; 4711 if( p->openMode==SHELL_OPEN_UNSPEC ){ 4712 if( zDbFilename==0 || zDbFilename[0]==0 ){ 4713 p->openMode = SHELL_OPEN_NORMAL; 4714 }else{ 4715 p->openMode = (u8)deduceDatabaseType(zDbFilename, 4716 (openFlags & OPEN_DB_ZIPFILE)!=0); 4717 } 4718 } 4719 switch( p->openMode ){ 4720 case SHELL_OPEN_APPENDVFS: { 4721 sqlite3_open_v2(zDbFilename, &p->db, 4722 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 4723 break; 4724 } 4725 case SHELL_OPEN_HEXDB: 4726 case SHELL_OPEN_DESERIALIZE: { 4727 sqlite3_open(0, &p->db); 4728 break; 4729 } 4730 case SHELL_OPEN_ZIPFILE: { 4731 sqlite3_open(":memory:", &p->db); 4732 break; 4733 } 4734 case SHELL_OPEN_READONLY: { 4735 sqlite3_open_v2(zDbFilename, &p->db, 4736 SQLITE_OPEN_READONLY|p->openFlags, 0); 4737 break; 4738 } 4739 case SHELL_OPEN_UNSPEC: 4740 case SHELL_OPEN_NORMAL: { 4741 sqlite3_open_v2(zDbFilename, &p->db, 4742 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 4743 break; 4744 } 4745 } 4746 globalDb = p->db; 4747 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 4748 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 4749 zDbFilename, sqlite3_errmsg(p->db)); 4750 if( openFlags & OPEN_DB_KEEPALIVE ){ 4751 sqlite3_open(":memory:", &p->db); 4752 return; 4753 } 4754 exit(1); 4755 } 4756#ifndef SQLITE_OMIT_LOAD_EXTENSION 4757 sqlite3_enable_load_extension(p->db, 1); 4758#endif 4759 sqlite3_fileio_init(p->db, 0, 0); 4760 sqlite3_shathree_init(p->db, 0, 0); 4761 sqlite3_completion_init(p->db, 0, 0); 4762 sqlite3_uint_init(p->db, 0, 0); 4763 sqlite3_decimal_init(p->db, 0, 0); 4764 sqlite3_regexp_init(p->db, 0, 0); 4765 sqlite3_ieee_init(p->db, 0, 0); 4766 sqlite3_series_init(p->db, 0, 0); 4767#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4768 sqlite3_dbdata_init(p->db, 0, 0); 4769#endif 4770#ifdef SQLITE_HAVE_ZLIB 4771 sqlite3_zipfile_init(p->db, 0, 0); 4772 sqlite3_sqlar_init(p->db, 0, 0); 4773#endif 4774 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 4775 shellAddSchemaName, 0, 0); 4776 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 4777 shellModuleSchema, 0, 0); 4778 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 4779 shellPutsFunc, 0, 0); 4780 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 4781 shellEscapeCrnl, 0, 0); 4782 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 4783 shellInt32, 0, 0); 4784 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 4785 shellIdQuote, 0, 0); 4786 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 4787 shellUSleepFunc, 0, 0); 4788#ifndef SQLITE_NOHAVE_SYSTEM 4789 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 4790 editFunc, 0, 0); 4791 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 4792 editFunc, 0, 0); 4793#endif 4794 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 4795 char *zSql = sqlite3_mprintf( 4796 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); 4797 shell_check_oom(zSql); 4798 sqlite3_exec(p->db, zSql, 0, 0, 0); 4799 sqlite3_free(zSql); 4800 } 4801#ifndef SQLITE_OMIT_DESERIALIZE 4802 else 4803 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 4804 int rc; 4805 int nData = 0; 4806 unsigned char *aData; 4807 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 4808 aData = (unsigned char*)readFile(zDbFilename, &nData); 4809 }else{ 4810 aData = readHexDb(p, &nData); 4811 if( aData==0 ){ 4812 return; 4813 } 4814 } 4815 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 4816 SQLITE_DESERIALIZE_RESIZEABLE | 4817 SQLITE_DESERIALIZE_FREEONCLOSE); 4818 if( rc ){ 4819 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 4820 } 4821 if( p->szMax>0 ){ 4822 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 4823 } 4824 } 4825#endif 4826 } 4827 if( p->bSafeModePersist && p->db!=0 ){ 4828 sqlite3_set_authorizer(p->db, safeModeAuth, p); 4829 } 4830} 4831 4832/* 4833** Attempt to close the databaes connection. Report errors. 4834*/ 4835void close_db(sqlite3 *db){ 4836 int rc = sqlite3_close(db); 4837 if( rc ){ 4838 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 4839 rc, sqlite3_errmsg(db)); 4840 } 4841} 4842 4843#if HAVE_READLINE || HAVE_EDITLINE 4844/* 4845** Readline completion callbacks 4846*/ 4847static char *readline_completion_generator(const char *text, int state){ 4848 static sqlite3_stmt *pStmt = 0; 4849 char *zRet; 4850 if( state==0 ){ 4851 char *zSql; 4852 sqlite3_finalize(pStmt); 4853 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 4854 " FROM completion(%Q) ORDER BY 1", text); 4855 shell_check_oom(zSql); 4856 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 4857 sqlite3_free(zSql); 4858 } 4859 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 4860 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); 4861 }else{ 4862 sqlite3_finalize(pStmt); 4863 pStmt = 0; 4864 zRet = 0; 4865 } 4866 return zRet; 4867} 4868static char **readline_completion(const char *zText, int iStart, int iEnd){ 4869 rl_attempted_completion_over = 1; 4870 return rl_completion_matches(zText, readline_completion_generator); 4871} 4872 4873#elif HAVE_LINENOISE 4874/* 4875** Linenoise completion callback 4876*/ 4877static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 4878 int nLine = strlen30(zLine); 4879 int i, iStart; 4880 sqlite3_stmt *pStmt = 0; 4881 char *zSql; 4882 char zBuf[1000]; 4883 4884 if( nLine>sizeof(zBuf)-30 ) return; 4885 if( zLine[0]=='.' || zLine[0]=='#') return; 4886 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 4887 if( i==nLine-1 ) return; 4888 iStart = i+1; 4889 memcpy(zBuf, zLine, iStart); 4890 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 4891 " FROM completion(%Q,%Q) ORDER BY 1", 4892 &zLine[iStart], zLine); 4893 shell_check_oom(zSql); 4894 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 4895 sqlite3_free(zSql); 4896 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 4897 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 4898 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 4899 int nCompletion = sqlite3_column_bytes(pStmt, 0); 4900 if( iStart+nCompletion < sizeof(zBuf)-1 ){ 4901 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 4902 linenoiseAddCompletion(lc, zBuf); 4903 } 4904 } 4905 sqlite3_finalize(pStmt); 4906} 4907#endif 4908 4909/* 4910** Do C-language style dequoting. 4911** 4912** \a -> alarm 4913** \b -> backspace 4914** \t -> tab 4915** \n -> newline 4916** \v -> vertical tab 4917** \f -> form feed 4918** \r -> carriage return 4919** \s -> space 4920** \" -> " 4921** \' -> ' 4922** \\ -> backslash 4923** \NNN -> ascii character NNN in octal 4924*/ 4925static void resolve_backslashes(char *z){ 4926 int i, j; 4927 char c; 4928 while( *z && *z!='\\' ) z++; 4929 for(i=j=0; (c = z[i])!=0; i++, j++){ 4930 if( c=='\\' && z[i+1]!=0 ){ 4931 c = z[++i]; 4932 if( c=='a' ){ 4933 c = '\a'; 4934 }else if( c=='b' ){ 4935 c = '\b'; 4936 }else if( c=='t' ){ 4937 c = '\t'; 4938 }else if( c=='n' ){ 4939 c = '\n'; 4940 }else if( c=='v' ){ 4941 c = '\v'; 4942 }else if( c=='f' ){ 4943 c = '\f'; 4944 }else if( c=='r' ){ 4945 c = '\r'; 4946 }else if( c=='"' ){ 4947 c = '"'; 4948 }else if( c=='\'' ){ 4949 c = '\''; 4950 }else if( c=='\\' ){ 4951 c = '\\'; 4952 }else if( c>='0' && c<='7' ){ 4953 c -= '0'; 4954 if( z[i+1]>='0' && z[i+1]<='7' ){ 4955 i++; 4956 c = (c<<3) + z[i] - '0'; 4957 if( z[i+1]>='0' && z[i+1]<='7' ){ 4958 i++; 4959 c = (c<<3) + z[i] - '0'; 4960 } 4961 } 4962 } 4963 } 4964 z[j] = c; 4965 } 4966 if( j<i ) z[j] = 0; 4967} 4968 4969/* 4970** Interpret zArg as either an integer or a boolean value. Return 1 or 0 4971** for TRUE and FALSE. Return the integer value if appropriate. 4972*/ 4973static int booleanValue(const char *zArg){ 4974 int i; 4975 if( zArg[0]=='0' && zArg[1]=='x' ){ 4976 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 4977 }else{ 4978 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 4979 } 4980 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 4981 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 4982 return 1; 4983 } 4984 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 4985 return 0; 4986 } 4987 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 4988 zArg); 4989 return 0; 4990} 4991 4992/* 4993** Set or clear a shell flag according to a boolean value. 4994*/ 4995static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 4996 if( booleanValue(zArg) ){ 4997 ShellSetFlag(p, mFlag); 4998 }else{ 4999 ShellClearFlag(p, mFlag); 5000 } 5001} 5002 5003/* 5004** Close an output file, assuming it is not stderr or stdout 5005*/ 5006static void output_file_close(FILE *f){ 5007 if( f && f!=stdout && f!=stderr ) fclose(f); 5008} 5009 5010/* 5011** Try to open an output file. The names "stdout" and "stderr" are 5012** recognized and do the right thing. NULL is returned if the output 5013** filename is "off". 5014*/ 5015static FILE *output_file_open(const char *zFile, int bTextMode){ 5016 FILE *f; 5017 if( strcmp(zFile,"stdout")==0 ){ 5018 f = stdout; 5019 }else if( strcmp(zFile, "stderr")==0 ){ 5020 f = stderr; 5021 }else if( strcmp(zFile, "off")==0 ){ 5022 f = 0; 5023 }else{ 5024 f = fopen(zFile, bTextMode ? "w" : "wb"); 5025 if( f==0 ){ 5026 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 5027 } 5028 } 5029 return f; 5030} 5031 5032#ifndef SQLITE_OMIT_TRACE 5033/* 5034** A routine for handling output from sqlite3_trace(). 5035*/ 5036static int sql_trace_callback( 5037 unsigned mType, /* The trace type */ 5038 void *pArg, /* The ShellState pointer */ 5039 void *pP, /* Usually a pointer to sqlite_stmt */ 5040 void *pX /* Auxiliary output */ 5041){ 5042 ShellState *p = (ShellState*)pArg; 5043 sqlite3_stmt *pStmt; 5044 const char *zSql; 5045 int nSql; 5046 if( p->traceOut==0 ) return 0; 5047 if( mType==SQLITE_TRACE_CLOSE ){ 5048 utf8_printf(p->traceOut, "-- closing database connection\n"); 5049 return 0; 5050 } 5051 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 5052 zSql = (const char*)pX; 5053 }else{ 5054 pStmt = (sqlite3_stmt*)pP; 5055 switch( p->eTraceType ){ 5056 case SHELL_TRACE_EXPANDED: { 5057 zSql = sqlite3_expanded_sql(pStmt); 5058 break; 5059 } 5060#ifdef SQLITE_ENABLE_NORMALIZE 5061 case SHELL_TRACE_NORMALIZED: { 5062 zSql = sqlite3_normalized_sql(pStmt); 5063 break; 5064 } 5065#endif 5066 default: { 5067 zSql = sqlite3_sql(pStmt); 5068 break; 5069 } 5070 } 5071 } 5072 if( zSql==0 ) return 0; 5073 nSql = strlen30(zSql); 5074 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 5075 switch( mType ){ 5076 case SQLITE_TRACE_ROW: 5077 case SQLITE_TRACE_STMT: { 5078 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 5079 break; 5080 } 5081 case SQLITE_TRACE_PROFILE: { 5082 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 5083 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 5084 break; 5085 } 5086 } 5087 return 0; 5088} 5089#endif 5090 5091/* 5092** A no-op routine that runs with the ".breakpoint" doc-command. This is 5093** a useful spot to set a debugger breakpoint. 5094*/ 5095static void test_breakpoint(void){ 5096 static int nCall = 0; 5097 nCall++; 5098} 5099 5100/* 5101** An object used to read a CSV and other files for import. 5102*/ 5103typedef struct ImportCtx ImportCtx; 5104struct ImportCtx { 5105 const char *zFile; /* Name of the input file */ 5106 FILE *in; /* Read the CSV text from this input stream */ 5107 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 5108 char *z; /* Accumulated text for a field */ 5109 int n; /* Number of bytes in z */ 5110 int nAlloc; /* Space allocated for z[] */ 5111 int nLine; /* Current line number */ 5112 int nRow; /* Number of rows imported */ 5113 int nErr; /* Number of errors encountered */ 5114 int bNotFirst; /* True if one or more bytes already read */ 5115 int cTerm; /* Character that terminated the most recent field */ 5116 int cColSep; /* The column separator character. (Usually ",") */ 5117 int cRowSep; /* The row separator character. (Usually "\n") */ 5118}; 5119 5120/* Clean up resourced used by an ImportCtx */ 5121static void import_cleanup(ImportCtx *p){ 5122 if( p->in!=0 && p->xCloser!=0 ){ 5123 p->xCloser(p->in); 5124 p->in = 0; 5125 } 5126 sqlite3_free(p->z); 5127 p->z = 0; 5128} 5129 5130/* Append a single byte to z[] */ 5131static void import_append_char(ImportCtx *p, int c){ 5132 if( p->n+1>=p->nAlloc ){ 5133 p->nAlloc += p->nAlloc + 100; 5134 p->z = sqlite3_realloc64(p->z, p->nAlloc); 5135 shell_check_oom(p->z); 5136 } 5137 p->z[p->n++] = (char)c; 5138} 5139 5140/* Read a single field of CSV text. Compatible with rfc4180 and extended 5141** with the option of having a separator other than ",". 5142** 5143** + Input comes from p->in. 5144** + Store results in p->z of length p->n. Space to hold p->z comes 5145** from sqlite3_malloc64(). 5146** + Use p->cSep as the column separator. The default is ",". 5147** + Use p->rSep as the row separator. The default is "\n". 5148** + Keep track of the line number in p->nLine. 5149** + Store the character that terminates the field in p->cTerm. Store 5150** EOF on end-of-file. 5151** + Report syntax errors on stderr 5152*/ 5153static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 5154 int c; 5155 int cSep = p->cColSep; 5156 int rSep = p->cRowSep; 5157 p->n = 0; 5158 c = fgetc(p->in); 5159 if( c==EOF || seenInterrupt ){ 5160 p->cTerm = EOF; 5161 return 0; 5162 } 5163 if( c=='"' ){ 5164 int pc, ppc; 5165 int startLine = p->nLine; 5166 int cQuote = c; 5167 pc = ppc = 0; 5168 while( 1 ){ 5169 c = fgetc(p->in); 5170 if( c==rSep ) p->nLine++; 5171 if( c==cQuote ){ 5172 if( pc==cQuote ){ 5173 pc = 0; 5174 continue; 5175 } 5176 } 5177 if( (c==cSep && pc==cQuote) 5178 || (c==rSep && pc==cQuote) 5179 || (c==rSep && pc=='\r' && ppc==cQuote) 5180 || (c==EOF && pc==cQuote) 5181 ){ 5182 do{ p->n--; }while( p->z[p->n]!=cQuote ); 5183 p->cTerm = c; 5184 break; 5185 } 5186 if( pc==cQuote && c!='\r' ){ 5187 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 5188 p->zFile, p->nLine, cQuote); 5189 } 5190 if( c==EOF ){ 5191 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 5192 p->zFile, startLine, cQuote); 5193 p->cTerm = c; 5194 break; 5195 } 5196 import_append_char(p, c); 5197 ppc = pc; 5198 pc = c; 5199 } 5200 }else{ 5201 /* If this is the first field being parsed and it begins with the 5202 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 5203 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 5204 import_append_char(p, c); 5205 c = fgetc(p->in); 5206 if( (c&0xff)==0xbb ){ 5207 import_append_char(p, c); 5208 c = fgetc(p->in); 5209 if( (c&0xff)==0xbf ){ 5210 p->bNotFirst = 1; 5211 p->n = 0; 5212 return csv_read_one_field(p); 5213 } 5214 } 5215 } 5216 while( c!=EOF && c!=cSep && c!=rSep ){ 5217 import_append_char(p, c); 5218 c = fgetc(p->in); 5219 } 5220 if( c==rSep ){ 5221 p->nLine++; 5222 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 5223 } 5224 p->cTerm = c; 5225 } 5226 if( p->z ) p->z[p->n] = 0; 5227 p->bNotFirst = 1; 5228 return p->z; 5229} 5230 5231/* Read a single field of ASCII delimited text. 5232** 5233** + Input comes from p->in. 5234** + Store results in p->z of length p->n. Space to hold p->z comes 5235** from sqlite3_malloc64(). 5236** + Use p->cSep as the column separator. The default is "\x1F". 5237** + Use p->rSep as the row separator. The default is "\x1E". 5238** + Keep track of the row number in p->nLine. 5239** + Store the character that terminates the field in p->cTerm. Store 5240** EOF on end-of-file. 5241** + Report syntax errors on stderr 5242*/ 5243static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 5244 int c; 5245 int cSep = p->cColSep; 5246 int rSep = p->cRowSep; 5247 p->n = 0; 5248 c = fgetc(p->in); 5249 if( c==EOF || seenInterrupt ){ 5250 p->cTerm = EOF; 5251 return 0; 5252 } 5253 while( c!=EOF && c!=cSep && c!=rSep ){ 5254 import_append_char(p, c); 5255 c = fgetc(p->in); 5256 } 5257 if( c==rSep ){ 5258 p->nLine++; 5259 } 5260 p->cTerm = c; 5261 if( p->z ) p->z[p->n] = 0; 5262 return p->z; 5263} 5264 5265/* 5266** Try to transfer data for table zTable. If an error is seen while 5267** moving forward, try to go backwards. The backwards movement won't 5268** work for WITHOUT ROWID tables. 5269*/ 5270static void tryToCloneData( 5271 ShellState *p, 5272 sqlite3 *newDb, 5273 const char *zTable 5274){ 5275 sqlite3_stmt *pQuery = 0; 5276 sqlite3_stmt *pInsert = 0; 5277 char *zQuery = 0; 5278 char *zInsert = 0; 5279 int rc; 5280 int i, j, n; 5281 int nTable = strlen30(zTable); 5282 int k = 0; 5283 int cnt = 0; 5284 const int spinRate = 10000; 5285 5286 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 5287 shell_check_oom(zQuery); 5288 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5289 if( rc ){ 5290 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5291 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5292 zQuery); 5293 goto end_data_xfer; 5294 } 5295 n = sqlite3_column_count(pQuery); 5296 zInsert = sqlite3_malloc64(200 + nTable + n*3); 5297 shell_check_oom(zInsert); 5298 sqlite3_snprintf(200+nTable,zInsert, 5299 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 5300 i = strlen30(zInsert); 5301 for(j=1; j<n; j++){ 5302 memcpy(zInsert+i, ",?", 2); 5303 i += 2; 5304 } 5305 memcpy(zInsert+i, ");", 3); 5306 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 5307 if( rc ){ 5308 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5309 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 5310 zQuery); 5311 goto end_data_xfer; 5312 } 5313 for(k=0; k<2; k++){ 5314 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5315 for(i=0; i<n; i++){ 5316 switch( sqlite3_column_type(pQuery, i) ){ 5317 case SQLITE_NULL: { 5318 sqlite3_bind_null(pInsert, i+1); 5319 break; 5320 } 5321 case SQLITE_INTEGER: { 5322 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 5323 break; 5324 } 5325 case SQLITE_FLOAT: { 5326 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 5327 break; 5328 } 5329 case SQLITE_TEXT: { 5330 sqlite3_bind_text(pInsert, i+1, 5331 (const char*)sqlite3_column_text(pQuery,i), 5332 -1, SQLITE_STATIC); 5333 break; 5334 } 5335 case SQLITE_BLOB: { 5336 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 5337 sqlite3_column_bytes(pQuery,i), 5338 SQLITE_STATIC); 5339 break; 5340 } 5341 } 5342 } /* End for */ 5343 rc = sqlite3_step(pInsert); 5344 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 5345 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 5346 sqlite3_errmsg(newDb)); 5347 } 5348 sqlite3_reset(pInsert); 5349 cnt++; 5350 if( (cnt%spinRate)==0 ){ 5351 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 5352 fflush(stdout); 5353 } 5354 } /* End while */ 5355 if( rc==SQLITE_DONE ) break; 5356 sqlite3_finalize(pQuery); 5357 sqlite3_free(zQuery); 5358 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 5359 zTable); 5360 shell_check_oom(zQuery); 5361 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5362 if( rc ){ 5363 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 5364 break; 5365 } 5366 } /* End for(k=0...) */ 5367 5368end_data_xfer: 5369 sqlite3_finalize(pQuery); 5370 sqlite3_finalize(pInsert); 5371 sqlite3_free(zQuery); 5372 sqlite3_free(zInsert); 5373} 5374 5375 5376/* 5377** Try to transfer all rows of the schema that match zWhere. For 5378** each row, invoke xForEach() on the object defined by that row. 5379** If an error is encountered while moving forward through the 5380** sqlite_schema table, try again moving backwards. 5381*/ 5382static void tryToCloneSchema( 5383 ShellState *p, 5384 sqlite3 *newDb, 5385 const char *zWhere, 5386 void (*xForEach)(ShellState*,sqlite3*,const char*) 5387){ 5388 sqlite3_stmt *pQuery = 0; 5389 char *zQuery = 0; 5390 int rc; 5391 const unsigned char *zName; 5392 const unsigned char *zSql; 5393 char *zErrMsg = 0; 5394 5395 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5396 " WHERE %s", zWhere); 5397 shell_check_oom(zQuery); 5398 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5399 if( rc ){ 5400 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5401 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5402 zQuery); 5403 goto end_schema_xfer; 5404 } 5405 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5406 zName = sqlite3_column_text(pQuery, 0); 5407 zSql = sqlite3_column_text(pQuery, 1); 5408 printf("%s... ", zName); fflush(stdout); 5409 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5410 if( zErrMsg ){ 5411 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5412 sqlite3_free(zErrMsg); 5413 zErrMsg = 0; 5414 } 5415 if( xForEach ){ 5416 xForEach(p, newDb, (const char*)zName); 5417 } 5418 printf("done\n"); 5419 } 5420 if( rc!=SQLITE_DONE ){ 5421 sqlite3_finalize(pQuery); 5422 sqlite3_free(zQuery); 5423 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5424 " WHERE %s ORDER BY rowid DESC", zWhere); 5425 shell_check_oom(zQuery); 5426 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5427 if( rc ){ 5428 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5429 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5430 zQuery); 5431 goto end_schema_xfer; 5432 } 5433 while( sqlite3_step(pQuery)==SQLITE_ROW ){ 5434 zName = sqlite3_column_text(pQuery, 0); 5435 zSql = sqlite3_column_text(pQuery, 1); 5436 printf("%s... ", zName); fflush(stdout); 5437 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5438 if( zErrMsg ){ 5439 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5440 sqlite3_free(zErrMsg); 5441 zErrMsg = 0; 5442 } 5443 if( xForEach ){ 5444 xForEach(p, newDb, (const char*)zName); 5445 } 5446 printf("done\n"); 5447 } 5448 } 5449end_schema_xfer: 5450 sqlite3_finalize(pQuery); 5451 sqlite3_free(zQuery); 5452} 5453 5454/* 5455** Open a new database file named "zNewDb". Try to recover as much information 5456** as possible out of the main database (which might be corrupt) and write it 5457** into zNewDb. 5458*/ 5459static void tryToClone(ShellState *p, const char *zNewDb){ 5460 int rc; 5461 sqlite3 *newDb = 0; 5462 if( access(zNewDb,0)==0 ){ 5463 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 5464 return; 5465 } 5466 rc = sqlite3_open(zNewDb, &newDb); 5467 if( rc ){ 5468 utf8_printf(stderr, "Cannot create output database: %s\n", 5469 sqlite3_errmsg(newDb)); 5470 }else{ 5471 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 5472 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 5473 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 5474 tryToCloneSchema(p, newDb, "type!='table'", 0); 5475 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 5476 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 5477 } 5478 close_db(newDb); 5479} 5480 5481/* 5482** Change the output file back to stdout. 5483** 5484** If the p->doXdgOpen flag is set, that means the output was being 5485** redirected to a temporary file named by p->zTempFile. In that case, 5486** launch start/open/xdg-open on that temporary file. 5487*/ 5488static void output_reset(ShellState *p){ 5489 if( p->outfile[0]=='|' ){ 5490#ifndef SQLITE_OMIT_POPEN 5491 pclose(p->out); 5492#endif 5493 }else{ 5494 output_file_close(p->out); 5495#ifndef SQLITE_NOHAVE_SYSTEM 5496 if( p->doXdgOpen ){ 5497 const char *zXdgOpenCmd = 5498#if defined(_WIN32) 5499 "start"; 5500#elif defined(__APPLE__) 5501 "open"; 5502#else 5503 "xdg-open"; 5504#endif 5505 char *zCmd; 5506 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 5507 if( system(zCmd) ){ 5508 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 5509 }else{ 5510 /* Give the start/open/xdg-open command some time to get 5511 ** going before we continue, and potential delete the 5512 ** p->zTempFile data file out from under it */ 5513 sqlite3_sleep(2000); 5514 } 5515 sqlite3_free(zCmd); 5516 outputModePop(p); 5517 p->doXdgOpen = 0; 5518 } 5519#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 5520 } 5521 p->outfile[0] = 0; 5522 p->out = stdout; 5523} 5524 5525/* 5526** Run an SQL command and return the single integer result. 5527*/ 5528static int db_int(ShellState *p, const char *zSql){ 5529 sqlite3_stmt *pStmt; 5530 int res = 0; 5531 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 5532 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 5533 res = sqlite3_column_int(pStmt,0); 5534 } 5535 sqlite3_finalize(pStmt); 5536 return res; 5537} 5538 5539/* 5540** Convert a 2-byte or 4-byte big-endian integer into a native integer 5541*/ 5542static unsigned int get2byteInt(unsigned char *a){ 5543 return (a[0]<<8) + a[1]; 5544} 5545static unsigned int get4byteInt(unsigned char *a){ 5546 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 5547} 5548 5549/* 5550** Implementation of the ".dbinfo" command. 5551** 5552** Return 1 on error, 2 to exit, and 0 otherwise. 5553*/ 5554static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 5555 static const struct { const char *zName; int ofst; } aField[] = { 5556 { "file change counter:", 24 }, 5557 { "database page count:", 28 }, 5558 { "freelist page count:", 36 }, 5559 { "schema cookie:", 40 }, 5560 { "schema format:", 44 }, 5561 { "default cache size:", 48 }, 5562 { "autovacuum top root:", 52 }, 5563 { "incremental vacuum:", 64 }, 5564 { "text encoding:", 56 }, 5565 { "user version:", 60 }, 5566 { "application id:", 68 }, 5567 { "software version:", 96 }, 5568 }; 5569 static const struct { const char *zName; const char *zSql; } aQuery[] = { 5570 { "number of tables:", 5571 "SELECT count(*) FROM %s WHERE type='table'" }, 5572 { "number of indexes:", 5573 "SELECT count(*) FROM %s WHERE type='index'" }, 5574 { "number of triggers:", 5575 "SELECT count(*) FROM %s WHERE type='trigger'" }, 5576 { "number of views:", 5577 "SELECT count(*) FROM %s WHERE type='view'" }, 5578 { "schema size:", 5579 "SELECT total(length(sql)) FROM %s" }, 5580 }; 5581 int i, rc; 5582 unsigned iDataVersion; 5583 char *zSchemaTab; 5584 char *zDb = nArg>=2 ? azArg[1] : "main"; 5585 sqlite3_stmt *pStmt = 0; 5586 unsigned char aHdr[100]; 5587 open_db(p, 0); 5588 if( p->db==0 ) return 1; 5589 rc = sqlite3_prepare_v2(p->db, 5590 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 5591 -1, &pStmt, 0); 5592 if( rc ){ 5593 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 5594 sqlite3_finalize(pStmt); 5595 return 1; 5596 } 5597 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 5598 if( sqlite3_step(pStmt)==SQLITE_ROW 5599 && sqlite3_column_bytes(pStmt,0)>100 5600 ){ 5601 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 5602 sqlite3_finalize(pStmt); 5603 }else{ 5604 raw_printf(stderr, "unable to read database header\n"); 5605 sqlite3_finalize(pStmt); 5606 return 1; 5607 } 5608 i = get2byteInt(aHdr+16); 5609 if( i==1 ) i = 65536; 5610 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 5611 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 5612 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 5613 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 5614 for(i=0; i<ArraySize(aField); i++){ 5615 int ofst = aField[i].ofst; 5616 unsigned int val = get4byteInt(aHdr + ofst); 5617 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 5618 switch( ofst ){ 5619 case 56: { 5620 if( val==1 ) raw_printf(p->out, " (utf8)"); 5621 if( val==2 ) raw_printf(p->out, " (utf16le)"); 5622 if( val==3 ) raw_printf(p->out, " (utf16be)"); 5623 } 5624 } 5625 raw_printf(p->out, "\n"); 5626 } 5627 if( zDb==0 ){ 5628 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 5629 }else if( strcmp(zDb,"temp")==0 ){ 5630 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 5631 }else{ 5632 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 5633 } 5634 for(i=0; i<ArraySize(aQuery); i++){ 5635 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 5636 int val = db_int(p, zSql); 5637 sqlite3_free(zSql); 5638 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 5639 } 5640 sqlite3_free(zSchemaTab); 5641 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 5642 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 5643 return 0; 5644} 5645 5646/* 5647** Print the current sqlite3_errmsg() value to stderr and return 1. 5648*/ 5649static int shellDatabaseError(sqlite3 *db){ 5650 const char *zErr = sqlite3_errmsg(db); 5651 utf8_printf(stderr, "Error: %s\n", zErr); 5652 return 1; 5653} 5654 5655/* 5656** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 5657** if they match and FALSE (0) if they do not match. 5658** 5659** Globbing rules: 5660** 5661** '*' Matches any sequence of zero or more characters. 5662** 5663** '?' Matches exactly one character. 5664** 5665** [...] Matches one character from the enclosed list of 5666** characters. 5667** 5668** [^...] Matches one character not in the enclosed list. 5669** 5670** '#' Matches any sequence of one or more digits with an 5671** optional + or - sign in front 5672** 5673** ' ' Any span of whitespace matches any other span of 5674** whitespace. 5675** 5676** Extra whitespace at the end of z[] is ignored. 5677*/ 5678static int testcase_glob(const char *zGlob, const char *z){ 5679 int c, c2; 5680 int invert; 5681 int seen; 5682 5683 while( (c = (*(zGlob++)))!=0 ){ 5684 if( IsSpace(c) ){ 5685 if( !IsSpace(*z) ) return 0; 5686 while( IsSpace(*zGlob) ) zGlob++; 5687 while( IsSpace(*z) ) z++; 5688 }else if( c=='*' ){ 5689 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 5690 if( c=='?' && (*(z++))==0 ) return 0; 5691 } 5692 if( c==0 ){ 5693 return 1; 5694 }else if( c=='[' ){ 5695 while( *z && testcase_glob(zGlob-1,z)==0 ){ 5696 z++; 5697 } 5698 return (*z)!=0; 5699 } 5700 while( (c2 = (*(z++)))!=0 ){ 5701 while( c2!=c ){ 5702 c2 = *(z++); 5703 if( c2==0 ) return 0; 5704 } 5705 if( testcase_glob(zGlob,z) ) return 1; 5706 } 5707 return 0; 5708 }else if( c=='?' ){ 5709 if( (*(z++))==0 ) return 0; 5710 }else if( c=='[' ){ 5711 int prior_c = 0; 5712 seen = 0; 5713 invert = 0; 5714 c = *(z++); 5715 if( c==0 ) return 0; 5716 c2 = *(zGlob++); 5717 if( c2=='^' ){ 5718 invert = 1; 5719 c2 = *(zGlob++); 5720 } 5721 if( c2==']' ){ 5722 if( c==']' ) seen = 1; 5723 c2 = *(zGlob++); 5724 } 5725 while( c2 && c2!=']' ){ 5726 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 5727 c2 = *(zGlob++); 5728 if( c>=prior_c && c<=c2 ) seen = 1; 5729 prior_c = 0; 5730 }else{ 5731 if( c==c2 ){ 5732 seen = 1; 5733 } 5734 prior_c = c2; 5735 } 5736 c2 = *(zGlob++); 5737 } 5738 if( c2==0 || (seen ^ invert)==0 ) return 0; 5739 }else if( c=='#' ){ 5740 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 5741 if( !IsDigit(z[0]) ) return 0; 5742 z++; 5743 while( IsDigit(z[0]) ){ z++; } 5744 }else{ 5745 if( c!=(*(z++)) ) return 0; 5746 } 5747 } 5748 while( IsSpace(*z) ){ z++; } 5749 return *z==0; 5750} 5751 5752 5753/* 5754** Compare the string as a command-line option with either one or two 5755** initial "-" characters. 5756*/ 5757static int optionMatch(const char *zStr, const char *zOpt){ 5758 if( zStr[0]!='-' ) return 0; 5759 zStr++; 5760 if( zStr[0]=='-' ) zStr++; 5761 return strcmp(zStr, zOpt)==0; 5762} 5763 5764/* 5765** Delete a file. 5766*/ 5767int shellDeleteFile(const char *zFilename){ 5768 int rc; 5769#ifdef _WIN32 5770 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 5771 rc = _wunlink(z); 5772 sqlite3_free(z); 5773#else 5774 rc = unlink(zFilename); 5775#endif 5776 return rc; 5777} 5778 5779/* 5780** Try to delete the temporary file (if there is one) and free the 5781** memory used to hold the name of the temp file. 5782*/ 5783static void clearTempFile(ShellState *p){ 5784 if( p->zTempFile==0 ) return; 5785 if( p->doXdgOpen ) return; 5786 if( shellDeleteFile(p->zTempFile) ) return; 5787 sqlite3_free(p->zTempFile); 5788 p->zTempFile = 0; 5789} 5790 5791/* 5792** Create a new temp file name with the given suffix. 5793*/ 5794static void newTempFile(ShellState *p, const char *zSuffix){ 5795 clearTempFile(p); 5796 sqlite3_free(p->zTempFile); 5797 p->zTempFile = 0; 5798 if( p->db ){ 5799 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 5800 } 5801 if( p->zTempFile==0 ){ 5802 /* If p->db is an in-memory database then the TEMPFILENAME file-control 5803 ** will not work and we will need to fallback to guessing */ 5804 char *zTemp; 5805 sqlite3_uint64 r; 5806 sqlite3_randomness(sizeof(r), &r); 5807 zTemp = getenv("TEMP"); 5808 if( zTemp==0 ) zTemp = getenv("TMP"); 5809 if( zTemp==0 ){ 5810#ifdef _WIN32 5811 zTemp = "\\tmp"; 5812#else 5813 zTemp = "/tmp"; 5814#endif 5815 } 5816 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 5817 }else{ 5818 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 5819 } 5820 shell_check_oom(p->zTempFile); 5821} 5822 5823 5824/* 5825** The implementation of SQL scalar function fkey_collate_clause(), used 5826** by the ".lint fkey-indexes" command. This scalar function is always 5827** called with four arguments - the parent table name, the parent column name, 5828** the child table name and the child column name. 5829** 5830** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 5831** 5832** If either of the named tables or columns do not exist, this function 5833** returns an empty string. An empty string is also returned if both tables 5834** and columns exist but have the same default collation sequence. Or, 5835** if both exist but the default collation sequences are different, this 5836** function returns the string " COLLATE <parent-collation>", where 5837** <parent-collation> is the default collation sequence of the parent column. 5838*/ 5839static void shellFkeyCollateClause( 5840 sqlite3_context *pCtx, 5841 int nVal, 5842 sqlite3_value **apVal 5843){ 5844 sqlite3 *db = sqlite3_context_db_handle(pCtx); 5845 const char *zParent; 5846 const char *zParentCol; 5847 const char *zParentSeq; 5848 const char *zChild; 5849 const char *zChildCol; 5850 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 5851 int rc; 5852 5853 assert( nVal==4 ); 5854 zParent = (const char*)sqlite3_value_text(apVal[0]); 5855 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 5856 zChild = (const char*)sqlite3_value_text(apVal[2]); 5857 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 5858 5859 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 5860 rc = sqlite3_table_column_metadata( 5861 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 5862 ); 5863 if( rc==SQLITE_OK ){ 5864 rc = sqlite3_table_column_metadata( 5865 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 5866 ); 5867 } 5868 5869 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 5870 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 5871 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 5872 sqlite3_free(z); 5873 } 5874} 5875 5876 5877/* 5878** The implementation of dot-command ".lint fkey-indexes". 5879*/ 5880static int lintFkeyIndexes( 5881 ShellState *pState, /* Current shell tool state */ 5882 char **azArg, /* Array of arguments passed to dot command */ 5883 int nArg /* Number of entries in azArg[] */ 5884){ 5885 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 5886 FILE *out = pState->out; /* Stream to write non-error output to */ 5887 int bVerbose = 0; /* If -verbose is present */ 5888 int bGroupByParent = 0; /* If -groupbyparent is present */ 5889 int i; /* To iterate through azArg[] */ 5890 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 5891 int rc; /* Return code */ 5892 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 5893 5894 /* 5895 ** This SELECT statement returns one row for each foreign key constraint 5896 ** in the schema of the main database. The column values are: 5897 ** 5898 ** 0. The text of an SQL statement similar to: 5899 ** 5900 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 5901 ** 5902 ** This SELECT is similar to the one that the foreign keys implementation 5903 ** needs to run internally on child tables. If there is an index that can 5904 ** be used to optimize this query, then it can also be used by the FK 5905 ** implementation to optimize DELETE or UPDATE statements on the parent 5906 ** table. 5907 ** 5908 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 5909 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 5910 ** contains an index that can be used to optimize the query. 5911 ** 5912 ** 2. Human readable text that describes the child table and columns. e.g. 5913 ** 5914 ** "child_table(child_key1, child_key2)" 5915 ** 5916 ** 3. Human readable text that describes the parent table and columns. e.g. 5917 ** 5918 ** "parent_table(parent_key1, parent_key2)" 5919 ** 5920 ** 4. A full CREATE INDEX statement for an index that could be used to 5921 ** optimize DELETE or UPDATE statements on the parent table. e.g. 5922 ** 5923 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 5924 ** 5925 ** 5. The name of the parent table. 5926 ** 5927 ** These six values are used by the C logic below to generate the report. 5928 */ 5929 const char *zSql = 5930 "SELECT " 5931 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 5932 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 5933 " || fkey_collate_clause(" 5934 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 5935 ", " 5936 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('" 5937 " || group_concat('*=?', ' AND ') || ')'" 5938 ", " 5939 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 5940 ", " 5941 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 5942 ", " 5943 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 5944 " || ' ON ' || quote(s.name) || '('" 5945 " || group_concat(quote(f.[from]) ||" 5946 " fkey_collate_clause(" 5947 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 5948 " || ');'" 5949 ", " 5950 " f.[table] " 5951 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 5952 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 5953 "GROUP BY s.name, f.id " 5954 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 5955 ; 5956 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)"; 5957 5958 for(i=2; i<nArg; i++){ 5959 int n = strlen30(azArg[i]); 5960 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 5961 bVerbose = 1; 5962 } 5963 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 5964 bGroupByParent = 1; 5965 zIndent = " "; 5966 } 5967 else{ 5968 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 5969 azArg[0], azArg[1] 5970 ); 5971 return SQLITE_ERROR; 5972 } 5973 } 5974 5975 /* Register the fkey_collate_clause() SQL function */ 5976 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 5977 0, shellFkeyCollateClause, 0, 0 5978 ); 5979 5980 5981 if( rc==SQLITE_OK ){ 5982 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 5983 } 5984 if( rc==SQLITE_OK ){ 5985 sqlite3_bind_int(pSql, 1, bGroupByParent); 5986 } 5987 5988 if( rc==SQLITE_OK ){ 5989 int rc2; 5990 char *zPrev = 0; 5991 while( SQLITE_ROW==sqlite3_step(pSql) ){ 5992 int res = -1; 5993 sqlite3_stmt *pExplain = 0; 5994 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 5995 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 5996 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 5997 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 5998 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 5999 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 6000 6001 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 6002 if( rc!=SQLITE_OK ) break; 6003 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 6004 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 6005 res = ( 6006 0==sqlite3_strglob(zGlob, zPlan) 6007 || 0==sqlite3_strglob(zGlobIPK, zPlan) 6008 ); 6009 } 6010 rc = sqlite3_finalize(pExplain); 6011 if( rc!=SQLITE_OK ) break; 6012 6013 if( res<0 ){ 6014 raw_printf(stderr, "Error: internal error"); 6015 break; 6016 }else{ 6017 if( bGroupByParent 6018 && (bVerbose || res==0) 6019 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 6020 ){ 6021 raw_printf(out, "-- Parent table %s\n", zParent); 6022 sqlite3_free(zPrev); 6023 zPrev = sqlite3_mprintf("%s", zParent); 6024 } 6025 6026 if( res==0 ){ 6027 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 6028 }else if( bVerbose ){ 6029 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 6030 zIndent, zFrom, zTarget 6031 ); 6032 } 6033 } 6034 } 6035 sqlite3_free(zPrev); 6036 6037 if( rc!=SQLITE_OK ){ 6038 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6039 } 6040 6041 rc2 = sqlite3_finalize(pSql); 6042 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 6043 rc = rc2; 6044 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6045 } 6046 }else{ 6047 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6048 } 6049 6050 return rc; 6051} 6052 6053/* 6054** Implementation of ".lint" dot command. 6055*/ 6056static int lintDotCommand( 6057 ShellState *pState, /* Current shell tool state */ 6058 char **azArg, /* Array of arguments passed to dot command */ 6059 int nArg /* Number of entries in azArg[] */ 6060){ 6061 int n; 6062 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 6063 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 6064 return lintFkeyIndexes(pState, azArg, nArg); 6065 6066 usage: 6067 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 6068 raw_printf(stderr, "Where sub-commands are:\n"); 6069 raw_printf(stderr, " fkey-indexes\n"); 6070 return SQLITE_ERROR; 6071} 6072 6073#if !defined SQLITE_OMIT_VIRTUALTABLE 6074static void shellPrepare( 6075 sqlite3 *db, 6076 int *pRc, 6077 const char *zSql, 6078 sqlite3_stmt **ppStmt 6079){ 6080 *ppStmt = 0; 6081 if( *pRc==SQLITE_OK ){ 6082 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 6083 if( rc!=SQLITE_OK ){ 6084 raw_printf(stderr, "sql error: %s (%d)\n", 6085 sqlite3_errmsg(db), sqlite3_errcode(db) 6086 ); 6087 *pRc = rc; 6088 } 6089 } 6090} 6091 6092/* 6093** Create a prepared statement using printf-style arguments for the SQL. 6094** 6095** This routine is could be marked "static". But it is not always used, 6096** depending on compile-time options. By omitting the "static", we avoid 6097** nuisance compiler warnings about "defined but not used". 6098*/ 6099void shellPreparePrintf( 6100 sqlite3 *db, 6101 int *pRc, 6102 sqlite3_stmt **ppStmt, 6103 const char *zFmt, 6104 ... 6105){ 6106 *ppStmt = 0; 6107 if( *pRc==SQLITE_OK ){ 6108 va_list ap; 6109 char *z; 6110 va_start(ap, zFmt); 6111 z = sqlite3_vmprintf(zFmt, ap); 6112 va_end(ap); 6113 if( z==0 ){ 6114 *pRc = SQLITE_NOMEM; 6115 }else{ 6116 shellPrepare(db, pRc, z, ppStmt); 6117 sqlite3_free(z); 6118 } 6119 } 6120} 6121 6122/* Finalize the prepared statement created using shellPreparePrintf(). 6123** 6124** This routine is could be marked "static". But it is not always used, 6125** depending on compile-time options. By omitting the "static", we avoid 6126** nuisance compiler warnings about "defined but not used". 6127*/ 6128void shellFinalize( 6129 int *pRc, 6130 sqlite3_stmt *pStmt 6131){ 6132 if( pStmt ){ 6133 sqlite3 *db = sqlite3_db_handle(pStmt); 6134 int rc = sqlite3_finalize(pStmt); 6135 if( *pRc==SQLITE_OK ){ 6136 if( rc!=SQLITE_OK ){ 6137 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6138 } 6139 *pRc = rc; 6140 } 6141 } 6142} 6143 6144/* Reset the prepared statement created using shellPreparePrintf(). 6145** 6146** This routine is could be marked "static". But it is not always used, 6147** depending on compile-time options. By omitting the "static", we avoid 6148** nuisance compiler warnings about "defined but not used". 6149*/ 6150void shellReset( 6151 int *pRc, 6152 sqlite3_stmt *pStmt 6153){ 6154 int rc = sqlite3_reset(pStmt); 6155 if( *pRc==SQLITE_OK ){ 6156 if( rc!=SQLITE_OK ){ 6157 sqlite3 *db = sqlite3_db_handle(pStmt); 6158 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6159 } 6160 *pRc = rc; 6161 } 6162} 6163#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 6164 6165#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 6166/****************************************************************************** 6167** The ".archive" or ".ar" command. 6168*/ 6169/* 6170** Structure representing a single ".ar" command. 6171*/ 6172typedef struct ArCommand ArCommand; 6173struct ArCommand { 6174 u8 eCmd; /* An AR_CMD_* value */ 6175 u8 bVerbose; /* True if --verbose */ 6176 u8 bZip; /* True if the archive is a ZIP */ 6177 u8 bDryRun; /* True if --dry-run */ 6178 u8 bAppend; /* True if --append */ 6179 u8 bGlob; /* True if --glob */ 6180 u8 fromCmdLine; /* Run from -A instead of .archive */ 6181 int nArg; /* Number of command arguments */ 6182 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 6183 const char *zFile; /* --file argument, or NULL */ 6184 const char *zDir; /* --directory argument, or NULL */ 6185 char **azArg; /* Array of command arguments */ 6186 ShellState *p; /* Shell state */ 6187 sqlite3 *db; /* Database containing the archive */ 6188}; 6189 6190/* 6191** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 6192*/ 6193static int arUsage(FILE *f){ 6194 showHelp(f,"archive"); 6195 return SQLITE_ERROR; 6196} 6197 6198/* 6199** Print an error message for the .ar command to stderr and return 6200** SQLITE_ERROR. 6201*/ 6202static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 6203 va_list ap; 6204 char *z; 6205 va_start(ap, zFmt); 6206 z = sqlite3_vmprintf(zFmt, ap); 6207 va_end(ap); 6208 utf8_printf(stderr, "Error: %s\n", z); 6209 if( pAr->fromCmdLine ){ 6210 utf8_printf(stderr, "Use \"-A\" for more help\n"); 6211 }else{ 6212 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 6213 } 6214 sqlite3_free(z); 6215 return SQLITE_ERROR; 6216} 6217 6218/* 6219** Values for ArCommand.eCmd. 6220*/ 6221#define AR_CMD_CREATE 1 6222#define AR_CMD_UPDATE 2 6223#define AR_CMD_INSERT 3 6224#define AR_CMD_EXTRACT 4 6225#define AR_CMD_LIST 5 6226#define AR_CMD_HELP 6 6227#define AR_CMD_REMOVE 7 6228 6229/* 6230** Other (non-command) switches. 6231*/ 6232#define AR_SWITCH_VERBOSE 8 6233#define AR_SWITCH_FILE 9 6234#define AR_SWITCH_DIRECTORY 10 6235#define AR_SWITCH_APPEND 11 6236#define AR_SWITCH_DRYRUN 12 6237#define AR_SWITCH_GLOB 13 6238 6239static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 6240 switch( eSwitch ){ 6241 case AR_CMD_CREATE: 6242 case AR_CMD_EXTRACT: 6243 case AR_CMD_LIST: 6244 case AR_CMD_REMOVE: 6245 case AR_CMD_UPDATE: 6246 case AR_CMD_INSERT: 6247 case AR_CMD_HELP: 6248 if( pAr->eCmd ){ 6249 return arErrorMsg(pAr, "multiple command options"); 6250 } 6251 pAr->eCmd = eSwitch; 6252 break; 6253 6254 case AR_SWITCH_DRYRUN: 6255 pAr->bDryRun = 1; 6256 break; 6257 case AR_SWITCH_GLOB: 6258 pAr->bGlob = 1; 6259 break; 6260 case AR_SWITCH_VERBOSE: 6261 pAr->bVerbose = 1; 6262 break; 6263 case AR_SWITCH_APPEND: 6264 pAr->bAppend = 1; 6265 /* Fall thru into --file */ 6266 case AR_SWITCH_FILE: 6267 pAr->zFile = zArg; 6268 break; 6269 case AR_SWITCH_DIRECTORY: 6270 pAr->zDir = zArg; 6271 break; 6272 } 6273 6274 return SQLITE_OK; 6275} 6276 6277/* 6278** Parse the command line for an ".ar" command. The results are written into 6279** structure (*pAr). SQLITE_OK is returned if the command line is parsed 6280** successfully, otherwise an error message is written to stderr and 6281** SQLITE_ERROR returned. 6282*/ 6283static int arParseCommand( 6284 char **azArg, /* Array of arguments passed to dot command */ 6285 int nArg, /* Number of entries in azArg[] */ 6286 ArCommand *pAr /* Populate this object */ 6287){ 6288 struct ArSwitch { 6289 const char *zLong; 6290 char cShort; 6291 u8 eSwitch; 6292 u8 bArg; 6293 } aSwitch[] = { 6294 { "create", 'c', AR_CMD_CREATE, 0 }, 6295 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 6296 { "insert", 'i', AR_CMD_INSERT, 0 }, 6297 { "list", 't', AR_CMD_LIST, 0 }, 6298 { "remove", 'r', AR_CMD_REMOVE, 0 }, 6299 { "update", 'u', AR_CMD_UPDATE, 0 }, 6300 { "help", 'h', AR_CMD_HELP, 0 }, 6301 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 6302 { "file", 'f', AR_SWITCH_FILE, 1 }, 6303 { "append", 'a', AR_SWITCH_APPEND, 1 }, 6304 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 6305 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 6306 { "glob", 'g', AR_SWITCH_GLOB, 0 }, 6307 }; 6308 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 6309 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 6310 6311 if( nArg<=1 ){ 6312 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 6313 return arUsage(stderr); 6314 }else{ 6315 char *z = azArg[1]; 6316 if( z[0]!='-' ){ 6317 /* Traditional style [tar] invocation */ 6318 int i; 6319 int iArg = 2; 6320 for(i=0; z[i]; i++){ 6321 const char *zArg = 0; 6322 struct ArSwitch *pOpt; 6323 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6324 if( z[i]==pOpt->cShort ) break; 6325 } 6326 if( pOpt==pEnd ){ 6327 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6328 } 6329 if( pOpt->bArg ){ 6330 if( iArg>=nArg ){ 6331 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 6332 } 6333 zArg = azArg[iArg++]; 6334 } 6335 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6336 } 6337 pAr->nArg = nArg-iArg; 6338 if( pAr->nArg>0 ){ 6339 pAr->azArg = &azArg[iArg]; 6340 } 6341 }else{ 6342 /* Non-traditional invocation */ 6343 int iArg; 6344 for(iArg=1; iArg<nArg; iArg++){ 6345 int n; 6346 z = azArg[iArg]; 6347 if( z[0]!='-' ){ 6348 /* All remaining command line words are command arguments. */ 6349 pAr->azArg = &azArg[iArg]; 6350 pAr->nArg = nArg-iArg; 6351 break; 6352 } 6353 n = strlen30(z); 6354 6355 if( z[1]!='-' ){ 6356 int i; 6357 /* One or more short options */ 6358 for(i=1; i<n; i++){ 6359 const char *zArg = 0; 6360 struct ArSwitch *pOpt; 6361 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6362 if( z[i]==pOpt->cShort ) break; 6363 } 6364 if( pOpt==pEnd ){ 6365 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6366 } 6367 if( pOpt->bArg ){ 6368 if( i<(n-1) ){ 6369 zArg = &z[i+1]; 6370 i = n; 6371 }else{ 6372 if( iArg>=(nArg-1) ){ 6373 return arErrorMsg(pAr, "option requires an argument: %c", 6374 z[i]); 6375 } 6376 zArg = azArg[++iArg]; 6377 } 6378 } 6379 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6380 } 6381 }else if( z[2]=='\0' ){ 6382 /* A -- option, indicating that all remaining command line words 6383 ** are command arguments. */ 6384 pAr->azArg = &azArg[iArg+1]; 6385 pAr->nArg = nArg-iArg-1; 6386 break; 6387 }else{ 6388 /* A long option */ 6389 const char *zArg = 0; /* Argument for option, if any */ 6390 struct ArSwitch *pMatch = 0; /* Matching option */ 6391 struct ArSwitch *pOpt; /* Iterator */ 6392 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6393 const char *zLong = pOpt->zLong; 6394 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 6395 if( pMatch ){ 6396 return arErrorMsg(pAr, "ambiguous option: %s",z); 6397 }else{ 6398 pMatch = pOpt; 6399 } 6400 } 6401 } 6402 6403 if( pMatch==0 ){ 6404 return arErrorMsg(pAr, "unrecognized option: %s", z); 6405 } 6406 if( pMatch->bArg ){ 6407 if( iArg>=(nArg-1) ){ 6408 return arErrorMsg(pAr, "option requires an argument: %s", z); 6409 } 6410 zArg = azArg[++iArg]; 6411 } 6412 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 6413 } 6414 } 6415 } 6416 } 6417 6418 return SQLITE_OK; 6419} 6420 6421/* 6422** This function assumes that all arguments within the ArCommand.azArg[] 6423** array refer to archive members, as for the --extract, --list or --remove 6424** commands. It checks that each of them are "present". If any specified 6425** file is not present in the archive, an error is printed to stderr and an 6426** error code returned. Otherwise, if all specified arguments are present 6427** in the archive, SQLITE_OK is returned. Here, "present" means either an 6428** exact equality when pAr->bGlob is false or a "name GLOB pattern" match 6429** when pAr->bGlob is true. 6430** 6431** This function strips any trailing '/' characters from each argument. 6432** This is consistent with the way the [tar] command seems to work on 6433** Linux. 6434*/ 6435static int arCheckEntries(ArCommand *pAr){ 6436 int rc = SQLITE_OK; 6437 if( pAr->nArg ){ 6438 int i, j; 6439 sqlite3_stmt *pTest = 0; 6440 const char *zSel = (pAr->bGlob) 6441 ? "SELECT name FROM %s WHERE glob($name,name)" 6442 : "SELECT name FROM %s WHERE name=$name"; 6443 6444 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); 6445 j = sqlite3_bind_parameter_index(pTest, "$name"); 6446 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 6447 char *z = pAr->azArg[i]; 6448 int n = strlen30(z); 6449 int bOk = 0; 6450 while( n>0 && z[n-1]=='/' ) n--; 6451 z[n] = '\0'; 6452 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 6453 if( SQLITE_ROW==sqlite3_step(pTest) ){ 6454 bOk = 1; 6455 } 6456 shellReset(&rc, pTest); 6457 if( rc==SQLITE_OK && bOk==0 ){ 6458 utf8_printf(stderr, "not found in archive: %s\n", z); 6459 rc = SQLITE_ERROR; 6460 } 6461 } 6462 shellFinalize(&rc, pTest); 6463 } 6464 return rc; 6465} 6466 6467/* 6468** Format a WHERE clause that can be used against the "sqlar" table to 6469** identify all archive members that match the command arguments held 6470** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 6471** The caller is responsible for eventually calling sqlite3_free() on 6472** any non-NULL (*pzWhere) value. Here, "match" means strict equality 6473** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. 6474*/ 6475static void arWhereClause( 6476 int *pRc, 6477 ArCommand *pAr, 6478 char **pzWhere /* OUT: New WHERE clause */ 6479){ 6480 char *zWhere = 0; 6481 const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; 6482 if( *pRc==SQLITE_OK ){ 6483 if( pAr->nArg==0 ){ 6484 zWhere = sqlite3_mprintf("1"); 6485 }else{ 6486 int i; 6487 const char *zSep = ""; 6488 for(i=0; i<pAr->nArg; i++){ 6489 const char *z = pAr->azArg[i]; 6490 zWhere = sqlite3_mprintf( 6491 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", 6492 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z 6493 ); 6494 if( zWhere==0 ){ 6495 *pRc = SQLITE_NOMEM; 6496 break; 6497 } 6498 zSep = " OR "; 6499 } 6500 } 6501 } 6502 *pzWhere = zWhere; 6503} 6504 6505/* 6506** Implementation of .ar "lisT" command. 6507*/ 6508static int arListCommand(ArCommand *pAr){ 6509 const char *zSql = "SELECT %s FROM %s WHERE %s"; 6510 const char *azCols[] = { 6511 "name", 6512 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 6513 }; 6514 6515 char *zWhere = 0; 6516 sqlite3_stmt *pSql = 0; 6517 int rc; 6518 6519 rc = arCheckEntries(pAr); 6520 arWhereClause(&rc, pAr, &zWhere); 6521 6522 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 6523 pAr->zSrcTable, zWhere); 6524 if( pAr->bDryRun ){ 6525 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6526 }else{ 6527 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6528 if( pAr->bVerbose ){ 6529 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 6530 sqlite3_column_text(pSql, 0), 6531 sqlite3_column_int(pSql, 1), 6532 sqlite3_column_text(pSql, 2), 6533 sqlite3_column_text(pSql, 3) 6534 ); 6535 }else{ 6536 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6537 } 6538 } 6539 } 6540 shellFinalize(&rc, pSql); 6541 sqlite3_free(zWhere); 6542 return rc; 6543} 6544 6545 6546/* 6547** Implementation of .ar "Remove" command. 6548*/ 6549static int arRemoveCommand(ArCommand *pAr){ 6550 int rc = 0; 6551 char *zSql = 0; 6552 char *zWhere = 0; 6553 6554 if( pAr->nArg ){ 6555 /* Verify that args actually exist within the archive before proceeding. 6556 ** And formulate a WHERE clause to match them. */ 6557 rc = arCheckEntries(pAr); 6558 arWhereClause(&rc, pAr, &zWhere); 6559 } 6560 if( rc==SQLITE_OK ){ 6561 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", 6562 pAr->zSrcTable, zWhere); 6563 if( pAr->bDryRun ){ 6564 utf8_printf(pAr->p->out, "%s\n", zSql); 6565 }else{ 6566 char *zErr = 0; 6567 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); 6568 if( rc==SQLITE_OK ){ 6569 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6570 if( rc!=SQLITE_OK ){ 6571 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 6572 }else{ 6573 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); 6574 } 6575 } 6576 if( zErr ){ 6577 utf8_printf(stdout, "ERROR: %s\n", zErr); 6578 sqlite3_free(zErr); 6579 } 6580 } 6581 } 6582 sqlite3_free(zWhere); 6583 sqlite3_free(zSql); 6584 return rc; 6585} 6586 6587/* 6588** Implementation of .ar "eXtract" command. 6589*/ 6590static int arExtractCommand(ArCommand *pAr){ 6591 const char *zSql1 = 6592 "SELECT " 6593 " ($dir || name)," 6594 " writefile(($dir || name), %s, mode, mtime) " 6595 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 6596 " AND name NOT GLOB '*..[/\\]*'"; 6597 6598 const char *azExtraArg[] = { 6599 "sqlar_uncompress(data, sz)", 6600 "data" 6601 }; 6602 6603 sqlite3_stmt *pSql = 0; 6604 int rc = SQLITE_OK; 6605 char *zDir = 0; 6606 char *zWhere = 0; 6607 int i, j; 6608 6609 /* If arguments are specified, check that they actually exist within 6610 ** the archive before proceeding. And formulate a WHERE clause to 6611 ** match them. */ 6612 rc = arCheckEntries(pAr); 6613 arWhereClause(&rc, pAr, &zWhere); 6614 6615 if( rc==SQLITE_OK ){ 6616 if( pAr->zDir ){ 6617 zDir = sqlite3_mprintf("%s/", pAr->zDir); 6618 }else{ 6619 zDir = sqlite3_mprintf(""); 6620 } 6621 if( zDir==0 ) rc = SQLITE_NOMEM; 6622 } 6623 6624 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 6625 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 6626 ); 6627 6628 if( rc==SQLITE_OK ){ 6629 j = sqlite3_bind_parameter_index(pSql, "$dir"); 6630 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 6631 6632 /* Run the SELECT statement twice. The first time, writefile() is called 6633 ** for all archive members that should be extracted. The second time, 6634 ** only for the directories. This is because the timestamps for 6635 ** extracted directories must be reset after they are populated (as 6636 ** populating them changes the timestamp). */ 6637 for(i=0; i<2; i++){ 6638 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 6639 sqlite3_bind_int(pSql, j, i); 6640 if( pAr->bDryRun ){ 6641 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6642 }else{ 6643 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6644 if( i==0 && pAr->bVerbose ){ 6645 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6646 } 6647 } 6648 } 6649 shellReset(&rc, pSql); 6650 } 6651 shellFinalize(&rc, pSql); 6652 } 6653 6654 sqlite3_free(zDir); 6655 sqlite3_free(zWhere); 6656 return rc; 6657} 6658 6659/* 6660** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 6661*/ 6662static int arExecSql(ArCommand *pAr, const char *zSql){ 6663 int rc; 6664 if( pAr->bDryRun ){ 6665 utf8_printf(pAr->p->out, "%s\n", zSql); 6666 rc = SQLITE_OK; 6667 }else{ 6668 char *zErr = 0; 6669 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6670 if( zErr ){ 6671 utf8_printf(stdout, "ERROR: %s\n", zErr); 6672 sqlite3_free(zErr); 6673 } 6674 } 6675 return rc; 6676} 6677 6678 6679/* 6680** Implementation of .ar "create", "insert", and "update" commands. 6681** 6682** create -> Create a new SQL archive 6683** insert -> Insert or reinsert all files listed 6684** update -> Insert files that have changed or that were not 6685** previously in the archive 6686** 6687** Create the "sqlar" table in the database if it does not already exist. 6688** Then add each file in the azFile[] array to the archive. Directories 6689** are added recursively. If argument bVerbose is non-zero, a message is 6690** printed on stdout for each file archived. 6691** 6692** The create command is the same as update, except that it drops 6693** any existing "sqlar" table before beginning. The "insert" command 6694** always overwrites every file named on the command-line, where as 6695** "update" only overwrites if the size or mtime or mode has changed. 6696*/ 6697static int arCreateOrUpdateCommand( 6698 ArCommand *pAr, /* Command arguments and options */ 6699 int bUpdate, /* true for a --create. */ 6700 int bOnlyIfChanged /* Only update if file has changed */ 6701){ 6702 const char *zCreate = 6703 "CREATE TABLE IF NOT EXISTS sqlar(\n" 6704 " name TEXT PRIMARY KEY, -- name of the file\n" 6705 " mode INT, -- access permissions\n" 6706 " mtime INT, -- last modification time\n" 6707 " sz INT, -- original file size\n" 6708 " data BLOB -- compressed content\n" 6709 ")"; 6710 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 6711 const char *zInsertFmt[2] = { 6712 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 6713 " SELECT\n" 6714 " %s,\n" 6715 " mode,\n" 6716 " mtime,\n" 6717 " CASE substr(lsmode(mode),1,1)\n" 6718 " WHEN '-' THEN length(data)\n" 6719 " WHEN 'd' THEN 0\n" 6720 " ELSE -1 END,\n" 6721 " sqlar_compress(data)\n" 6722 " FROM fsdir(%Q,%Q) AS disk\n" 6723 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6724 , 6725 "REPLACE INTO %s(name,mode,mtime,data)\n" 6726 " SELECT\n" 6727 " %s,\n" 6728 " mode,\n" 6729 " mtime,\n" 6730 " data\n" 6731 " FROM fsdir(%Q,%Q) AS disk\n" 6732 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6733 }; 6734 int i; /* For iterating through azFile[] */ 6735 int rc; /* Return code */ 6736 const char *zTab = 0; /* SQL table into which to insert */ 6737 char *zSql; 6738 char zTemp[50]; 6739 char *zExists = 0; 6740 6741 arExecSql(pAr, "PRAGMA page_size=512"); 6742 rc = arExecSql(pAr, "SAVEPOINT ar;"); 6743 if( rc!=SQLITE_OK ) return rc; 6744 zTemp[0] = 0; 6745 if( pAr->bZip ){ 6746 /* Initialize the zipfile virtual table, if necessary */ 6747 if( pAr->zFile ){ 6748 sqlite3_uint64 r; 6749 sqlite3_randomness(sizeof(r),&r); 6750 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 6751 zTab = zTemp; 6752 zSql = sqlite3_mprintf( 6753 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 6754 zTab, pAr->zFile 6755 ); 6756 rc = arExecSql(pAr, zSql); 6757 sqlite3_free(zSql); 6758 }else{ 6759 zTab = "zip"; 6760 } 6761 }else{ 6762 /* Initialize the table for an SQLAR */ 6763 zTab = "sqlar"; 6764 if( bUpdate==0 ){ 6765 rc = arExecSql(pAr, zDrop); 6766 if( rc!=SQLITE_OK ) goto end_ar_transaction; 6767 } 6768 rc = arExecSql(pAr, zCreate); 6769 } 6770 if( bOnlyIfChanged ){ 6771 zExists = sqlite3_mprintf( 6772 " AND NOT EXISTS(" 6773 "SELECT 1 FROM %s AS mem" 6774 " WHERE mem.name=disk.name" 6775 " AND mem.mtime=disk.mtime" 6776 " AND mem.mode=disk.mode)", zTab); 6777 }else{ 6778 zExists = sqlite3_mprintf(""); 6779 } 6780 if( zExists==0 ) rc = SQLITE_NOMEM; 6781 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 6782 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 6783 pAr->bVerbose ? "shell_putsnl(name)" : "name", 6784 pAr->azArg[i], pAr->zDir, zExists); 6785 rc = arExecSql(pAr, zSql2); 6786 sqlite3_free(zSql2); 6787 } 6788end_ar_transaction: 6789 if( rc!=SQLITE_OK ){ 6790 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 6791 }else{ 6792 rc = arExecSql(pAr, "RELEASE ar;"); 6793 if( pAr->bZip && pAr->zFile ){ 6794 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 6795 arExecSql(pAr, zSql); 6796 sqlite3_free(zSql); 6797 } 6798 } 6799 sqlite3_free(zExists); 6800 return rc; 6801} 6802 6803/* 6804** Implementation of ".ar" dot command. 6805*/ 6806static int arDotCommand( 6807 ShellState *pState, /* Current shell tool state */ 6808 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 6809 char **azArg, /* Array of arguments passed to dot command */ 6810 int nArg /* Number of entries in azArg[] */ 6811){ 6812 ArCommand cmd; 6813 int rc; 6814 memset(&cmd, 0, sizeof(cmd)); 6815 cmd.fromCmdLine = fromCmdLine; 6816 rc = arParseCommand(azArg, nArg, &cmd); 6817 if( rc==SQLITE_OK ){ 6818 int eDbType = SHELL_OPEN_UNSPEC; 6819 cmd.p = pState; 6820 cmd.db = pState->db; 6821 if( cmd.zFile ){ 6822 eDbType = deduceDatabaseType(cmd.zFile, 1); 6823 }else{ 6824 eDbType = pState->openMode; 6825 } 6826 if( eDbType==SHELL_OPEN_ZIPFILE ){ 6827 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 6828 if( cmd.zFile==0 ){ 6829 cmd.zSrcTable = sqlite3_mprintf("zip"); 6830 }else{ 6831 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 6832 } 6833 } 6834 cmd.bZip = 1; 6835 }else if( cmd.zFile ){ 6836 int flags; 6837 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 6838 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 6839 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ 6840 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 6841 }else{ 6842 flags = SQLITE_OPEN_READONLY; 6843 } 6844 cmd.db = 0; 6845 if( cmd.bDryRun ){ 6846 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 6847 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 6848 } 6849 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 6850 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 6851 if( rc!=SQLITE_OK ){ 6852 utf8_printf(stderr, "cannot open file: %s (%s)\n", 6853 cmd.zFile, sqlite3_errmsg(cmd.db) 6854 ); 6855 goto end_ar_command; 6856 } 6857 sqlite3_fileio_init(cmd.db, 0, 0); 6858 sqlite3_sqlar_init(cmd.db, 0, 0); 6859 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 6860 shellPutsFunc, 0, 0); 6861 6862 } 6863 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 6864 if( cmd.eCmd!=AR_CMD_CREATE 6865 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 6866 ){ 6867 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 6868 rc = SQLITE_ERROR; 6869 goto end_ar_command; 6870 } 6871 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 6872 } 6873 6874 switch( cmd.eCmd ){ 6875 case AR_CMD_CREATE: 6876 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 6877 break; 6878 6879 case AR_CMD_EXTRACT: 6880 rc = arExtractCommand(&cmd); 6881 break; 6882 6883 case AR_CMD_LIST: 6884 rc = arListCommand(&cmd); 6885 break; 6886 6887 case AR_CMD_HELP: 6888 arUsage(pState->out); 6889 break; 6890 6891 case AR_CMD_INSERT: 6892 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 6893 break; 6894 6895 case AR_CMD_REMOVE: 6896 rc = arRemoveCommand(&cmd); 6897 break; 6898 6899 default: 6900 assert( cmd.eCmd==AR_CMD_UPDATE ); 6901 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 6902 break; 6903 } 6904 } 6905end_ar_command: 6906 if( cmd.db!=pState->db ){ 6907 close_db(cmd.db); 6908 } 6909 sqlite3_free(cmd.zSrcTable); 6910 6911 return rc; 6912} 6913/* End of the ".archive" or ".ar" command logic 6914*******************************************************************************/ 6915#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 6916 6917#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 6918/* 6919** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 6920** Otherwise, the SQL statement or statements in zSql are executed using 6921** database connection db and the error code written to *pRc before 6922** this function returns. 6923*/ 6924static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 6925 int rc = *pRc; 6926 if( rc==SQLITE_OK ){ 6927 char *zErr = 0; 6928 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 6929 if( rc!=SQLITE_OK ){ 6930 raw_printf(stderr, "SQL error: %s\n", zErr); 6931 } 6932 sqlite3_free(zErr); 6933 *pRc = rc; 6934 } 6935} 6936 6937/* 6938** Like shellExec(), except that zFmt is a printf() style format string. 6939*/ 6940static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 6941 char *z = 0; 6942 if( *pRc==SQLITE_OK ){ 6943 va_list ap; 6944 va_start(ap, zFmt); 6945 z = sqlite3_vmprintf(zFmt, ap); 6946 va_end(ap); 6947 if( z==0 ){ 6948 *pRc = SQLITE_NOMEM; 6949 }else{ 6950 shellExec(db, pRc, z); 6951 } 6952 sqlite3_free(z); 6953 } 6954} 6955 6956/* 6957** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 6958** Otherwise, an attempt is made to allocate, zero and return a pointer 6959** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 6960** to SQLITE_NOMEM and NULL returned. 6961*/ 6962static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 6963 void *pRet = 0; 6964 if( *pRc==SQLITE_OK ){ 6965 pRet = sqlite3_malloc64(nByte); 6966 if( pRet==0 ){ 6967 *pRc = SQLITE_NOMEM; 6968 }else{ 6969 memset(pRet, 0, nByte); 6970 } 6971 } 6972 return pRet; 6973} 6974 6975/* 6976** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 6977** Otherwise, zFmt is treated as a printf() style string. The result of 6978** formatting it along with any trailing arguments is written into a 6979** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 6980** It is the responsibility of the caller to eventually free this buffer 6981** using a call to sqlite3_free(). 6982** 6983** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 6984** pointer returned. 6985*/ 6986static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 6987 char *z = 0; 6988 if( *pRc==SQLITE_OK ){ 6989 va_list ap; 6990 va_start(ap, zFmt); 6991 z = sqlite3_vmprintf(zFmt, ap); 6992 va_end(ap); 6993 if( z==0 ){ 6994 *pRc = SQLITE_NOMEM; 6995 } 6996 } 6997 return z; 6998} 6999 7000/* 7001** When running the ".recover" command, each output table, and the special 7002** orphaned row table if it is required, is represented by an instance 7003** of the following struct. 7004*/ 7005typedef struct RecoverTable RecoverTable; 7006struct RecoverTable { 7007 char *zQuoted; /* Quoted version of table name */ 7008 int nCol; /* Number of columns in table */ 7009 char **azlCol; /* Array of column lists */ 7010 int iPk; /* Index of IPK column */ 7011}; 7012 7013/* 7014** Free a RecoverTable object allocated by recoverFindTable() or 7015** recoverOrphanTable(). 7016*/ 7017static void recoverFreeTable(RecoverTable *pTab){ 7018 if( pTab ){ 7019 sqlite3_free(pTab->zQuoted); 7020 if( pTab->azlCol ){ 7021 int i; 7022 for(i=0; i<=pTab->nCol; i++){ 7023 sqlite3_free(pTab->azlCol[i]); 7024 } 7025 sqlite3_free(pTab->azlCol); 7026 } 7027 sqlite3_free(pTab); 7028 } 7029} 7030 7031/* 7032** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 7033** Otherwise, it allocates and returns a RecoverTable object based on the 7034** final four arguments passed to this function. It is the responsibility 7035** of the caller to eventually free the returned object using 7036** recoverFreeTable(). 7037*/ 7038static RecoverTable *recoverNewTable( 7039 int *pRc, /* IN/OUT: Error code */ 7040 const char *zName, /* Name of table */ 7041 const char *zSql, /* CREATE TABLE statement */ 7042 int bIntkey, 7043 int nCol 7044){ 7045 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 7046 int rc = *pRc; 7047 RecoverTable *pTab = 0; 7048 7049 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 7050 if( rc==SQLITE_OK ){ 7051 int nSqlCol = 0; 7052 int bSqlIntkey = 0; 7053 sqlite3_stmt *pStmt = 0; 7054 7055 rc = sqlite3_open("", &dbtmp); 7056 if( rc==SQLITE_OK ){ 7057 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 7058 shellIdQuote, 0, 0); 7059 } 7060 if( rc==SQLITE_OK ){ 7061 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 7062 } 7063 if( rc==SQLITE_OK ){ 7064 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 7065 if( rc==SQLITE_ERROR ){ 7066 rc = SQLITE_OK; 7067 goto finished; 7068 } 7069 } 7070 shellPreparePrintf(dbtmp, &rc, &pStmt, 7071 "SELECT count(*) FROM pragma_table_info(%Q)", zName 7072 ); 7073 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7074 nSqlCol = sqlite3_column_int(pStmt, 0); 7075 } 7076 shellFinalize(&rc, pStmt); 7077 7078 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 7079 goto finished; 7080 } 7081 7082 shellPreparePrintf(dbtmp, &rc, &pStmt, 7083 "SELECT (" 7084 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 7085 ") FROM sqlite_schema WHERE name = %Q", zName 7086 ); 7087 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7088 bSqlIntkey = sqlite3_column_int(pStmt, 0); 7089 } 7090 shellFinalize(&rc, pStmt); 7091 7092 if( bIntkey==bSqlIntkey ){ 7093 int i; 7094 const char *zPk = "_rowid_"; 7095 sqlite3_stmt *pPkFinder = 0; 7096 7097 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 7098 ** set zPk to the name of the PK column, and pTab->iPk to the index 7099 ** of the column, where columns are 0-numbered from left to right. 7100 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 7101 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 7102 pTab->iPk = -2; 7103 if( bIntkey ){ 7104 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 7105 "SELECT cid, name FROM pragma_table_info(%Q) " 7106 " WHERE pk=1 AND type='integer' COLLATE nocase" 7107 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 7108 , zName, zName 7109 ); 7110 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 7111 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 7112 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 7113 } 7114 } 7115 7116 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 7117 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 7118 pTab->nCol = nSqlCol; 7119 7120 if( bIntkey ){ 7121 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 7122 }else{ 7123 pTab->azlCol[0] = shellMPrintf(&rc, ""); 7124 } 7125 i = 1; 7126 shellPreparePrintf(dbtmp, &rc, &pStmt, 7127 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 7128 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 7129 "FROM pragma_table_info(%Q)", 7130 bIntkey ? ", " : "", pTab->iPk, 7131 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 7132 zName 7133 ); 7134 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7135 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 7136 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 7137 i++; 7138 } 7139 shellFinalize(&rc, pStmt); 7140 7141 shellFinalize(&rc, pPkFinder); 7142 } 7143 } 7144 7145 finished: 7146 sqlite3_close(dbtmp); 7147 *pRc = rc; 7148 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 7149 recoverFreeTable(pTab); 7150 pTab = 0; 7151 } 7152 return pTab; 7153} 7154 7155/* 7156** This function is called to search the schema recovered from the 7157** sqlite_schema table of the (possibly) corrupt database as part 7158** of a ".recover" command. Specifically, for a table with root page 7159** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 7160** table must be a WITHOUT ROWID table, or if non-zero, not one of 7161** those. 7162** 7163** If a table is found, a (RecoverTable*) object is returned. Or, if 7164** no such table is found, but bIntkey is false and iRoot is the 7165** root page of an index in the recovered schema, then (*pbNoop) is 7166** set to true and NULL returned. Or, if there is no such table or 7167** index, NULL is returned and (*pbNoop) set to 0, indicating that 7168** the caller should write data to the orphans table. 7169*/ 7170static RecoverTable *recoverFindTable( 7171 ShellState *pState, /* Shell state object */ 7172 int *pRc, /* IN/OUT: Error code */ 7173 int iRoot, /* Root page of table */ 7174 int bIntkey, /* True for an intkey table */ 7175 int nCol, /* Number of columns in table */ 7176 int *pbNoop /* OUT: True if iRoot is root of index */ 7177){ 7178 sqlite3_stmt *pStmt = 0; 7179 RecoverTable *pRet = 0; 7180 int bNoop = 0; 7181 const char *zSql = 0; 7182 const char *zName = 0; 7183 7184 /* Search the recovered schema for an object with root page iRoot. */ 7185 shellPreparePrintf(pState->db, pRc, &pStmt, 7186 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 7187 ); 7188 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7189 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 7190 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 7191 bNoop = 1; 7192 break; 7193 } 7194 if( sqlite3_stricmp(zType, "table")==0 ){ 7195 zName = (const char*)sqlite3_column_text(pStmt, 1); 7196 zSql = (const char*)sqlite3_column_text(pStmt, 2); 7197 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 7198 break; 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 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 7893 shell_check_oom(azName); 7894 azName[nName*2] = strdup(zSchema); 7895 azName[nName*2+1] = strdup(zFile); 7896 nName++; 7897 } 7898 } 7899 sqlite3_finalize(pStmt); 7900 for(i=0; i<nName; i++){ 7901 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 7902 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 7903 const char *z = azName[i*2+1]; 7904 utf8_printf(p->out, "%s: %s %s%s\n", 7905 azName[i*2], 7906 z && z[0] ? z : "\"\"", 7907 bRdonly ? "r/o" : "r/w", 7908 eTxn==SQLITE_TXN_NONE ? "" : 7909 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 7910 free(azName[i*2]); 7911 free(azName[i*2+1]); 7912 } 7913 sqlite3_free(azName); 7914 }else 7915 7916 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 7917 static const struct DbConfigChoices { 7918 const char *zName; 7919 int op; 7920 } aDbConfig[] = { 7921 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 7922 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 7923 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 7924 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 7925 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 7926 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 7927 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 7928 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 7929 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 7930 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 7931 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 7932 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 7933 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 7934 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 7935 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 7936 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 7937 }; 7938 int ii, v; 7939 open_db(p, 0); 7940 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 7941 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 7942 if( nArg>=3 ){ 7943 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 7944 } 7945 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 7946 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 7947 if( nArg>1 ) break; 7948 } 7949 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 7950 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 7951 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 7952 } 7953 }else 7954 7955 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 7956 rc = shell_dbinfo_command(p, nArg, azArg); 7957 }else 7958 7959#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 7960 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 7961 open_db(p, 0); 7962 rc = recoverDatabaseCmd(p, nArg, azArg); 7963 }else 7964#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 7965 7966 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 7967 char *zLike = 0; 7968 char *zSql; 7969 int i; 7970 int savedShowHeader = p->showHeader; 7971 int savedShellFlags = p->shellFlgs; 7972 ShellClearFlag(p, 7973 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 7974 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 7975 for(i=1; i<nArg; i++){ 7976 if( azArg[i][0]=='-' ){ 7977 const char *z = azArg[i]+1; 7978 if( z[0]=='-' ) z++; 7979 if( strcmp(z,"preserve-rowids")==0 ){ 7980#ifdef SQLITE_OMIT_VIRTUALTABLE 7981 raw_printf(stderr, "The --preserve-rowids option is not compatible" 7982 " with SQLITE_OMIT_VIRTUALTABLE\n"); 7983 rc = 1; 7984 sqlite3_free(zLike); 7985 goto meta_command_exit; 7986#else 7987 ShellSetFlag(p, SHFLG_PreserveRowid); 7988#endif 7989 }else 7990 if( strcmp(z,"newlines")==0 ){ 7991 ShellSetFlag(p, SHFLG_Newlines); 7992 }else 7993 if( strcmp(z,"data-only")==0 ){ 7994 ShellSetFlag(p, SHFLG_DumpDataOnly); 7995 }else 7996 if( strcmp(z,"nosys")==0 ){ 7997 ShellSetFlag(p, SHFLG_DumpNoSys); 7998 }else 7999 { 8000 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 8001 rc = 1; 8002 sqlite3_free(zLike); 8003 goto meta_command_exit; 8004 } 8005 }else{ 8006 /* azArg[i] contains a LIKE pattern. This ".dump" request should 8007 ** only dump data for tables for which either the table name matches 8008 ** the LIKE pattern, or the table appears to be a shadow table of 8009 ** a virtual table for which the name matches the LIKE pattern. 8010 */ 8011 char *zExpr = sqlite3_mprintf( 8012 "name LIKE %Q ESCAPE '\\' OR EXISTS (" 8013 " SELECT 1 FROM sqlite_schema WHERE " 8014 " name LIKE %Q ESCAPE '\\' AND" 8015 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" 8016 " substr(o.name, 1, length(name)+1) == (name||'_')" 8017 ")", azArg[i], azArg[i] 8018 ); 8019 8020 if( zLike ){ 8021 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); 8022 }else{ 8023 zLike = zExpr; 8024 } 8025 } 8026 } 8027 8028 open_db(p, 0); 8029 8030 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8031 /* When playing back a "dump", the content might appear in an order 8032 ** which causes immediate foreign key constraints to be violated. 8033 ** So disable foreign-key constraint enforcement to prevent problems. */ 8034 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 8035 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 8036 } 8037 p->writableSchema = 0; 8038 p->showHeader = 0; 8039 /* Set writable_schema=ON since doing so forces SQLite to initialize 8040 ** as much of the schema as it can even if the sqlite_schema table is 8041 ** corrupt. */ 8042 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 8043 p->nErr = 0; 8044 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 8045 zSql = sqlite3_mprintf( 8046 "SELECT name, type, sql FROM sqlite_schema AS o " 8047 "WHERE (%s) AND type=='table'" 8048 " AND sql NOT NULL" 8049 " ORDER BY tbl_name='sqlite_sequence', rowid", 8050 zLike 8051 ); 8052 run_schema_dump_query(p,zSql); 8053 sqlite3_free(zSql); 8054 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8055 zSql = sqlite3_mprintf( 8056 "SELECT sql FROM sqlite_schema AS o " 8057 "WHERE (%s) AND sql NOT NULL" 8058 " AND type IN ('index','trigger','view')", 8059 zLike 8060 ); 8061 run_table_dump_query(p, zSql); 8062 sqlite3_free(zSql); 8063 } 8064 sqlite3_free(zLike); 8065 if( p->writableSchema ){ 8066 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 8067 p->writableSchema = 0; 8068 } 8069 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 8070 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 8071 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8072 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 8073 } 8074 p->showHeader = savedShowHeader; 8075 p->shellFlgs = savedShellFlags; 8076 }else 8077 8078 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 8079 if( nArg==2 ){ 8080 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 8081 }else{ 8082 raw_printf(stderr, "Usage: .echo on|off\n"); 8083 rc = 1; 8084 } 8085 }else 8086 8087 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 8088 if( nArg==2 ){ 8089 p->autoEQPtest = 0; 8090 if( p->autoEQPtrace ){ 8091 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 8092 p->autoEQPtrace = 0; 8093 } 8094 if( strcmp(azArg[1],"full")==0 ){ 8095 p->autoEQP = AUTOEQP_full; 8096 }else if( strcmp(azArg[1],"trigger")==0 ){ 8097 p->autoEQP = AUTOEQP_trigger; 8098#ifdef SQLITE_DEBUG 8099 }else if( strcmp(azArg[1],"test")==0 ){ 8100 p->autoEQP = AUTOEQP_on; 8101 p->autoEQPtest = 1; 8102 }else if( strcmp(azArg[1],"trace")==0 ){ 8103 p->autoEQP = AUTOEQP_full; 8104 p->autoEQPtrace = 1; 8105 open_db(p, 0); 8106 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 8107 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 8108#endif 8109 }else{ 8110 p->autoEQP = (u8)booleanValue(azArg[1]); 8111 } 8112 }else{ 8113 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 8114 rc = 1; 8115 } 8116 }else 8117 8118 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 8119 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 8120 rc = 2; 8121 }else 8122 8123 /* The ".explain" command is automatic now. It is largely pointless. It 8124 ** retained purely for backwards compatibility */ 8125 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 8126 int val = 1; 8127 if( nArg>=2 ){ 8128 if( strcmp(azArg[1],"auto")==0 ){ 8129 val = 99; 8130 }else{ 8131 val = booleanValue(azArg[1]); 8132 } 8133 } 8134 if( val==1 && p->mode!=MODE_Explain ){ 8135 p->normalMode = p->mode; 8136 p->mode = MODE_Explain; 8137 p->autoExplain = 0; 8138 }else if( val==0 ){ 8139 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8140 p->autoExplain = 0; 8141 }else if( val==99 ){ 8142 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8143 p->autoExplain = 1; 8144 } 8145 }else 8146 8147#ifndef SQLITE_OMIT_VIRTUALTABLE 8148 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 8149 open_db(p, 0); 8150 expertDotCommand(p, azArg, nArg); 8151 }else 8152#endif 8153 8154 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 8155 static const struct { 8156 const char *zCtrlName; /* Name of a test-control option */ 8157 int ctrlCode; /* Integer code for that option */ 8158 const char *zUsage; /* Usage notes */ 8159 } aCtrl[] = { 8160 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 8161 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" }, 8162 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 8163 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 8164 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 8165 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 8166 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 8167 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 8168 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 8169 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 8170 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 8171 }; 8172 int filectrl = -1; 8173 int iCtrl = -1; 8174 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 8175 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 8176 int n2, i; 8177 const char *zCmd = 0; 8178 const char *zSchema = 0; 8179 8180 open_db(p, 0); 8181 zCmd = nArg>=2 ? azArg[1] : "help"; 8182 8183 if( zCmd[0]=='-' 8184 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 8185 && nArg>=4 8186 ){ 8187 zSchema = azArg[2]; 8188 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 8189 nArg -= 2; 8190 zCmd = azArg[1]; 8191 } 8192 8193 /* The argument can optionally begin with "-" or "--" */ 8194 if( zCmd[0]=='-' && zCmd[1] ){ 8195 zCmd++; 8196 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 8197 } 8198 8199 /* --help lists all file-controls */ 8200 if( strcmp(zCmd,"help")==0 ){ 8201 utf8_printf(p->out, "Available file-controls:\n"); 8202 for(i=0; i<ArraySize(aCtrl); i++){ 8203 utf8_printf(p->out, " .filectrl %s %s\n", 8204 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 8205 } 8206 rc = 1; 8207 goto meta_command_exit; 8208 } 8209 8210 /* convert filectrl text option to value. allow any unique prefix 8211 ** of the option name, or a numerical value. */ 8212 n2 = strlen30(zCmd); 8213 for(i=0; i<ArraySize(aCtrl); i++){ 8214 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 8215 if( filectrl<0 ){ 8216 filectrl = aCtrl[i].ctrlCode; 8217 iCtrl = i; 8218 }else{ 8219 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 8220 "Use \".filectrl --help\" for help\n", zCmd); 8221 rc = 1; 8222 goto meta_command_exit; 8223 } 8224 } 8225 } 8226 if( filectrl<0 ){ 8227 utf8_printf(stderr,"Error: unknown file-control: %s\n" 8228 "Use \".filectrl --help\" for help\n", zCmd); 8229 }else{ 8230 switch(filectrl){ 8231 case SQLITE_FCNTL_SIZE_LIMIT: { 8232 if( nArg!=2 && nArg!=3 ) break; 8233 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 8234 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 8235 isOk = 1; 8236 break; 8237 } 8238 case SQLITE_FCNTL_LOCK_TIMEOUT: 8239 case SQLITE_FCNTL_CHUNK_SIZE: { 8240 int x; 8241 if( nArg!=3 ) break; 8242 x = (int)integerValue(azArg[2]); 8243 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8244 isOk = 2; 8245 break; 8246 } 8247 case SQLITE_FCNTL_PERSIST_WAL: 8248 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 8249 int x; 8250 if( nArg!=2 && nArg!=3 ) break; 8251 x = nArg==3 ? booleanValue(azArg[2]) : -1; 8252 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8253 iRes = x; 8254 isOk = 1; 8255 break; 8256 } 8257 case SQLITE_FCNTL_DATA_VERSION: 8258 case SQLITE_FCNTL_HAS_MOVED: { 8259 int x; 8260 if( nArg!=2 ) break; 8261 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8262 iRes = x; 8263 isOk = 1; 8264 break; 8265 } 8266 case SQLITE_FCNTL_TEMPFILENAME: { 8267 char *z = 0; 8268 if( nArg!=2 ) break; 8269 sqlite3_file_control(p->db, zSchema, filectrl, &z); 8270 if( z ){ 8271 utf8_printf(p->out, "%s\n", z); 8272 sqlite3_free(z); 8273 } 8274 isOk = 2; 8275 break; 8276 } 8277 case SQLITE_FCNTL_RESERVE_BYTES: { 8278 int x; 8279 if( nArg>=3 ){ 8280 x = atoi(azArg[2]); 8281 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8282 } 8283 x = -1; 8284 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8285 utf8_printf(p->out,"%d\n", x); 8286 isOk = 2; 8287 break; 8288 } 8289 } 8290 } 8291 if( isOk==0 && iCtrl>=0 ){ 8292 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 8293 rc = 1; 8294 }else if( isOk==1 ){ 8295 char zBuf[100]; 8296 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 8297 raw_printf(p->out, "%s\n", zBuf); 8298 } 8299 }else 8300 8301 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 8302 ShellState data; 8303 int doStats = 0; 8304 memcpy(&data, p, sizeof(data)); 8305 data.showHeader = 0; 8306 data.cMode = data.mode = MODE_Semi; 8307 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 8308 data.cMode = data.mode = MODE_Pretty; 8309 nArg = 1; 8310 } 8311 if( nArg!=1 ){ 8312 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 8313 rc = 1; 8314 goto meta_command_exit; 8315 } 8316 open_db(p, 0); 8317 rc = sqlite3_exec(p->db, 8318 "SELECT sql FROM" 8319 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 8320 " FROM sqlite_schema UNION ALL" 8321 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 8322 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 8323 "ORDER BY x", 8324 callback, &data, 0 8325 ); 8326 if( rc==SQLITE_OK ){ 8327 sqlite3_stmt *pStmt; 8328 rc = sqlite3_prepare_v2(p->db, 8329 "SELECT rowid FROM sqlite_schema" 8330 " WHERE name GLOB 'sqlite_stat[134]'", 8331 -1, &pStmt, 0); 8332 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 8333 sqlite3_finalize(pStmt); 8334 } 8335 if( doStats==0 ){ 8336 raw_printf(p->out, "/* No STAT tables available */\n"); 8337 }else{ 8338 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8339 data.cMode = data.mode = MODE_Insert; 8340 data.zDestTable = "sqlite_stat1"; 8341 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); 8342 data.zDestTable = "sqlite_stat4"; 8343 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0); 8344 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8345 } 8346 }else 8347 8348 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 8349 if( nArg==2 ){ 8350 p->showHeader = booleanValue(azArg[1]); 8351 p->shellFlgs |= SHFLG_HeaderSet; 8352 }else{ 8353 raw_printf(stderr, "Usage: .headers on|off\n"); 8354 rc = 1; 8355 } 8356 }else 8357 8358 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 8359 if( nArg>=2 ){ 8360 n = showHelp(p->out, azArg[1]); 8361 if( n==0 ){ 8362 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 8363 } 8364 }else{ 8365 showHelp(p->out, 0); 8366 } 8367 }else 8368 8369 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 8370 char *zTable = 0; /* Insert data into this table */ 8371 char *zFile = 0; /* Name of file to extra content from */ 8372 sqlite3_stmt *pStmt = NULL; /* A statement */ 8373 int nCol; /* Number of columns in the table */ 8374 int nByte; /* Number of bytes in an SQL string */ 8375 int i, j; /* Loop counters */ 8376 int needCommit; /* True to COMMIT or ROLLBACK at end */ 8377 int nSep; /* Number of bytes in p->colSeparator[] */ 8378 char *zSql; /* An SQL statement */ 8379 ImportCtx sCtx; /* Reader context */ 8380 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 8381 int eVerbose = 0; /* Larger for more console output */ 8382 int nSkip = 0; /* Initial lines to skip */ 8383 int useOutputMode = 1; /* Use output mode to determine separators */ 8384 8385 failIfSafeMode(p, "cannot run .import in safe mode"); 8386 memset(&sCtx, 0, sizeof(sCtx)); 8387 sCtx.z = sqlite3_malloc64(120); 8388 if( sCtx.z==0 ){ 8389 import_cleanup(&sCtx); 8390 shell_out_of_memory(); 8391 } 8392 if( p->mode==MODE_Ascii ){ 8393 xRead = ascii_read_one_field; 8394 }else{ 8395 xRead = csv_read_one_field; 8396 } 8397 for(i=1; i<nArg; i++){ 8398 char *z = azArg[i]; 8399 if( z[0]=='-' && z[1]=='-' ) z++; 8400 if( z[0]!='-' ){ 8401 if( zFile==0 ){ 8402 zFile = z; 8403 }else if( zTable==0 ){ 8404 zTable = z; 8405 }else{ 8406 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 8407 showHelp(p->out, "import"); 8408 rc = 1; 8409 goto meta_command_exit; 8410 } 8411 }else if( strcmp(z,"-v")==0 ){ 8412 eVerbose++; 8413 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 8414 nSkip = integerValue(azArg[++i]); 8415 }else if( strcmp(z,"-ascii")==0 ){ 8416 sCtx.cColSep = SEP_Unit[0]; 8417 sCtx.cRowSep = SEP_Record[0]; 8418 xRead = ascii_read_one_field; 8419 useOutputMode = 0; 8420 }else if( strcmp(z,"-csv")==0 ){ 8421 sCtx.cColSep = ','; 8422 sCtx.cRowSep = '\n'; 8423 xRead = csv_read_one_field; 8424 useOutputMode = 0; 8425 }else{ 8426 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 8427 showHelp(p->out, "import"); 8428 rc = 1; 8429 goto meta_command_exit; 8430 } 8431 } 8432 if( zTable==0 ){ 8433 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 8434 zFile==0 ? "FILE" : "TABLE"); 8435 showHelp(p->out, "import"); 8436 rc = 1; 8437 goto meta_command_exit; 8438 } 8439 seenInterrupt = 0; 8440 open_db(p, 0); 8441 if( useOutputMode ){ 8442 /* If neither the --csv or --ascii options are specified, then set 8443 ** the column and row separator characters from the output mode. */ 8444 nSep = strlen30(p->colSeparator); 8445 if( nSep==0 ){ 8446 raw_printf(stderr, 8447 "Error: non-null column separator required for import\n"); 8448 rc = 1; 8449 goto meta_command_exit; 8450 } 8451 if( nSep>1 ){ 8452 raw_printf(stderr, 8453 "Error: multi-character column separators not allowed" 8454 " for import\n"); 8455 rc = 1; 8456 goto meta_command_exit; 8457 } 8458 nSep = strlen30(p->rowSeparator); 8459 if( nSep==0 ){ 8460 raw_printf(stderr, 8461 "Error: non-null row separator required for import\n"); 8462 rc = 1; 8463 goto meta_command_exit; 8464 } 8465 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 8466 /* When importing CSV (only), if the row separator is set to the 8467 ** default output row separator, change it to the default input 8468 ** row separator. This avoids having to maintain different input 8469 ** and output row separators. */ 8470 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8471 nSep = strlen30(p->rowSeparator); 8472 } 8473 if( nSep>1 ){ 8474 raw_printf(stderr, "Error: multi-character row separators not allowed" 8475 " for import\n"); 8476 rc = 1; 8477 goto meta_command_exit; 8478 } 8479 sCtx.cColSep = p->colSeparator[0]; 8480 sCtx.cRowSep = p->rowSeparator[0]; 8481 } 8482 sCtx.zFile = zFile; 8483 sCtx.nLine = 1; 8484 if( sCtx.zFile[0]=='|' ){ 8485#ifdef SQLITE_OMIT_POPEN 8486 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 8487 rc = 1; 8488 goto meta_command_exit; 8489#else 8490 sCtx.in = popen(sCtx.zFile+1, "r"); 8491 sCtx.zFile = "<pipe>"; 8492 sCtx.xCloser = pclose; 8493#endif 8494 }else{ 8495 sCtx.in = fopen(sCtx.zFile, "rb"); 8496 sCtx.xCloser = fclose; 8497 } 8498 if( sCtx.in==0 ){ 8499 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 8500 rc = 1; 8501 import_cleanup(&sCtx); 8502 goto meta_command_exit; 8503 } 8504 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 8505 char zSep[2]; 8506 zSep[1] = 0; 8507 zSep[0] = sCtx.cColSep; 8508 utf8_printf(p->out, "Column separator "); 8509 output_c_string(p->out, zSep); 8510 utf8_printf(p->out, ", row separator "); 8511 zSep[0] = sCtx.cRowSep; 8512 output_c_string(p->out, zSep); 8513 utf8_printf(p->out, "\n"); 8514 } 8515 while( (nSkip--)>0 ){ 8516 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 8517 } 8518 zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 8519 if( zSql==0 ){ 8520 import_cleanup(&sCtx); 8521 shell_out_of_memory(); 8522 } 8523 nByte = strlen30(zSql); 8524 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8525 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 8526 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 8527 char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable); 8528 char cSep = '('; 8529 while( xRead(&sCtx) ){ 8530 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 8531 cSep = ','; 8532 if( sCtx.cTerm!=sCtx.cColSep ) break; 8533 } 8534 if( cSep=='(' ){ 8535 sqlite3_free(zCreate); 8536 import_cleanup(&sCtx); 8537 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 8538 rc = 1; 8539 goto meta_command_exit; 8540 } 8541 zCreate = sqlite3_mprintf("%z\n)", zCreate); 8542 if( eVerbose>=1 ){ 8543 utf8_printf(p->out, "%s\n", zCreate); 8544 } 8545 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 8546 sqlite3_free(zCreate); 8547 if( rc ){ 8548 utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable, 8549 sqlite3_errmsg(p->db)); 8550 import_cleanup(&sCtx); 8551 rc = 1; 8552 goto meta_command_exit; 8553 } 8554 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8555 } 8556 sqlite3_free(zSql); 8557 if( rc ){ 8558 if (pStmt) sqlite3_finalize(pStmt); 8559 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 8560 import_cleanup(&sCtx); 8561 rc = 1; 8562 goto meta_command_exit; 8563 } 8564 nCol = sqlite3_column_count(pStmt); 8565 sqlite3_finalize(pStmt); 8566 pStmt = 0; 8567 if( nCol==0 ) return 0; /* no columns, no error */ 8568 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 8569 if( zSql==0 ){ 8570 import_cleanup(&sCtx); 8571 shell_out_of_memory(); 8572 } 8573 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 8574 j = strlen30(zSql); 8575 for(i=1; i<nCol; i++){ 8576 zSql[j++] = ','; 8577 zSql[j++] = '?'; 8578 } 8579 zSql[j++] = ')'; 8580 zSql[j] = 0; 8581 if( eVerbose>=2 ){ 8582 utf8_printf(p->out, "Insert using: %s\n", zSql); 8583 } 8584 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8585 sqlite3_free(zSql); 8586 if( rc ){ 8587 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 8588 if (pStmt) sqlite3_finalize(pStmt); 8589 import_cleanup(&sCtx); 8590 rc = 1; 8591 goto meta_command_exit; 8592 } 8593 needCommit = sqlite3_get_autocommit(p->db); 8594 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 8595 do{ 8596 int startLine = sCtx.nLine; 8597 for(i=0; i<nCol; i++){ 8598 char *z = xRead(&sCtx); 8599 /* 8600 ** Did we reach end-of-file before finding any columns? 8601 ** If so, stop instead of NULL filling the remaining columns. 8602 */ 8603 if( z==0 && i==0 ) break; 8604 /* 8605 ** Did we reach end-of-file OR end-of-line before finding any 8606 ** columns in ASCII mode? If so, stop instead of NULL filling 8607 ** the remaining columns. 8608 */ 8609 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 8610 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 8611 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 8612 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 8613 "filling the rest with NULL\n", 8614 sCtx.zFile, startLine, nCol, i+1); 8615 i += 2; 8616 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 8617 } 8618 } 8619 if( sCtx.cTerm==sCtx.cColSep ){ 8620 do{ 8621 xRead(&sCtx); 8622 i++; 8623 }while( sCtx.cTerm==sCtx.cColSep ); 8624 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 8625 "extras ignored\n", 8626 sCtx.zFile, startLine, nCol, i); 8627 } 8628 if( i>=nCol ){ 8629 sqlite3_step(pStmt); 8630 rc = sqlite3_reset(pStmt); 8631 if( rc!=SQLITE_OK ){ 8632 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 8633 startLine, sqlite3_errmsg(p->db)); 8634 sCtx.nErr++; 8635 }else{ 8636 sCtx.nRow++; 8637 } 8638 } 8639 }while( sCtx.cTerm!=EOF ); 8640 8641 import_cleanup(&sCtx); 8642 sqlite3_finalize(pStmt); 8643 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 8644 if( eVerbose>0 ){ 8645 utf8_printf(p->out, 8646 "Added %d rows with %d errors using %d lines of input\n", 8647 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 8648 } 8649 }else 8650 8651#ifndef SQLITE_UNTESTABLE 8652 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 8653 char *zSql; 8654 char *zCollist = 0; 8655 sqlite3_stmt *pStmt; 8656 int tnum = 0; 8657 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 8658 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 8659 int i; 8660 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 8661 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 8662 " .imposter off\n"); 8663 /* Also allowed, but not documented: 8664 ** 8665 ** .imposter TABLE IMPOSTER 8666 ** 8667 ** where TABLE is a WITHOUT ROWID table. In that case, the 8668 ** imposter is another WITHOUT ROWID table with the columns in 8669 ** storage order. */ 8670 rc = 1; 8671 goto meta_command_exit; 8672 } 8673 open_db(p, 0); 8674 if( nArg==2 ){ 8675 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 8676 goto meta_command_exit; 8677 } 8678 zSql = sqlite3_mprintf( 8679 "SELECT rootpage, 0 FROM sqlite_schema" 8680 " WHERE name='%q' AND type='index'" 8681 "UNION ALL " 8682 "SELECT rootpage, 1 FROM sqlite_schema" 8683 " WHERE name='%q' AND type='table'" 8684 " AND sql LIKE '%%without%%rowid%%'", 8685 azArg[1], azArg[1] 8686 ); 8687 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8688 sqlite3_free(zSql); 8689 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 8690 tnum = sqlite3_column_int(pStmt, 0); 8691 isWO = sqlite3_column_int(pStmt, 1); 8692 } 8693 sqlite3_finalize(pStmt); 8694 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 8695 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8696 sqlite3_free(zSql); 8697 i = 0; 8698 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 8699 char zLabel[20]; 8700 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 8701 i++; 8702 if( zCol==0 ){ 8703 if( sqlite3_column_int(pStmt,1)==-1 ){ 8704 zCol = "_ROWID_"; 8705 }else{ 8706 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 8707 zCol = zLabel; 8708 } 8709 } 8710 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 8711 lenPK = (int)strlen(zCollist); 8712 } 8713 if( zCollist==0 ){ 8714 zCollist = sqlite3_mprintf("\"%w\"", zCol); 8715 }else{ 8716 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 8717 } 8718 } 8719 sqlite3_finalize(pStmt); 8720 if( i==0 || tnum==0 ){ 8721 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 8722 rc = 1; 8723 sqlite3_free(zCollist); 8724 goto meta_command_exit; 8725 } 8726 if( lenPK==0 ) lenPK = 100000; 8727 zSql = sqlite3_mprintf( 8728 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 8729 azArg[2], zCollist, lenPK, zCollist); 8730 sqlite3_free(zCollist); 8731 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 8732 if( rc==SQLITE_OK ){ 8733 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 8734 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 8735 if( rc ){ 8736 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 8737 }else{ 8738 utf8_printf(stdout, "%s;\n", zSql); 8739 raw_printf(stdout, 8740 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 8741 azArg[1], isWO ? "table" : "index" 8742 ); 8743 } 8744 }else{ 8745 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 8746 rc = 1; 8747 } 8748 sqlite3_free(zSql); 8749 }else 8750#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 8751 8752#ifdef SQLITE_ENABLE_IOTRACE 8753 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 8754 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 8755 if( iotrace && iotrace!=stdout ) fclose(iotrace); 8756 iotrace = 0; 8757 if( nArg<2 ){ 8758 sqlite3IoTrace = 0; 8759 }else if( strcmp(azArg[1], "-")==0 ){ 8760 sqlite3IoTrace = iotracePrintf; 8761 iotrace = stdout; 8762 }else{ 8763 iotrace = fopen(azArg[1], "w"); 8764 if( iotrace==0 ){ 8765 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 8766 sqlite3IoTrace = 0; 8767 rc = 1; 8768 }else{ 8769 sqlite3IoTrace = iotracePrintf; 8770 } 8771 } 8772 }else 8773#endif 8774 8775 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 8776 static const struct { 8777 const char *zLimitName; /* Name of a limit */ 8778 int limitCode; /* Integer code for that limit */ 8779 } aLimit[] = { 8780 { "length", SQLITE_LIMIT_LENGTH }, 8781 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 8782 { "column", SQLITE_LIMIT_COLUMN }, 8783 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 8784 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 8785 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 8786 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 8787 { "attached", SQLITE_LIMIT_ATTACHED }, 8788 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 8789 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 8790 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 8791 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 8792 }; 8793 int i, n2; 8794 open_db(p, 0); 8795 if( nArg==1 ){ 8796 for(i=0; i<ArraySize(aLimit); i++){ 8797 printf("%20s %d\n", aLimit[i].zLimitName, 8798 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 8799 } 8800 }else if( nArg>3 ){ 8801 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 8802 rc = 1; 8803 goto meta_command_exit; 8804 }else{ 8805 int iLimit = -1; 8806 n2 = strlen30(azArg[1]); 8807 for(i=0; i<ArraySize(aLimit); i++){ 8808 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 8809 if( iLimit<0 ){ 8810 iLimit = i; 8811 }else{ 8812 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 8813 rc = 1; 8814 goto meta_command_exit; 8815 } 8816 } 8817 } 8818 if( iLimit<0 ){ 8819 utf8_printf(stderr, "unknown limit: \"%s\"\n" 8820 "enter \".limits\" with no arguments for a list.\n", 8821 azArg[1]); 8822 rc = 1; 8823 goto meta_command_exit; 8824 } 8825 if( nArg==3 ){ 8826 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 8827 (int)integerValue(azArg[2])); 8828 } 8829 printf("%20s %d\n", aLimit[iLimit].zLimitName, 8830 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 8831 } 8832 }else 8833 8834 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 8835 open_db(p, 0); 8836 lintDotCommand(p, azArg, nArg); 8837 }else 8838 8839#ifndef SQLITE_OMIT_LOAD_EXTENSION 8840 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 8841 const char *zFile, *zProc; 8842 char *zErrMsg = 0; 8843 failIfSafeMode(p, "cannot run .load in safe mode"); 8844 if( nArg<2 ){ 8845 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 8846 rc = 1; 8847 goto meta_command_exit; 8848 } 8849 zFile = azArg[1]; 8850 zProc = nArg>=3 ? azArg[2] : 0; 8851 open_db(p, 0); 8852 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 8853 if( rc!=SQLITE_OK ){ 8854 utf8_printf(stderr, "Error: %s\n", zErrMsg); 8855 sqlite3_free(zErrMsg); 8856 rc = 1; 8857 } 8858 }else 8859#endif 8860 8861 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 8862 failIfSafeMode(p, "cannot run .log in safe mode"); 8863 if( nArg!=2 ){ 8864 raw_printf(stderr, "Usage: .log FILENAME\n"); 8865 rc = 1; 8866 }else{ 8867 const char *zFile = azArg[1]; 8868 output_file_close(p->pLog); 8869 p->pLog = output_file_open(zFile, 0); 8870 } 8871 }else 8872 8873 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 8874 const char *zMode = nArg>=2 ? azArg[1] : ""; 8875 int n2 = strlen30(zMode); 8876 int c2 = zMode[0]; 8877 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 8878 p->mode = MODE_Line; 8879 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8880 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 8881 p->mode = MODE_Column; 8882 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 8883 p->showHeader = 1; 8884 } 8885 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8886 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 8887 p->mode = MODE_List; 8888 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 8889 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8890 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 8891 p->mode = MODE_Html; 8892 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 8893 p->mode = MODE_Tcl; 8894 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 8895 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8896 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 8897 p->mode = MODE_Csv; 8898 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 8899 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 8900 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 8901 p->mode = MODE_List; 8902 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 8903 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 8904 p->mode = MODE_Insert; 8905 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 8906 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 8907 p->mode = MODE_Quote; 8908 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 8909 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8910 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 8911 p->mode = MODE_Ascii; 8912 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 8913 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 8914 }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ 8915 p->mode = MODE_Markdown; 8916 }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ 8917 p->mode = MODE_Table; 8918 }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ 8919 p->mode = MODE_Box; 8920 }else if( c2=='c' && strncmp(azArg[1],"count",n2)==0 ){ 8921 p->mode = MODE_Count; 8922 }else if( c2=='o' && strncmp(azArg[1],"off",n2)==0 ){ 8923 p->mode = MODE_Off; 8924 }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ 8925 p->mode = MODE_Json; 8926 }else if( nArg==1 ){ 8927 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 8928 }else{ 8929 raw_printf(stderr, "Error: mode should be one of: " 8930 "ascii box column csv html insert json line list markdown " 8931 "quote table tabs tcl\n"); 8932 rc = 1; 8933 } 8934 p->cMode = p->mode; 8935 }else 8936 8937 if( c=='n' && strcmp(azArg[0], "nonce")==0 ){ 8938 if( nArg!=2 ){ 8939 raw_printf(stderr, "Usage: .nonce NONCE\n"); 8940 rc = 1; 8941 }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ 8942 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", p->lineno, azArg[1]); 8943 exit(1); 8944 }else{ 8945 p->bSafeMode = 0; 8946 return 0; /* Return immediately to bypass the safe mode reset 8947 ** at the end of this procedure */ 8948 } 8949 }else 8950 8951 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 8952 if( nArg==2 ){ 8953 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 8954 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 8955 }else{ 8956 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 8957 rc = 1; 8958 } 8959 }else 8960 8961#ifdef SQLITE_DEBUG 8962 if( c=='o' && strcmp(azArg[0],"oom")==0 ){ 8963 int i; 8964 for(i=1; i<nArg; i++){ 8965 const char *z = azArg[i]; 8966 if( z[0]=='-' && z[1]=='-' ) z++; 8967 if( strcmp(z,"-repeat")==0 ){ 8968 if( i==nArg-1 ){ 8969 raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]); 8970 rc = 1; 8971 }else{ 8972 oomRepeat = (int)integerValue(azArg[++i]); 8973 } 8974 }else if( IsDigit(z[0]) ){ 8975 oomCounter = (int)integerValue(azArg[i]); 8976 }else{ 8977 raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]); 8978 raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n"); 8979 rc = 1; 8980 } 8981 } 8982 if( rc==0 ){ 8983 raw_printf(p->out, "oomCounter = %d\n", oomCounter); 8984 raw_printf(p->out, "oomRepeat = %d\n", oomRepeat); 8985 } 8986 }else 8987#endif /* SQLITE_DEBUG */ 8988 8989 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 8990 const char *zFN = 0; /* Pointer to constant filename */ 8991 char *zNewFilename = 0; /* Name of the database file to open */ 8992 int iName = 1; /* Index in azArg[] of the filename */ 8993 int newFlag = 0; /* True to delete file before opening */ 8994 int openMode = SHELL_OPEN_UNSPEC; 8995 8996 /* Check for command-line arguments */ 8997 for(iName=1; iName<nArg; iName++){ 8998 const char *z = azArg[iName]; 8999 if( optionMatch(z,"new") ){ 9000 newFlag = 1; 9001#ifdef SQLITE_HAVE_ZLIB 9002 }else if( optionMatch(z, "zip") ){ 9003 openMode = SHELL_OPEN_ZIPFILE; 9004#endif 9005 }else if( optionMatch(z, "append") ){ 9006 openMode = SHELL_OPEN_APPENDVFS; 9007 }else if( optionMatch(z, "readonly") ){ 9008 openMode = SHELL_OPEN_READONLY; 9009 }else if( optionMatch(z, "nofollow") ){ 9010 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 9011#ifndef SQLITE_OMIT_DESERIALIZE 9012 }else if( optionMatch(z, "deserialize") ){ 9013 openMode = SHELL_OPEN_DESERIALIZE; 9014 }else if( optionMatch(z, "hexdb") ){ 9015 openMode = SHELL_OPEN_HEXDB; 9016 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 9017 p->szMax = integerValue(azArg[++iName]); 9018#endif /* SQLITE_OMIT_DESERIALIZE */ 9019 }else if( z[0]=='-' ){ 9020 utf8_printf(stderr, "unknown option: %s\n", z); 9021 rc = 1; 9022 goto meta_command_exit; 9023 }else if( zFN ){ 9024 utf8_printf(stderr, "extra argument: \"%s\"\n", z); 9025 rc = 1; 9026 goto meta_command_exit; 9027 }else{ 9028 zFN = z; 9029 } 9030 } 9031 9032 /* Close the existing database */ 9033 session_close_all(p, -1); 9034 close_db(p->db); 9035 p->db = 0; 9036 p->pAuxDb->zDbFilename = 0; 9037 sqlite3_free(p->pAuxDb->zFreeOnClose); 9038 p->pAuxDb->zFreeOnClose = 0; 9039 p->openMode = openMode; 9040 p->openFlags = 0; 9041 p->szMax = 0; 9042 9043 /* If a filename is specified, try to open it first */ 9044 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){ 9045 if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename); 9046 if( p->bSafeMode 9047 && p->openMode!=SHELL_OPEN_HEXDB 9048 && zNewFilename 9049 && strcmp(zNewFilename,":memory:")!=0 9050 ){ 9051 failIfSafeMode(p, "cannot open disk-based database files in safe mode"); 9052 } 9053 if( zFN ){ 9054 zNewFilename = sqlite3_mprintf("%s", zFN); 9055 shell_check_oom(zNewFilename); 9056 }else{ 9057 zNewFilename = 0; 9058 } 9059 p->pAuxDb->zDbFilename = zNewFilename; 9060 open_db(p, OPEN_DB_KEEPALIVE); 9061 if( p->db==0 ){ 9062 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 9063 sqlite3_free(zNewFilename); 9064 }else{ 9065 p->pAuxDb->zFreeOnClose = zNewFilename; 9066 } 9067 } 9068 if( p->db==0 ){ 9069 /* As a fall-back open a TEMP database */ 9070 p->pAuxDb->zDbFilename = 0; 9071 open_db(p, 0); 9072 } 9073 }else 9074 9075 if( (c=='o' 9076 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 9077 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 9078 ){ 9079 char *zFile = 0; 9080 int bTxtMode = 0; 9081 int i; 9082 int eMode = 0; 9083 int bBOM = 0; 9084 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 9085 9086 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 9087 if( c=='e' ){ 9088 eMode = 'x'; 9089 bOnce = 2; 9090 }else if( strncmp(azArg[0],"once",n)==0 ){ 9091 bOnce = 1; 9092 } 9093 for(i=1; i<nArg; i++){ 9094 char *z = azArg[i]; 9095 if( z[0]=='-' ){ 9096 if( z[1]=='-' ) z++; 9097 if( strcmp(z,"-bom")==0 ){ 9098 bBOM = 1; 9099 }else if( c!='e' && strcmp(z,"-x")==0 ){ 9100 eMode = 'x'; /* spreadsheet */ 9101 }else if( c!='e' && strcmp(z,"-e")==0 ){ 9102 eMode = 'e'; /* text editor */ 9103 }else{ 9104 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 9105 azArg[i]); 9106 showHelp(p->out, azArg[0]); 9107 rc = 1; 9108 goto meta_command_exit; 9109 } 9110 }else if( zFile==0 && eMode!='e' && eMode!='x' ){ 9111 zFile = sqlite3_mprintf("%s", z); 9112 if( zFile && zFile[0]=='|' ){ 9113 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]); 9114 break; 9115 } 9116 }else{ 9117 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 9118 azArg[i]); 9119 showHelp(p->out, azArg[0]); 9120 rc = 1; 9121 sqlite3_free(zFile); 9122 goto meta_command_exit; 9123 } 9124 } 9125 if( zFile==0 ){ 9126 zFile = sqlite3_mprintf("stdout"); 9127 } 9128 if( bOnce ){ 9129 p->outCount = 2; 9130 }else{ 9131 p->outCount = 0; 9132 } 9133 output_reset(p); 9134#ifndef SQLITE_NOHAVE_SYSTEM 9135 if( eMode=='e' || eMode=='x' ){ 9136 p->doXdgOpen = 1; 9137 outputModePush(p); 9138 if( eMode=='x' ){ 9139 /* spreadsheet mode. Output as CSV. */ 9140 newTempFile(p, "csv"); 9141 ShellClearFlag(p, SHFLG_Echo); 9142 p->mode = MODE_Csv; 9143 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 9144 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 9145 }else{ 9146 /* text editor mode */ 9147 newTempFile(p, "txt"); 9148 bTxtMode = 1; 9149 } 9150 sqlite3_free(zFile); 9151 zFile = sqlite3_mprintf("%s", p->zTempFile); 9152 } 9153#endif /* SQLITE_NOHAVE_SYSTEM */ 9154 shell_check_oom(zFile); 9155 if( zFile[0]=='|' ){ 9156#ifdef SQLITE_OMIT_POPEN 9157 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9158 rc = 1; 9159 p->out = stdout; 9160#else 9161 p->out = popen(zFile + 1, "w"); 9162 if( p->out==0 ){ 9163 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 9164 p->out = stdout; 9165 rc = 1; 9166 }else{ 9167 if( bBOM ) fprintf(p->out,"\357\273\277"); 9168 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9169 } 9170#endif 9171 }else{ 9172 p->out = output_file_open(zFile, bTxtMode); 9173 if( p->out==0 ){ 9174 if( strcmp(zFile,"off")!=0 ){ 9175 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 9176 } 9177 p->out = stdout; 9178 rc = 1; 9179 } else { 9180 if( bBOM ) fprintf(p->out,"\357\273\277"); 9181 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9182 } 9183 } 9184 sqlite3_free(zFile); 9185 }else 9186 9187 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 9188 open_db(p,0); 9189 if( nArg<=1 ) goto parameter_syntax_error; 9190 9191 /* .parameter clear 9192 ** Clear all bind parameters by dropping the TEMP table that holds them. 9193 */ 9194 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 9195 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 9196 0, 0, 0); 9197 }else 9198 9199 /* .parameter list 9200 ** List all bind parameters. 9201 */ 9202 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 9203 sqlite3_stmt *pStmt = 0; 9204 int rx; 9205 int len = 0; 9206 rx = sqlite3_prepare_v2(p->db, 9207 "SELECT max(length(key)) " 9208 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9209 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9210 len = sqlite3_column_int(pStmt, 0); 9211 if( len>40 ) len = 40; 9212 } 9213 sqlite3_finalize(pStmt); 9214 pStmt = 0; 9215 if( len ){ 9216 rx = sqlite3_prepare_v2(p->db, 9217 "SELECT key, quote(value) " 9218 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9219 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9220 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 9221 sqlite3_column_text(pStmt,1)); 9222 } 9223 sqlite3_finalize(pStmt); 9224 } 9225 }else 9226 9227 /* .parameter init 9228 ** Make sure the TEMP table used to hold bind parameters exists. 9229 ** Create it if necessary. 9230 */ 9231 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 9232 bind_table_init(p); 9233 }else 9234 9235 /* .parameter set NAME VALUE 9236 ** Set or reset a bind parameter. NAME should be the full parameter 9237 ** name exactly as it appears in the query. (ex: $abc, @def). The 9238 ** VALUE can be in either SQL literal notation, or if not it will be 9239 ** understood to be a text string. 9240 */ 9241 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 9242 int rx; 9243 char *zSql; 9244 sqlite3_stmt *pStmt; 9245 const char *zKey = azArg[2]; 9246 const char *zValue = azArg[3]; 9247 bind_table_init(p); 9248 zSql = sqlite3_mprintf( 9249 "REPLACE INTO temp.sqlite_parameters(key,value)" 9250 "VALUES(%Q,%s);", zKey, zValue); 9251 shell_check_oom(zSql); 9252 pStmt = 0; 9253 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9254 sqlite3_free(zSql); 9255 if( rx!=SQLITE_OK ){ 9256 sqlite3_finalize(pStmt); 9257 pStmt = 0; 9258 zSql = sqlite3_mprintf( 9259 "REPLACE INTO temp.sqlite_parameters(key,value)" 9260 "VALUES(%Q,%Q);", zKey, zValue); 9261 shell_check_oom(zSql); 9262 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9263 sqlite3_free(zSql); 9264 if( rx!=SQLITE_OK ){ 9265 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 9266 sqlite3_finalize(pStmt); 9267 pStmt = 0; 9268 rc = 1; 9269 } 9270 } 9271 sqlite3_step(pStmt); 9272 sqlite3_finalize(pStmt); 9273 }else 9274 9275 /* .parameter unset NAME 9276 ** Remove the NAME binding from the parameter binding table, if it 9277 ** exists. 9278 */ 9279 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 9280 char *zSql = sqlite3_mprintf( 9281 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 9282 shell_check_oom(zSql); 9283 sqlite3_exec(p->db, zSql, 0, 0, 0); 9284 sqlite3_free(zSql); 9285 }else 9286 /* If no command name matches, show a syntax error */ 9287 parameter_syntax_error: 9288 showHelp(p->out, "parameter"); 9289 }else 9290 9291 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 9292 int i; 9293 for(i=1; i<nArg; i++){ 9294 if( i>1 ) raw_printf(p->out, " "); 9295 utf8_printf(p->out, "%s", azArg[i]); 9296 } 9297 raw_printf(p->out, "\n"); 9298 }else 9299 9300#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 9301 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 9302 int i; 9303 int nn = 0; 9304 p->flgProgress = 0; 9305 p->mxProgress = 0; 9306 p->nProgress = 0; 9307 for(i=1; i<nArg; i++){ 9308 const char *z = azArg[i]; 9309 if( z[0]=='-' ){ 9310 z++; 9311 if( z[0]=='-' ) z++; 9312 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 9313 p->flgProgress |= SHELL_PROGRESS_QUIET; 9314 continue; 9315 } 9316 if( strcmp(z,"reset")==0 ){ 9317 p->flgProgress |= SHELL_PROGRESS_RESET; 9318 continue; 9319 } 9320 if( strcmp(z,"once")==0 ){ 9321 p->flgProgress |= SHELL_PROGRESS_ONCE; 9322 continue; 9323 } 9324 if( strcmp(z,"limit")==0 ){ 9325 if( i+1>=nArg ){ 9326 utf8_printf(stderr, "Error: missing argument on --limit\n"); 9327 rc = 1; 9328 goto meta_command_exit; 9329 }else{ 9330 p->mxProgress = (int)integerValue(azArg[++i]); 9331 } 9332 continue; 9333 } 9334 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 9335 rc = 1; 9336 goto meta_command_exit; 9337 }else{ 9338 nn = (int)integerValue(z); 9339 } 9340 } 9341 open_db(p, 0); 9342 sqlite3_progress_handler(p->db, nn, progress_handler, p); 9343 }else 9344#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 9345 9346 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 9347 if( nArg >= 2) { 9348 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 9349 } 9350 if( nArg >= 3) { 9351 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 9352 } 9353 }else 9354 9355 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 9356 rc = 2; 9357 }else 9358 9359 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 9360 FILE *inSaved = p->in; 9361 int savedLineno = p->lineno; 9362 failIfSafeMode(p, "cannot run .read in safe mode"); 9363 if( nArg!=2 ){ 9364 raw_printf(stderr, "Usage: .read FILE\n"); 9365 rc = 1; 9366 goto meta_command_exit; 9367 } 9368 if( azArg[1][0]=='|' ){ 9369#ifdef SQLITE_OMIT_POPEN 9370 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9371 rc = 1; 9372 p->out = stdout; 9373#else 9374 p->in = popen(azArg[1]+1, "r"); 9375 if( p->in==0 ){ 9376 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 9377 rc = 1; 9378 }else{ 9379 rc = process_input(p); 9380 pclose(p->in); 9381 } 9382#endif 9383 }else if( (p->in = openChrSource(azArg[1]))==0 ){ 9384 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 9385 rc = 1; 9386 }else{ 9387 rc = process_input(p); 9388 fclose(p->in); 9389 } 9390 p->in = inSaved; 9391 p->lineno = savedLineno; 9392 }else 9393 9394 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 9395 const char *zSrcFile; 9396 const char *zDb; 9397 sqlite3 *pSrc; 9398 sqlite3_backup *pBackup; 9399 int nTimeout = 0; 9400 9401 failIfSafeMode(p, "cannot run .restore in safe mode"); 9402 if( nArg==2 ){ 9403 zSrcFile = azArg[1]; 9404 zDb = "main"; 9405 }else if( nArg==3 ){ 9406 zSrcFile = azArg[2]; 9407 zDb = azArg[1]; 9408 }else{ 9409 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 9410 rc = 1; 9411 goto meta_command_exit; 9412 } 9413 rc = sqlite3_open(zSrcFile, &pSrc); 9414 if( rc!=SQLITE_OK ){ 9415 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 9416 close_db(pSrc); 9417 return 1; 9418 } 9419 open_db(p, 0); 9420 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 9421 if( pBackup==0 ){ 9422 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9423 close_db(pSrc); 9424 return 1; 9425 } 9426 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 9427 || rc==SQLITE_BUSY ){ 9428 if( rc==SQLITE_BUSY ){ 9429 if( nTimeout++ >= 3 ) break; 9430 sqlite3_sleep(100); 9431 } 9432 } 9433 sqlite3_backup_finish(pBackup); 9434 if( rc==SQLITE_DONE ){ 9435 rc = 0; 9436 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 9437 raw_printf(stderr, "Error: source database is busy\n"); 9438 rc = 1; 9439 }else{ 9440 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9441 rc = 1; 9442 } 9443 close_db(pSrc); 9444 }else 9445 9446 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 9447 if( nArg==2 ){ 9448 p->scanstatsOn = (u8)booleanValue(azArg[1]); 9449#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 9450 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 9451#endif 9452 }else{ 9453 raw_printf(stderr, "Usage: .scanstats on|off\n"); 9454 rc = 1; 9455 } 9456 }else 9457 9458 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 9459 ShellText sSelect; 9460 ShellState data; 9461 char *zErrMsg = 0; 9462 const char *zDiv = "("; 9463 const char *zName = 0; 9464 int iSchema = 0; 9465 int bDebug = 0; 9466 int bNoSystemTabs = 0; 9467 int ii; 9468 9469 open_db(p, 0); 9470 memcpy(&data, p, sizeof(data)); 9471 data.showHeader = 0; 9472 data.cMode = data.mode = MODE_Semi; 9473 initText(&sSelect); 9474 for(ii=1; ii<nArg; ii++){ 9475 if( optionMatch(azArg[ii],"indent") ){ 9476 data.cMode = data.mode = MODE_Pretty; 9477 }else if( optionMatch(azArg[ii],"debug") ){ 9478 bDebug = 1; 9479 }else if( optionMatch(azArg[ii],"nosys") ){ 9480 bNoSystemTabs = 1; 9481 }else if( azArg[ii][0]=='-' ){ 9482 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]); 9483 rc = 1; 9484 goto meta_command_exit; 9485 }else if( zName==0 ){ 9486 zName = azArg[ii]; 9487 }else{ 9488 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 9489 rc = 1; 9490 goto meta_command_exit; 9491 } 9492 } 9493 if( zName!=0 ){ 9494 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 9495 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 9496 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 9497 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 9498 if( isSchema ){ 9499 char *new_argv[2], *new_colv[2]; 9500 new_argv[0] = sqlite3_mprintf( 9501 "CREATE TABLE %s (\n" 9502 " type text,\n" 9503 " name text,\n" 9504 " tbl_name text,\n" 9505 " rootpage integer,\n" 9506 " sql text\n" 9507 ")", zName); 9508 shell_check_oom(new_argv[0]); 9509 new_argv[1] = 0; 9510 new_colv[0] = "sql"; 9511 new_colv[1] = 0; 9512 callback(&data, 1, new_argv, new_colv); 9513 sqlite3_free(new_argv[0]); 9514 } 9515 } 9516 if( zDiv ){ 9517 sqlite3_stmt *pStmt = 0; 9518 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 9519 -1, &pStmt, 0); 9520 if( rc ){ 9521 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9522 sqlite3_finalize(pStmt); 9523 rc = 1; 9524 goto meta_command_exit; 9525 } 9526 appendText(&sSelect, "SELECT sql FROM", 0); 9527 iSchema = 0; 9528 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 9529 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 9530 char zScNum[30]; 9531 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 9532 appendText(&sSelect, zDiv, 0); 9533 zDiv = " UNION ALL "; 9534 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 9535 if( sqlite3_stricmp(zDb, "main")!=0 ){ 9536 appendText(&sSelect, zDb, '\''); 9537 }else{ 9538 appendText(&sSelect, "NULL", 0); 9539 } 9540 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 9541 appendText(&sSelect, zScNum, 0); 9542 appendText(&sSelect, " AS snum, ", 0); 9543 appendText(&sSelect, zDb, '\''); 9544 appendText(&sSelect, " AS sname FROM ", 0); 9545 appendText(&sSelect, zDb, quoteChar(zDb)); 9546 appendText(&sSelect, ".sqlite_schema", 0); 9547 } 9548 sqlite3_finalize(pStmt); 9549#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 9550 if( zName ){ 9551 appendText(&sSelect, 9552 " UNION ALL SELECT shell_module_schema(name)," 9553 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 9554 0); 9555 } 9556#endif 9557 appendText(&sSelect, ") WHERE ", 0); 9558 if( zName ){ 9559 char *zQarg = sqlite3_mprintf("%Q", zName); 9560 shell_check_oom(zQarg); 9561 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 9562 strchr(zName, '[') != 0; 9563 if( strchr(zName, '.') ){ 9564 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 9565 }else{ 9566 appendText(&sSelect, "lower(tbl_name)", 0); 9567 } 9568 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 9569 appendText(&sSelect, zQarg, 0); 9570 if( !bGlob ){ 9571 appendText(&sSelect, " ESCAPE '\\' ", 0); 9572 } 9573 appendText(&sSelect, " AND ", 0); 9574 sqlite3_free(zQarg); 9575 } 9576 if( bNoSystemTabs ){ 9577 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 9578 } 9579 appendText(&sSelect, "sql IS NOT NULL" 9580 " ORDER BY snum, rowid", 0); 9581 if( bDebug ){ 9582 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 9583 }else{ 9584 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 9585 } 9586 freeText(&sSelect); 9587 } 9588 if( zErrMsg ){ 9589 utf8_printf(stderr,"Error: %s\n", zErrMsg); 9590 sqlite3_free(zErrMsg); 9591 rc = 1; 9592 }else if( rc != SQLITE_OK ){ 9593 raw_printf(stderr,"Error: querying schema information\n"); 9594 rc = 1; 9595 }else{ 9596 rc = 0; 9597 } 9598 }else 9599 9600 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 9601 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 9602 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x); 9603 }else 9604 9605#if defined(SQLITE_ENABLE_SESSION) 9606 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 9607 struct AuxDb *pAuxDb = p->pAuxDb; 9608 OpenSession *pSession = &pAuxDb->aSession[0]; 9609 char **azCmd = &azArg[1]; 9610 int iSes = 0; 9611 int nCmd = nArg - 1; 9612 int i; 9613 if( nArg<=1 ) goto session_syntax_error; 9614 open_db(p, 0); 9615 if( nArg>=3 ){ 9616 for(iSes=0; iSes<pAuxDb->nSession; iSes++){ 9617 if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; 9618 } 9619 if( iSes<pAuxDb->nSession ){ 9620 pSession = &pAuxDb->aSession[iSes]; 9621 azCmd++; 9622 nCmd--; 9623 }else{ 9624 pSession = &pAuxDb->aSession[0]; 9625 iSes = 0; 9626 } 9627 } 9628 9629 /* .session attach TABLE 9630 ** Invoke the sqlite3session_attach() interface to attach a particular 9631 ** table so that it is never filtered. 9632 */ 9633 if( strcmp(azCmd[0],"attach")==0 ){ 9634 if( nCmd!=2 ) goto session_syntax_error; 9635 if( pSession->p==0 ){ 9636 session_not_open: 9637 raw_printf(stderr, "ERROR: No sessions are open\n"); 9638 }else{ 9639 rc = sqlite3session_attach(pSession->p, azCmd[1]); 9640 if( rc ){ 9641 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 9642 rc = 0; 9643 } 9644 } 9645 }else 9646 9647 /* .session changeset FILE 9648 ** .session patchset FILE 9649 ** Write a changeset or patchset into a file. The file is overwritten. 9650 */ 9651 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 9652 FILE *out = 0; 9653 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); 9654 if( nCmd!=2 ) goto session_syntax_error; 9655 if( pSession->p==0 ) goto session_not_open; 9656 out = fopen(azCmd[1], "wb"); 9657 if( out==0 ){ 9658 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 9659 azCmd[1]); 9660 }else{ 9661 int szChng; 9662 void *pChng; 9663 if( azCmd[0][0]=='c' ){ 9664 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 9665 }else{ 9666 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 9667 } 9668 if( rc ){ 9669 printf("Error: error code %d\n", rc); 9670 rc = 0; 9671 } 9672 if( pChng 9673 && fwrite(pChng, szChng, 1, out)!=1 ){ 9674 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 9675 szChng); 9676 } 9677 sqlite3_free(pChng); 9678 fclose(out); 9679 } 9680 }else 9681 9682 /* .session close 9683 ** Close the identified session 9684 */ 9685 if( strcmp(azCmd[0], "close")==0 ){ 9686 if( nCmd!=1 ) goto session_syntax_error; 9687 if( pAuxDb->nSession ){ 9688 session_close(pSession); 9689 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; 9690 } 9691 }else 9692 9693 /* .session enable ?BOOLEAN? 9694 ** Query or set the enable flag 9695 */ 9696 if( strcmp(azCmd[0], "enable")==0 ){ 9697 int ii; 9698 if( nCmd>2 ) goto session_syntax_error; 9699 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 9700 if( pAuxDb->nSession ){ 9701 ii = sqlite3session_enable(pSession->p, ii); 9702 utf8_printf(p->out, "session %s enable flag = %d\n", 9703 pSession->zName, ii); 9704 } 9705 }else 9706 9707 /* .session filter GLOB .... 9708 ** Set a list of GLOB patterns of table names to be excluded. 9709 */ 9710 if( strcmp(azCmd[0], "filter")==0 ){ 9711 int ii, nByte; 9712 if( nCmd<2 ) goto session_syntax_error; 9713 if( pAuxDb->nSession ){ 9714 for(ii=0; ii<pSession->nFilter; ii++){ 9715 sqlite3_free(pSession->azFilter[ii]); 9716 } 9717 sqlite3_free(pSession->azFilter); 9718 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 9719 pSession->azFilter = sqlite3_malloc( nByte ); 9720 if( pSession->azFilter==0 ){ 9721 raw_printf(stderr, "Error: out or memory\n"); 9722 exit(1); 9723 } 9724 for(ii=1; ii<nCmd; ii++){ 9725 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 9726 shell_check_oom(x); 9727 } 9728 pSession->nFilter = ii-1; 9729 } 9730 }else 9731 9732 /* .session indirect ?BOOLEAN? 9733 ** Query or set the indirect flag 9734 */ 9735 if( strcmp(azCmd[0], "indirect")==0 ){ 9736 int ii; 9737 if( nCmd>2 ) goto session_syntax_error; 9738 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 9739 if( pAuxDb->nSession ){ 9740 ii = sqlite3session_indirect(pSession->p, ii); 9741 utf8_printf(p->out, "session %s indirect flag = %d\n", 9742 pSession->zName, ii); 9743 } 9744 }else 9745 9746 /* .session isempty 9747 ** Determine if the session is empty 9748 */ 9749 if( strcmp(azCmd[0], "isempty")==0 ){ 9750 int ii; 9751 if( nCmd!=1 ) goto session_syntax_error; 9752 if( pAuxDb->nSession ){ 9753 ii = sqlite3session_isempty(pSession->p); 9754 utf8_printf(p->out, "session %s isempty flag = %d\n", 9755 pSession->zName, ii); 9756 } 9757 }else 9758 9759 /* .session list 9760 ** List all currently open sessions 9761 */ 9762 if( strcmp(azCmd[0],"list")==0 ){ 9763 for(i=0; i<pAuxDb->nSession; i++){ 9764 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName); 9765 } 9766 }else 9767 9768 /* .session open DB NAME 9769 ** Open a new session called NAME on the attached database DB. 9770 ** DB is normally "main". 9771 */ 9772 if( strcmp(azCmd[0],"open")==0 ){ 9773 char *zName; 9774 if( nCmd!=3 ) goto session_syntax_error; 9775 zName = azCmd[2]; 9776 if( zName[0]==0 ) goto session_syntax_error; 9777 for(i=0; i<pAuxDb->nSession; i++){ 9778 if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ 9779 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 9780 goto meta_command_exit; 9781 } 9782 } 9783 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ 9784 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); 9785 goto meta_command_exit; 9786 } 9787 pSession = &pAuxDb->aSession[pAuxDb->nSession]; 9788 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 9789 if( rc ){ 9790 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 9791 rc = 0; 9792 goto meta_command_exit; 9793 } 9794 pSession->nFilter = 0; 9795 sqlite3session_table_filter(pSession->p, session_filter, pSession); 9796 pAuxDb->nSession++; 9797 pSession->zName = sqlite3_mprintf("%s", zName); 9798 shell_check_oom(pSession->zName); 9799 }else 9800 /* If no command name matches, show a syntax error */ 9801 session_syntax_error: 9802 showHelp(p->out, "session"); 9803 }else 9804#endif 9805 9806#ifdef SQLITE_DEBUG 9807 /* Undocumented commands for internal testing. Subject to change 9808 ** without notice. */ 9809 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 9810 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 9811 int i, v; 9812 for(i=1; i<nArg; i++){ 9813 v = booleanValue(azArg[i]); 9814 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 9815 } 9816 } 9817 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 9818 int i; sqlite3_int64 v; 9819 for(i=1; i<nArg; i++){ 9820 char zBuf[200]; 9821 v = integerValue(azArg[i]); 9822 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 9823 utf8_printf(p->out, "%s", zBuf); 9824 } 9825 } 9826 }else 9827#endif 9828 9829 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 9830 int bIsInit = 0; /* True to initialize the SELFTEST table */ 9831 int bVerbose = 0; /* Verbose output */ 9832 int bSelftestExists; /* True if SELFTEST already exists */ 9833 int i, k; /* Loop counters */ 9834 int nTest = 0; /* Number of tests runs */ 9835 int nErr = 0; /* Number of errors seen */ 9836 ShellText str; /* Answer for a query */ 9837 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 9838 9839 open_db(p,0); 9840 for(i=1; i<nArg; i++){ 9841 const char *z = azArg[i]; 9842 if( z[0]=='-' && z[1]=='-' ) z++; 9843 if( strcmp(z,"-init")==0 ){ 9844 bIsInit = 1; 9845 }else 9846 if( strcmp(z,"-v")==0 ){ 9847 bVerbose++; 9848 }else 9849 { 9850 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 9851 azArg[i], azArg[0]); 9852 raw_printf(stderr, "Should be one of: --init -v\n"); 9853 rc = 1; 9854 goto meta_command_exit; 9855 } 9856 } 9857 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 9858 != SQLITE_OK ){ 9859 bSelftestExists = 0; 9860 }else{ 9861 bSelftestExists = 1; 9862 } 9863 if( bIsInit ){ 9864 createSelftestTable(p); 9865 bSelftestExists = 1; 9866 } 9867 initText(&str); 9868 appendText(&str, "x", 0); 9869 for(k=bSelftestExists; k>=0; k--){ 9870 if( k==1 ){ 9871 rc = sqlite3_prepare_v2(p->db, 9872 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 9873 -1, &pStmt, 0); 9874 }else{ 9875 rc = sqlite3_prepare_v2(p->db, 9876 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 9877 " (1,'run','PRAGMA integrity_check','ok')", 9878 -1, &pStmt, 0); 9879 } 9880 if( rc ){ 9881 raw_printf(stderr, "Error querying the selftest table\n"); 9882 rc = 1; 9883 sqlite3_finalize(pStmt); 9884 goto meta_command_exit; 9885 } 9886 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 9887 int tno = sqlite3_column_int(pStmt, 0); 9888 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 9889 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 9890 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 9891 9892 k = 0; 9893 if( bVerbose>0 ){ 9894 printf("%d: %s %s\n", tno, zOp, zSql); 9895 } 9896 if( strcmp(zOp,"memo")==0 ){ 9897 utf8_printf(p->out, "%s\n", zSql); 9898 }else 9899 if( strcmp(zOp,"run")==0 ){ 9900 char *zErrMsg = 0; 9901 str.n = 0; 9902 str.z[0] = 0; 9903 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 9904 nTest++; 9905 if( bVerbose ){ 9906 utf8_printf(p->out, "Result: %s\n", str.z); 9907 } 9908 if( rc || zErrMsg ){ 9909 nErr++; 9910 rc = 1; 9911 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 9912 sqlite3_free(zErrMsg); 9913 }else if( strcmp(zAns,str.z)!=0 ){ 9914 nErr++; 9915 rc = 1; 9916 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 9917 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 9918 } 9919 }else 9920 { 9921 utf8_printf(stderr, 9922 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 9923 rc = 1; 9924 break; 9925 } 9926 } /* End loop over rows of content from SELFTEST */ 9927 sqlite3_finalize(pStmt); 9928 } /* End loop over k */ 9929 freeText(&str); 9930 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 9931 }else 9932 9933 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 9934 if( nArg<2 || nArg>3 ){ 9935 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 9936 rc = 1; 9937 } 9938 if( nArg>=2 ){ 9939 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 9940 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 9941 } 9942 if( nArg>=3 ){ 9943 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 9944 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 9945 } 9946 }else 9947 9948 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 9949 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 9950 int i; /* Loop counter */ 9951 int bSchema = 0; /* Also hash the schema */ 9952 int bSeparate = 0; /* Hash each table separately */ 9953 int iSize = 224; /* Hash algorithm to use */ 9954 int bDebug = 0; /* Only show the query that would have run */ 9955 sqlite3_stmt *pStmt; /* For querying tables names */ 9956 char *zSql; /* SQL to be run */ 9957 char *zSep; /* Separator */ 9958 ShellText sSql; /* Complete SQL for the query to run the hash */ 9959 ShellText sQuery; /* Set of queries used to read all content */ 9960 open_db(p, 0); 9961 for(i=1; i<nArg; i++){ 9962 const char *z = azArg[i]; 9963 if( z[0]=='-' ){ 9964 z++; 9965 if( z[0]=='-' ) z++; 9966 if( strcmp(z,"schema")==0 ){ 9967 bSchema = 1; 9968 }else 9969 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 9970 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 9971 ){ 9972 iSize = atoi(&z[5]); 9973 }else 9974 if( strcmp(z,"debug")==0 ){ 9975 bDebug = 1; 9976 }else 9977 { 9978 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 9979 azArg[i], azArg[0]); 9980 showHelp(p->out, azArg[0]); 9981 rc = 1; 9982 goto meta_command_exit; 9983 } 9984 }else if( zLike ){ 9985 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 9986 rc = 1; 9987 goto meta_command_exit; 9988 }else{ 9989 zLike = z; 9990 bSeparate = 1; 9991 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 9992 } 9993 } 9994 if( bSchema ){ 9995 zSql = "SELECT lower(name) FROM sqlite_schema" 9996 " WHERE type='table' AND coalesce(rootpage,0)>1" 9997 " UNION ALL SELECT 'sqlite_schema'" 9998 " ORDER BY 1 collate nocase"; 9999 }else{ 10000 zSql = "SELECT lower(name) FROM sqlite_schema" 10001 " WHERE type='table' AND coalesce(rootpage,0)>1" 10002 " AND name NOT LIKE 'sqlite_%'" 10003 " ORDER BY 1 collate nocase"; 10004 } 10005 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 10006 initText(&sQuery); 10007 initText(&sSql); 10008 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 10009 zSep = "VALUES("; 10010 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 10011 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 10012 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 10013 if( strncmp(zTab, "sqlite_",7)!=0 ){ 10014 appendText(&sQuery,"SELECT * FROM ", 0); 10015 appendText(&sQuery,zTab,'"'); 10016 appendText(&sQuery," NOT INDEXED;", 0); 10017 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 10018 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 10019 " ORDER BY name;", 0); 10020 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 10021 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 10022 " ORDER BY name;", 0); 10023 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 10024 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 10025 " ORDER BY tbl,idx;", 0); 10026 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 10027 appendText(&sQuery, "SELECT * FROM ", 0); 10028 appendText(&sQuery, zTab, 0); 10029 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 10030 } 10031 appendText(&sSql, zSep, 0); 10032 appendText(&sSql, sQuery.z, '\''); 10033 sQuery.n = 0; 10034 appendText(&sSql, ",", 0); 10035 appendText(&sSql, zTab, '\''); 10036 zSep = "),("; 10037 } 10038 sqlite3_finalize(pStmt); 10039 if( bSeparate ){ 10040 zSql = sqlite3_mprintf( 10041 "%s))" 10042 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 10043 " FROM [sha3sum$query]", 10044 sSql.z, iSize); 10045 }else{ 10046 zSql = sqlite3_mprintf( 10047 "%s))" 10048 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 10049 " FROM [sha3sum$query]", 10050 sSql.z, iSize); 10051 } 10052 shell_check_oom(zSql); 10053 freeText(&sQuery); 10054 freeText(&sSql); 10055 if( bDebug ){ 10056 utf8_printf(p->out, "%s\n", zSql); 10057 }else{ 10058 shell_exec(p, zSql, 0); 10059 } 10060 sqlite3_free(zSql); 10061 }else 10062 10063#ifndef SQLITE_NOHAVE_SYSTEM 10064 if( c=='s' 10065 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 10066 ){ 10067 char *zCmd; 10068 int i, x; 10069 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 10070 if( nArg<2 ){ 10071 raw_printf(stderr, "Usage: .system COMMAND\n"); 10072 rc = 1; 10073 goto meta_command_exit; 10074 } 10075 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 10076 for(i=2; i<nArg && zCmd!=0; i++){ 10077 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 10078 zCmd, azArg[i]); 10079 } 10080 x = zCmd!=0 ? system(zCmd) : 1; 10081 sqlite3_free(zCmd); 10082 if( x ) raw_printf(stderr, "System command returns %d\n", x); 10083 }else 10084#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 10085 10086 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 10087 static const char *azBool[] = { "off", "on", "trigger", "full"}; 10088 const char *zOut; 10089 int i; 10090 if( nArg!=1 ){ 10091 raw_printf(stderr, "Usage: .show\n"); 10092 rc = 1; 10093 goto meta_command_exit; 10094 } 10095 utf8_printf(p->out, "%12.12s: %s\n","echo", 10096 azBool[ShellHasFlag(p, SHFLG_Echo)]); 10097 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 10098 utf8_printf(p->out, "%12.12s: %s\n","explain", 10099 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 10100 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 10101 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 10102 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 10103 output_c_string(p->out, p->nullValue); 10104 raw_printf(p->out, "\n"); 10105 utf8_printf(p->out,"%12.12s: %s\n","output", 10106 strlen30(p->outfile) ? p->outfile : "stdout"); 10107 utf8_printf(p->out,"%12.12s: ", "colseparator"); 10108 output_c_string(p->out, p->colSeparator); 10109 raw_printf(p->out, "\n"); 10110 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 10111 output_c_string(p->out, p->rowSeparator); 10112 raw_printf(p->out, "\n"); 10113 switch( p->statsOn ){ 10114 case 0: zOut = "off"; break; 10115 default: zOut = "on"; break; 10116 case 2: zOut = "stmt"; break; 10117 case 3: zOut = "vmstep"; break; 10118 } 10119 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut); 10120 utf8_printf(p->out, "%12.12s: ", "width"); 10121 for (i=0;i<p->nWidth;i++) { 10122 raw_printf(p->out, "%d ", p->colWidth[i]); 10123 } 10124 raw_printf(p->out, "\n"); 10125 utf8_printf(p->out, "%12.12s: %s\n", "filename", 10126 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); 10127 }else 10128 10129 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 10130 if( nArg==2 ){ 10131 if( strcmp(azArg[1],"stmt")==0 ){ 10132 p->statsOn = 2; 10133 }else if( strcmp(azArg[1],"vmstep")==0 ){ 10134 p->statsOn = 3; 10135 }else{ 10136 p->statsOn = (u8)booleanValue(azArg[1]); 10137 } 10138 }else if( nArg==1 ){ 10139 display_stats(p->db, p, 0); 10140 }else{ 10141 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n"); 10142 rc = 1; 10143 } 10144 }else 10145 10146 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 10147 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 10148 || strncmp(azArg[0], "indexes", n)==0) ) 10149 ){ 10150 sqlite3_stmt *pStmt; 10151 char **azResult; 10152 int nRow, nAlloc; 10153 int ii; 10154 ShellText s; 10155 initText(&s); 10156 open_db(p, 0); 10157 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 10158 if( rc ){ 10159 sqlite3_finalize(pStmt); 10160 return shellDatabaseError(p->db); 10161 } 10162 10163 if( nArg>2 && c=='i' ){ 10164 /* It is an historical accident that the .indexes command shows an error 10165 ** when called with the wrong number of arguments whereas the .tables 10166 ** command does not. */ 10167 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 10168 rc = 1; 10169 sqlite3_finalize(pStmt); 10170 goto meta_command_exit; 10171 } 10172 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 10173 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 10174 if( zDbName==0 ) continue; 10175 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 10176 if( sqlite3_stricmp(zDbName, "main")==0 ){ 10177 appendText(&s, "SELECT name FROM ", 0); 10178 }else{ 10179 appendText(&s, "SELECT ", 0); 10180 appendText(&s, zDbName, '\''); 10181 appendText(&s, "||'.'||name FROM ", 0); 10182 } 10183 appendText(&s, zDbName, '"'); 10184 appendText(&s, ".sqlite_schema ", 0); 10185 if( c=='t' ){ 10186 appendText(&s," WHERE type IN ('table','view')" 10187 " AND name NOT LIKE 'sqlite_%'" 10188 " AND name LIKE ?1", 0); 10189 }else{ 10190 appendText(&s," WHERE type='index'" 10191 " AND tbl_name LIKE ?1", 0); 10192 } 10193 } 10194 rc = sqlite3_finalize(pStmt); 10195 if( rc==SQLITE_OK ){ 10196 appendText(&s, " ORDER BY 1", 0); 10197 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 10198 } 10199 freeText(&s); 10200 if( rc ) return shellDatabaseError(p->db); 10201 10202 /* Run the SQL statement prepared by the above block. Store the results 10203 ** as an array of nul-terminated strings in azResult[]. */ 10204 nRow = nAlloc = 0; 10205 azResult = 0; 10206 if( nArg>1 ){ 10207 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 10208 }else{ 10209 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 10210 } 10211 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 10212 if( nRow>=nAlloc ){ 10213 char **azNew; 10214 int n2 = nAlloc*2 + 10; 10215 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 10216 shell_check_oom(azNew); 10217 nAlloc = n2; 10218 azResult = azNew; 10219 } 10220 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 10221 shell_check_oom(azResult[nRow]); 10222 nRow++; 10223 } 10224 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 10225 rc = shellDatabaseError(p->db); 10226 } 10227 10228 /* Pretty-print the contents of array azResult[] to the output */ 10229 if( rc==0 && nRow>0 ){ 10230 int len, maxlen = 0; 10231 int i, j; 10232 int nPrintCol, nPrintRow; 10233 for(i=0; i<nRow; i++){ 10234 len = strlen30(azResult[i]); 10235 if( len>maxlen ) maxlen = len; 10236 } 10237 nPrintCol = 80/(maxlen+2); 10238 if( nPrintCol<1 ) nPrintCol = 1; 10239 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 10240 for(i=0; i<nPrintRow; i++){ 10241 for(j=i; j<nRow; j+=nPrintRow){ 10242 char *zSp = j<nPrintRow ? "" : " "; 10243 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 10244 azResult[j] ? azResult[j]:""); 10245 } 10246 raw_printf(p->out, "\n"); 10247 } 10248 } 10249 10250 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 10251 sqlite3_free(azResult); 10252 }else 10253 10254 /* Begin redirecting output to the file "testcase-out.txt" */ 10255 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 10256 output_reset(p); 10257 p->out = output_file_open("testcase-out.txt", 0); 10258 if( p->out==0 ){ 10259 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 10260 } 10261 if( nArg>=2 ){ 10262 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 10263 }else{ 10264 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 10265 } 10266 }else 10267 10268#ifndef SQLITE_UNTESTABLE 10269 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 10270 static const struct { 10271 const char *zCtrlName; /* Name of a test-control option */ 10272 int ctrlCode; /* Integer code for that option */ 10273 int unSafe; /* Not valid for --safe mode */ 10274 const char *zUsage; /* Usage notes */ 10275 } aCtrl[] = { 10276 { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" }, 10277 { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" }, 10278 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/ 10279 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/ 10280 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" }, 10281 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" }, 10282 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/ 10283 { "imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, 10284 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, 10285 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, 10286 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, 10287 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, 10288#ifdef YYCOVERAGE 10289 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" }, 10290#endif 10291 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " }, 10292 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" }, 10293 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" }, 10294 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" }, 10295 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" }, 10296 { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" }, 10297 { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" }, 10298 }; 10299 int testctrl = -1; 10300 int iCtrl = -1; 10301 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 10302 int isOk = 0; 10303 int i, n2; 10304 const char *zCmd = 0; 10305 10306 open_db(p, 0); 10307 zCmd = nArg>=2 ? azArg[1] : "help"; 10308 10309 /* The argument can optionally begin with "-" or "--" */ 10310 if( zCmd[0]=='-' && zCmd[1] ){ 10311 zCmd++; 10312 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 10313 } 10314 10315 /* --help lists all test-controls */ 10316 if( strcmp(zCmd,"help")==0 ){ 10317 utf8_printf(p->out, "Available test-controls:\n"); 10318 for(i=0; i<ArraySize(aCtrl); i++){ 10319 utf8_printf(p->out, " .testctrl %s %s\n", 10320 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 10321 } 10322 rc = 1; 10323 goto meta_command_exit; 10324 } 10325 10326 /* convert testctrl text option to value. allow any unique prefix 10327 ** of the option name, or a numerical value. */ 10328 n2 = strlen30(zCmd); 10329 for(i=0; i<ArraySize(aCtrl); i++){ 10330 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 10331 if( testctrl<0 ){ 10332 testctrl = aCtrl[i].ctrlCode; 10333 iCtrl = i; 10334 }else{ 10335 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 10336 "Use \".testctrl --help\" for help\n", zCmd); 10337 rc = 1; 10338 goto meta_command_exit; 10339 } 10340 } 10341 } 10342 if( testctrl<0 ){ 10343 utf8_printf(stderr,"Error: unknown test-control: %s\n" 10344 "Use \".testctrl --help\" for help\n", zCmd); 10345 }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){ 10346 utf8_printf(stderr, 10347 "line %d: \".testctrl %s\" may not be used in safe mode\n", 10348 p->lineno, aCtrl[iCtrl].zCtrlName); 10349 exit(1); 10350 }else{ 10351 switch(testctrl){ 10352 10353 /* sqlite3_test_control(int, db, int) */ 10354 case SQLITE_TESTCTRL_OPTIMIZATIONS: 10355 if( nArg==3 ){ 10356 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0); 10357 rc2 = sqlite3_test_control(testctrl, p->db, opt); 10358 isOk = 3; 10359 } 10360 break; 10361 10362 /* sqlite3_test_control(int) */ 10363 case SQLITE_TESTCTRL_PRNG_SAVE: 10364 case SQLITE_TESTCTRL_PRNG_RESTORE: 10365 case SQLITE_TESTCTRL_BYTEORDER: 10366 if( nArg==2 ){ 10367 rc2 = sqlite3_test_control(testctrl); 10368 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 10369 } 10370 break; 10371 10372 /* sqlite3_test_control(int, uint) */ 10373 case SQLITE_TESTCTRL_PENDING_BYTE: 10374 if( nArg==3 ){ 10375 unsigned int opt = (unsigned int)integerValue(azArg[2]); 10376 rc2 = sqlite3_test_control(testctrl, opt); 10377 isOk = 3; 10378 } 10379 break; 10380 10381 /* sqlite3_test_control(int, int, sqlite3*) */ 10382 case SQLITE_TESTCTRL_PRNG_SEED: 10383 if( nArg==3 || nArg==4 ){ 10384 int ii = (int)integerValue(azArg[2]); 10385 sqlite3 *db; 10386 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 10387 sqlite3_randomness(sizeof(ii),&ii); 10388 printf("-- random seed: %d\n", ii); 10389 } 10390 if( nArg==3 ){ 10391 db = 0; 10392 }else{ 10393 db = p->db; 10394 /* Make sure the schema has been loaded */ 10395 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 10396 } 10397 rc2 = sqlite3_test_control(testctrl, ii, db); 10398 isOk = 3; 10399 } 10400 break; 10401 10402 /* sqlite3_test_control(int, int) */ 10403 case SQLITE_TESTCTRL_ASSERT: 10404 case SQLITE_TESTCTRL_ALWAYS: 10405 if( nArg==3 ){ 10406 int opt = booleanValue(azArg[2]); 10407 rc2 = sqlite3_test_control(testctrl, opt); 10408 isOk = 1; 10409 } 10410 break; 10411 10412 /* sqlite3_test_control(int, int) */ 10413 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 10414 case SQLITE_TESTCTRL_NEVER_CORRUPT: 10415 if( nArg==3 ){ 10416 int opt = booleanValue(azArg[2]); 10417 rc2 = sqlite3_test_control(testctrl, opt); 10418 isOk = 3; 10419 } 10420 break; 10421 10422 /* sqlite3_test_control(sqlite3*) */ 10423 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 10424 rc2 = sqlite3_test_control(testctrl, p->db); 10425 isOk = 3; 10426 break; 10427 10428 case SQLITE_TESTCTRL_IMPOSTER: 10429 if( nArg==5 ){ 10430 rc2 = sqlite3_test_control(testctrl, p->db, 10431 azArg[2], 10432 integerValue(azArg[3]), 10433 integerValue(azArg[4])); 10434 isOk = 3; 10435 } 10436 break; 10437 10438 case SQLITE_TESTCTRL_SEEK_COUNT: { 10439 u64 x = 0; 10440 rc2 = sqlite3_test_control(testctrl, p->db, &x); 10441 utf8_printf(p->out, "%llu\n", x); 10442 isOk = 3; 10443 break; 10444 } 10445 10446#ifdef YYCOVERAGE 10447 case SQLITE_TESTCTRL_PARSER_COVERAGE: { 10448 if( nArg==2 ){ 10449 sqlite3_test_control(testctrl, p->out); 10450 isOk = 3; 10451 } 10452 break; 10453 } 10454#endif 10455#ifdef SQLITE_DEBUG 10456 case SQLITE_TESTCTRL_TUNE: { 10457 if( nArg==4 ){ 10458 int id = (int)integerValue(azArg[2]); 10459 int val = (int)integerValue(azArg[3]); 10460 sqlite3_test_control(testctrl, id, &val); 10461 isOk = 3; 10462 }else if( nArg==3 ){ 10463 int id = (int)integerValue(azArg[2]); 10464 sqlite3_test_control(testctrl, -id, &rc2); 10465 isOk = 1; 10466 }else if( nArg==2 ){ 10467 int id = 1; 10468 while(1){ 10469 int val = 0; 10470 rc2 = sqlite3_test_control(testctrl, -id, &val); 10471 if( rc2!=SQLITE_OK ) break; 10472 if( id>1 ) utf8_printf(p->out, " "); 10473 utf8_printf(p->out, "%d: %d", id, val); 10474 id++; 10475 } 10476 if( id>1 ) utf8_printf(p->out, "\n"); 10477 isOk = 3; 10478 } 10479 break; 10480 } 10481#endif 10482 case SQLITE_TESTCTRL_SORTER_MMAP: 10483 if( nArg==3 ){ 10484 int opt = (unsigned int)integerValue(azArg[2]); 10485 rc2 = sqlite3_test_control(testctrl, p->db, opt); 10486 isOk = 3; 10487 } 10488 break; 10489 } 10490 } 10491 if( isOk==0 && iCtrl>=0 ){ 10492 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 10493 rc = 1; 10494 }else if( isOk==1 ){ 10495 raw_printf(p->out, "%d\n", rc2); 10496 }else if( isOk==2 ){ 10497 raw_printf(p->out, "0x%08x\n", rc2); 10498 } 10499 }else 10500#endif /* !defined(SQLITE_UNTESTABLE) */ 10501 10502 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 10503 open_db(p, 0); 10504 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 10505 }else 10506 10507 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 10508 if( nArg==2 ){ 10509 enableTimer = booleanValue(azArg[1]); 10510 if( enableTimer && !HAS_TIMER ){ 10511 raw_printf(stderr, "Error: timer not available on this system.\n"); 10512 enableTimer = 0; 10513 } 10514 }else{ 10515 raw_printf(stderr, "Usage: .timer on|off\n"); 10516 rc = 1; 10517 } 10518 }else 10519 10520#ifndef SQLITE_OMIT_TRACE 10521 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 10522 int mType = 0; 10523 int jj; 10524 open_db(p, 0); 10525 for(jj=1; jj<nArg; jj++){ 10526 const char *z = azArg[jj]; 10527 if( z[0]=='-' ){ 10528 if( optionMatch(z, "expanded") ){ 10529 p->eTraceType = SHELL_TRACE_EXPANDED; 10530 } 10531#ifdef SQLITE_ENABLE_NORMALIZE 10532 else if( optionMatch(z, "normalized") ){ 10533 p->eTraceType = SHELL_TRACE_NORMALIZED; 10534 } 10535#endif 10536 else if( optionMatch(z, "plain") ){ 10537 p->eTraceType = SHELL_TRACE_PLAIN; 10538 } 10539 else if( optionMatch(z, "profile") ){ 10540 mType |= SQLITE_TRACE_PROFILE; 10541 } 10542 else if( optionMatch(z, "row") ){ 10543 mType |= SQLITE_TRACE_ROW; 10544 } 10545 else if( optionMatch(z, "stmt") ){ 10546 mType |= SQLITE_TRACE_STMT; 10547 } 10548 else if( optionMatch(z, "close") ){ 10549 mType |= SQLITE_TRACE_CLOSE; 10550 } 10551 else { 10552 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 10553 rc = 1; 10554 goto meta_command_exit; 10555 } 10556 }else{ 10557 output_file_close(p->traceOut); 10558 p->traceOut = output_file_open(azArg[1], 0); 10559 } 10560 } 10561 if( p->traceOut==0 ){ 10562 sqlite3_trace_v2(p->db, 0, 0, 0); 10563 }else{ 10564 if( mType==0 ) mType = SQLITE_TRACE_STMT; 10565 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 10566 } 10567 }else 10568#endif /* !defined(SQLITE_OMIT_TRACE) */ 10569 10570#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 10571 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 10572 int ii; 10573 int lenOpt; 10574 char *zOpt; 10575 if( nArg<2 ){ 10576 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 10577 rc = 1; 10578 goto meta_command_exit; 10579 } 10580 open_db(p, 0); 10581 zOpt = azArg[1]; 10582 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 10583 lenOpt = (int)strlen(zOpt); 10584 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 10585 assert( azArg[nArg]==0 ); 10586 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 10587 }else{ 10588 for(ii=1; ii<nArg; ii++){ 10589 sqlite3_create_module(p->db, azArg[ii], 0, 0); 10590 } 10591 } 10592 }else 10593#endif 10594 10595#if SQLITE_USER_AUTHENTICATION 10596 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 10597 if( nArg<2 ){ 10598 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 10599 rc = 1; 10600 goto meta_command_exit; 10601 } 10602 open_db(p, 0); 10603 if( strcmp(azArg[1],"login")==0 ){ 10604 if( nArg!=4 ){ 10605 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 10606 rc = 1; 10607 goto meta_command_exit; 10608 } 10609 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 10610 strlen30(azArg[3])); 10611 if( rc ){ 10612 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 10613 rc = 1; 10614 } 10615 }else if( strcmp(azArg[1],"add")==0 ){ 10616 if( nArg!=5 ){ 10617 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 10618 rc = 1; 10619 goto meta_command_exit; 10620 } 10621 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 10622 booleanValue(azArg[4])); 10623 if( rc ){ 10624 raw_printf(stderr, "User-Add failed: %d\n", rc); 10625 rc = 1; 10626 } 10627 }else if( strcmp(azArg[1],"edit")==0 ){ 10628 if( nArg!=5 ){ 10629 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 10630 rc = 1; 10631 goto meta_command_exit; 10632 } 10633 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 10634 booleanValue(azArg[4])); 10635 if( rc ){ 10636 raw_printf(stderr, "User-Edit failed: %d\n", rc); 10637 rc = 1; 10638 } 10639 }else if( strcmp(azArg[1],"delete")==0 ){ 10640 if( nArg!=3 ){ 10641 raw_printf(stderr, "Usage: .user delete USER\n"); 10642 rc = 1; 10643 goto meta_command_exit; 10644 } 10645 rc = sqlite3_user_delete(p->db, azArg[2]); 10646 if( rc ){ 10647 raw_printf(stderr, "User-Delete failed: %d\n", rc); 10648 rc = 1; 10649 } 10650 }else{ 10651 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 10652 rc = 1; 10653 goto meta_command_exit; 10654 } 10655 }else 10656#endif /* SQLITE_USER_AUTHENTICATION */ 10657 10658 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 10659 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 10660 sqlite3_libversion(), sqlite3_sourceid()); 10661#if SQLITE_HAVE_ZLIB 10662 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 10663#endif 10664#define CTIMEOPT_VAL_(opt) #opt 10665#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 10666#if defined(__clang__) && defined(__clang_major__) 10667 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 10668 CTIMEOPT_VAL(__clang_minor__) "." 10669 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 10670#elif defined(_MSC_VER) 10671 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 10672#elif defined(__GNUC__) && defined(__VERSION__) 10673 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 10674#endif 10675 }else 10676 10677 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 10678 const char *zDbName = nArg==2 ? azArg[1] : "main"; 10679 sqlite3_vfs *pVfs = 0; 10680 if( p->db ){ 10681 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 10682 if( pVfs ){ 10683 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 10684 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 10685 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 10686 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 10687 } 10688 } 10689 }else 10690 10691 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 10692 sqlite3_vfs *pVfs; 10693 sqlite3_vfs *pCurrent = 0; 10694 if( p->db ){ 10695 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 10696 } 10697 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 10698 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 10699 pVfs==pCurrent ? " <--- CURRENT" : ""); 10700 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 10701 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 10702 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 10703 if( pVfs->pNext ){ 10704 raw_printf(p->out, "-----------------------------------\n"); 10705 } 10706 } 10707 }else 10708 10709 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 10710 const char *zDbName = nArg==2 ? azArg[1] : "main"; 10711 char *zVfsName = 0; 10712 if( p->db ){ 10713 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 10714 if( zVfsName ){ 10715 utf8_printf(p->out, "%s\n", zVfsName); 10716 sqlite3_free(zVfsName); 10717 } 10718 } 10719 }else 10720 10721 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 10722 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 10723 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x); 10724 }else 10725 10726 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 10727 int j; 10728 assert( nArg<=ArraySize(azArg) ); 10729 p->nWidth = nArg-1; 10730 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); 10731 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 10732 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 10733 for(j=1; j<nArg; j++){ 10734 p->colWidth[j-1] = (int)integerValue(azArg[j]); 10735 } 10736 }else 10737 10738 { 10739 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 10740 " \"%s\". Enter \".help\" for help\n", azArg[0]); 10741 rc = 1; 10742 } 10743 10744meta_command_exit: 10745 if( p->outCount ){ 10746 p->outCount--; 10747 if( p->outCount==0 ) output_reset(p); 10748 } 10749 p->bSafeMode = p->bSafeModePersist; 10750 return rc; 10751} 10752 10753/* Line scan result and intermediate states (supporting scan resumption) 10754*/ 10755#ifndef CHAR_BIT 10756# define CHAR_BIT 8 10757#endif 10758typedef enum { 10759 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT, 10760 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT, 10761 QSS_Start = 0 10762} QuickScanState; 10763#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask)) 10764#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start) 10765#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start) 10766#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark) 10767#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi) 10768 10769/* 10770** Scan line for classification to guide shell's handling. 10771** The scan is resumable for subsequent lines when prior 10772** return values are passed as the 2nd argument. 10773*/ 10774static QuickScanState quickscan(char *zLine, QuickScanState qss){ 10775 char cin; 10776 char cWait = (char)qss; /* intentional narrowing loss */ 10777 if( cWait==0 ){ 10778 PlainScan: 10779 assert( cWait==0 ); 10780 while( (cin = *zLine++)!=0 ){ 10781 if( IsSpace(cin) ) 10782 continue; 10783 switch (cin){ 10784 case '-': 10785 if( *zLine!='-' ) 10786 break; 10787 while((cin = *++zLine)!=0 ) 10788 if( cin=='\n') 10789 goto PlainScan; 10790 return qss; 10791 case ';': 10792 qss |= QSS_EndingSemi; 10793 continue; 10794 case '/': 10795 if( *zLine=='*' ){ 10796 ++zLine; 10797 cWait = '*'; 10798 qss = QSS_SETV(qss, cWait); 10799 goto TermScan; 10800 } 10801 break; 10802 case '[': 10803 cin = ']'; 10804 /* fall thru */ 10805 case '`': case '\'': case '"': 10806 cWait = cin; 10807 qss = QSS_HasDark | cWait; 10808 goto TermScan; 10809 default: 10810 break; 10811 } 10812 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark; 10813 } 10814 }else{ 10815 TermScan: 10816 while( (cin = *zLine++)!=0 ){ 10817 if( cin==cWait ){ 10818 switch( cWait ){ 10819 case '*': 10820 if( *zLine != '/' ) 10821 continue; 10822 ++zLine; 10823 cWait = 0; 10824 qss = QSS_SETV(qss, 0); 10825 goto PlainScan; 10826 case '`': case '\'': case '"': 10827 if(*zLine==cWait){ 10828 ++zLine; 10829 continue; 10830 } 10831 /* fall thru */ 10832 case ']': 10833 cWait = 0; 10834 qss = QSS_SETV(qss, 0); 10835 goto PlainScan; 10836 default: assert(0); 10837 } 10838 } 10839 } 10840 } 10841 return qss; 10842} 10843 10844/* 10845** Return TRUE if the line typed in is an SQL command terminator other 10846** than a semi-colon. The SQL Server style "go" command is understood 10847** as is the Oracle "/". 10848*/ 10849static int line_is_command_terminator(char *zLine){ 10850 while( IsSpace(zLine[0]) ){ zLine++; }; 10851 if( zLine[0]=='/' ) 10852 zLine += 1; /* Oracle */ 10853 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' ) 10854 zLine += 2; /* SQL Server */ 10855 else 10856 return 0; 10857 return quickscan(zLine,QSS_Start)==QSS_Start; 10858} 10859 10860/* 10861** We need a default sqlite3_complete() implementation to use in case 10862** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 10863** any arbitrary text is a complete SQL statement. This is not very 10864** user-friendly, but it does seem to work. 10865*/ 10866#ifdef SQLITE_OMIT_COMPLETE 10867#define sqlite3_complete(x) 1 10868#endif 10869 10870/* 10871** Return true if zSql is a complete SQL statement. Return false if it 10872** ends in the middle of a string literal or C-style comment. 10873*/ 10874static int line_is_complete(char *zSql, int nSql){ 10875 int rc; 10876 if( zSql==0 ) return 1; 10877 zSql[nSql] = ';'; 10878 zSql[nSql+1] = 0; 10879 rc = sqlite3_complete(zSql); 10880 zSql[nSql] = 0; 10881 return rc; 10882} 10883 10884/* 10885** Run a single line of SQL. Return the number of errors. 10886*/ 10887static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 10888 int rc; 10889 char *zErrMsg = 0; 10890 10891 open_db(p, 0); 10892 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 10893 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 10894 BEGIN_TIMER; 10895 rc = shell_exec(p, zSql, &zErrMsg); 10896 END_TIMER; 10897 if( rc || zErrMsg ){ 10898 char zPrefix[100]; 10899 if( in!=0 || !stdin_is_interactive ){ 10900 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 10901 "Error: near line %d:", startline); 10902 }else{ 10903 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 10904 } 10905 if( zErrMsg!=0 ){ 10906 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 10907 sqlite3_free(zErrMsg); 10908 zErrMsg = 0; 10909 }else{ 10910 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 10911 } 10912 return 1; 10913 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 10914 char zLineBuf[2000]; 10915 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, 10916 "changes: %lld total_changes: %lld", 10917 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); 10918 raw_printf(p->out, "%s\n", zLineBuf); 10919 } 10920 return 0; 10921} 10922 10923 10924/* 10925** Read input from *in and process it. If *in==0 then input 10926** is interactive - the user is typing it it. Otherwise, input 10927** is coming from a file or device. A prompt is issued and history 10928** is saved only if input is interactive. An interrupt signal will 10929** cause this routine to exit immediately, unless input is interactive. 10930** 10931** Return the number of errors. 10932*/ 10933static int process_input(ShellState *p){ 10934 char *zLine = 0; /* A single input line */ 10935 char *zSql = 0; /* Accumulated SQL text */ 10936 int nLine; /* Length of current line */ 10937 int nSql = 0; /* Bytes of zSql[] used */ 10938 int nAlloc = 0; /* Allocated zSql[] space */ 10939 int rc; /* Error code */ 10940 int errCnt = 0; /* Number of errors seen */ 10941 int startline = 0; /* Line number for start of current input */ 10942 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */ 10943 10944 p->lineno = 0; 10945 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 10946 fflush(p->out); 10947 zLine = one_input_line(p->in, zLine, nSql>0); 10948 if( zLine==0 ){ 10949 /* End of input */ 10950 if( p->in==0 && stdin_is_interactive ) printf("\n"); 10951 break; 10952 } 10953 if( seenInterrupt ){ 10954 if( p->in!=0 ) break; 10955 seenInterrupt = 0; 10956 } 10957 p->lineno++; 10958 if( QSS_INPLAIN(qss) 10959 && line_is_command_terminator(zLine) 10960 && line_is_complete(zSql, nSql) ){ 10961 memcpy(zLine,";",2); 10962 } 10963 qss = quickscan(zLine, qss); 10964 if( QSS_PLAINWHITE(qss) && nSql==0 ){ 10965 if( ShellHasFlag(p, SHFLG_Echo) ) 10966 printf("%s\n", zLine); 10967 /* Just swallow single-line whitespace */ 10968 qss = QSS_Start; 10969 continue; 10970 } 10971 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 10972 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 10973 if( zLine[0]=='.' ){ 10974 rc = do_meta_command(zLine, p); 10975 if( rc==2 ){ /* exit requested */ 10976 break; 10977 }else if( rc ){ 10978 errCnt++; 10979 } 10980 } 10981 qss = QSS_Start; 10982 continue; 10983 } 10984 /* No single-line dispositions remain; accumulate line(s). */ 10985 nLine = strlen30(zLine); 10986 if( nSql+nLine+2>=nAlloc ){ 10987 /* Grow buffer by half-again increments when big. */ 10988 nAlloc = nSql+(nSql>>1)+nLine+100; 10989 zSql = realloc(zSql, nAlloc); 10990 shell_check_oom(zSql); 10991 } 10992 if( nSql==0 ){ 10993 int i; 10994 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 10995 assert( nAlloc>0 && zSql!=0 ); 10996 memcpy(zSql, zLine+i, nLine+1-i); 10997 startline = p->lineno; 10998 nSql = nLine-i; 10999 }else{ 11000 zSql[nSql++] = '\n'; 11001 memcpy(zSql+nSql, zLine, nLine+1); 11002 nSql += nLine; 11003 } 11004 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ 11005 errCnt += runOneSqlLine(p, zSql, p->in, startline); 11006 nSql = 0; 11007 if( p->outCount ){ 11008 output_reset(p); 11009 p->outCount = 0; 11010 }else{ 11011 clearTempFile(p); 11012 } 11013 p->bSafeMode = p->bSafeModePersist; 11014 qss = QSS_Start; 11015 }else if( nSql && QSS_PLAINWHITE(qss) ){ 11016 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 11017 nSql = 0; 11018 qss = QSS_Start; 11019 } 11020 } 11021 if( nSql && QSS_PLAINDARK(qss) ){ 11022 errCnt += runOneSqlLine(p, zSql, p->in, startline); 11023 } 11024 free(zSql); 11025 free(zLine); 11026 return errCnt>0; 11027} 11028 11029/* 11030** Return a pathname which is the user's home directory. A 11031** 0 return indicates an error of some kind. 11032*/ 11033static char *find_home_dir(int clearFlag){ 11034 static char *home_dir = NULL; 11035 if( clearFlag ){ 11036 free(home_dir); 11037 home_dir = 0; 11038 return 0; 11039 } 11040 if( home_dir ) return home_dir; 11041 11042#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 11043 && !defined(__RTP__) && !defined(_WRS_KERNEL) 11044 { 11045 struct passwd *pwent; 11046 uid_t uid = getuid(); 11047 if( (pwent=getpwuid(uid)) != NULL) { 11048 home_dir = pwent->pw_dir; 11049 } 11050 } 11051#endif 11052 11053#if defined(_WIN32_WCE) 11054 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 11055 */ 11056 home_dir = "/"; 11057#else 11058 11059#if defined(_WIN32) || defined(WIN32) 11060 if (!home_dir) { 11061 home_dir = getenv("USERPROFILE"); 11062 } 11063#endif 11064 11065 if (!home_dir) { 11066 home_dir = getenv("HOME"); 11067 } 11068 11069#if defined(_WIN32) || defined(WIN32) 11070 if (!home_dir) { 11071 char *zDrive, *zPath; 11072 int n; 11073 zDrive = getenv("HOMEDRIVE"); 11074 zPath = getenv("HOMEPATH"); 11075 if( zDrive && zPath ){ 11076 n = strlen30(zDrive) + strlen30(zPath) + 1; 11077 home_dir = malloc( n ); 11078 if( home_dir==0 ) return 0; 11079 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 11080 return home_dir; 11081 } 11082 home_dir = "c:\\"; 11083 } 11084#endif 11085 11086#endif /* !_WIN32_WCE */ 11087 11088 if( home_dir ){ 11089 int n = strlen30(home_dir) + 1; 11090 char *z = malloc( n ); 11091 if( z ) memcpy(z, home_dir, n); 11092 home_dir = z; 11093 } 11094 11095 return home_dir; 11096} 11097 11098/* 11099** Read input from the file given by sqliterc_override. Or if that 11100** parameter is NULL, take input from ~/.sqliterc 11101** 11102** Returns the number of errors. 11103*/ 11104static void process_sqliterc( 11105 ShellState *p, /* Configuration data */ 11106 const char *sqliterc_override /* Name of config file. NULL to use default */ 11107){ 11108 char *home_dir = NULL; 11109 const char *sqliterc = sqliterc_override; 11110 char *zBuf = 0; 11111 FILE *inSaved = p->in; 11112 int savedLineno = p->lineno; 11113 11114 if (sqliterc == NULL) { 11115 home_dir = find_home_dir(0); 11116 if( home_dir==0 ){ 11117 raw_printf(stderr, "-- warning: cannot find home directory;" 11118 " cannot read ~/.sqliterc\n"); 11119 return; 11120 } 11121 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 11122 shell_check_oom(zBuf); 11123 sqliterc = zBuf; 11124 } 11125 p->in = fopen(sqliterc,"rb"); 11126 if( p->in ){ 11127 if( stdin_is_interactive ){ 11128 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 11129 } 11130 if( process_input(p) && bail_on_error ) exit(1); 11131 fclose(p->in); 11132 }else if( sqliterc_override!=0 ){ 11133 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc); 11134 if( bail_on_error ) exit(1); 11135 } 11136 p->in = inSaved; 11137 p->lineno = savedLineno; 11138 sqlite3_free(zBuf); 11139} 11140 11141/* 11142** Show available command line options 11143*/ 11144static const char zOptions[] = 11145#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 11146 " -A ARGS... run \".archive ARGS\" and exit\n" 11147#endif 11148 " -append append the database to the end of the file\n" 11149 " -ascii set output mode to 'ascii'\n" 11150 " -bail stop after hitting an error\n" 11151 " -batch force batch I/O\n" 11152 " -box set output mode to 'box'\n" 11153 " -column set output mode to 'column'\n" 11154 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 11155 " -csv set output mode to 'csv'\n" 11156#if !defined(SQLITE_OMIT_DESERIALIZE) 11157 " -deserialize open the database using sqlite3_deserialize()\n" 11158#endif 11159 " -echo print commands before execution\n" 11160 " -init FILENAME read/process named file\n" 11161 " -[no]header turn headers on or off\n" 11162#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11163 " -heap SIZE Size of heap for memsys3 or memsys5\n" 11164#endif 11165 " -help show this message\n" 11166 " -html set output mode to HTML\n" 11167 " -interactive force interactive I/O\n" 11168 " -json set output mode to 'json'\n" 11169 " -line set output mode to 'line'\n" 11170 " -list set output mode to 'list'\n" 11171 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 11172 " -markdown set output mode to 'markdown'\n" 11173#if !defined(SQLITE_OMIT_DESERIALIZE) 11174 " -maxsize N maximum size for a --deserialize database\n" 11175#endif 11176 " -memtrace trace all memory allocations and deallocations\n" 11177 " -mmap N default mmap size set to N\n" 11178#ifdef SQLITE_ENABLE_MULTIPLEX 11179 " -multiplex enable the multiplexor VFS\n" 11180#endif 11181 " -newline SEP set output row separator. Default: '\\n'\n" 11182 " -nofollow refuse to open symbolic links to database files\n" 11183 " -nonce STRING set the safe-mode escape nonce\n" 11184 " -nullvalue TEXT set text string for NULL values. Default ''\n" 11185 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 11186 " -quote set output mode to 'quote'\n" 11187 " -readonly open the database read-only\n" 11188 " -safe enable safe-mode\n" 11189 " -separator SEP set output column separator. Default: '|'\n" 11190#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11191 " -sorterref SIZE sorter references threshold size\n" 11192#endif 11193 " -stats print memory stats before each finalize\n" 11194 " -table set output mode to 'table'\n" 11195 " -tabs set output mode to 'tabs'\n" 11196 " -version show SQLite version\n" 11197 " -vfs NAME use NAME as the default VFS\n" 11198#ifdef SQLITE_ENABLE_VFSTRACE 11199 " -vfstrace enable tracing of all VFS calls\n" 11200#endif 11201#ifdef SQLITE_HAVE_ZLIB 11202 " -zip open the file as a ZIP Archive\n" 11203#endif 11204; 11205static void usage(int showDetail){ 11206 utf8_printf(stderr, 11207 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 11208 "FILENAME is the name of an SQLite database. A new database is created\n" 11209 "if the file does not previously exist.\n", Argv0); 11210 if( showDetail ){ 11211 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 11212 }else{ 11213 raw_printf(stderr, "Use the -help option for additional information\n"); 11214 } 11215 exit(1); 11216} 11217 11218/* 11219** Internal check: Verify that the SQLite is uninitialized. Print a 11220** error message if it is initialized. 11221*/ 11222static void verify_uninitialized(void){ 11223 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 11224 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 11225 " initialization.\n"); 11226 } 11227} 11228 11229/* 11230** Initialize the state information in data 11231*/ 11232static void main_init(ShellState *data) { 11233 memset(data, 0, sizeof(*data)); 11234 data->normalMode = data->cMode = data->mode = MODE_List; 11235 data->autoExplain = 1; 11236 data->pAuxDb = &data->aAuxDb[0]; 11237 memcpy(data->colSeparator,SEP_Column, 2); 11238 memcpy(data->rowSeparator,SEP_Row, 2); 11239 data->showHeader = 0; 11240 data->shellFlgs = SHFLG_Lookaside; 11241 verify_uninitialized(); 11242 sqlite3_config(SQLITE_CONFIG_URI, 1); 11243 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 11244 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 11245 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 11246 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 11247} 11248 11249/* 11250** Output text to the console in a font that attracts extra attention. 11251*/ 11252#ifdef _WIN32 11253static void printBold(const char *zText){ 11254#if !SQLITE_OS_WINRT 11255 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 11256 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 11257 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 11258 SetConsoleTextAttribute(out, 11259 FOREGROUND_RED|FOREGROUND_INTENSITY 11260 ); 11261#endif 11262 printf("%s", zText); 11263#if !SQLITE_OS_WINRT 11264 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 11265#endif 11266} 11267#else 11268static void printBold(const char *zText){ 11269 printf("\033[1m%s\033[0m", zText); 11270} 11271#endif 11272 11273/* 11274** Get the argument to an --option. Throw an error and die if no argument 11275** is available. 11276*/ 11277static char *cmdline_option_value(int argc, char **argv, int i){ 11278 if( i==argc ){ 11279 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 11280 argv[0], argv[argc-1]); 11281 exit(1); 11282 } 11283 return argv[i]; 11284} 11285 11286#ifndef SQLITE_SHELL_IS_UTF8 11287# if (defined(_WIN32) || defined(WIN32)) \ 11288 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__))) 11289# define SQLITE_SHELL_IS_UTF8 (0) 11290# else 11291# define SQLITE_SHELL_IS_UTF8 (1) 11292# endif 11293#endif 11294 11295#if SQLITE_SHELL_IS_UTF8 11296int SQLITE_CDECL main(int argc, char **argv){ 11297#else 11298int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 11299 char **argv; 11300#endif 11301 char *zErrMsg = 0; 11302 ShellState data; 11303 const char *zInitFile = 0; 11304 int i; 11305 int rc = 0; 11306 int warnInmemoryDb = 0; 11307 int readStdin = 1; 11308 int nCmd = 0; 11309 char **azCmd = 0; 11310 const char *zVfs = 0; /* Value of -vfs command-line option */ 11311#if !SQLITE_SHELL_IS_UTF8 11312 char **argvToFree = 0; 11313 int argcToFree = 0; 11314#endif 11315 11316 setBinaryMode(stdin, 0); 11317 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 11318 stdin_is_interactive = isatty(0); 11319 stdout_is_console = isatty(1); 11320 11321#ifdef SQLITE_DEBUG 11322 registerOomSimulator(); 11323#endif 11324 11325#if !defined(_WIN32_WCE) 11326 if( getenv("SQLITE_DEBUG_BREAK") ){ 11327 if( isatty(0) && isatty(2) ){ 11328 fprintf(stderr, 11329 "attach debugger to process %d and press any key to continue.\n", 11330 GETPID()); 11331 fgetc(stdin); 11332 }else{ 11333#if defined(_WIN32) || defined(WIN32) 11334#if SQLITE_OS_WINRT 11335 __debugbreak(); 11336#else 11337 DebugBreak(); 11338#endif 11339#elif defined(SIGTRAP) 11340 raise(SIGTRAP); 11341#endif 11342 } 11343 } 11344#endif 11345 11346#if USE_SYSTEM_SQLITE+0!=1 11347 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 11348 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 11349 sqlite3_sourceid(), SQLITE_SOURCE_ID); 11350 exit(1); 11351 } 11352#endif 11353 main_init(&data); 11354 11355 /* On Windows, we must translate command-line arguments into UTF-8. 11356 ** The SQLite memory allocator subsystem has to be enabled in order to 11357 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 11358 ** subsequent sqlite3_config() calls will work. So copy all results into 11359 ** memory that does not come from the SQLite memory allocator. 11360 */ 11361#if !SQLITE_SHELL_IS_UTF8 11362 sqlite3_initialize(); 11363 argvToFree = malloc(sizeof(argv[0])*argc*2); 11364 shell_check_oom(argvToFree); 11365 argcToFree = argc; 11366 argv = argvToFree + argc; 11367 for(i=0; i<argc; i++){ 11368 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 11369 int n; 11370 shell_check_oom(z); 11371 n = (int)strlen(z); 11372 argv[i] = malloc( n+1 ); 11373 shell_check_oom(argv[i]); 11374 memcpy(argv[i], z, n+1); 11375 argvToFree[i] = argv[i]; 11376 sqlite3_free(z); 11377 } 11378 sqlite3_shutdown(); 11379#endif 11380 11381 assert( argc>=1 && argv && argv[0] ); 11382 Argv0 = argv[0]; 11383 11384 /* Make sure we have a valid signal handler early, before anything 11385 ** else is done. 11386 */ 11387#ifdef SIGINT 11388 signal(SIGINT, interrupt_handler); 11389#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 11390 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 11391#endif 11392 11393#ifdef SQLITE_SHELL_DBNAME_PROC 11394 { 11395 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 11396 ** of a C-function that will provide the name of the database file. Use 11397 ** this compile-time option to embed this shell program in larger 11398 ** applications. */ 11399 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 11400 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); 11401 warnInmemoryDb = 0; 11402 } 11403#endif 11404 11405 /* Do an initial pass through the command-line argument to locate 11406 ** the name of the database file, the name of the initialization file, 11407 ** the size of the alternative malloc heap, 11408 ** and the first command to execute. 11409 */ 11410 verify_uninitialized(); 11411 for(i=1; i<argc; i++){ 11412 char *z; 11413 z = argv[i]; 11414 if( z[0]!='-' ){ 11415 if( data.aAuxDb->zDbFilename==0 ){ 11416 data.aAuxDb->zDbFilename = z; 11417 }else{ 11418 /* Excesss arguments are interpreted as SQL (or dot-commands) and 11419 ** mean that nothing is read from stdin */ 11420 readStdin = 0; 11421 nCmd++; 11422 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 11423 shell_check_oom(azCmd); 11424 azCmd[nCmd-1] = z; 11425 } 11426 } 11427 if( z[1]=='-' ) z++; 11428 if( strcmp(z,"-separator")==0 11429 || strcmp(z,"-nullvalue")==0 11430 || strcmp(z,"-newline")==0 11431 || strcmp(z,"-cmd")==0 11432 ){ 11433 (void)cmdline_option_value(argc, argv, ++i); 11434 }else if( strcmp(z,"-init")==0 ){ 11435 zInitFile = cmdline_option_value(argc, argv, ++i); 11436 }else if( strcmp(z,"-batch")==0 ){ 11437 /* Need to check for batch mode here to so we can avoid printing 11438 ** informational messages (like from process_sqliterc) before 11439 ** we do the actual processing of arguments later in a second pass. 11440 */ 11441 stdin_is_interactive = 0; 11442 }else if( strcmp(z,"-heap")==0 ){ 11443#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11444 const char *zSize; 11445 sqlite3_int64 szHeap; 11446 11447 zSize = cmdline_option_value(argc, argv, ++i); 11448 szHeap = integerValue(zSize); 11449 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 11450 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 11451#else 11452 (void)cmdline_option_value(argc, argv, ++i); 11453#endif 11454 }else if( strcmp(z,"-pagecache")==0 ){ 11455 sqlite3_int64 n, sz; 11456 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11457 if( sz>70000 ) sz = 70000; 11458 if( sz<0 ) sz = 0; 11459 n = integerValue(cmdline_option_value(argc,argv,++i)); 11460 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 11461 n = 0xffffffffffffLL/sz; 11462 } 11463 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 11464 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 11465 data.shellFlgs |= SHFLG_Pagecache; 11466 }else if( strcmp(z,"-lookaside")==0 ){ 11467 int n, sz; 11468 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11469 if( sz<0 ) sz = 0; 11470 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11471 if( n<0 ) n = 0; 11472 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 11473 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 11474 }else if( strcmp(z,"-threadsafe")==0 ){ 11475 int n; 11476 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 11477 switch( n ){ 11478 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break; 11479 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break; 11480 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break; 11481 } 11482#ifdef SQLITE_ENABLE_VFSTRACE 11483 }else if( strcmp(z,"-vfstrace")==0 ){ 11484 extern int vfstrace_register( 11485 const char *zTraceName, 11486 const char *zOldVfsName, 11487 int (*xOut)(const char*,void*), 11488 void *pOutArg, 11489 int makeDefault 11490 ); 11491 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 11492#endif 11493#ifdef SQLITE_ENABLE_MULTIPLEX 11494 }else if( strcmp(z,"-multiplex")==0 ){ 11495 extern int sqlite3_multiple_initialize(const char*,int); 11496 sqlite3_multiplex_initialize(0, 1); 11497#endif 11498 }else if( strcmp(z,"-mmap")==0 ){ 11499 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11500 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 11501#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11502 }else if( strcmp(z,"-sorterref")==0 ){ 11503 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11504 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 11505#endif 11506 }else if( strcmp(z,"-vfs")==0 ){ 11507 zVfs = cmdline_option_value(argc, argv, ++i); 11508#ifdef SQLITE_HAVE_ZLIB 11509 }else if( strcmp(z,"-zip")==0 ){ 11510 data.openMode = SHELL_OPEN_ZIPFILE; 11511#endif 11512 }else if( strcmp(z,"-append")==0 ){ 11513 data.openMode = SHELL_OPEN_APPENDVFS; 11514#ifndef SQLITE_OMIT_DESERIALIZE 11515 }else if( strcmp(z,"-deserialize")==0 ){ 11516 data.openMode = SHELL_OPEN_DESERIALIZE; 11517 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 11518 data.szMax = integerValue(argv[++i]); 11519#endif 11520 }else if( strcmp(z,"-readonly")==0 ){ 11521 data.openMode = SHELL_OPEN_READONLY; 11522 }else if( strcmp(z,"-nofollow")==0 ){ 11523 data.openFlags = SQLITE_OPEN_NOFOLLOW; 11524#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 11525 }else if( strncmp(z, "-A",2)==0 ){ 11526 /* All remaining command-line arguments are passed to the ".archive" 11527 ** command, so ignore them */ 11528 break; 11529#endif 11530 }else if( strcmp(z, "-memtrace")==0 ){ 11531 sqlite3MemTraceActivate(stderr); 11532 }else if( strcmp(z,"-bail")==0 ){ 11533 bail_on_error = 1; 11534 }else if( strcmp(z,"-nonce")==0 ){ 11535 free(data.zNonce); 11536 data.zNonce = strdup(argv[++i]); 11537 }else if( strcmp(z,"-safe")==0 ){ 11538 /* no-op - catch this on the second pass */ 11539 } 11540 } 11541 verify_uninitialized(); 11542 11543 11544#ifdef SQLITE_SHELL_INIT_PROC 11545 { 11546 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 11547 ** of a C-function that will perform initialization actions on SQLite that 11548 ** occur just before or after sqlite3_initialize(). Use this compile-time 11549 ** option to embed this shell program in larger applications. */ 11550 extern void SQLITE_SHELL_INIT_PROC(void); 11551 SQLITE_SHELL_INIT_PROC(); 11552 } 11553#else 11554 /* All the sqlite3_config() calls have now been made. So it is safe 11555 ** to call sqlite3_initialize() and process any command line -vfs option. */ 11556 sqlite3_initialize(); 11557#endif 11558 11559 if( zVfs ){ 11560 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 11561 if( pVfs ){ 11562 sqlite3_vfs_register(pVfs, 1); 11563 }else{ 11564 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 11565 exit(1); 11566 } 11567 } 11568 11569 if( data.pAuxDb->zDbFilename==0 ){ 11570#ifndef SQLITE_OMIT_MEMORYDB 11571 data.pAuxDb->zDbFilename = ":memory:"; 11572 warnInmemoryDb = argc==1; 11573#else 11574 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 11575 return 1; 11576#endif 11577 } 11578 data.out = stdout; 11579 sqlite3_appendvfs_init(0,0,0); 11580 11581 /* Go ahead and open the database file if it already exists. If the 11582 ** file does not exist, delay opening it. This prevents empty database 11583 ** files from being created if a user mistypes the database name argument 11584 ** to the sqlite command-line tool. 11585 */ 11586 if( access(data.pAuxDb->zDbFilename, 0)==0 ){ 11587 open_db(&data, 0); 11588 } 11589 11590 /* Process the initialization file if there is one. If no -init option 11591 ** is given on the command line, look for a file named ~/.sqliterc and 11592 ** try to process it. 11593 */ 11594 process_sqliterc(&data,zInitFile); 11595 11596 /* Make a second pass through the command-line argument and set 11597 ** options. This second pass is delayed until after the initialization 11598 ** file is processed so that the command-line arguments will override 11599 ** settings in the initialization file. 11600 */ 11601 for(i=1; i<argc; i++){ 11602 char *z = argv[i]; 11603 if( z[0]!='-' ) continue; 11604 if( z[1]=='-' ){ z++; } 11605 if( strcmp(z,"-init")==0 ){ 11606 i++; 11607 }else if( strcmp(z,"-html")==0 ){ 11608 data.mode = MODE_Html; 11609 }else if( strcmp(z,"-list")==0 ){ 11610 data.mode = MODE_List; 11611 }else if( strcmp(z,"-quote")==0 ){ 11612 data.mode = MODE_Quote; 11613 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 11614 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 11615 }else if( strcmp(z,"-line")==0 ){ 11616 data.mode = MODE_Line; 11617 }else if( strcmp(z,"-column")==0 ){ 11618 data.mode = MODE_Column; 11619 }else if( strcmp(z,"-json")==0 ){ 11620 data.mode = MODE_Json; 11621 }else if( strcmp(z,"-markdown")==0 ){ 11622 data.mode = MODE_Markdown; 11623 }else if( strcmp(z,"-table")==0 ){ 11624 data.mode = MODE_Table; 11625 }else if( strcmp(z,"-box")==0 ){ 11626 data.mode = MODE_Box; 11627 }else if( strcmp(z,"-csv")==0 ){ 11628 data.mode = MODE_Csv; 11629 memcpy(data.colSeparator,",",2); 11630#ifdef SQLITE_HAVE_ZLIB 11631 }else if( strcmp(z,"-zip")==0 ){ 11632 data.openMode = SHELL_OPEN_ZIPFILE; 11633#endif 11634 }else if( strcmp(z,"-append")==0 ){ 11635 data.openMode = SHELL_OPEN_APPENDVFS; 11636#ifndef SQLITE_OMIT_DESERIALIZE 11637 }else if( strcmp(z,"-deserialize")==0 ){ 11638 data.openMode = SHELL_OPEN_DESERIALIZE; 11639 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 11640 data.szMax = integerValue(argv[++i]); 11641#endif 11642 }else if( strcmp(z,"-readonly")==0 ){ 11643 data.openMode = SHELL_OPEN_READONLY; 11644 }else if( strcmp(z,"-nofollow")==0 ){ 11645 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 11646 }else if( strcmp(z,"-ascii")==0 ){ 11647 data.mode = MODE_Ascii; 11648 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit); 11649 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record); 11650 }else if( strcmp(z,"-tabs")==0 ){ 11651 data.mode = MODE_List; 11652 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab); 11653 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 11654 }else if( strcmp(z,"-separator")==0 ){ 11655 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 11656 "%s",cmdline_option_value(argc,argv,++i)); 11657 }else if( strcmp(z,"-newline")==0 ){ 11658 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 11659 "%s",cmdline_option_value(argc,argv,++i)); 11660 }else if( strcmp(z,"-nullvalue")==0 ){ 11661 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 11662 "%s",cmdline_option_value(argc,argv,++i)); 11663 }else if( strcmp(z,"-header")==0 ){ 11664 data.showHeader = 1; 11665 ShellSetFlag(&data, SHFLG_HeaderSet); 11666 }else if( strcmp(z,"-noheader")==0 ){ 11667 data.showHeader = 0; 11668 ShellSetFlag(&data, SHFLG_HeaderSet); 11669 }else if( strcmp(z,"-echo")==0 ){ 11670 ShellSetFlag(&data, SHFLG_Echo); 11671 }else if( strcmp(z,"-eqp")==0 ){ 11672 data.autoEQP = AUTOEQP_on; 11673 }else if( strcmp(z,"-eqpfull")==0 ){ 11674 data.autoEQP = AUTOEQP_full; 11675 }else if( strcmp(z,"-stats")==0 ){ 11676 data.statsOn = 1; 11677 }else if( strcmp(z,"-scanstats")==0 ){ 11678 data.scanstatsOn = 1; 11679 }else if( strcmp(z,"-backslash")==0 ){ 11680 /* Undocumented command-line option: -backslash 11681 ** Causes C-style backslash escapes to be evaluated in SQL statements 11682 ** prior to sending the SQL into SQLite. Useful for injecting 11683 ** crazy bytes in the middle of SQL statements for testing and debugging. 11684 */ 11685 ShellSetFlag(&data, SHFLG_Backslash); 11686 }else if( strcmp(z,"-bail")==0 ){ 11687 /* No-op. The bail_on_error flag should already be set. */ 11688 }else if( strcmp(z,"-version")==0 ){ 11689 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 11690 return 0; 11691 }else if( strcmp(z,"-interactive")==0 ){ 11692 stdin_is_interactive = 1; 11693 }else if( strcmp(z,"-batch")==0 ){ 11694 stdin_is_interactive = 0; 11695 }else if( strcmp(z,"-heap")==0 ){ 11696 i++; 11697 }else if( strcmp(z,"-pagecache")==0 ){ 11698 i+=2; 11699 }else if( strcmp(z,"-lookaside")==0 ){ 11700 i+=2; 11701 }else if( strcmp(z,"-threadsafe")==0 ){ 11702 i+=2; 11703 }else if( strcmp(z,"-nonce")==0 ){ 11704 i += 2; 11705 }else if( strcmp(z,"-mmap")==0 ){ 11706 i++; 11707 }else if( strcmp(z,"-memtrace")==0 ){ 11708 i++; 11709#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11710 }else if( strcmp(z,"-sorterref")==0 ){ 11711 i++; 11712#endif 11713 }else if( strcmp(z,"-vfs")==0 ){ 11714 i++; 11715#ifdef SQLITE_ENABLE_VFSTRACE 11716 }else if( strcmp(z,"-vfstrace")==0 ){ 11717 i++; 11718#endif 11719#ifdef SQLITE_ENABLE_MULTIPLEX 11720 }else if( strcmp(z,"-multiplex")==0 ){ 11721 i++; 11722#endif 11723 }else if( strcmp(z,"-help")==0 ){ 11724 usage(1); 11725 }else if( strcmp(z,"-cmd")==0 ){ 11726 /* Run commands that follow -cmd first and separately from commands 11727 ** that simply appear on the command-line. This seems goofy. It would 11728 ** be better if all commands ran in the order that they appear. But 11729 ** we retain the goofy behavior for historical compatibility. */ 11730 if( i==argc-1 ) break; 11731 z = cmdline_option_value(argc,argv,++i); 11732 if( z[0]=='.' ){ 11733 rc = do_meta_command(z, &data); 11734 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 11735 }else{ 11736 open_db(&data, 0); 11737 rc = shell_exec(&data, z, &zErrMsg); 11738 if( zErrMsg!=0 ){ 11739 utf8_printf(stderr,"Error: %s\n", zErrMsg); 11740 if( bail_on_error ) return rc!=0 ? rc : 1; 11741 }else if( rc!=0 ){ 11742 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 11743 if( bail_on_error ) return rc; 11744 } 11745 } 11746#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 11747 }else if( strncmp(z, "-A", 2)==0 ){ 11748 if( nCmd>0 ){ 11749 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 11750 " with \"%s\"\n", z); 11751 return 1; 11752 } 11753 open_db(&data, OPEN_DB_ZIPFILE); 11754 if( z[2] ){ 11755 argv[i] = &z[2]; 11756 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 11757 }else{ 11758 arDotCommand(&data, 1, argv+i, argc-i); 11759 } 11760 readStdin = 0; 11761 break; 11762#endif 11763 }else if( strcmp(z,"-safe")==0 ){ 11764 data.bSafeMode = data.bSafeModePersist = 1; 11765 }else{ 11766 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 11767 raw_printf(stderr,"Use -help for a list of options.\n"); 11768 return 1; 11769 } 11770 data.cMode = data.mode; 11771 } 11772 11773 if( !readStdin ){ 11774 /* Run all arguments that do not begin with '-' as if they were separate 11775 ** command-line inputs, except for the argToSkip argument which contains 11776 ** the database filename. 11777 */ 11778 for(i=0; i<nCmd; i++){ 11779 if( azCmd[i][0]=='.' ){ 11780 rc = do_meta_command(azCmd[i], &data); 11781 if( rc ){ 11782 free(azCmd); 11783 return rc==2 ? 0 : rc; 11784 } 11785 }else{ 11786 open_db(&data, 0); 11787 rc = shell_exec(&data, azCmd[i], &zErrMsg); 11788 if( zErrMsg || rc ){ 11789 if( zErrMsg!=0 ){ 11790 utf8_printf(stderr,"Error: %s\n", zErrMsg); 11791 }else{ 11792 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 11793 } 11794 sqlite3_free(zErrMsg); 11795 free(azCmd); 11796 return rc!=0 ? rc : 1; 11797 } 11798 } 11799 } 11800 }else{ 11801 /* Run commands received from standard input 11802 */ 11803 if( stdin_is_interactive ){ 11804 char *zHome; 11805 char *zHistory; 11806 int nHistory; 11807 printf( 11808 "SQLite version %s %.19s\n" /*extra-version-info*/ 11809 "Enter \".help\" for usage hints.\n", 11810 sqlite3_libversion(), sqlite3_sourceid() 11811 ); 11812 if( warnInmemoryDb ){ 11813 printf("Connected to a "); 11814 printBold("transient in-memory database"); 11815 printf(".\nUse \".open FILENAME\" to reopen on a " 11816 "persistent database.\n"); 11817 } 11818 zHistory = getenv("SQLITE_HISTORY"); 11819 if( zHistory ){ 11820 zHistory = strdup(zHistory); 11821 }else if( (zHome = find_home_dir(0))!=0 ){ 11822 nHistory = strlen30(zHome) + 20; 11823 if( (zHistory = malloc(nHistory))!=0 ){ 11824 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 11825 } 11826 } 11827 if( zHistory ){ shell_read_history(zHistory); } 11828#if HAVE_READLINE || HAVE_EDITLINE 11829 rl_attempted_completion_function = readline_completion; 11830#elif HAVE_LINENOISE 11831 linenoiseSetCompletionCallback(linenoise_completion); 11832#endif 11833 data.in = 0; 11834 rc = process_input(&data); 11835 if( zHistory ){ 11836 shell_stifle_history(2000); 11837 shell_write_history(zHistory); 11838 free(zHistory); 11839 } 11840 }else{ 11841 data.in = stdin; 11842 rc = process_input(&data); 11843 } 11844 } 11845 free(azCmd); 11846 set_table_name(&data, 0); 11847 if( data.db ){ 11848 session_close_all(&data, -1); 11849 close_db(data.db); 11850 } 11851 for(i=0; i<ArraySize(data.aAuxDb); i++){ 11852 sqlite3_free(data.aAuxDb[i].zFreeOnClose); 11853 if( data.aAuxDb[i].db ){ 11854 session_close_all(&data, i); 11855 close_db(data.aAuxDb[i].db); 11856 } 11857 } 11858 find_home_dir(1); 11859 output_reset(&data); 11860 data.doXdgOpen = 0; 11861 clearTempFile(&data); 11862#if !SQLITE_SHELL_IS_UTF8 11863 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 11864 free(argvToFree); 11865#endif 11866 free(data.colWidth); 11867 free(data.zNonce); 11868 /* Clear the global data structure so that valgrind will detect memory 11869 ** leaks */ 11870 memset(&data, 0, sizeof(data)); 11871 return rc; 11872} 11873