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# define SHELL_STRINGIFY_(f) #f 27# define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f) 28#ifdef SQLITE_CUSTOM_INCLUDE 29# include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE) 30#endif 31 32/* 33** Determine if we are dealing with WinRT, which provides only a subset of 34** the full Win32 API. 35*/ 36#if !defined(SQLITE_OS_WINRT) 37# define SQLITE_OS_WINRT 0 38#endif 39 40/* 41** Warning pragmas copied from msvc.h in the core. 42*/ 43#if defined(_MSC_VER) 44#pragma warning(disable : 4054) 45#pragma warning(disable : 4055) 46#pragma warning(disable : 4100) 47#pragma warning(disable : 4127) 48#pragma warning(disable : 4130) 49#pragma warning(disable : 4152) 50#pragma warning(disable : 4189) 51#pragma warning(disable : 4206) 52#pragma warning(disable : 4210) 53#pragma warning(disable : 4232) 54#pragma warning(disable : 4244) 55#pragma warning(disable : 4305) 56#pragma warning(disable : 4306) 57#pragma warning(disable : 4702) 58#pragma warning(disable : 4706) 59#endif /* defined(_MSC_VER) */ 60 61/* 62** No support for loadable extensions in VxWorks. 63*/ 64#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 65# define SQLITE_OMIT_LOAD_EXTENSION 1 66#endif 67 68/* 69** Enable large-file support for fopen() and friends on unix. 70*/ 71#ifndef SQLITE_DISABLE_LFS 72# define _LARGE_FILE 1 73# ifndef _FILE_OFFSET_BITS 74# define _FILE_OFFSET_BITS 64 75# endif 76# define _LARGEFILE_SOURCE 1 77#endif 78 79#include <stdlib.h> 80#include <string.h> 81#include <stdio.h> 82#include <assert.h> 83#include "sqlite3.h" 84typedef sqlite3_int64 i64; 85typedef sqlite3_uint64 u64; 86typedef unsigned char u8; 87#if SQLITE_USER_AUTHENTICATION 88# include "sqlite3userauth.h" 89#endif 90#include <ctype.h> 91#include <stdarg.h> 92 93#if !defined(_WIN32) && !defined(WIN32) 94# include <signal.h> 95# if !defined(__RTP__) && !defined(_WRS_KERNEL) 96# include <pwd.h> 97# endif 98#endif 99#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 100# include <unistd.h> 101# include <dirent.h> 102# define GETPID getpid 103# if defined(__MINGW32__) 104# define DIRENT dirent 105# ifndef S_ISLNK 106# define S_ISLNK(mode) (0) 107# endif 108# endif 109#else 110# define GETPID (int)GetCurrentProcessId 111#endif 112#include <sys/types.h> 113#include <sys/stat.h> 114 115#if HAVE_READLINE 116# include <readline/readline.h> 117# include <readline/history.h> 118#endif 119 120#if HAVE_EDITLINE 121# include <editline/readline.h> 122#endif 123 124#if HAVE_EDITLINE || HAVE_READLINE 125 126# define shell_add_history(X) add_history(X) 127# define shell_read_history(X) read_history(X) 128# define shell_write_history(X) write_history(X) 129# define shell_stifle_history(X) stifle_history(X) 130# define shell_readline(X) readline(X) 131 132#elif HAVE_LINENOISE 133 134# include "linenoise.h" 135# define shell_add_history(X) linenoiseHistoryAdd(X) 136# define shell_read_history(X) linenoiseHistoryLoad(X) 137# define shell_write_history(X) linenoiseHistorySave(X) 138# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 139# define shell_readline(X) linenoise(X) 140 141#else 142 143# define shell_read_history(X) 144# define shell_write_history(X) 145# define shell_stifle_history(X) 146 147# define SHELL_USE_LOCAL_GETLINE 1 148#endif 149 150 151#if defined(_WIN32) || defined(WIN32) 152# if SQLITE_OS_WINRT 153# define SQLITE_OMIT_POPEN 1 154# else 155# include <io.h> 156# include <fcntl.h> 157# define isatty(h) _isatty(h) 158# ifndef access 159# define access(f,m) _access((f),(m)) 160# endif 161# ifndef unlink 162# define unlink _unlink 163# endif 164# ifndef strdup 165# define strdup _strdup 166# endif 167# undef popen 168# define popen _popen 169# undef pclose 170# define pclose _pclose 171# endif 172#else 173 /* Make sure isatty() has a prototype. */ 174 extern int isatty(int); 175 176# if !defined(__RTP__) && !defined(_WRS_KERNEL) 177 /* popen and pclose are not C89 functions and so are 178 ** sometimes omitted from the <stdio.h> header */ 179 extern FILE *popen(const char*,const char*); 180 extern int pclose(FILE*); 181# else 182# define SQLITE_OMIT_POPEN 1 183# endif 184#endif 185 186#if defined(_WIN32_WCE) 187/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 188 * thus we always assume that we have a console. That can be 189 * overridden with the -batch command line option. 190 */ 191#define isatty(x) 1 192#endif 193 194/* ctype macros that work with signed characters */ 195#define IsSpace(X) isspace((unsigned char)X) 196#define IsDigit(X) isdigit((unsigned char)X) 197#define ToLower(X) (char)tolower((unsigned char)X) 198 199#if defined(_WIN32) || defined(WIN32) 200#if SQLITE_OS_WINRT 201#include <intrin.h> 202#endif 203#include <windows.h> 204 205/* string conversion routines only needed on Win32 */ 206extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 207extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 208extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 209extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 210#endif 211 212/* On Windows, we normally run with output mode of TEXT so that \n characters 213** are automatically translated into \r\n. However, this behavior needs 214** to be disabled in some cases (ex: when generating CSV output and when 215** rendering quoted strings that contain \n characters). The following 216** routines take care of that. 217*/ 218#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT 219static void setBinaryMode(FILE *file, int isOutput){ 220 if( isOutput ) fflush(file); 221 _setmode(_fileno(file), _O_BINARY); 222} 223static void setTextMode(FILE *file, int isOutput){ 224 if( isOutput ) fflush(file); 225 _setmode(_fileno(file), _O_TEXT); 226} 227#else 228# define setBinaryMode(X,Y) 229# define setTextMode(X,Y) 230#endif 231 232 233/* True if the timer is enabled */ 234static int enableTimer = 0; 235 236/* Return the current wall-clock time */ 237static sqlite3_int64 timeOfDay(void){ 238 static sqlite3_vfs *clockVfs = 0; 239 sqlite3_int64 t; 240 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 241 if( clockVfs==0 ) return 0; /* Never actually happens */ 242 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 243 clockVfs->xCurrentTimeInt64(clockVfs, &t); 244 }else{ 245 double r; 246 clockVfs->xCurrentTime(clockVfs, &r); 247 t = (sqlite3_int64)(r*86400000.0); 248 } 249 return t; 250} 251 252#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 253#include <sys/time.h> 254#include <sys/resource.h> 255 256/* VxWorks does not support getrusage() as far as we can determine */ 257#if defined(_WRS_KERNEL) || defined(__RTP__) 258struct rusage { 259 struct timeval ru_utime; /* user CPU time used */ 260 struct timeval ru_stime; /* system CPU time used */ 261}; 262#define getrusage(A,B) memset(B,0,sizeof(*B)) 263#endif 264 265/* Saved resource information for the beginning of an operation */ 266static struct rusage sBegin; /* CPU time at start */ 267static sqlite3_int64 iBegin; /* Wall-clock time at start */ 268 269/* 270** Begin timing an operation 271*/ 272static void beginTimer(void){ 273 if( enableTimer ){ 274 getrusage(RUSAGE_SELF, &sBegin); 275 iBegin = timeOfDay(); 276 } 277} 278 279/* Return the difference of two time_structs in seconds */ 280static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 281 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 282 (double)(pEnd->tv_sec - pStart->tv_sec); 283} 284 285/* 286** Print the timing results. 287*/ 288static void endTimer(void){ 289 if( enableTimer ){ 290 sqlite3_int64 iEnd = timeOfDay(); 291 struct rusage sEnd; 292 getrusage(RUSAGE_SELF, &sEnd); 293 printf("Run Time: real %.3f user %f sys %f\n", 294 (iEnd - iBegin)*0.001, 295 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 296 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 297 } 298} 299 300#define BEGIN_TIMER beginTimer() 301#define END_TIMER endTimer() 302#define HAS_TIMER 1 303 304#elif (defined(_WIN32) || defined(WIN32)) 305 306/* Saved resource information for the beginning of an operation */ 307static HANDLE hProcess; 308static FILETIME ftKernelBegin; 309static FILETIME ftUserBegin; 310static sqlite3_int64 ftWallBegin; 311typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 312 LPFILETIME, LPFILETIME); 313static GETPROCTIMES getProcessTimesAddr = NULL; 314 315/* 316** Check to see if we have timer support. Return 1 if necessary 317** support found (or found previously). 318*/ 319static int hasTimer(void){ 320 if( getProcessTimesAddr ){ 321 return 1; 322 } else { 323#if !SQLITE_OS_WINRT 324 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 325 ** versions. See if the version we are running on has it, and if it 326 ** does, save off a pointer to it and the current process handle. 327 */ 328 hProcess = GetCurrentProcess(); 329 if( hProcess ){ 330 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 331 if( NULL != hinstLib ){ 332 getProcessTimesAddr = 333 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 334 if( NULL != getProcessTimesAddr ){ 335 return 1; 336 } 337 FreeLibrary(hinstLib); 338 } 339 } 340#endif 341 } 342 return 0; 343} 344 345/* 346** Begin timing an operation 347*/ 348static void beginTimer(void){ 349 if( enableTimer && getProcessTimesAddr ){ 350 FILETIME ftCreation, ftExit; 351 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 352 &ftKernelBegin,&ftUserBegin); 353 ftWallBegin = timeOfDay(); 354 } 355} 356 357/* Return the difference of two FILETIME structs in seconds */ 358static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 359 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 360 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 361 return (double) ((i64End - i64Start) / 10000000.0); 362} 363 364/* 365** Print the timing results. 366*/ 367static void endTimer(void){ 368 if( enableTimer && getProcessTimesAddr){ 369 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 370 sqlite3_int64 ftWallEnd = timeOfDay(); 371 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 372 printf("Run Time: real %.3f user %f sys %f\n", 373 (ftWallEnd - ftWallBegin)*0.001, 374 timeDiff(&ftUserBegin, &ftUserEnd), 375 timeDiff(&ftKernelBegin, &ftKernelEnd)); 376 } 377} 378 379#define BEGIN_TIMER beginTimer() 380#define END_TIMER endTimer() 381#define HAS_TIMER hasTimer() 382 383#else 384#define BEGIN_TIMER 385#define END_TIMER 386#define HAS_TIMER 0 387#endif 388 389/* 390** Used to prevent warnings about unused parameters 391*/ 392#define UNUSED_PARAMETER(x) (void)(x) 393 394/* 395** Number of elements in an array 396*/ 397#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 398 399/* 400** If the following flag is set, then command execution stops 401** at an error if we are not interactive. 402*/ 403static int bail_on_error = 0; 404 405/* 406** Threat stdin as an interactive input if the following variable 407** is true. Otherwise, assume stdin is connected to a file or pipe. 408*/ 409static int stdin_is_interactive = 1; 410 411/* 412** On Windows systems we have to know if standard output is a console 413** in order to translate UTF-8 into MBCS. The following variable is 414** true if translation is required. 415*/ 416static int stdout_is_console = 1; 417 418/* 419** The following is the open SQLite database. We make a pointer 420** to this database a static variable so that it can be accessed 421** by the SIGINT handler to interrupt database processing. 422*/ 423static sqlite3 *globalDb = 0; 424 425/* 426** True if an interrupt (Control-C) has been received. 427*/ 428static volatile int seenInterrupt = 0; 429 430/* 431** This is the name of our program. It is set in main(), used 432** in a number of other places, mostly for error messages. 433*/ 434static char *Argv0; 435 436/* 437** Prompt strings. Initialized in main. Settable with 438** .prompt main continue 439*/ 440static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 441static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 442 443/* 444** Render output like fprintf(). Except, if the output is going to the 445** console and if this is running on a Windows machine, translate the 446** output from UTF-8 into MBCS. 447*/ 448#if defined(_WIN32) || defined(WIN32) 449void utf8_printf(FILE *out, const char *zFormat, ...){ 450 va_list ap; 451 va_start(ap, zFormat); 452 if( stdout_is_console && (out==stdout || out==stderr) ){ 453 char *z1 = sqlite3_vmprintf(zFormat, ap); 454 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 455 sqlite3_free(z1); 456 fputs(z2, out); 457 sqlite3_free(z2); 458 }else{ 459 vfprintf(out, zFormat, ap); 460 } 461 va_end(ap); 462} 463#elif !defined(utf8_printf) 464# define utf8_printf fprintf 465#endif 466 467/* 468** Render output like fprintf(). This should not be used on anything that 469** includes string formatting (e.g. "%s"). 470*/ 471#if !defined(raw_printf) 472# define raw_printf fprintf 473#endif 474 475/* Indicate out-of-memory and exit. */ 476static void shell_out_of_memory(void){ 477 raw_printf(stderr,"Error: out of memory\n"); 478 exit(1); 479} 480 481/* Check a pointer to see if it is NULL. If it is NULL, exit with an 482** out-of-memory error. 483*/ 484static void shell_check_oom(void *p){ 485 if( p==0 ) shell_out_of_memory(); 486} 487 488/* 489** Write I/O traces to the following stream. 490*/ 491#ifdef SQLITE_ENABLE_IOTRACE 492static FILE *iotrace = 0; 493#endif 494 495/* 496** This routine works like printf in that its first argument is a 497** format string and subsequent arguments are values to be substituted 498** in place of % fields. The result of formatting this string 499** is written to iotrace. 500*/ 501#ifdef SQLITE_ENABLE_IOTRACE 502static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 503 va_list ap; 504 char *z; 505 if( iotrace==0 ) return; 506 va_start(ap, zFormat); 507 z = sqlite3_vmprintf(zFormat, ap); 508 va_end(ap); 509 utf8_printf(iotrace, "%s", z); 510 sqlite3_free(z); 511} 512#endif 513 514/* 515** Output string zUtf to stream pOut as w characters. If w is negative, 516** then right-justify the text. W is the width in UTF-8 characters, not 517** in bytes. This is different from the %*.*s specification in printf 518** since with %*.*s the width is measured in bytes, not characters. 519*/ 520static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 521 int i; 522 int n; 523 int aw = w<0 ? -w : w; 524 for(i=n=0; zUtf[i]; i++){ 525 if( (zUtf[i]&0xc0)!=0x80 ){ 526 n++; 527 if( n==aw ){ 528 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 529 break; 530 } 531 } 532 } 533 if( n>=aw ){ 534 utf8_printf(pOut, "%.*s", i, zUtf); 535 }else if( w<0 ){ 536 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 537 }else{ 538 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 539 } 540} 541 542 543/* 544** Determines if a string is a number of not. 545*/ 546static int isNumber(const char *z, int *realnum){ 547 if( *z=='-' || *z=='+' ) z++; 548 if( !IsDigit(*z) ){ 549 return 0; 550 } 551 z++; 552 if( realnum ) *realnum = 0; 553 while( IsDigit(*z) ){ z++; } 554 if( *z=='.' ){ 555 z++; 556 if( !IsDigit(*z) ) return 0; 557 while( IsDigit(*z) ){ z++; } 558 if( realnum ) *realnum = 1; 559 } 560 if( *z=='e' || *z=='E' ){ 561 z++; 562 if( *z=='+' || *z=='-' ) z++; 563 if( !IsDigit(*z) ) return 0; 564 while( IsDigit(*z) ){ z++; } 565 if( realnum ) *realnum = 1; 566 } 567 return *z==0; 568} 569 570/* 571** Compute a string length that is limited to what can be stored in 572** lower 30 bits of a 32-bit signed integer. 573*/ 574static int strlen30(const char *z){ 575 const char *z2 = z; 576 while( *z2 ){ z2++; } 577 return 0x3fffffff & (int)(z2 - z); 578} 579 580/* 581** Return the length of a string in characters. Multibyte UTF8 characters 582** count as a single character. 583*/ 584static int strlenChar(const char *z){ 585 int n = 0; 586 while( *z ){ 587 if( (0xc0&*(z++))!=0x80 ) n++; 588 } 589 return n; 590} 591 592/* 593** Return open FILE * if zFile exists, can be opened for read 594** and is an ordinary file or a character stream source. 595** Otherwise return 0. 596*/ 597static FILE * openChrSource(const char *zFile){ 598#ifdef _WIN32 599 struct _stat x = {0}; 600# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) 601 /* On Windows, open first, then check the stream nature. This order 602 ** is necessary because _stat() and sibs, when checking a named pipe, 603 ** effectively break the pipe as its supplier sees it. */ 604 FILE *rv = fopen(zFile, "rb"); 605 if( rv==0 ) return 0; 606 if( _fstat(_fileno(rv), &x) != 0 607 || !STAT_CHR_SRC(x.st_mode)){ 608 fclose(rv); 609 rv = 0; 610 } 611 return rv; 612#else 613 struct stat x = {0}; 614 int rc = stat(zFile, &x); 615# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) 616 if( rc!=0 ) return 0; 617 if( STAT_CHR_SRC(x.st_mode) ){ 618 return fopen(zFile, "rb"); 619 }else{ 620 return 0; 621 } 622#endif 623#undef STAT_CHR_SRC 624} 625 626/* 627** This routine reads a line of text from FILE in, stores 628** the text in memory obtained from malloc() and returns a pointer 629** to the text. NULL is returned at end of file, or if malloc() 630** fails. 631** 632** If zLine is not NULL then it is a malloced buffer returned from 633** a previous call to this routine that may be reused. 634*/ 635static char *local_getline(char *zLine, FILE *in){ 636 int nLine = zLine==0 ? 0 : 100; 637 int n = 0; 638 639 while( 1 ){ 640 if( n+100>nLine ){ 641 nLine = nLine*2 + 100; 642 zLine = realloc(zLine, nLine); 643 shell_check_oom(zLine); 644 } 645 if( fgets(&zLine[n], nLine - n, in)==0 ){ 646 if( n==0 ){ 647 free(zLine); 648 return 0; 649 } 650 zLine[n] = 0; 651 break; 652 } 653 while( zLine[n] ) n++; 654 if( n>0 && zLine[n-1]=='\n' ){ 655 n--; 656 if( n>0 && zLine[n-1]=='\r' ) n--; 657 zLine[n] = 0; 658 break; 659 } 660 } 661#if defined(_WIN32) || defined(WIN32) 662 /* For interactive input on Windows systems, translate the 663 ** multi-byte characterset characters into UTF-8. */ 664 if( stdin_is_interactive && in==stdin ){ 665 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 666 if( zTrans ){ 667 int nTrans = strlen30(zTrans)+1; 668 if( nTrans>nLine ){ 669 zLine = realloc(zLine, nTrans); 670 shell_check_oom(zLine); 671 } 672 memcpy(zLine, zTrans, nTrans); 673 sqlite3_free(zTrans); 674 } 675 } 676#endif /* defined(_WIN32) || defined(WIN32) */ 677 return zLine; 678} 679 680/* 681** Retrieve a single line of input text. 682** 683** If in==0 then read from standard input and prompt before each line. 684** If isContinuation is true, then a continuation prompt is appropriate. 685** If isContinuation is zero, then the main prompt should be used. 686** 687** If zPrior is not NULL then it is a buffer from a prior call to this 688** routine that can be reused. 689** 690** The result is stored in space obtained from malloc() and must either 691** be freed by the caller or else passed back into this routine via the 692** zPrior argument for reuse. 693*/ 694static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 695 char *zPrompt; 696 char *zResult; 697 if( in!=0 ){ 698 zResult = local_getline(zPrior, in); 699 }else{ 700 zPrompt = isContinuation ? continuePrompt : mainPrompt; 701#if SHELL_USE_LOCAL_GETLINE 702 printf("%s", zPrompt); 703 fflush(stdout); 704 zResult = local_getline(zPrior, stdin); 705#else 706 free(zPrior); 707 zResult = shell_readline(zPrompt); 708 if( zResult && *zResult ) shell_add_history(zResult); 709#endif 710 } 711 return zResult; 712} 713 714 715/* 716** Return the value of a hexadecimal digit. Return -1 if the input 717** is not a hex digit. 718*/ 719static int hexDigitValue(char c){ 720 if( c>='0' && c<='9' ) return c - '0'; 721 if( c>='a' && c<='f' ) return c - 'a' + 10; 722 if( c>='A' && c<='F' ) return c - 'A' + 10; 723 return -1; 724} 725 726/* 727** Interpret zArg as an integer value, possibly with suffixes. 728*/ 729static sqlite3_int64 integerValue(const char *zArg){ 730 sqlite3_int64 v = 0; 731 static const struct { char *zSuffix; int iMult; } aMult[] = { 732 { "KiB", 1024 }, 733 { "MiB", 1024*1024 }, 734 { "GiB", 1024*1024*1024 }, 735 { "KB", 1000 }, 736 { "MB", 1000000 }, 737 { "GB", 1000000000 }, 738 { "K", 1000 }, 739 { "M", 1000000 }, 740 { "G", 1000000000 }, 741 }; 742 int i; 743 int isNeg = 0; 744 if( zArg[0]=='-' ){ 745 isNeg = 1; 746 zArg++; 747 }else if( zArg[0]=='+' ){ 748 zArg++; 749 } 750 if( zArg[0]=='0' && zArg[1]=='x' ){ 751 int x; 752 zArg += 2; 753 while( (x = hexDigitValue(zArg[0]))>=0 ){ 754 v = (v<<4) + x; 755 zArg++; 756 } 757 }else{ 758 while( IsDigit(zArg[0]) ){ 759 v = v*10 + zArg[0] - '0'; 760 zArg++; 761 } 762 } 763 for(i=0; i<ArraySize(aMult); i++){ 764 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 765 v *= aMult[i].iMult; 766 break; 767 } 768 } 769 return isNeg? -v : v; 770} 771 772/* 773** A variable length string to which one can append text. 774*/ 775typedef struct ShellText ShellText; 776struct ShellText { 777 char *z; 778 int n; 779 int nAlloc; 780}; 781 782/* 783** Initialize and destroy a ShellText object 784*/ 785static void initText(ShellText *p){ 786 memset(p, 0, sizeof(*p)); 787} 788static void freeText(ShellText *p){ 789 free(p->z); 790 initText(p); 791} 792 793/* zIn is either a pointer to a NULL-terminated string in memory obtained 794** from malloc(), or a NULL pointer. The string pointed to by zAppend is 795** added to zIn, and the result returned in memory obtained from malloc(). 796** zIn, if it was not NULL, is freed. 797** 798** If the third argument, quote, is not '\0', then it is used as a 799** quote character for zAppend. 800*/ 801static void appendText(ShellText *p, char const *zAppend, char quote){ 802 int len; 803 int i; 804 int nAppend = strlen30(zAppend); 805 806 len = nAppend+p->n+1; 807 if( quote ){ 808 len += 2; 809 for(i=0; i<nAppend; i++){ 810 if( zAppend[i]==quote ) len++; 811 } 812 } 813 814 if( p->z==0 || p->n+len>=p->nAlloc ){ 815 p->nAlloc = p->nAlloc*2 + len + 20; 816 p->z = realloc(p->z, p->nAlloc); 817 shell_check_oom(p->z); 818 } 819 820 if( quote ){ 821 char *zCsr = p->z+p->n; 822 *zCsr++ = quote; 823 for(i=0; i<nAppend; i++){ 824 *zCsr++ = zAppend[i]; 825 if( zAppend[i]==quote ) *zCsr++ = quote; 826 } 827 *zCsr++ = quote; 828 p->n = (int)(zCsr - p->z); 829 *zCsr = '\0'; 830 }else{ 831 memcpy(p->z+p->n, zAppend, nAppend); 832 p->n += nAppend; 833 p->z[p->n] = '\0'; 834 } 835} 836 837/* 838** Attempt to determine if identifier zName needs to be quoted, either 839** because it contains non-alphanumeric characters, or because it is an 840** SQLite keyword. Be conservative in this estimate: When in doubt assume 841** that quoting is required. 842** 843** Return '"' if quoting is required. Return 0 if no quoting is required. 844*/ 845static char quoteChar(const char *zName){ 846 int i; 847 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 848 for(i=0; zName[i]; i++){ 849 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 850 } 851 return sqlite3_keyword_check(zName, i) ? '"' : 0; 852} 853 854/* 855** Construct a fake object name and column list to describe the structure 856** of the view, virtual table, or table valued function zSchema.zName. 857*/ 858static char *shellFakeSchema( 859 sqlite3 *db, /* The database connection containing the vtab */ 860 const char *zSchema, /* Schema of the database holding the vtab */ 861 const char *zName /* The name of the virtual table */ 862){ 863 sqlite3_stmt *pStmt = 0; 864 char *zSql; 865 ShellText s; 866 char cQuote; 867 char *zDiv = "("; 868 int nRow = 0; 869 870 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 871 zSchema ? zSchema : "main", zName); 872 shell_check_oom(zSql); 873 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 874 sqlite3_free(zSql); 875 initText(&s); 876 if( zSchema ){ 877 cQuote = quoteChar(zSchema); 878 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 879 appendText(&s, zSchema, cQuote); 880 appendText(&s, ".", 0); 881 } 882 cQuote = quoteChar(zName); 883 appendText(&s, zName, cQuote); 884 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 885 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 886 nRow++; 887 appendText(&s, zDiv, 0); 888 zDiv = ","; 889 if( zCol==0 ) zCol = ""; 890 cQuote = quoteChar(zCol); 891 appendText(&s, zCol, cQuote); 892 } 893 appendText(&s, ")", 0); 894 sqlite3_finalize(pStmt); 895 if( nRow==0 ){ 896 freeText(&s); 897 s.z = 0; 898 } 899 return s.z; 900} 901 902/* 903** SQL function: shell_module_schema(X) 904** 905** Return a fake schema for the table-valued function or eponymous virtual 906** table X. 907*/ 908static void shellModuleSchema( 909 sqlite3_context *pCtx, 910 int nVal, 911 sqlite3_value **apVal 912){ 913 const char *zName; 914 char *zFake; 915 UNUSED_PARAMETER(nVal); 916 zName = (const char*)sqlite3_value_text(apVal[0]); 917 zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0; 918 if( zFake ){ 919 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 920 -1, sqlite3_free); 921 free(zFake); 922 } 923} 924 925/* 926** SQL function: shell_add_schema(S,X) 927** 928** Add the schema name X to the CREATE statement in S and return the result. 929** Examples: 930** 931** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 932** 933** Also works on 934** 935** CREATE INDEX 936** CREATE UNIQUE INDEX 937** CREATE VIEW 938** CREATE TRIGGER 939** CREATE VIRTUAL TABLE 940** 941** This UDF is used by the .schema command to insert the schema name of 942** attached databases into the middle of the sqlite_schema.sql field. 943*/ 944static void shellAddSchemaName( 945 sqlite3_context *pCtx, 946 int nVal, 947 sqlite3_value **apVal 948){ 949 static const char *aPrefix[] = { 950 "TABLE", 951 "INDEX", 952 "UNIQUE INDEX", 953 "VIEW", 954 "TRIGGER", 955 "VIRTUAL TABLE" 956 }; 957 int i = 0; 958 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 959 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 960 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 961 sqlite3 *db = sqlite3_context_db_handle(pCtx); 962 UNUSED_PARAMETER(nVal); 963 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 964 for(i=0; i<ArraySize(aPrefix); i++){ 965 int n = strlen30(aPrefix[i]); 966 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 967 char *z = 0; 968 char *zFake = 0; 969 if( zSchema ){ 970 char cQuote = quoteChar(zSchema); 971 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 972 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 973 }else{ 974 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 975 } 976 } 977 if( zName 978 && aPrefix[i][0]=='V' 979 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 980 ){ 981 if( z==0 ){ 982 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 983 }else{ 984 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 985 } 986 free(zFake); 987 } 988 if( z ){ 989 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 990 return; 991 } 992 } 993 } 994 } 995 sqlite3_result_value(pCtx, apVal[0]); 996} 997 998/* 999** The source code for several run-time loadable extensions is inserted 1000** below by the ../tool/mkshellc.tcl script. Before processing that included 1001** code, we need to override some macros to make the included program code 1002** work here in the middle of this regular program. 1003*/ 1004#define SQLITE_EXTENSION_INIT1 1005#define SQLITE_EXTENSION_INIT2(X) (void)(X) 1006 1007#if defined(_WIN32) && defined(_MSC_VER) 1008INCLUDE test_windirent.h 1009INCLUDE test_windirent.c 1010#define dirent DIRENT 1011#endif 1012INCLUDE ../ext/misc/shathree.c 1013INCLUDE ../ext/misc/fileio.c 1014INCLUDE ../ext/misc/completion.c 1015INCLUDE ../ext/misc/appendvfs.c 1016INCLUDE ../ext/misc/memtrace.c 1017INCLUDE ../ext/misc/uint.c 1018INCLUDE ../ext/misc/decimal.c 1019INCLUDE ../ext/misc/ieee754.c 1020INCLUDE ../ext/misc/series.c 1021INCLUDE ../ext/misc/regexp.c 1022#ifdef SQLITE_HAVE_ZLIB 1023INCLUDE ../ext/misc/zipfile.c 1024INCLUDE ../ext/misc/sqlar.c 1025#endif 1026INCLUDE ../ext/expert/sqlite3expert.h 1027INCLUDE ../ext/expert/sqlite3expert.c 1028 1029#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 1030INCLUDE ../ext/misc/dbdata.c 1031#endif 1032 1033#if defined(SQLITE_ENABLE_SESSION) 1034/* 1035** State information for a single open session 1036*/ 1037typedef struct OpenSession OpenSession; 1038struct OpenSession { 1039 char *zName; /* Symbolic name for this session */ 1040 int nFilter; /* Number of xFilter rejection GLOB patterns */ 1041 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 1042 sqlite3_session *p; /* The open session */ 1043}; 1044#endif 1045 1046typedef struct ExpertInfo ExpertInfo; 1047struct ExpertInfo { 1048 sqlite3expert *pExpert; 1049 int bVerbose; 1050}; 1051 1052/* A single line in the EQP output */ 1053typedef struct EQPGraphRow EQPGraphRow; 1054struct EQPGraphRow { 1055 int iEqpId; /* ID for this row */ 1056 int iParentId; /* ID of the parent row */ 1057 EQPGraphRow *pNext; /* Next row in sequence */ 1058 char zText[1]; /* Text to display for this row */ 1059}; 1060 1061/* All EQP output is collected into an instance of the following */ 1062typedef struct EQPGraph EQPGraph; 1063struct EQPGraph { 1064 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 1065 EQPGraphRow *pLast; /* Last element of the pRow list */ 1066 char zPrefix[100]; /* Graph prefix */ 1067}; 1068 1069/* Parameters affecting columnar mode result display (defaulting together) */ 1070typedef struct ColModeOpts { 1071 int iWrap; /* In columnar modes, wrap lines reaching this limit */ 1072 u8 bQuote; /* Quote results for .mode box and table */ 1073 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */ 1074} ColModeOpts; 1075#define ColModeOpts_default { 60, 0, 0 } 1076#define ColModeOpts_default_qbox { 60, 1, 0 } 1077 1078/* 1079** State information about the database connection is contained in an 1080** instance of the following structure. 1081*/ 1082typedef struct ShellState ShellState; 1083struct ShellState { 1084 sqlite3 *db; /* The database */ 1085 u8 autoExplain; /* Automatically turn on .explain mode */ 1086 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 1087 u8 autoEQPtest; /* autoEQP is in test mode */ 1088 u8 autoEQPtrace; /* autoEQP is in trace mode */ 1089 u8 scanstatsOn; /* True to display scan stats before each finalize */ 1090 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 1091 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 1092 u8 nEqpLevel; /* Depth of the EQP output graph */ 1093 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 1094 u8 bSafeMode; /* True to prohibit unsafe operations */ 1095 u8 bSafeModePersist; /* The long-term value of bSafeMode */ 1096 ColModeOpts cmOpts; /* Option values affecting columnar mode output */ 1097 unsigned statsOn; /* True to display memory stats before each finalize */ 1098 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 1099 int inputNesting; /* Track nesting level of .read and other redirects */ 1100 int outCount; /* Revert to stdout when reaching zero */ 1101 int cnt; /* Number of records displayed so far */ 1102 int lineno; /* Line number of last line read from in */ 1103 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 1104 FILE *in; /* Read commands from this stream */ 1105 FILE *out; /* Write results here */ 1106 FILE *traceOut; /* Output for sqlite3_trace() */ 1107 int nErr; /* Number of errors seen */ 1108 int mode; /* An output mode setting */ 1109 int modePrior; /* Saved mode */ 1110 int cMode; /* temporary output mode for the current query */ 1111 int normalMode; /* Output mode before ".explain on" */ 1112 int writableSchema; /* True if PRAGMA writable_schema=ON */ 1113 int showHeader; /* True to show column names in List or Column mode */ 1114 int nCheck; /* Number of ".check" commands run */ 1115 unsigned nProgress; /* Number of progress callbacks encountered */ 1116 unsigned mxProgress; /* Maximum progress callbacks before failing */ 1117 unsigned flgProgress; /* Flags for the progress callback */ 1118 unsigned shellFlgs; /* Various flags */ 1119 unsigned priorShFlgs; /* Saved copy of flags */ 1120 sqlite3_int64 szMax; /* --maxsize argument to .open */ 1121 char *zDestTable; /* Name of destination table when MODE_Insert */ 1122 char *zTempFile; /* Temporary file that might need deleting */ 1123 char zTestcase[30]; /* Name of current test case */ 1124 char colSeparator[20]; /* Column separator character for several modes */ 1125 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 1126 char colSepPrior[20]; /* Saved column separator */ 1127 char rowSepPrior[20]; /* Saved row separator */ 1128 int *colWidth; /* Requested width of each column in columnar modes */ 1129 int *actualWidth; /* Actual width of each column */ 1130 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 1131 char nullValue[20]; /* The text to print when a NULL comes back from 1132 ** the database */ 1133 char outfile[FILENAME_MAX]; /* Filename for *out */ 1134 sqlite3_stmt *pStmt; /* Current statement if any. */ 1135 FILE *pLog; /* Write log output here */ 1136 struct AuxDb { /* Storage space for auxiliary database connections */ 1137 sqlite3 *db; /* Connection pointer */ 1138 const char *zDbFilename; /* Filename used to open the connection */ 1139 char *zFreeOnClose; /* Free this memory allocation on close */ 1140#if defined(SQLITE_ENABLE_SESSION) 1141 int nSession; /* Number of active sessions */ 1142 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 1143#endif 1144 } aAuxDb[5], /* Array of all database connections */ 1145 *pAuxDb; /* Currently active database connection */ 1146 int *aiIndent; /* Array of indents used in MODE_Explain */ 1147 int nIndent; /* Size of array aiIndent[] */ 1148 int iIndent; /* Index of current op in aiIndent[] */ 1149 char *zNonce; /* Nonce for temporary safe-mode excapes */ 1150 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 1151 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 1152}; 1153 1154 1155/* Allowed values for ShellState.autoEQP 1156*/ 1157#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 1158#define AUTOEQP_on 1 /* Automatic EQP is on */ 1159#define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 1160#define AUTOEQP_full 3 /* Show full EXPLAIN */ 1161 1162/* Allowed values for ShellState.openMode 1163*/ 1164#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 1165#define SHELL_OPEN_NORMAL 1 /* Normal database file */ 1166#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 1167#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 1168#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 1169#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 1170#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 1171 1172/* Allowed values for ShellState.eTraceType 1173*/ 1174#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 1175#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 1176#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 1177 1178/* Bits in the ShellState.flgProgress variable */ 1179#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 1180#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 1181 ** callback limit is reached, and for each 1182 ** top-level SQL statement */ 1183#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 1184 1185/* 1186** These are the allowed shellFlgs values 1187*/ 1188#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 1189#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 1190#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 1191#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 1192#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 1193#define SHFLG_CountChanges 0x00000020 /* .changes setting */ 1194#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 1195#define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ 1196#define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 1197#define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 1198 1199/* 1200** Macros for testing and setting shellFlgs 1201*/ 1202#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 1203#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 1204#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 1205 1206/* 1207** These are the allowed modes. 1208*/ 1209#define MODE_Line 0 /* One column per line. Blank line between records */ 1210#define MODE_Column 1 /* One record per line in neat columns */ 1211#define MODE_List 2 /* One record per line with a separator */ 1212#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 1213#define MODE_Html 4 /* Generate an XHTML table */ 1214#define MODE_Insert 5 /* Generate SQL "insert" statements */ 1215#define MODE_Quote 6 /* Quote values as for SQL */ 1216#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 1217#define MODE_Csv 8 /* Quote strings, numbers are plain */ 1218#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 1219#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 1220#define MODE_Pretty 11 /* Pretty-print schemas */ 1221#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 1222#define MODE_Json 13 /* Output JSON */ 1223#define MODE_Markdown 14 /* Markdown formatting */ 1224#define MODE_Table 15 /* MySQL-style table formatting */ 1225#define MODE_Box 16 /* Unicode box-drawing characters */ 1226#define MODE_Count 17 /* Output only a count of the rows of output */ 1227#define MODE_Off 18 /* No query output shown */ 1228 1229static const char *modeDescr[] = { 1230 "line", 1231 "column", 1232 "list", 1233 "semi", 1234 "html", 1235 "insert", 1236 "quote", 1237 "tcl", 1238 "csv", 1239 "explain", 1240 "ascii", 1241 "prettyprint", 1242 "eqp", 1243 "json", 1244 "markdown", 1245 "table", 1246 "box", 1247 "count", 1248 "off" 1249}; 1250 1251/* 1252** These are the column/row/line separators used by the various 1253** import/export modes. 1254*/ 1255#define SEP_Column "|" 1256#define SEP_Row "\n" 1257#define SEP_Tab "\t" 1258#define SEP_Space " " 1259#define SEP_Comma "," 1260#define SEP_CrLf "\r\n" 1261#define SEP_Unit "\x1F" 1262#define SEP_Record "\x1E" 1263 1264/* 1265** Limit input nesting via .read or any other input redirect. 1266** It's not too expensive, so a generous allowance can be made. 1267*/ 1268#define MAX_INPUT_NESTING 25 1269 1270/* 1271** A callback for the sqlite3_log() interface. 1272*/ 1273static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 1274 ShellState *p = (ShellState*)pArg; 1275 if( p->pLog==0 ) return; 1276 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 1277 fflush(p->pLog); 1278} 1279 1280/* 1281** SQL function: shell_putsnl(X) 1282** 1283** Write the text X to the screen (or whatever output is being directed) 1284** adding a newline at the end, and then return X. 1285*/ 1286static void shellPutsFunc( 1287 sqlite3_context *pCtx, 1288 int nVal, 1289 sqlite3_value **apVal 1290){ 1291 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 1292 (void)nVal; 1293 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 1294 sqlite3_result_value(pCtx, apVal[0]); 1295} 1296 1297/* 1298** If in safe mode, print an error message described by the arguments 1299** and exit immediately. 1300*/ 1301static void failIfSafeMode( 1302 ShellState *p, 1303 const char *zErrMsg, 1304 ... 1305){ 1306 if( p->bSafeMode ){ 1307 va_list ap; 1308 char *zMsg; 1309 va_start(ap, zErrMsg); 1310 zMsg = sqlite3_vmprintf(zErrMsg, ap); 1311 va_end(ap); 1312 raw_printf(stderr, "line %d: ", p->lineno); 1313 utf8_printf(stderr, "%s\n", zMsg); 1314 exit(1); 1315 } 1316} 1317 1318/* 1319** SQL function: edit(VALUE) 1320** edit(VALUE,EDITOR) 1321** 1322** These steps: 1323** 1324** (1) Write VALUE into a temporary file. 1325** (2) Run program EDITOR on that temporary file. 1326** (3) Read the temporary file back and return its content as the result. 1327** (4) Delete the temporary file 1328** 1329** If the EDITOR argument is omitted, use the value in the VISUAL 1330** environment variable. If still there is no EDITOR, through an error. 1331** 1332** Also throw an error if the EDITOR program returns a non-zero exit code. 1333*/ 1334#ifndef SQLITE_NOHAVE_SYSTEM 1335static void editFunc( 1336 sqlite3_context *context, 1337 int argc, 1338 sqlite3_value **argv 1339){ 1340 const char *zEditor; 1341 char *zTempFile = 0; 1342 sqlite3 *db; 1343 char *zCmd = 0; 1344 int bBin; 1345 int rc; 1346 int hasCRNL = 0; 1347 FILE *f = 0; 1348 sqlite3_int64 sz; 1349 sqlite3_int64 x; 1350 unsigned char *p = 0; 1351 1352 if( argc==2 ){ 1353 zEditor = (const char*)sqlite3_value_text(argv[1]); 1354 }else{ 1355 zEditor = getenv("VISUAL"); 1356 } 1357 if( zEditor==0 ){ 1358 sqlite3_result_error(context, "no editor for edit()", -1); 1359 return; 1360 } 1361 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 1362 sqlite3_result_error(context, "NULL input to edit()", -1); 1363 return; 1364 } 1365 db = sqlite3_context_db_handle(context); 1366 zTempFile = 0; 1367 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 1368 if( zTempFile==0 ){ 1369 sqlite3_uint64 r = 0; 1370 sqlite3_randomness(sizeof(r), &r); 1371 zTempFile = sqlite3_mprintf("temp%llx", r); 1372 if( zTempFile==0 ){ 1373 sqlite3_result_error_nomem(context); 1374 return; 1375 } 1376 } 1377 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 1378 /* When writing the file to be edited, do \n to \r\n conversions on systems 1379 ** that want \r\n line endings */ 1380 f = fopen(zTempFile, bBin ? "wb" : "w"); 1381 if( f==0 ){ 1382 sqlite3_result_error(context, "edit() cannot open temp file", -1); 1383 goto edit_func_end; 1384 } 1385 sz = sqlite3_value_bytes(argv[0]); 1386 if( bBin ){ 1387 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 1388 }else{ 1389 const char *z = (const char*)sqlite3_value_text(argv[0]); 1390 /* Remember whether or not the value originally contained \r\n */ 1391 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 1392 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 1393 } 1394 fclose(f); 1395 f = 0; 1396 if( x!=sz ){ 1397 sqlite3_result_error(context, "edit() could not write the whole file", -1); 1398 goto edit_func_end; 1399 } 1400 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 1401 if( zCmd==0 ){ 1402 sqlite3_result_error_nomem(context); 1403 goto edit_func_end; 1404 } 1405 rc = system(zCmd); 1406 sqlite3_free(zCmd); 1407 if( rc ){ 1408 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 1409 goto edit_func_end; 1410 } 1411 f = fopen(zTempFile, "rb"); 1412 if( f==0 ){ 1413 sqlite3_result_error(context, 1414 "edit() cannot reopen temp file after edit", -1); 1415 goto edit_func_end; 1416 } 1417 fseek(f, 0, SEEK_END); 1418 sz = ftell(f); 1419 rewind(f); 1420 p = sqlite3_malloc64( sz+1 ); 1421 if( p==0 ){ 1422 sqlite3_result_error_nomem(context); 1423 goto edit_func_end; 1424 } 1425 x = fread(p, 1, (size_t)sz, f); 1426 fclose(f); 1427 f = 0; 1428 if( x!=sz ){ 1429 sqlite3_result_error(context, "could not read back the whole file", -1); 1430 goto edit_func_end; 1431 } 1432 if( bBin ){ 1433 sqlite3_result_blob64(context, p, sz, sqlite3_free); 1434 }else{ 1435 sqlite3_int64 i, j; 1436 if( hasCRNL ){ 1437 /* If the original contains \r\n then do no conversions back to \n */ 1438 }else{ 1439 /* If the file did not originally contain \r\n then convert any new 1440 ** \r\n back into \n */ 1441 for(i=j=0; i<sz; i++){ 1442 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 1443 p[j++] = p[i]; 1444 } 1445 sz = j; 1446 p[sz] = 0; 1447 } 1448 sqlite3_result_text64(context, (const char*)p, sz, 1449 sqlite3_free, SQLITE_UTF8); 1450 } 1451 p = 0; 1452 1453edit_func_end: 1454 if( f ) fclose(f); 1455 unlink(zTempFile); 1456 sqlite3_free(zTempFile); 1457 sqlite3_free(p); 1458} 1459#endif /* SQLITE_NOHAVE_SYSTEM */ 1460 1461/* 1462** Save or restore the current output mode 1463*/ 1464static void outputModePush(ShellState *p){ 1465 p->modePrior = p->mode; 1466 p->priorShFlgs = p->shellFlgs; 1467 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 1468 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 1469} 1470static void outputModePop(ShellState *p){ 1471 p->mode = p->modePrior; 1472 p->shellFlgs = p->priorShFlgs; 1473 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 1474 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 1475} 1476 1477/* 1478** Output the given string as a hex-encoded blob (eg. X'1234' ) 1479*/ 1480static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 1481 int i; 1482 char *zBlob = (char *)pBlob; 1483 raw_printf(out,"X'"); 1484 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 1485 raw_printf(out,"'"); 1486} 1487 1488/* 1489** Find a string that is not found anywhere in z[]. Return a pointer 1490** to that string. 1491** 1492** Try to use zA and zB first. If both of those are already found in z[] 1493** then make up some string and store it in the buffer zBuf. 1494*/ 1495static const char *unused_string( 1496 const char *z, /* Result must not appear anywhere in z */ 1497 const char *zA, const char *zB, /* Try these first */ 1498 char *zBuf /* Space to store a generated string */ 1499){ 1500 unsigned i = 0; 1501 if( strstr(z, zA)==0 ) return zA; 1502 if( strstr(z, zB)==0 ) return zB; 1503 do{ 1504 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 1505 }while( strstr(z,zBuf)!=0 ); 1506 return zBuf; 1507} 1508 1509/* 1510** Output the given string as a quoted string using SQL quoting conventions. 1511** 1512** See also: output_quoted_escaped_string() 1513*/ 1514static void output_quoted_string(FILE *out, const char *z){ 1515 int i; 1516 char c; 1517 setBinaryMode(out, 1); 1518 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1519 if( c==0 ){ 1520 utf8_printf(out,"'%s'",z); 1521 }else{ 1522 raw_printf(out, "'"); 1523 while( *z ){ 1524 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1525 if( c=='\'' ) i++; 1526 if( i ){ 1527 utf8_printf(out, "%.*s", i, z); 1528 z += i; 1529 } 1530 if( c=='\'' ){ 1531 raw_printf(out, "'"); 1532 continue; 1533 } 1534 if( c==0 ){ 1535 break; 1536 } 1537 z++; 1538 } 1539 raw_printf(out, "'"); 1540 } 1541 setTextMode(out, 1); 1542} 1543 1544/* 1545** Output the given string as a quoted string using SQL quoting conventions. 1546** Additionallly , escape the "\n" and "\r" characters so that they do not 1547** get corrupted by end-of-line translation facilities in some operating 1548** systems. 1549** 1550** This is like output_quoted_string() but with the addition of the \r\n 1551** escape mechanism. 1552*/ 1553static void output_quoted_escaped_string(FILE *out, const char *z){ 1554 int i; 1555 char c; 1556 setBinaryMode(out, 1); 1557 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 1558 if( c==0 ){ 1559 utf8_printf(out,"'%s'",z); 1560 }else{ 1561 const char *zNL = 0; 1562 const char *zCR = 0; 1563 int nNL = 0; 1564 int nCR = 0; 1565 char zBuf1[20], zBuf2[20]; 1566 for(i=0; z[i]; i++){ 1567 if( z[i]=='\n' ) nNL++; 1568 if( z[i]=='\r' ) nCR++; 1569 } 1570 if( nNL ){ 1571 raw_printf(out, "replace("); 1572 zNL = unused_string(z, "\\n", "\\012", zBuf1); 1573 } 1574 if( nCR ){ 1575 raw_printf(out, "replace("); 1576 zCR = unused_string(z, "\\r", "\\015", zBuf2); 1577 } 1578 raw_printf(out, "'"); 1579 while( *z ){ 1580 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 1581 if( c=='\'' ) i++; 1582 if( i ){ 1583 utf8_printf(out, "%.*s", i, z); 1584 z += i; 1585 } 1586 if( c=='\'' ){ 1587 raw_printf(out, "'"); 1588 continue; 1589 } 1590 if( c==0 ){ 1591 break; 1592 } 1593 z++; 1594 if( c=='\n' ){ 1595 raw_printf(out, "%s", zNL); 1596 continue; 1597 } 1598 raw_printf(out, "%s", zCR); 1599 } 1600 raw_printf(out, "'"); 1601 if( nCR ){ 1602 raw_printf(out, ",'%s',char(13))", zCR); 1603 } 1604 if( nNL ){ 1605 raw_printf(out, ",'%s',char(10))", zNL); 1606 } 1607 } 1608 setTextMode(out, 1); 1609} 1610 1611/* 1612** Output the given string as a quoted according to C or TCL quoting rules. 1613*/ 1614static void output_c_string(FILE *out, const char *z){ 1615 unsigned int c; 1616 fputc('"', out); 1617 while( (c = *(z++))!=0 ){ 1618 if( c=='\\' ){ 1619 fputc(c, out); 1620 fputc(c, out); 1621 }else if( c=='"' ){ 1622 fputc('\\', out); 1623 fputc('"', out); 1624 }else if( c=='\t' ){ 1625 fputc('\\', out); 1626 fputc('t', out); 1627 }else if( c=='\n' ){ 1628 fputc('\\', out); 1629 fputc('n', out); 1630 }else if( c=='\r' ){ 1631 fputc('\\', out); 1632 fputc('r', out); 1633 }else if( !isprint(c&0xff) ){ 1634 raw_printf(out, "\\%03o", c&0xff); 1635 }else{ 1636 fputc(c, out); 1637 } 1638 } 1639 fputc('"', out); 1640} 1641 1642/* 1643** Output the given string as a quoted according to JSON quoting rules. 1644*/ 1645static void output_json_string(FILE *out, const char *z, int n){ 1646 unsigned int c; 1647 if( n<0 ) n = (int)strlen(z); 1648 fputc('"', out); 1649 while( n-- ){ 1650 c = *(z++); 1651 if( c=='\\' || c=='"' ){ 1652 fputc('\\', out); 1653 fputc(c, out); 1654 }else if( c<=0x1f ){ 1655 fputc('\\', out); 1656 if( c=='\b' ){ 1657 fputc('b', out); 1658 }else if( c=='\f' ){ 1659 fputc('f', out); 1660 }else if( c=='\n' ){ 1661 fputc('n', out); 1662 }else if( c=='\r' ){ 1663 fputc('r', out); 1664 }else if( c=='\t' ){ 1665 fputc('t', out); 1666 }else{ 1667 raw_printf(out, "u%04x",c); 1668 } 1669 }else{ 1670 fputc(c, out); 1671 } 1672 } 1673 fputc('"', out); 1674} 1675 1676/* 1677** Output the given string with characters that are special to 1678** HTML escaped. 1679*/ 1680static void output_html_string(FILE *out, const char *z){ 1681 int i; 1682 if( z==0 ) z = ""; 1683 while( *z ){ 1684 for(i=0; z[i] 1685 && z[i]!='<' 1686 && z[i]!='&' 1687 && z[i]!='>' 1688 && z[i]!='\"' 1689 && z[i]!='\''; 1690 i++){} 1691 if( i>0 ){ 1692 utf8_printf(out,"%.*s",i,z); 1693 } 1694 if( z[i]=='<' ){ 1695 raw_printf(out,"<"); 1696 }else if( z[i]=='&' ){ 1697 raw_printf(out,"&"); 1698 }else if( z[i]=='>' ){ 1699 raw_printf(out,">"); 1700 }else if( z[i]=='\"' ){ 1701 raw_printf(out,"""); 1702 }else if( z[i]=='\'' ){ 1703 raw_printf(out,"'"); 1704 }else{ 1705 break; 1706 } 1707 z += i + 1; 1708 } 1709} 1710 1711/* 1712** If a field contains any character identified by a 1 in the following 1713** array, then the string must be quoted for CSV. 1714*/ 1715static const char needCsvQuote[] = { 1716 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1717 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1718 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1719 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1720 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1722 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1724 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1725 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1726 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1727 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1728 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1729 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1730 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1731 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1732}; 1733 1734/* 1735** Output a single term of CSV. Actually, p->colSeparator is used for 1736** the separator, which may or may not be a comma. p->nullValue is 1737** the null value. Strings are quoted if necessary. The separator 1738** is only issued if bSep is true. 1739*/ 1740static void output_csv(ShellState *p, const char *z, int bSep){ 1741 FILE *out = p->out; 1742 if( z==0 ){ 1743 utf8_printf(out,"%s",p->nullValue); 1744 }else{ 1745 unsigned i; 1746 for(i=0; z[i]; i++){ 1747 if( needCsvQuote[((unsigned char*)z)[i]] ){ 1748 i = 0; 1749 break; 1750 } 1751 } 1752 if( i==0 || strstr(z, p->colSeparator)!=0 ){ 1753 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 1754 shell_check_oom(zQuoted); 1755 utf8_printf(out, "%s", zQuoted); 1756 sqlite3_free(zQuoted); 1757 }else{ 1758 utf8_printf(out, "%s", z); 1759 } 1760 } 1761 if( bSep ){ 1762 utf8_printf(p->out, "%s", p->colSeparator); 1763 } 1764} 1765 1766/* 1767** This routine runs when the user presses Ctrl-C 1768*/ 1769static void interrupt_handler(int NotUsed){ 1770 UNUSED_PARAMETER(NotUsed); 1771 seenInterrupt++; 1772 if( seenInterrupt>2 ) exit(1); 1773 if( globalDb ) sqlite3_interrupt(globalDb); 1774} 1775 1776#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 1777/* 1778** This routine runs for console events (e.g. Ctrl-C) on Win32 1779*/ 1780static BOOL WINAPI ConsoleCtrlHandler( 1781 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 1782){ 1783 if( dwCtrlType==CTRL_C_EVENT ){ 1784 interrupt_handler(0); 1785 return TRUE; 1786 } 1787 return FALSE; 1788} 1789#endif 1790 1791#ifndef SQLITE_OMIT_AUTHORIZATION 1792/* 1793** This authorizer runs in safe mode. 1794*/ 1795static int safeModeAuth( 1796 void *pClientData, 1797 int op, 1798 const char *zA1, 1799 const char *zA2, 1800 const char *zA3, 1801 const char *zA4 1802){ 1803 ShellState *p = (ShellState*)pClientData; 1804 static const char *azProhibitedFunctions[] = { 1805 "edit", 1806 "fts3_tokenizer", 1807 "load_extension", 1808 "readfile", 1809 "writefile", 1810 "zipfile", 1811 "zipfile_cds", 1812 }; 1813 UNUSED_PARAMETER(zA2); 1814 UNUSED_PARAMETER(zA3); 1815 UNUSED_PARAMETER(zA4); 1816 switch( op ){ 1817 case SQLITE_ATTACH: { 1818 failIfSafeMode(p, "cannot run ATTACH in safe mode"); 1819 break; 1820 } 1821 case SQLITE_FUNCTION: { 1822 int i; 1823 for(i=0; i<ArraySize(azProhibitedFunctions); i++){ 1824 if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){ 1825 failIfSafeMode(p, "cannot use the %s() function in safe mode", 1826 azProhibitedFunctions[i]); 1827 } 1828 } 1829 break; 1830 } 1831 } 1832 return SQLITE_OK; 1833} 1834 1835/* 1836** When the ".auth ON" is set, the following authorizer callback is 1837** invoked. It always returns SQLITE_OK. 1838*/ 1839static int shellAuth( 1840 void *pClientData, 1841 int op, 1842 const char *zA1, 1843 const char *zA2, 1844 const char *zA3, 1845 const char *zA4 1846){ 1847 ShellState *p = (ShellState*)pClientData; 1848 static const char *azAction[] = { 0, 1849 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 1850 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 1851 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 1852 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 1853 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 1854 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 1855 "PRAGMA", "READ", "SELECT", 1856 "TRANSACTION", "UPDATE", "ATTACH", 1857 "DETACH", "ALTER_TABLE", "REINDEX", 1858 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 1859 "FUNCTION", "SAVEPOINT", "RECURSIVE" 1860 }; 1861 int i; 1862 const char *az[4]; 1863 az[0] = zA1; 1864 az[1] = zA2; 1865 az[2] = zA3; 1866 az[3] = zA4; 1867 utf8_printf(p->out, "authorizer: %s", azAction[op]); 1868 for(i=0; i<4; i++){ 1869 raw_printf(p->out, " "); 1870 if( az[i] ){ 1871 output_c_string(p->out, az[i]); 1872 }else{ 1873 raw_printf(p->out, "NULL"); 1874 } 1875 } 1876 raw_printf(p->out, "\n"); 1877 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); 1878 return SQLITE_OK; 1879} 1880#endif 1881 1882/* 1883** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 1884** 1885** This routine converts some CREATE TABLE statements for shadow tables 1886** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 1887*/ 1888static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 1889 if( z==0 ) return; 1890 if( zTail==0 ) return; 1891 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 1892 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 1893 }else{ 1894 utf8_printf(out, "%s%s", z, zTail); 1895 } 1896} 1897static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 1898 char c = z[n]; 1899 z[n] = 0; 1900 printSchemaLine(out, z, zTail); 1901 z[n] = c; 1902} 1903 1904/* 1905** Return true if string z[] has nothing but whitespace and comments to the 1906** end of the first line. 1907*/ 1908static int wsToEol(const char *z){ 1909 int i; 1910 for(i=0; z[i]; i++){ 1911 if( z[i]=='\n' ) return 1; 1912 if( IsSpace(z[i]) ) continue; 1913 if( z[i]=='-' && z[i+1]=='-' ) return 1; 1914 return 0; 1915 } 1916 return 1; 1917} 1918 1919/* 1920** Add a new entry to the EXPLAIN QUERY PLAN data 1921*/ 1922static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 1923 EQPGraphRow *pNew; 1924 int nText = strlen30(zText); 1925 if( p->autoEQPtest ){ 1926 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 1927 } 1928 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 1929 shell_check_oom(pNew); 1930 pNew->iEqpId = iEqpId; 1931 pNew->iParentId = p2; 1932 memcpy(pNew->zText, zText, nText+1); 1933 pNew->pNext = 0; 1934 if( p->sGraph.pLast ){ 1935 p->sGraph.pLast->pNext = pNew; 1936 }else{ 1937 p->sGraph.pRow = pNew; 1938 } 1939 p->sGraph.pLast = pNew; 1940} 1941 1942/* 1943** Free and reset the EXPLAIN QUERY PLAN data that has been collected 1944** in p->sGraph. 1945*/ 1946static void eqp_reset(ShellState *p){ 1947 EQPGraphRow *pRow, *pNext; 1948 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 1949 pNext = pRow->pNext; 1950 sqlite3_free(pRow); 1951 } 1952 memset(&p->sGraph, 0, sizeof(p->sGraph)); 1953} 1954 1955/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 1956** pOld, or return the first such line if pOld is NULL 1957*/ 1958static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 1959 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 1960 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 1961 return pRow; 1962} 1963 1964/* Render a single level of the graph that has iEqpId as its parent. Called 1965** recursively to render sublevels. 1966*/ 1967static void eqp_render_level(ShellState *p, int iEqpId){ 1968 EQPGraphRow *pRow, *pNext; 1969 int n = strlen30(p->sGraph.zPrefix); 1970 char *z; 1971 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 1972 pNext = eqp_next_row(p, iEqpId, pRow); 1973 z = pRow->zText; 1974 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 1975 pNext ? "|--" : "`--", z); 1976 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 1977 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 1978 eqp_render_level(p, pRow->iEqpId); 1979 p->sGraph.zPrefix[n] = 0; 1980 } 1981 } 1982} 1983 1984/* 1985** Display and reset the EXPLAIN QUERY PLAN data 1986*/ 1987static void eqp_render(ShellState *p){ 1988 EQPGraphRow *pRow = p->sGraph.pRow; 1989 if( pRow ){ 1990 if( pRow->zText[0]=='-' ){ 1991 if( pRow->pNext==0 ){ 1992 eqp_reset(p); 1993 return; 1994 } 1995 utf8_printf(p->out, "%s\n", pRow->zText+3); 1996 p->sGraph.pRow = pRow->pNext; 1997 sqlite3_free(pRow); 1998 }else{ 1999 utf8_printf(p->out, "QUERY PLAN\n"); 2000 } 2001 p->sGraph.zPrefix[0] = 0; 2002 eqp_render_level(p, 0); 2003 eqp_reset(p); 2004 } 2005} 2006 2007#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 2008/* 2009** Progress handler callback. 2010*/ 2011static int progress_handler(void *pClientData) { 2012 ShellState *p = (ShellState*)pClientData; 2013 p->nProgress++; 2014 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 2015 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 2016 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 2017 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 2018 return 1; 2019 } 2020 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 2021 raw_printf(p->out, "Progress %u\n", p->nProgress); 2022 } 2023 return 0; 2024} 2025#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 2026 2027/* 2028** Print N dashes 2029*/ 2030static void print_dashes(FILE *out, int N){ 2031 const char zDash[] = "--------------------------------------------------"; 2032 const int nDash = sizeof(zDash) - 1; 2033 while( N>nDash ){ 2034 fputs(zDash, out); 2035 N -= nDash; 2036 } 2037 raw_printf(out, "%.*s", N, zDash); 2038} 2039 2040/* 2041** Print a markdown or table-style row separator using ascii-art 2042*/ 2043static void print_row_separator( 2044 ShellState *p, 2045 int nArg, 2046 const char *zSep 2047){ 2048 int i; 2049 if( nArg>0 ){ 2050 fputs(zSep, p->out); 2051 print_dashes(p->out, p->actualWidth[0]+2); 2052 for(i=1; i<nArg; i++){ 2053 fputs(zSep, p->out); 2054 print_dashes(p->out, p->actualWidth[i]+2); 2055 } 2056 fputs(zSep, p->out); 2057 } 2058 fputs("\n", p->out); 2059} 2060 2061/* 2062** This is the callback routine that the shell 2063** invokes for each row of a query result. 2064*/ 2065static int shell_callback( 2066 void *pArg, 2067 int nArg, /* Number of result columns */ 2068 char **azArg, /* Text of each result column */ 2069 char **azCol, /* Column names */ 2070 int *aiType /* Column types. Might be NULL */ 2071){ 2072 int i; 2073 ShellState *p = (ShellState*)pArg; 2074 2075 if( azArg==0 ) return 0; 2076 switch( p->cMode ){ 2077 case MODE_Count: 2078 case MODE_Off: { 2079 break; 2080 } 2081 case MODE_Line: { 2082 int w = 5; 2083 if( azArg==0 ) break; 2084 for(i=0; i<nArg; i++){ 2085 int len = strlen30(azCol[i] ? azCol[i] : ""); 2086 if( len>w ) w = len; 2087 } 2088 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 2089 for(i=0; i<nArg; i++){ 2090 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 2091 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 2092 } 2093 break; 2094 } 2095 case MODE_Explain: { 2096 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 2097 if( nArg>ArraySize(aExplainWidth) ){ 2098 nArg = ArraySize(aExplainWidth); 2099 } 2100 if( p->cnt++==0 ){ 2101 for(i=0; i<nArg; i++){ 2102 int w = aExplainWidth[i]; 2103 utf8_width_print(p->out, w, azCol[i]); 2104 fputs(i==nArg-1 ? "\n" : " ", p->out); 2105 } 2106 for(i=0; i<nArg; i++){ 2107 int w = aExplainWidth[i]; 2108 print_dashes(p->out, w); 2109 fputs(i==nArg-1 ? "\n" : " ", p->out); 2110 } 2111 } 2112 if( azArg==0 ) break; 2113 for(i=0; i<nArg; i++){ 2114 int w = aExplainWidth[i]; 2115 if( i==nArg-1 ) w = 0; 2116 if( azArg[i] && strlenChar(azArg[i])>w ){ 2117 w = strlenChar(azArg[i]); 2118 } 2119 if( i==1 && p->aiIndent && p->pStmt ){ 2120 if( p->iIndent<p->nIndent ){ 2121 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 2122 } 2123 p->iIndent++; 2124 } 2125 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 2126 fputs(i==nArg-1 ? "\n" : " ", p->out); 2127 } 2128 break; 2129 } 2130 case MODE_Semi: { /* .schema and .fullschema output */ 2131 printSchemaLine(p->out, azArg[0], ";\n"); 2132 break; 2133 } 2134 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 2135 char *z; 2136 int j; 2137 int nParen = 0; 2138 char cEnd = 0; 2139 char c; 2140 int nLine = 0; 2141 assert( nArg==1 ); 2142 if( azArg[0]==0 ) break; 2143 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 2144 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 2145 ){ 2146 utf8_printf(p->out, "%s;\n", azArg[0]); 2147 break; 2148 } 2149 z = sqlite3_mprintf("%s", azArg[0]); 2150 shell_check_oom(z); 2151 j = 0; 2152 for(i=0; IsSpace(z[i]); i++){} 2153 for(; (c = z[i])!=0; i++){ 2154 if( IsSpace(c) ){ 2155 if( z[j-1]=='\r' ) z[j-1] = '\n'; 2156 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 2157 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 2158 j--; 2159 } 2160 z[j++] = c; 2161 } 2162 while( j>0 && IsSpace(z[j-1]) ){ j--; } 2163 z[j] = 0; 2164 if( strlen30(z)>=79 ){ 2165 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 2166 if( c==cEnd ){ 2167 cEnd = 0; 2168 }else if( c=='"' || c=='\'' || c=='`' ){ 2169 cEnd = c; 2170 }else if( c=='[' ){ 2171 cEnd = ']'; 2172 }else if( c=='-' && z[i+1]=='-' ){ 2173 cEnd = '\n'; 2174 }else if( c=='(' ){ 2175 nParen++; 2176 }else if( c==')' ){ 2177 nParen--; 2178 if( nLine>0 && nParen==0 && j>0 ){ 2179 printSchemaLineN(p->out, z, j, "\n"); 2180 j = 0; 2181 } 2182 } 2183 z[j++] = c; 2184 if( nParen==1 && cEnd==0 2185 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 2186 ){ 2187 if( c=='\n' ) j--; 2188 printSchemaLineN(p->out, z, j, "\n "); 2189 j = 0; 2190 nLine++; 2191 while( IsSpace(z[i+1]) ){ i++; } 2192 } 2193 } 2194 z[j] = 0; 2195 } 2196 printSchemaLine(p->out, z, ";\n"); 2197 sqlite3_free(z); 2198 break; 2199 } 2200 case MODE_List: { 2201 if( p->cnt++==0 && p->showHeader ){ 2202 for(i=0; i<nArg; i++){ 2203 utf8_printf(p->out,"%s%s",azCol[i], 2204 i==nArg-1 ? p->rowSeparator : p->colSeparator); 2205 } 2206 } 2207 if( azArg==0 ) break; 2208 for(i=0; i<nArg; i++){ 2209 char *z = azArg[i]; 2210 if( z==0 ) z = p->nullValue; 2211 utf8_printf(p->out, "%s", z); 2212 if( i<nArg-1 ){ 2213 utf8_printf(p->out, "%s", p->colSeparator); 2214 }else{ 2215 utf8_printf(p->out, "%s", p->rowSeparator); 2216 } 2217 } 2218 break; 2219 } 2220 case MODE_Html: { 2221 if( p->cnt++==0 && p->showHeader ){ 2222 raw_printf(p->out,"<TR>"); 2223 for(i=0; i<nArg; i++){ 2224 raw_printf(p->out,"<TH>"); 2225 output_html_string(p->out, azCol[i]); 2226 raw_printf(p->out,"</TH>\n"); 2227 } 2228 raw_printf(p->out,"</TR>\n"); 2229 } 2230 if( azArg==0 ) break; 2231 raw_printf(p->out,"<TR>"); 2232 for(i=0; i<nArg; i++){ 2233 raw_printf(p->out,"<TD>"); 2234 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2235 raw_printf(p->out,"</TD>\n"); 2236 } 2237 raw_printf(p->out,"</TR>\n"); 2238 break; 2239 } 2240 case MODE_Tcl: { 2241 if( p->cnt++==0 && p->showHeader ){ 2242 for(i=0; i<nArg; i++){ 2243 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 2244 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2245 } 2246 utf8_printf(p->out, "%s", p->rowSeparator); 2247 } 2248 if( azArg==0 ) break; 2249 for(i=0; i<nArg; i++){ 2250 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 2251 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 2252 } 2253 utf8_printf(p->out, "%s", p->rowSeparator); 2254 break; 2255 } 2256 case MODE_Csv: { 2257 setBinaryMode(p->out, 1); 2258 if( p->cnt++==0 && p->showHeader ){ 2259 for(i=0; i<nArg; i++){ 2260 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 2261 } 2262 utf8_printf(p->out, "%s", p->rowSeparator); 2263 } 2264 if( nArg>0 ){ 2265 for(i=0; i<nArg; i++){ 2266 output_csv(p, azArg[i], i<nArg-1); 2267 } 2268 utf8_printf(p->out, "%s", p->rowSeparator); 2269 } 2270 setTextMode(p->out, 1); 2271 break; 2272 } 2273 case MODE_Insert: { 2274 if( azArg==0 ) break; 2275 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 2276 if( p->showHeader ){ 2277 raw_printf(p->out,"("); 2278 for(i=0; i<nArg; i++){ 2279 if( i>0 ) raw_printf(p->out, ","); 2280 if( quoteChar(azCol[i]) ){ 2281 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 2282 shell_check_oom(z); 2283 utf8_printf(p->out, "%s", z); 2284 sqlite3_free(z); 2285 }else{ 2286 raw_printf(p->out, "%s", azCol[i]); 2287 } 2288 } 2289 raw_printf(p->out,")"); 2290 } 2291 p->cnt++; 2292 for(i=0; i<nArg; i++){ 2293 raw_printf(p->out, i>0 ? "," : " VALUES("); 2294 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2295 utf8_printf(p->out,"NULL"); 2296 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2297 if( ShellHasFlag(p, SHFLG_Newlines) ){ 2298 output_quoted_string(p->out, azArg[i]); 2299 }else{ 2300 output_quoted_escaped_string(p->out, azArg[i]); 2301 } 2302 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2303 utf8_printf(p->out,"%s", azArg[i]); 2304 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2305 char z[50]; 2306 double r = sqlite3_column_double(p->pStmt, i); 2307 sqlite3_uint64 ur; 2308 memcpy(&ur,&r,sizeof(r)); 2309 if( ur==0x7ff0000000000000LL ){ 2310 raw_printf(p->out, "1e999"); 2311 }else if( ur==0xfff0000000000000LL ){ 2312 raw_printf(p->out, "-1e999"); 2313 }else{ 2314 sqlite3_int64 ir = (sqlite3_int64)r; 2315 if( r==(double)ir ){ 2316 sqlite3_snprintf(50,z,"%lld.0", ir); 2317 }else{ 2318 sqlite3_snprintf(50,z,"%!.20g", r); 2319 } 2320 raw_printf(p->out, "%s", z); 2321 } 2322 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2323 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2324 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2325 output_hex_blob(p->out, pBlob, nBlob); 2326 }else if( isNumber(azArg[i], 0) ){ 2327 utf8_printf(p->out,"%s", azArg[i]); 2328 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 2329 output_quoted_string(p->out, azArg[i]); 2330 }else{ 2331 output_quoted_escaped_string(p->out, azArg[i]); 2332 } 2333 } 2334 raw_printf(p->out,");\n"); 2335 break; 2336 } 2337 case MODE_Json: { 2338 if( azArg==0 ) break; 2339 if( p->cnt==0 ){ 2340 fputs("[{", p->out); 2341 }else{ 2342 fputs(",\n{", p->out); 2343 } 2344 p->cnt++; 2345 for(i=0; i<nArg; i++){ 2346 output_json_string(p->out, azCol[i], -1); 2347 putc(':', p->out); 2348 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2349 fputs("null",p->out); 2350 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2351 char z[50]; 2352 double r = sqlite3_column_double(p->pStmt, i); 2353 sqlite3_uint64 ur; 2354 memcpy(&ur,&r,sizeof(r)); 2355 if( ur==0x7ff0000000000000LL ){ 2356 raw_printf(p->out, "1e999"); 2357 }else if( ur==0xfff0000000000000LL ){ 2358 raw_printf(p->out, "-1e999"); 2359 }else{ 2360 sqlite3_snprintf(50,z,"%!.20g", r); 2361 raw_printf(p->out, "%s", z); 2362 } 2363 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2364 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2365 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2366 output_json_string(p->out, pBlob, nBlob); 2367 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2368 output_json_string(p->out, azArg[i], -1); 2369 }else{ 2370 utf8_printf(p->out,"%s", azArg[i]); 2371 } 2372 if( i<nArg-1 ){ 2373 putc(',', p->out); 2374 } 2375 } 2376 putc('}', p->out); 2377 break; 2378 } 2379 case MODE_Quote: { 2380 if( azArg==0 ) break; 2381 if( p->cnt==0 && p->showHeader ){ 2382 for(i=0; i<nArg; i++){ 2383 if( i>0 ) fputs(p->colSeparator, p->out); 2384 output_quoted_string(p->out, azCol[i]); 2385 } 2386 fputs(p->rowSeparator, p->out); 2387 } 2388 p->cnt++; 2389 for(i=0; i<nArg; i++){ 2390 if( i>0 ) fputs(p->colSeparator, p->out); 2391 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2392 utf8_printf(p->out,"NULL"); 2393 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2394 output_quoted_string(p->out, azArg[i]); 2395 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2396 utf8_printf(p->out,"%s", azArg[i]); 2397 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2398 char z[50]; 2399 double r = sqlite3_column_double(p->pStmt, i); 2400 sqlite3_snprintf(50,z,"%!.20g", r); 2401 raw_printf(p->out, "%s", z); 2402 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2403 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2404 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2405 output_hex_blob(p->out, pBlob, nBlob); 2406 }else if( isNumber(azArg[i], 0) ){ 2407 utf8_printf(p->out,"%s", azArg[i]); 2408 }else{ 2409 output_quoted_string(p->out, azArg[i]); 2410 } 2411 } 2412 fputs(p->rowSeparator, p->out); 2413 break; 2414 } 2415 case MODE_Ascii: { 2416 if( p->cnt++==0 && p->showHeader ){ 2417 for(i=0; i<nArg; i++){ 2418 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2419 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 2420 } 2421 utf8_printf(p->out, "%s", p->rowSeparator); 2422 } 2423 if( azArg==0 ) break; 2424 for(i=0; i<nArg; i++){ 2425 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2426 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 2427 } 2428 utf8_printf(p->out, "%s", p->rowSeparator); 2429 break; 2430 } 2431 case MODE_EQP: { 2432 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 2433 break; 2434 } 2435 } 2436 return 0; 2437} 2438 2439/* 2440** This is the callback routine that the SQLite library 2441** invokes for each row of a query result. 2442*/ 2443static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 2444 /* since we don't have type info, call the shell_callback with a NULL value */ 2445 return shell_callback(pArg, nArg, azArg, azCol, NULL); 2446} 2447 2448/* 2449** This is the callback routine from sqlite3_exec() that appends all 2450** output onto the end of a ShellText object. 2451*/ 2452static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 2453 ShellText *p = (ShellText*)pArg; 2454 int i; 2455 UNUSED_PARAMETER(az); 2456 if( azArg==0 ) return 0; 2457 if( p->n ) appendText(p, "|", 0); 2458 for(i=0; i<nArg; i++){ 2459 if( i ) appendText(p, ",", 0); 2460 if( azArg[i] ) appendText(p, azArg[i], 0); 2461 } 2462 return 0; 2463} 2464 2465/* 2466** Generate an appropriate SELFTEST table in the main database. 2467*/ 2468static void createSelftestTable(ShellState *p){ 2469 char *zErrMsg = 0; 2470 sqlite3_exec(p->db, 2471 "SAVEPOINT selftest_init;\n" 2472 "CREATE TABLE IF NOT EXISTS selftest(\n" 2473 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 2474 " op TEXT,\n" /* Operator: memo run */ 2475 " cmd TEXT,\n" /* Command text */ 2476 " ans TEXT\n" /* Desired answer */ 2477 ");" 2478 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 2479 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 2480 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 2481 " 'memo','Tests generated by --init');\n" 2482 "INSERT INTO [_shell$self]\n" 2483 " SELECT 'run',\n" 2484 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 2485 "FROM sqlite_schema ORDER BY 2'',224))',\n" 2486 " hex(sha3_query('SELECT type,name,tbl_name,sql " 2487 "FROM sqlite_schema ORDER BY 2',224));\n" 2488 "INSERT INTO [_shell$self]\n" 2489 " SELECT 'run'," 2490 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 2491 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 2492 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 2493 " FROM (\n" 2494 " SELECT name FROM sqlite_schema\n" 2495 " WHERE type='table'\n" 2496 " AND name<>'selftest'\n" 2497 " AND coalesce(rootpage,0)>0\n" 2498 " )\n" 2499 " ORDER BY name;\n" 2500 "INSERT INTO [_shell$self]\n" 2501 " VALUES('run','PRAGMA integrity_check','ok');\n" 2502 "INSERT INTO selftest(tno,op,cmd,ans)" 2503 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 2504 "DROP TABLE [_shell$self];" 2505 ,0,0,&zErrMsg); 2506 if( zErrMsg ){ 2507 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 2508 sqlite3_free(zErrMsg); 2509 } 2510 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 2511} 2512 2513 2514/* 2515** Set the destination table field of the ShellState structure to 2516** the name of the table given. Escape any quote characters in the 2517** table name. 2518*/ 2519static void set_table_name(ShellState *p, const char *zName){ 2520 int i, n; 2521 char cQuote; 2522 char *z; 2523 2524 if( p->zDestTable ){ 2525 free(p->zDestTable); 2526 p->zDestTable = 0; 2527 } 2528 if( zName==0 ) return; 2529 cQuote = quoteChar(zName); 2530 n = strlen30(zName); 2531 if( cQuote ) n += n+2; 2532 z = p->zDestTable = malloc( n+1 ); 2533 shell_check_oom(z); 2534 n = 0; 2535 if( cQuote ) z[n++] = cQuote; 2536 for(i=0; zName[i]; i++){ 2537 z[n++] = zName[i]; 2538 if( zName[i]==cQuote ) z[n++] = cQuote; 2539 } 2540 if( cQuote ) z[n++] = cQuote; 2541 z[n] = 0; 2542} 2543 2544/* 2545** Maybe construct two lines of text that point out the position of a 2546** syntax error. Return a pointer to the text, in memory obtained from 2547** sqlite3_malloc(). Or, if the most recent error does not involve a 2548** specific token that we can point to, return an empty string. 2549** 2550** In all cases, the memory returned is obtained from sqlite3_malloc64() 2551** and should be released by the caller invoking sqlite3_free(). 2552*/ 2553static char *shell_error_context(const char *zSql, sqlite3 *db){ 2554 int iOffset; 2555 size_t len; 2556 char *zCode; 2557 char *zMsg; 2558 int i; 2559 if( db==0 2560 || zSql==0 2561 || (iOffset = sqlite3_error_offset(db))<0 2562 ){ 2563 return sqlite3_mprintf(""); 2564 } 2565 while( iOffset>50 ){ 2566 iOffset--; 2567 zSql++; 2568 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; } 2569 } 2570 len = strlen(zSql); 2571 if( len>78 ){ 2572 len = 78; 2573 while( (zSql[len]&0xc0)==0x80 ) len--; 2574 } 2575 zCode = sqlite3_mprintf("%.*s", len, zSql); 2576 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; } 2577 if( iOffset<25 ){ 2578 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode, iOffset, ""); 2579 }else{ 2580 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode, iOffset-14, ""); 2581 } 2582 return zMsg; 2583} 2584 2585 2586/* 2587** Execute a query statement that will generate SQL output. Print 2588** the result columns, comma-separated, on a line and then add a 2589** semicolon terminator to the end of that line. 2590** 2591** If the number of columns is 1 and that column contains text "--" 2592** then write the semicolon on a separate line. That way, if a 2593** "--" comment occurs at the end of the statement, the comment 2594** won't consume the semicolon terminator. 2595*/ 2596static int run_table_dump_query( 2597 ShellState *p, /* Query context */ 2598 const char *zSelect /* SELECT statement to extract content */ 2599){ 2600 sqlite3_stmt *pSelect; 2601 int rc; 2602 int nResult; 2603 int i; 2604 const char *z; 2605 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 2606 if( rc!=SQLITE_OK || !pSelect ){ 2607 char *zContext = shell_error_context(zSelect, p->db); 2608 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc, 2609 sqlite3_errmsg(p->db), zContext); 2610 sqlite3_free(zContext); 2611 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2612 return rc; 2613 } 2614 rc = sqlite3_step(pSelect); 2615 nResult = sqlite3_column_count(pSelect); 2616 while( rc==SQLITE_ROW ){ 2617 z = (const char*)sqlite3_column_text(pSelect, 0); 2618 utf8_printf(p->out, "%s", z); 2619 for(i=1; i<nResult; i++){ 2620 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 2621 } 2622 if( z==0 ) z = ""; 2623 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 2624 if( z[0] ){ 2625 raw_printf(p->out, "\n;\n"); 2626 }else{ 2627 raw_printf(p->out, ";\n"); 2628 } 2629 rc = sqlite3_step(pSelect); 2630 } 2631 rc = sqlite3_finalize(pSelect); 2632 if( rc!=SQLITE_OK ){ 2633 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2634 sqlite3_errmsg(p->db)); 2635 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2636 } 2637 return rc; 2638} 2639 2640/* 2641** Allocate space and save off string indicating current error. 2642*/ 2643static char *save_err_msg( 2644 sqlite3 *db, /* Database to query */ 2645 const char *zPhase, /* When the error occcurs */ 2646 int rc, /* Error code returned from API */ 2647 const char *zSql /* SQL string, or NULL */ 2648){ 2649 char *zErr; 2650 char *zContext; 2651 sqlite3_str *pStr = sqlite3_str_new(0); 2652 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db)); 2653 if( rc>1 ){ 2654 sqlite3_str_appendf(pStr, " (%d)", rc); 2655 } 2656 zContext = shell_error_context(zSql, db); 2657 if( zContext ){ 2658 sqlite3_str_appendall(pStr, zContext); 2659 sqlite3_free(zContext); 2660 } 2661 zErr = sqlite3_str_finish(pStr); 2662 shell_check_oom(zErr); 2663 return zErr; 2664} 2665 2666#ifdef __linux__ 2667/* 2668** Attempt to display I/O stats on Linux using /proc/PID/io 2669*/ 2670static void displayLinuxIoStats(FILE *out){ 2671 FILE *in; 2672 char z[200]; 2673 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 2674 in = fopen(z, "rb"); 2675 if( in==0 ) return; 2676 while( fgets(z, sizeof(z), in)!=0 ){ 2677 static const struct { 2678 const char *zPattern; 2679 const char *zDesc; 2680 } aTrans[] = { 2681 { "rchar: ", "Bytes received by read():" }, 2682 { "wchar: ", "Bytes sent to write():" }, 2683 { "syscr: ", "Read() system calls:" }, 2684 { "syscw: ", "Write() system calls:" }, 2685 { "read_bytes: ", "Bytes read from storage:" }, 2686 { "write_bytes: ", "Bytes written to storage:" }, 2687 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 2688 }; 2689 int i; 2690 for(i=0; i<ArraySize(aTrans); i++){ 2691 int n = strlen30(aTrans[i].zPattern); 2692 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 2693 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 2694 break; 2695 } 2696 } 2697 } 2698 fclose(in); 2699} 2700#endif 2701 2702/* 2703** Display a single line of status using 64-bit values. 2704*/ 2705static void displayStatLine( 2706 ShellState *p, /* The shell context */ 2707 char *zLabel, /* Label for this one line */ 2708 char *zFormat, /* Format for the result */ 2709 int iStatusCtrl, /* Which status to display */ 2710 int bReset /* True to reset the stats */ 2711){ 2712 sqlite3_int64 iCur = -1; 2713 sqlite3_int64 iHiwtr = -1; 2714 int i, nPercent; 2715 char zLine[200]; 2716 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 2717 for(i=0, nPercent=0; zFormat[i]; i++){ 2718 if( zFormat[i]=='%' ) nPercent++; 2719 } 2720 if( nPercent>1 ){ 2721 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 2722 }else{ 2723 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 2724 } 2725 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 2726} 2727 2728/* 2729** Display memory stats. 2730*/ 2731static int display_stats( 2732 sqlite3 *db, /* Database to query */ 2733 ShellState *pArg, /* Pointer to ShellState */ 2734 int bReset /* True to reset the stats */ 2735){ 2736 int iCur; 2737 int iHiwtr; 2738 FILE *out; 2739 if( pArg==0 || pArg->out==0 ) return 0; 2740 out = pArg->out; 2741 2742 if( pArg->pStmt && pArg->statsOn==2 ){ 2743 int nCol, i, x; 2744 sqlite3_stmt *pStmt = pArg->pStmt; 2745 char z[100]; 2746 nCol = sqlite3_column_count(pStmt); 2747 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 2748 for(i=0; i<nCol; i++){ 2749 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 2750 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 2751#ifndef SQLITE_OMIT_DECLTYPE 2752 sqlite3_snprintf(30, z+x, "declared type:"); 2753 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 2754#endif 2755#ifdef SQLITE_ENABLE_COLUMN_METADATA 2756 sqlite3_snprintf(30, z+x, "database name:"); 2757 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 2758 sqlite3_snprintf(30, z+x, "table name:"); 2759 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 2760 sqlite3_snprintf(30, z+x, "origin name:"); 2761 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 2762#endif 2763 } 2764 } 2765 2766 if( pArg->statsOn==3 ){ 2767 if( pArg->pStmt ){ 2768 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2769 raw_printf(pArg->out, "VM-steps: %d\n", iCur); 2770 } 2771 return 0; 2772 } 2773 2774 displayStatLine(pArg, "Memory Used:", 2775 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 2776 displayStatLine(pArg, "Number of Outstanding Allocations:", 2777 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 2778 if( pArg->shellFlgs & SHFLG_Pagecache ){ 2779 displayStatLine(pArg, "Number of Pcache Pages Used:", 2780 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 2781 } 2782 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 2783 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 2784 displayStatLine(pArg, "Largest Allocation:", 2785 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 2786 displayStatLine(pArg, "Largest Pcache Allocation:", 2787 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 2788#ifdef YYTRACKMAXSTACKDEPTH 2789 displayStatLine(pArg, "Deepest Parser Stack:", 2790 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 2791#endif 2792 2793 if( db ){ 2794 if( pArg->shellFlgs & SHFLG_Lookaside ){ 2795 iHiwtr = iCur = -1; 2796 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 2797 &iCur, &iHiwtr, bReset); 2798 raw_printf(pArg->out, 2799 "Lookaside Slots Used: %d (max %d)\n", 2800 iCur, iHiwtr); 2801 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 2802 &iCur, &iHiwtr, bReset); 2803 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 2804 iHiwtr); 2805 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 2806 &iCur, &iHiwtr, bReset); 2807 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 2808 iHiwtr); 2809 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 2810 &iCur, &iHiwtr, bReset); 2811 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 2812 iHiwtr); 2813 } 2814 iHiwtr = iCur = -1; 2815 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 2816 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 2817 iCur); 2818 iHiwtr = iCur = -1; 2819 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 2820 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 2821 iHiwtr = iCur = -1; 2822 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 2823 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 2824 iHiwtr = iCur = -1; 2825 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 2826 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 2827 iHiwtr = iCur = -1; 2828 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 2829 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 2830 iHiwtr = iCur = -1; 2831 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 2832 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 2833 iCur); 2834 iHiwtr = iCur = -1; 2835 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 2836 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 2837 iCur); 2838 } 2839 2840 if( pArg->pStmt ){ 2841 int iHit, iMiss; 2842 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 2843 bReset); 2844 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 2845 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 2846 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 2847 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 2848 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 2849 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset); 2850 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset); 2851 if( iHit || iMiss ){ 2852 raw_printf(pArg->out, "Bloom filter bypass taken: %d/%d\n", 2853 iHit, iHit+iMiss); 2854 } 2855 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2856 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 2857 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 2858 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 2859 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 2860 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 2861 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 2862 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 2863 } 2864 2865#ifdef __linux__ 2866 displayLinuxIoStats(pArg->out); 2867#endif 2868 2869 /* Do not remove this machine readable comment: extra-stats-output-here */ 2870 2871 return 0; 2872} 2873 2874/* 2875** Display scan stats. 2876*/ 2877static void display_scanstats( 2878 sqlite3 *db, /* Database to query */ 2879 ShellState *pArg /* Pointer to ShellState */ 2880){ 2881#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 2882 UNUSED_PARAMETER(db); 2883 UNUSED_PARAMETER(pArg); 2884#else 2885 int i, k, n, mx; 2886 raw_printf(pArg->out, "-------- scanstats --------\n"); 2887 mx = 0; 2888 for(k=0; k<=mx; k++){ 2889 double rEstLoop = 1.0; 2890 for(i=n=0; 1; i++){ 2891 sqlite3_stmt *p = pArg->pStmt; 2892 sqlite3_int64 nLoop, nVisit; 2893 double rEst; 2894 int iSid; 2895 const char *zExplain; 2896 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 2897 break; 2898 } 2899 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 2900 if( iSid>mx ) mx = iSid; 2901 if( iSid!=k ) continue; 2902 if( n==0 ){ 2903 rEstLoop = (double)nLoop; 2904 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 2905 } 2906 n++; 2907 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 2908 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 2909 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 2910 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 2911 rEstLoop *= rEst; 2912 raw_printf(pArg->out, 2913 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 2914 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 2915 ); 2916 } 2917 } 2918 raw_printf(pArg->out, "---------------------------\n"); 2919#endif 2920} 2921 2922/* 2923** Parameter azArray points to a zero-terminated array of strings. zStr 2924** points to a single nul-terminated string. Return non-zero if zStr 2925** is equal, according to strcmp(), to any of the strings in the array. 2926** Otherwise, return zero. 2927*/ 2928static int str_in_array(const char *zStr, const char **azArray){ 2929 int i; 2930 for(i=0; azArray[i]; i++){ 2931 if( 0==strcmp(zStr, azArray[i]) ) return 1; 2932 } 2933 return 0; 2934} 2935 2936/* 2937** If compiled statement pSql appears to be an EXPLAIN statement, allocate 2938** and populate the ShellState.aiIndent[] array with the number of 2939** spaces each opcode should be indented before it is output. 2940** 2941** The indenting rules are: 2942** 2943** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 2944** all opcodes that occur between the p2 jump destination and the opcode 2945** itself by 2 spaces. 2946** 2947** * For each "Goto", if the jump destination is earlier in the program 2948** and ends on one of: 2949** Yield SeekGt SeekLt RowSetRead Rewind 2950** or if the P1 parameter is one instead of zero, 2951** then indent all opcodes between the earlier instruction 2952** and "Goto" by 2 spaces. 2953*/ 2954static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 2955 const char *zSql; /* The text of the SQL statement */ 2956 const char *z; /* Used to check if this is an EXPLAIN */ 2957 int *abYield = 0; /* True if op is an OP_Yield */ 2958 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 2959 int iOp; /* Index of operation in p->aiIndent[] */ 2960 2961 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 2962 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 2963 "Rewind", 0 }; 2964 const char *azGoto[] = { "Goto", 0 }; 2965 2966 /* Try to figure out if this is really an EXPLAIN statement. If this 2967 ** cannot be verified, return early. */ 2968 if( sqlite3_column_count(pSql)!=8 ){ 2969 p->cMode = p->mode; 2970 return; 2971 } 2972 zSql = sqlite3_sql(pSql); 2973 if( zSql==0 ) return; 2974 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 2975 if( sqlite3_strnicmp(z, "explain", 7) ){ 2976 p->cMode = p->mode; 2977 return; 2978 } 2979 2980 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 2981 int i; 2982 int iAddr = sqlite3_column_int(pSql, 0); 2983 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 2984 2985 /* Set p2 to the P2 field of the current opcode. Then, assuming that 2986 ** p2 is an instruction address, set variable p2op to the index of that 2987 ** instruction in the aiIndent[] array. p2 and p2op may be different if 2988 ** the current instruction is part of a sub-program generated by an 2989 ** SQL trigger or foreign key. */ 2990 int p2 = sqlite3_column_int(pSql, 3); 2991 int p2op = (p2 + (iOp-iAddr)); 2992 2993 /* Grow the p->aiIndent array as required */ 2994 if( iOp>=nAlloc ){ 2995 if( iOp==0 ){ 2996 /* Do further verfication that this is explain output. Abort if 2997 ** it is not */ 2998 static const char *explainCols[] = { 2999 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 3000 int jj; 3001 for(jj=0; jj<ArraySize(explainCols); jj++){ 3002 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 3003 p->cMode = p->mode; 3004 sqlite3_reset(pSql); 3005 return; 3006 } 3007 } 3008 } 3009 nAlloc += 100; 3010 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 3011 shell_check_oom(p->aiIndent); 3012 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 3013 shell_check_oom(abYield); 3014 } 3015 abYield[iOp] = str_in_array(zOp, azYield); 3016 p->aiIndent[iOp] = 0; 3017 p->nIndent = iOp+1; 3018 3019 if( str_in_array(zOp, azNext) ){ 3020 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 3021 } 3022 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 3023 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 3024 ){ 3025 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 3026 } 3027 } 3028 3029 p->iIndent = 0; 3030 sqlite3_free(abYield); 3031 sqlite3_reset(pSql); 3032} 3033 3034/* 3035** Free the array allocated by explain_data_prepare(). 3036*/ 3037static void explain_data_delete(ShellState *p){ 3038 sqlite3_free(p->aiIndent); 3039 p->aiIndent = 0; 3040 p->nIndent = 0; 3041 p->iIndent = 0; 3042} 3043 3044/* 3045** Disable and restore .wheretrace and .selecttrace settings. 3046*/ 3047static unsigned int savedSelectTrace; 3048static unsigned int savedWhereTrace; 3049static void disable_debug_trace_modes(void){ 3050 unsigned int zero = 0; 3051 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace); 3052 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero); 3053 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace); 3054 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero); 3055} 3056static void restore_debug_trace_modes(void){ 3057 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace); 3058 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace); 3059} 3060 3061/* Create the TEMP table used to store parameter bindings */ 3062static void bind_table_init(ShellState *p){ 3063 int wrSchema = 0; 3064 int defensiveMode = 0; 3065 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 3066 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 3067 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 3068 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 3069 sqlite3_exec(p->db, 3070 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 3071 " key TEXT PRIMARY KEY,\n" 3072 " value\n" 3073 ") WITHOUT ROWID;", 3074 0, 0, 0); 3075 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 3076 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 3077} 3078 3079/* 3080** Bind parameters on a prepared statement. 3081** 3082** Parameter bindings are taken from a TEMP table of the form: 3083** 3084** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 3085** WITHOUT ROWID; 3086** 3087** No bindings occur if this table does not exist. The name of the table 3088** begins with "sqlite_" so that it will not collide with ordinary application 3089** tables. The table must be in the TEMP schema. 3090*/ 3091static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 3092 int nVar; 3093 int i; 3094 int rc; 3095 sqlite3_stmt *pQ = 0; 3096 3097 nVar = sqlite3_bind_parameter_count(pStmt); 3098 if( nVar==0 ) return; /* Nothing to do */ 3099 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 3100 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 3101 return; /* Parameter table does not exist */ 3102 } 3103 rc = sqlite3_prepare_v2(pArg->db, 3104 "SELECT value FROM temp.sqlite_parameters" 3105 " WHERE key=?1", -1, &pQ, 0); 3106 if( rc || pQ==0 ) return; 3107 for(i=1; i<=nVar; i++){ 3108 char zNum[30]; 3109 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 3110 if( zVar==0 ){ 3111 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 3112 zVar = zNum; 3113 } 3114 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 3115 if( sqlite3_step(pQ)==SQLITE_ROW ){ 3116 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 3117 }else{ 3118 sqlite3_bind_null(pStmt, i); 3119 } 3120 sqlite3_reset(pQ); 3121 } 3122 sqlite3_finalize(pQ); 3123} 3124 3125/* 3126** UTF8 box-drawing characters. Imagine box lines like this: 3127** 3128** 1 3129** | 3130** 4 --+-- 2 3131** | 3132** 3 3133** 3134** Each box characters has between 2 and 4 of the lines leading from 3135** the center. The characters are here identified by the numbers of 3136** their corresponding lines. 3137*/ 3138#define BOX_24 "\342\224\200" /* U+2500 --- */ 3139#define BOX_13 "\342\224\202" /* U+2502 | */ 3140#define BOX_23 "\342\224\214" /* U+250c ,- */ 3141#define BOX_34 "\342\224\220" /* U+2510 -, */ 3142#define BOX_12 "\342\224\224" /* U+2514 '- */ 3143#define BOX_14 "\342\224\230" /* U+2518 -' */ 3144#define BOX_123 "\342\224\234" /* U+251c |- */ 3145#define BOX_134 "\342\224\244" /* U+2524 -| */ 3146#define BOX_234 "\342\224\254" /* U+252c -,- */ 3147#define BOX_124 "\342\224\264" /* U+2534 -'- */ 3148#define BOX_1234 "\342\224\274" /* U+253c -|- */ 3149 3150/* Draw horizontal line N characters long using unicode box 3151** characters 3152*/ 3153static void print_box_line(FILE *out, int N){ 3154 const char zDash[] = 3155 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 3156 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 3157 const int nDash = sizeof(zDash) - 1; 3158 N *= 3; 3159 while( N>nDash ){ 3160 utf8_printf(out, zDash); 3161 N -= nDash; 3162 } 3163 utf8_printf(out, "%.*s", N, zDash); 3164} 3165 3166/* 3167** Draw a horizontal separator for a MODE_Box table. 3168*/ 3169static void print_box_row_separator( 3170 ShellState *p, 3171 int nArg, 3172 const char *zSep1, 3173 const char *zSep2, 3174 const char *zSep3 3175){ 3176 int i; 3177 if( nArg>0 ){ 3178 utf8_printf(p->out, "%s", zSep1); 3179 print_box_line(p->out, p->actualWidth[0]+2); 3180 for(i=1; i<nArg; i++){ 3181 utf8_printf(p->out, "%s", zSep2); 3182 print_box_line(p->out, p->actualWidth[i]+2); 3183 } 3184 utf8_printf(p->out, "%s", zSep3); 3185 } 3186 fputs("\n", p->out); 3187} 3188 3189/* 3190** z[] is a line of text that is to be displayed the .mode box or table or 3191** similar tabular formats. z[] might contain control characters such 3192** as \n, \t, \f, or \r. 3193** 3194** Compute characters to display on the first line of z[]. Stop at the 3195** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained 3196** from malloc()) of that first line, which caller should free sometime. 3197** Write anything to display on the next line into *pzTail. If this is 3198** the last line, write a NULL into *pzTail. (*pzTail is not allocated.) 3199*/ 3200static char *translateForDisplayAndDup( 3201 const unsigned char *z, /* Input text to be transformed */ 3202 const unsigned char **pzTail, /* OUT: Tail of the input for next line */ 3203 int mxWidth, /* Max width. 0 means no limit */ 3204 u8 bWordWrap /* If true, avoid breaking mid-word */ 3205){ 3206 int i; /* Input bytes consumed */ 3207 int j; /* Output bytes generated */ 3208 int k; /* Input bytes to be displayed */ 3209 int n; /* Output column number */ 3210 unsigned char *zOut; /* Output text */ 3211 3212 if( z==0 ){ 3213 *pzTail = 0; 3214 return 0; 3215 } 3216 if( mxWidth<0 ) mxWidth = -mxWidth; 3217 if( mxWidth==0 ) mxWidth = 1000000; 3218 i = j = n = 0; 3219 while( n<mxWidth ){ 3220 if( z[i]>=' ' ){ 3221 n++; 3222 do{ i++; j++; }while( (z[i]&0xc0)==0x80 ); 3223 continue; 3224 } 3225 if( z[i]=='\t' ){ 3226 do{ 3227 n++; 3228 j++; 3229 }while( (n&7)!=0 && n<mxWidth ); 3230 i++; 3231 continue; 3232 } 3233 break; 3234 } 3235 if( n>=mxWidth && bWordWrap ){ 3236 /* Perhaps try to back up to a better place to break the line */ 3237 for(k=i; k>i/2; k--){ 3238 if( isspace(z[k-1]) ) break; 3239 } 3240 if( k<=i/2 ){ 3241 for(k=i; k>i/2; k--){ 3242 if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break; 3243 } 3244 } 3245 if( k<=i/2 ){ 3246 k = i; 3247 }else{ 3248 i = k; 3249 while( z[i]==' ' ) i++; 3250 } 3251 }else{ 3252 k = i; 3253 } 3254 if( n>=mxWidth && z[i]>=' ' ){ 3255 *pzTail = &z[i]; 3256 }else if( z[i]=='\r' && z[i+1]=='\n' ){ 3257 *pzTail = z[i+2] ? &z[i+2] : 0; 3258 }else if( z[i]==0 || z[i+1]==0 ){ 3259 *pzTail = 0; 3260 }else{ 3261 *pzTail = &z[i+1]; 3262 } 3263 zOut = malloc( j+1 ); 3264 shell_check_oom(zOut); 3265 i = j = n = 0; 3266 while( i<k ){ 3267 if( z[i]>=' ' ){ 3268 n++; 3269 do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 ); 3270 continue; 3271 } 3272 if( z[i]=='\t' ){ 3273 do{ 3274 n++; 3275 zOut[j++] = ' '; 3276 }while( (n&7)!=0 && n<mxWidth ); 3277 i++; 3278 continue; 3279 } 3280 break; 3281 } 3282 zOut[j] = 0; 3283 return (char*)zOut; 3284} 3285 3286/* Extract the value of the i-th current column for pStmt as an SQL literal 3287** value. Memory is obtained from sqlite3_malloc64() and must be freed by 3288** the caller. 3289*/ 3290static char *quoted_column(sqlite3_stmt *pStmt, int i){ 3291 switch( sqlite3_column_type(pStmt, i) ){ 3292 case SQLITE_NULL: { 3293 return sqlite3_mprintf("NULL"); 3294 } 3295 case SQLITE_INTEGER: 3296 case SQLITE_FLOAT: { 3297 return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i)); 3298 } 3299 case SQLITE_TEXT: { 3300 return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i)); 3301 } 3302 case SQLITE_BLOB: { 3303 int j; 3304 sqlite3_str *pStr = sqlite3_str_new(0); 3305 const unsigned char *a = sqlite3_column_blob(pStmt,i); 3306 int n = sqlite3_column_bytes(pStmt,i); 3307 sqlite3_str_append(pStr, "x'", 2); 3308 for(j=0; j<n; j++){ 3309 sqlite3_str_appendf(pStr, "%02x", a[j]); 3310 } 3311 sqlite3_str_append(pStr, "'", 1); 3312 return sqlite3_str_finish(pStr); 3313 } 3314 } 3315 return 0; /* Not reached */ 3316} 3317 3318/* 3319** Run a prepared statement and output the result in one of the 3320** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 3321** or MODE_Box. 3322** 3323** This is different from ordinary exec_prepared_stmt() in that 3324** it has to run the entire query and gather the results into memory 3325** first, in order to determine column widths, before providing 3326** any output. 3327*/ 3328static void exec_prepared_stmt_columnar( 3329 ShellState *p, /* Pointer to ShellState */ 3330 sqlite3_stmt *pStmt /* Statment to run */ 3331){ 3332 sqlite3_int64 nRow = 0; 3333 int nColumn = 0; 3334 char **azData = 0; 3335 sqlite3_int64 nAlloc = 0; 3336 char *abRowDiv = 0; 3337 const unsigned char *uz; 3338 const char *z; 3339 char **azQuoted = 0; 3340 int rc; 3341 sqlite3_int64 i, nData; 3342 int j, nTotal, w, n; 3343 const char *colSep = 0; 3344 const char *rowSep = 0; 3345 const unsigned char **azNextLine = 0; 3346 int bNextLine = 0; 3347 int bMultiLineRowExists = 0; 3348 int bw = p->cmOpts.bWordWrap; 3349 3350 rc = sqlite3_step(pStmt); 3351 if( rc!=SQLITE_ROW ) return; 3352 nColumn = sqlite3_column_count(pStmt); 3353 nAlloc = nColumn*4; 3354 if( nAlloc<=0 ) nAlloc = 1; 3355 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 3356 shell_check_oom(azData); 3357 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) ); 3358 shell_check_oom((void*)azNextLine); 3359 memset((void*)azNextLine, 0, nColumn*sizeof(char*) ); 3360 if( p->cmOpts.bQuote ){ 3361 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) ); 3362 shell_check_oom(azQuoted); 3363 memset(azQuoted, 0, nColumn*sizeof(char*) ); 3364 } 3365 abRowDiv = sqlite3_malloc64( nAlloc/nColumn ); 3366 shell_check_oom(abRowDiv); 3367 if( nColumn>p->nWidth ){ 3368 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); 3369 shell_check_oom(p->colWidth); 3370 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 3371 p->nWidth = nColumn; 3372 p->actualWidth = &p->colWidth[nColumn]; 3373 } 3374 memset(p->actualWidth, 0, nColumn*sizeof(int)); 3375 for(i=0; i<nColumn; i++){ 3376 w = p->colWidth[i]; 3377 if( w<0 ) w = -w; 3378 p->actualWidth[i] = w; 3379 } 3380 for(i=0; i<nColumn; i++){ 3381 const unsigned char *zNotUsed; 3382 int wx = p->colWidth[i]; 3383 if( wx==0 ){ 3384 wx = p->cmOpts.iWrap; 3385 } 3386 if( wx<0 ) wx = -wx; 3387 uz = (const unsigned char*)sqlite3_column_name(pStmt,i); 3388 azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw); 3389 } 3390 do{ 3391 int useNextLine = bNextLine; 3392 bNextLine = 0; 3393 if( (nRow+2)*nColumn >= nAlloc ){ 3394 nAlloc *= 2; 3395 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 3396 shell_check_oom(azData); 3397 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn); 3398 shell_check_oom(abRowDiv); 3399 } 3400 abRowDiv[nRow] = 1; 3401 nRow++; 3402 for(i=0; i<nColumn; i++){ 3403 int wx = p->colWidth[i]; 3404 if( wx==0 ){ 3405 wx = p->cmOpts.iWrap; 3406 } 3407 if( wx<0 ) wx = -wx; 3408 if( useNextLine ){ 3409 uz = azNextLine[i]; 3410 }else if( p->cmOpts.bQuote ){ 3411 sqlite3_free(azQuoted[i]); 3412 azQuoted[i] = quoted_column(pStmt,i); 3413 uz = (const unsigned char*)azQuoted[i]; 3414 }else{ 3415 uz = (const unsigned char*)sqlite3_column_text(pStmt,i); 3416 } 3417 azData[nRow*nColumn + i] 3418 = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw); 3419 if( azNextLine[i] ){ 3420 bNextLine = 1; 3421 abRowDiv[nRow-1] = 0; 3422 bMultiLineRowExists = 1; 3423 } 3424 } 3425 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW ); 3426 nTotal = nColumn*(nRow+1); 3427 for(i=0; i<nTotal; i++){ 3428 z = azData[i]; 3429 if( z==0 ) z = p->nullValue; 3430 n = strlenChar(z); 3431 j = i%nColumn; 3432 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 3433 } 3434 if( seenInterrupt ) goto columnar_end; 3435 if( nColumn==0 ) goto columnar_end; 3436 switch( p->cMode ){ 3437 case MODE_Column: { 3438 colSep = " "; 3439 rowSep = "\n"; 3440 if( p->showHeader ){ 3441 for(i=0; i<nColumn; i++){ 3442 w = p->actualWidth[i]; 3443 if( p->colWidth[i]<0 ) w = -w; 3444 utf8_width_print(p->out, w, azData[i]); 3445 fputs(i==nColumn-1?"\n":" ", p->out); 3446 } 3447 for(i=0; i<nColumn; i++){ 3448 print_dashes(p->out, p->actualWidth[i]); 3449 fputs(i==nColumn-1?"\n":" ", p->out); 3450 } 3451 } 3452 break; 3453 } 3454 case MODE_Table: { 3455 colSep = " | "; 3456 rowSep = " |\n"; 3457 print_row_separator(p, nColumn, "+"); 3458 fputs("| ", p->out); 3459 for(i=0; i<nColumn; i++){ 3460 w = p->actualWidth[i]; 3461 n = strlenChar(azData[i]); 3462 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3463 fputs(i==nColumn-1?" |\n":" | ", p->out); 3464 } 3465 print_row_separator(p, nColumn, "+"); 3466 break; 3467 } 3468 case MODE_Markdown: { 3469 colSep = " | "; 3470 rowSep = " |\n"; 3471 fputs("| ", p->out); 3472 for(i=0; i<nColumn; i++){ 3473 w = p->actualWidth[i]; 3474 n = strlenChar(azData[i]); 3475 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 3476 fputs(i==nColumn-1?" |\n":" | ", p->out); 3477 } 3478 print_row_separator(p, nColumn, "|"); 3479 break; 3480 } 3481 case MODE_Box: { 3482 colSep = " " BOX_13 " "; 3483 rowSep = " " BOX_13 "\n"; 3484 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 3485 utf8_printf(p->out, BOX_13 " "); 3486 for(i=0; i<nColumn; i++){ 3487 w = p->actualWidth[i]; 3488 n = strlenChar(azData[i]); 3489 utf8_printf(p->out, "%*s%s%*s%s", 3490 (w-n)/2, "", azData[i], (w-n+1)/2, "", 3491 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 3492 } 3493 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 3494 break; 3495 } 3496 } 3497 for(i=nColumn, j=0; i<nTotal; i++, j++){ 3498 if( j==0 && p->cMode!=MODE_Column ){ 3499 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 3500 } 3501 z = azData[i]; 3502 if( z==0 ) z = p->nullValue; 3503 w = p->actualWidth[j]; 3504 if( p->colWidth[j]<0 ) w = -w; 3505 utf8_width_print(p->out, w, z); 3506 if( j==nColumn-1 ){ 3507 utf8_printf(p->out, "%s", rowSep); 3508 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){ 3509 if( p->cMode==MODE_Table ){ 3510 print_row_separator(p, nColumn, "+"); 3511 }else if( p->cMode==MODE_Box ){ 3512 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 3513 }else if( p->cMode==MODE_Column ){ 3514 raw_printf(p->out, "\n"); 3515 } 3516 } 3517 j = -1; 3518 if( seenInterrupt ) goto columnar_end; 3519 }else{ 3520 utf8_printf(p->out, "%s", colSep); 3521 } 3522 } 3523 if( p->cMode==MODE_Table ){ 3524 print_row_separator(p, nColumn, "+"); 3525 }else if( p->cMode==MODE_Box ){ 3526 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 3527 } 3528columnar_end: 3529 if( seenInterrupt ){ 3530 utf8_printf(p->out, "Interrupt\n"); 3531 } 3532 nData = (nRow+1)*nColumn; 3533 for(i=0; i<nData; i++) free(azData[i]); 3534 sqlite3_free(azData); 3535 sqlite3_free((void*)azNextLine); 3536 sqlite3_free(abRowDiv); 3537 if( azQuoted ){ 3538 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]); 3539 sqlite3_free(azQuoted); 3540 } 3541} 3542 3543/* 3544** Run a prepared statement 3545*/ 3546static void exec_prepared_stmt( 3547 ShellState *pArg, /* Pointer to ShellState */ 3548 sqlite3_stmt *pStmt /* Statment to run */ 3549){ 3550 int rc; 3551 sqlite3_uint64 nRow = 0; 3552 3553 if( pArg->cMode==MODE_Column 3554 || pArg->cMode==MODE_Table 3555 || pArg->cMode==MODE_Box 3556 || pArg->cMode==MODE_Markdown 3557 ){ 3558 exec_prepared_stmt_columnar(pArg, pStmt); 3559 return; 3560 } 3561 3562 /* perform the first step. this will tell us if we 3563 ** have a result set or not and how wide it is. 3564 */ 3565 rc = sqlite3_step(pStmt); 3566 /* if we have a result set... */ 3567 if( SQLITE_ROW == rc ){ 3568 /* allocate space for col name ptr, value ptr, and type */ 3569 int nCol = sqlite3_column_count(pStmt); 3570 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 3571 if( !pData ){ 3572 shell_out_of_memory(); 3573 }else{ 3574 char **azCols = (char **)pData; /* Names of result columns */ 3575 char **azVals = &azCols[nCol]; /* Results */ 3576 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 3577 int i, x; 3578 assert(sizeof(int) <= sizeof(char *)); 3579 /* save off ptrs to column names */ 3580 for(i=0; i<nCol; i++){ 3581 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 3582 } 3583 do{ 3584 nRow++; 3585 /* extract the data and data types */ 3586 for(i=0; i<nCol; i++){ 3587 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 3588 if( x==SQLITE_BLOB 3589 && pArg 3590 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote) 3591 ){ 3592 azVals[i] = ""; 3593 }else{ 3594 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 3595 } 3596 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 3597 rc = SQLITE_NOMEM; 3598 break; /* from for */ 3599 } 3600 } /* end for */ 3601 3602 /* if data and types extracted successfully... */ 3603 if( SQLITE_ROW == rc ){ 3604 /* call the supplied callback with the result row data */ 3605 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 3606 rc = SQLITE_ABORT; 3607 }else{ 3608 rc = sqlite3_step(pStmt); 3609 } 3610 } 3611 } while( SQLITE_ROW == rc ); 3612 sqlite3_free(pData); 3613 if( pArg->cMode==MODE_Json ){ 3614 fputs("]\n", pArg->out); 3615 }else if( pArg->cMode==MODE_Count ){ 3616 char zBuf[200]; 3617 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n", 3618 nRow, nRow!=1 ? "s" : ""); 3619 printf("%s", zBuf); 3620 } 3621 } 3622 } 3623} 3624 3625#ifndef SQLITE_OMIT_VIRTUALTABLE 3626/* 3627** This function is called to process SQL if the previous shell command 3628** was ".expert". It passes the SQL in the second argument directly to 3629** the sqlite3expert object. 3630** 3631** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3632** code. In this case, (*pzErr) may be set to point to a buffer containing 3633** an English language error message. It is the responsibility of the 3634** caller to eventually free this buffer using sqlite3_free(). 3635*/ 3636static int expertHandleSQL( 3637 ShellState *pState, 3638 const char *zSql, 3639 char **pzErr 3640){ 3641 assert( pState->expert.pExpert ); 3642 assert( pzErr==0 || *pzErr==0 ); 3643 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 3644} 3645 3646/* 3647** This function is called either to silently clean up the object 3648** created by the ".expert" command (if bCancel==1), or to generate a 3649** report from it and then clean it up (if bCancel==0). 3650** 3651** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 3652** code. In this case, (*pzErr) may be set to point to a buffer containing 3653** an English language error message. It is the responsibility of the 3654** caller to eventually free this buffer using sqlite3_free(). 3655*/ 3656static int expertFinish( 3657 ShellState *pState, 3658 int bCancel, 3659 char **pzErr 3660){ 3661 int rc = SQLITE_OK; 3662 sqlite3expert *p = pState->expert.pExpert; 3663 assert( p ); 3664 assert( bCancel || pzErr==0 || *pzErr==0 ); 3665 if( bCancel==0 ){ 3666 FILE *out = pState->out; 3667 int bVerbose = pState->expert.bVerbose; 3668 3669 rc = sqlite3_expert_analyze(p, pzErr); 3670 if( rc==SQLITE_OK ){ 3671 int nQuery = sqlite3_expert_count(p); 3672 int i; 3673 3674 if( bVerbose ){ 3675 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 3676 raw_printf(out, "-- Candidates -----------------------------\n"); 3677 raw_printf(out, "%s\n", zCand); 3678 } 3679 for(i=0; i<nQuery; i++){ 3680 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 3681 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 3682 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 3683 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 3684 if( bVerbose ){ 3685 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 3686 raw_printf(out, "%s\n\n", zSql); 3687 } 3688 raw_printf(out, "%s\n", zIdx); 3689 raw_printf(out, "%s\n", zEQP); 3690 } 3691 } 3692 } 3693 sqlite3_expert_destroy(p); 3694 pState->expert.pExpert = 0; 3695 return rc; 3696} 3697 3698/* 3699** Implementation of ".expert" dot command. 3700*/ 3701static int expertDotCommand( 3702 ShellState *pState, /* Current shell tool state */ 3703 char **azArg, /* Array of arguments passed to dot command */ 3704 int nArg /* Number of entries in azArg[] */ 3705){ 3706 int rc = SQLITE_OK; 3707 char *zErr = 0; 3708 int i; 3709 int iSample = 0; 3710 3711 assert( pState->expert.pExpert==0 ); 3712 memset(&pState->expert, 0, sizeof(ExpertInfo)); 3713 3714 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 3715 char *z = azArg[i]; 3716 int n; 3717 if( z[0]=='-' && z[1]=='-' ) z++; 3718 n = strlen30(z); 3719 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 3720 pState->expert.bVerbose = 1; 3721 } 3722 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 3723 if( i==(nArg-1) ){ 3724 raw_printf(stderr, "option requires an argument: %s\n", z); 3725 rc = SQLITE_ERROR; 3726 }else{ 3727 iSample = (int)integerValue(azArg[++i]); 3728 if( iSample<0 || iSample>100 ){ 3729 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 3730 rc = SQLITE_ERROR; 3731 } 3732 } 3733 } 3734 else{ 3735 raw_printf(stderr, "unknown option: %s\n", z); 3736 rc = SQLITE_ERROR; 3737 } 3738 } 3739 3740 if( rc==SQLITE_OK ){ 3741 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 3742 if( pState->expert.pExpert==0 ){ 3743 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory"); 3744 rc = SQLITE_ERROR; 3745 }else{ 3746 sqlite3_expert_config( 3747 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 3748 ); 3749 } 3750 } 3751 sqlite3_free(zErr); 3752 3753 return rc; 3754} 3755#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 3756 3757/* 3758** Execute a statement or set of statements. Print 3759** any result rows/columns depending on the current mode 3760** set via the supplied callback. 3761** 3762** This is very similar to SQLite's built-in sqlite3_exec() 3763** function except it takes a slightly different callback 3764** and callback data argument. 3765*/ 3766static int shell_exec( 3767 ShellState *pArg, /* Pointer to ShellState */ 3768 const char *zSql, /* SQL to be evaluated */ 3769 char **pzErrMsg /* Error msg written here */ 3770){ 3771 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 3772 int rc = SQLITE_OK; /* Return Code */ 3773 int rc2; 3774 const char *zLeftover; /* Tail of unprocessed SQL */ 3775 sqlite3 *db = pArg->db; 3776 3777 if( pzErrMsg ){ 3778 *pzErrMsg = NULL; 3779 } 3780 3781#ifndef SQLITE_OMIT_VIRTUALTABLE 3782 if( pArg->expert.pExpert ){ 3783 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 3784 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 3785 } 3786#endif 3787 3788 while( zSql[0] && (SQLITE_OK == rc) ){ 3789 static const char *zStmtSql; 3790 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 3791 if( SQLITE_OK != rc ){ 3792 if( pzErrMsg ){ 3793 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql); 3794 } 3795 }else{ 3796 if( !pStmt ){ 3797 /* this happens for a comment or white-space */ 3798 zSql = zLeftover; 3799 while( IsSpace(zSql[0]) ) zSql++; 3800 continue; 3801 } 3802 zStmtSql = sqlite3_sql(pStmt); 3803 if( zStmtSql==0 ) zStmtSql = ""; 3804 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 3805 3806 /* save off the prepared statment handle and reset row count */ 3807 if( pArg ){ 3808 pArg->pStmt = pStmt; 3809 pArg->cnt = 0; 3810 } 3811 3812 /* echo the sql statement if echo on */ 3813 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 3814 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 3815 } 3816 3817 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 3818 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 3819 sqlite3_stmt *pExplain; 3820 char *zEQP; 3821 int triggerEQP = 0; 3822 disable_debug_trace_modes(); 3823 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 3824 if( pArg->autoEQP>=AUTOEQP_trigger ){ 3825 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 3826 } 3827 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 3828 shell_check_oom(zEQP); 3829 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3830 if( rc==SQLITE_OK ){ 3831 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 3832 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 3833 int iEqpId = sqlite3_column_int(pExplain, 0); 3834 int iParentId = sqlite3_column_int(pExplain, 1); 3835 if( zEQPLine==0 ) zEQPLine = ""; 3836 if( zEQPLine[0]=='-' ) eqp_render(pArg); 3837 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 3838 } 3839 eqp_render(pArg); 3840 } 3841 sqlite3_finalize(pExplain); 3842 sqlite3_free(zEQP); 3843 if( pArg->autoEQP>=AUTOEQP_full ){ 3844 /* Also do an EXPLAIN for ".eqp full" mode */ 3845 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 3846 shell_check_oom(zEQP); 3847 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 3848 if( rc==SQLITE_OK ){ 3849 pArg->cMode = MODE_Explain; 3850 explain_data_prepare(pArg, pExplain); 3851 exec_prepared_stmt(pArg, pExplain); 3852 explain_data_delete(pArg); 3853 } 3854 sqlite3_finalize(pExplain); 3855 sqlite3_free(zEQP); 3856 } 3857 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 3858 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 3859 /* Reprepare pStmt before reactiving trace modes */ 3860 sqlite3_finalize(pStmt); 3861 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 3862 if( pArg ) pArg->pStmt = pStmt; 3863 } 3864 restore_debug_trace_modes(); 3865 } 3866 3867 if( pArg ){ 3868 pArg->cMode = pArg->mode; 3869 if( pArg->autoExplain ){ 3870 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 3871 pArg->cMode = MODE_Explain; 3872 } 3873 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 3874 pArg->cMode = MODE_EQP; 3875 } 3876 } 3877 3878 /* If the shell is currently in ".explain" mode, gather the extra 3879 ** data required to add indents to the output.*/ 3880 if( pArg->cMode==MODE_Explain ){ 3881 explain_data_prepare(pArg, pStmt); 3882 } 3883 } 3884 3885 bind_prepared_stmt(pArg, pStmt); 3886 exec_prepared_stmt(pArg, pStmt); 3887 explain_data_delete(pArg); 3888 eqp_render(pArg); 3889 3890 /* print usage stats if stats on */ 3891 if( pArg && pArg->statsOn ){ 3892 display_stats(db, pArg, 0); 3893 } 3894 3895 /* print loop-counters if required */ 3896 if( pArg && pArg->scanstatsOn ){ 3897 display_scanstats(db, pArg); 3898 } 3899 3900 /* Finalize the statement just executed. If this fails, save a 3901 ** copy of the error message. Otherwise, set zSql to point to the 3902 ** next statement to execute. */ 3903 rc2 = sqlite3_finalize(pStmt); 3904 if( rc!=SQLITE_NOMEM ) rc = rc2; 3905 if( rc==SQLITE_OK ){ 3906 zSql = zLeftover; 3907 while( IsSpace(zSql[0]) ) zSql++; 3908 }else if( pzErrMsg ){ 3909 *pzErrMsg = save_err_msg(db, "stepping", rc, 0); 3910 } 3911 3912 /* clear saved stmt handle */ 3913 if( pArg ){ 3914 pArg->pStmt = NULL; 3915 } 3916 } 3917 } /* end while */ 3918 3919 return rc; 3920} 3921 3922/* 3923** Release memory previously allocated by tableColumnList(). 3924*/ 3925static void freeColumnList(char **azCol){ 3926 int i; 3927 for(i=1; azCol[i]; i++){ 3928 sqlite3_free(azCol[i]); 3929 } 3930 /* azCol[0] is a static string */ 3931 sqlite3_free(azCol); 3932} 3933 3934/* 3935** Return a list of pointers to strings which are the names of all 3936** columns in table zTab. The memory to hold the names is dynamically 3937** allocated and must be released by the caller using a subsequent call 3938** to freeColumnList(). 3939** 3940** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 3941** value that needs to be preserved, then azCol[0] is filled in with the 3942** name of the rowid column. 3943** 3944** The first regular column in the table is azCol[1]. The list is terminated 3945** by an entry with azCol[i]==0. 3946*/ 3947static char **tableColumnList(ShellState *p, const char *zTab){ 3948 char **azCol = 0; 3949 sqlite3_stmt *pStmt; 3950 char *zSql; 3951 int nCol = 0; 3952 int nAlloc = 0; 3953 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 3954 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 3955 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 3956 int rc; 3957 3958 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 3959 shell_check_oom(zSql); 3960 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3961 sqlite3_free(zSql); 3962 if( rc ) return 0; 3963 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 3964 if( nCol>=nAlloc-2 ){ 3965 nAlloc = nAlloc*2 + nCol + 10; 3966 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 3967 shell_check_oom(azCol); 3968 } 3969 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 3970 shell_check_oom(azCol[nCol]); 3971 if( sqlite3_column_int(pStmt, 5) ){ 3972 nPK++; 3973 if( nPK==1 3974 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 3975 "INTEGER")==0 3976 ){ 3977 isIPK = 1; 3978 }else{ 3979 isIPK = 0; 3980 } 3981 } 3982 } 3983 sqlite3_finalize(pStmt); 3984 if( azCol==0 ) return 0; 3985 azCol[0] = 0; 3986 azCol[nCol+1] = 0; 3987 3988 /* The decision of whether or not a rowid really needs to be preserved 3989 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 3990 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 3991 ** rowids on tables where the rowid is inaccessible because there are other 3992 ** columns in the table named "rowid", "_rowid_", and "oid". 3993 */ 3994 if( preserveRowid && isIPK ){ 3995 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 3996 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 3997 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 3998 ** ROWID aliases. To distinguish these cases, check to see if 3999 ** there is a "pk" entry in "PRAGMA index_list". There will be 4000 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 4001 */ 4002 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 4003 " WHERE origin='pk'", zTab); 4004 shell_check_oom(zSql); 4005 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 4006 sqlite3_free(zSql); 4007 if( rc ){ 4008 freeColumnList(azCol); 4009 return 0; 4010 } 4011 rc = sqlite3_step(pStmt); 4012 sqlite3_finalize(pStmt); 4013 preserveRowid = rc==SQLITE_ROW; 4014 } 4015 if( preserveRowid ){ 4016 /* Only preserve the rowid if we can find a name to use for the 4017 ** rowid */ 4018 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 4019 int i, j; 4020 for(j=0; j<3; j++){ 4021 for(i=1; i<=nCol; i++){ 4022 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 4023 } 4024 if( i>nCol ){ 4025 /* At this point, we know that azRowid[j] is not the name of any 4026 ** ordinary column in the table. Verify that azRowid[j] is a valid 4027 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 4028 ** tables will fail this last check */ 4029 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 4030 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 4031 break; 4032 } 4033 } 4034 } 4035 return azCol; 4036} 4037 4038/* 4039** Toggle the reverse_unordered_selects setting. 4040*/ 4041static void toggleSelectOrder(sqlite3 *db){ 4042 sqlite3_stmt *pStmt = 0; 4043 int iSetting = 0; 4044 char zStmt[100]; 4045 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 4046 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 4047 iSetting = sqlite3_column_int(pStmt, 0); 4048 } 4049 sqlite3_finalize(pStmt); 4050 sqlite3_snprintf(sizeof(zStmt), zStmt, 4051 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 4052 sqlite3_exec(db, zStmt, 0, 0, 0); 4053} 4054 4055/* 4056** This is a different callback routine used for dumping the database. 4057** Each row received by this callback consists of a table name, 4058** the table type ("index" or "table") and SQL to create the table. 4059** This routine should print text sufficient to recreate the table. 4060*/ 4061static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 4062 int rc; 4063 const char *zTable; 4064 const char *zType; 4065 const char *zSql; 4066 ShellState *p = (ShellState *)pArg; 4067 int dataOnly; 4068 int noSys; 4069 4070 UNUSED_PARAMETER(azNotUsed); 4071 if( nArg!=3 || azArg==0 ) return 0; 4072 zTable = azArg[0]; 4073 zType = azArg[1]; 4074 zSql = azArg[2]; 4075 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 4076 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 4077 4078 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 4079 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 4080 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 4081 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 4082 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 4083 return 0; 4084 }else if( dataOnly ){ 4085 /* no-op */ 4086 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 4087 char *zIns; 4088 if( !p->writableSchema ){ 4089 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 4090 p->writableSchema = 1; 4091 } 4092 zIns = sqlite3_mprintf( 4093 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 4094 "VALUES('table','%q','%q',0,'%q');", 4095 zTable, zTable, zSql); 4096 shell_check_oom(zIns); 4097 utf8_printf(p->out, "%s\n", zIns); 4098 sqlite3_free(zIns); 4099 return 0; 4100 }else{ 4101 printSchemaLine(p->out, zSql, ";\n"); 4102 } 4103 4104 if( strcmp(zType, "table")==0 ){ 4105 ShellText sSelect; 4106 ShellText sTable; 4107 char **azCol; 4108 int i; 4109 char *savedDestTable; 4110 int savedMode; 4111 4112 azCol = tableColumnList(p, zTable); 4113 if( azCol==0 ){ 4114 p->nErr++; 4115 return 0; 4116 } 4117 4118 /* Always quote the table name, even if it appears to be pure ascii, 4119 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 4120 initText(&sTable); 4121 appendText(&sTable, zTable, quoteChar(zTable)); 4122 /* If preserving the rowid, add a column list after the table name. 4123 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 4124 ** instead of the usual "INSERT INTO tab VALUES(...)". 4125 */ 4126 if( azCol[0] ){ 4127 appendText(&sTable, "(", 0); 4128 appendText(&sTable, azCol[0], 0); 4129 for(i=1; azCol[i]; i++){ 4130 appendText(&sTable, ",", 0); 4131 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 4132 } 4133 appendText(&sTable, ")", 0); 4134 } 4135 4136 /* Build an appropriate SELECT statement */ 4137 initText(&sSelect); 4138 appendText(&sSelect, "SELECT ", 0); 4139 if( azCol[0] ){ 4140 appendText(&sSelect, azCol[0], 0); 4141 appendText(&sSelect, ",", 0); 4142 } 4143 for(i=1; azCol[i]; i++){ 4144 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 4145 if( azCol[i+1] ){ 4146 appendText(&sSelect, ",", 0); 4147 } 4148 } 4149 freeColumnList(azCol); 4150 appendText(&sSelect, " FROM ", 0); 4151 appendText(&sSelect, zTable, quoteChar(zTable)); 4152 4153 savedDestTable = p->zDestTable; 4154 savedMode = p->mode; 4155 p->zDestTable = sTable.z; 4156 p->mode = p->cMode = MODE_Insert; 4157 rc = shell_exec(p, sSelect.z, 0); 4158 if( (rc&0xff)==SQLITE_CORRUPT ){ 4159 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 4160 toggleSelectOrder(p->db); 4161 shell_exec(p, sSelect.z, 0); 4162 toggleSelectOrder(p->db); 4163 } 4164 p->zDestTable = savedDestTable; 4165 p->mode = savedMode; 4166 freeText(&sTable); 4167 freeText(&sSelect); 4168 if( rc ) p->nErr++; 4169 } 4170 return 0; 4171} 4172 4173/* 4174** Run zQuery. Use dump_callback() as the callback routine so that 4175** the contents of the query are output as SQL statements. 4176** 4177** If we get a SQLITE_CORRUPT error, rerun the query after appending 4178** "ORDER BY rowid DESC" to the end. 4179*/ 4180static int run_schema_dump_query( 4181 ShellState *p, 4182 const char *zQuery 4183){ 4184 int rc; 4185 char *zErr = 0; 4186 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 4187 if( rc==SQLITE_CORRUPT ){ 4188 char *zQ2; 4189 int len = strlen30(zQuery); 4190 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 4191 if( zErr ){ 4192 utf8_printf(p->out, "/****** %s ******/\n", zErr); 4193 sqlite3_free(zErr); 4194 zErr = 0; 4195 } 4196 zQ2 = malloc( len+100 ); 4197 if( zQ2==0 ) return rc; 4198 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 4199 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 4200 if( rc ){ 4201 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 4202 }else{ 4203 rc = SQLITE_CORRUPT; 4204 } 4205 sqlite3_free(zErr); 4206 free(zQ2); 4207 } 4208 return rc; 4209} 4210 4211/* 4212** Text of help messages. 4213** 4214** The help text for each individual command begins with a line that starts 4215** with ".". Subsequent lines are supplimental information. 4216** 4217** There must be two or more spaces between the end of the command and the 4218** start of the description of what that command does. 4219*/ 4220static const char *(azHelp[]) = { 4221#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 4222 ".archive ... Manage SQL archives", 4223 " Each command must have exactly one of the following options:", 4224 " -c, --create Create a new archive", 4225 " -u, --update Add or update files with changed mtime", 4226 " -i, --insert Like -u but always add even if unchanged", 4227 " -r, --remove Remove files from archive", 4228 " -t, --list List contents of archive", 4229 " -x, --extract Extract files from archive", 4230 " Optional arguments:", 4231 " -v, --verbose Print each filename as it is processed", 4232 " -f FILE, --file FILE Use archive FILE (default is current db)", 4233 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 4234 " -C DIR, --directory DIR Read/extract files from directory DIR", 4235 " -g, --glob Use glob matching for names in archive", 4236 " -n, --dryrun Show the SQL that would have occurred", 4237 " Examples:", 4238 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 4239 " .ar -tf ARCHIVE # List members of ARCHIVE", 4240 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 4241 " See also:", 4242 " http://sqlite.org/cli.html#sqlite_archive_support", 4243#endif 4244#ifndef SQLITE_OMIT_AUTHORIZATION 4245 ".auth ON|OFF Show authorizer callbacks", 4246#endif 4247 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 4248 " --append Use the appendvfs", 4249 " --async Write to FILE without journal and fsync()", 4250 ".bail on|off Stop after hitting an error. Default OFF", 4251 ".binary on|off Turn binary output on or off. Default OFF", 4252 ".cd DIRECTORY Change the working directory to DIRECTORY", 4253 ".changes on|off Show number of rows changed by SQL", 4254 ".check GLOB Fail if output since .testcase does not match", 4255 ".clone NEWDB Clone data into NEWDB from the existing database", 4256 ".connection [close] [#] Open or close an auxiliary database connection", 4257 ".databases List names and files of attached databases", 4258 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 4259 ".dbinfo ?DB? Show status information about the database", 4260 ".dump ?OBJECTS? Render database content as SQL", 4261 " Options:", 4262 " --data-only Output only INSERT statements", 4263 " --newlines Allow unescaped newline characters in output", 4264 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 4265 " --preserve-rowids Include ROWID values in the output", 4266 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump", 4267 " Additional LIKE patterns can be given in subsequent arguments", 4268 ".echo on|off Turn command echo on or off", 4269 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 4270 " Other Modes:", 4271#ifdef SQLITE_DEBUG 4272 " test Show raw EXPLAIN QUERY PLAN output", 4273 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 4274#endif 4275 " trigger Like \"full\" but also show trigger bytecode", 4276 ".excel Display the output of next command in spreadsheet", 4277 " --bom Put a UTF8 byte-order mark on intermediate file", 4278 ".exit ?CODE? Exit this program with return-code CODE", 4279 ".expert EXPERIMENTAL. Suggest indexes for queries", 4280 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 4281 ".filectrl CMD ... Run various sqlite3_file_control() operations", 4282 " --schema SCHEMA Use SCHEMA instead of \"main\"", 4283 " --help Show CMD details", 4284 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 4285 ".headers on|off Turn display of headers on or off", 4286 ".help ?-all? ?PATTERN? Show help text for PATTERN", 4287 ".import FILE TABLE Import data from FILE into TABLE", 4288 " Options:", 4289 " --ascii Use \\037 and \\036 as column and row separators", 4290 " --csv Use , and \\n as column and row separators", 4291 " --skip N Skip the first N rows of input", 4292 " --schema S Target table to be S.TABLE", 4293 " -v \"Verbose\" - increase auxiliary output", 4294 " Notes:", 4295 " * If TABLE does not exist, it is created. The first row of input", 4296 " determines the column names.", 4297 " * If neither --csv or --ascii are used, the input mode is derived", 4298 " from the \".mode\" output mode", 4299 " * If FILE begins with \"|\" then it is a command that generates the", 4300 " input text.", 4301#ifndef SQLITE_OMIT_TEST_CONTROL 4302 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 4303#endif 4304 ".indexes ?TABLE? Show names of indexes", 4305 " If TABLE is specified, only show indexes for", 4306 " tables matching TABLE using the LIKE operator.", 4307#ifdef SQLITE_ENABLE_IOTRACE 4308 ".iotrace FILE Enable I/O diagnostic logging to FILE", 4309#endif 4310 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 4311 ".lint OPTIONS Report potential schema issues.", 4312 " Options:", 4313 " fkey-indexes Find missing foreign key indexes", 4314#ifndef SQLITE_OMIT_LOAD_EXTENSION 4315 ".load FILE ?ENTRY? Load an extension library", 4316#endif 4317 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 4318 ".mode MODE ?OPTIONS? Set output mode", 4319 " MODE is one of:", 4320 " ascii Columns/rows delimited by 0x1F and 0x1E", 4321 " box Tables using unicode box-drawing characters", 4322 " csv Comma-separated values", 4323 " column Output in columns. (See .width)", 4324 " html HTML <table> code", 4325 " insert SQL insert statements for TABLE", 4326 " json Results in a JSON array", 4327 " line One value per line", 4328 " list Values delimited by \"|\"", 4329 " markdown Markdown table format", 4330 " qbox Shorthand for \"box --width 60 --quote\"", 4331 " quote Escape answers as for SQL", 4332 " table ASCII-art table", 4333 " tabs Tab-separated values", 4334 " tcl TCL list elements", 4335 " OPTIONS: (for columnar modes or insert mode):", 4336 " --wrap N Wrap output lines to no longer than N characters", 4337 " --wordwrap B Wrap or not at word boundaries per B (on/off)", 4338 " --ww Shorthand for \"--wordwrap 1\"", 4339 " --quote Quote output text as SQL literals", 4340 " --noquote Do not quote output text", 4341 " TABLE The name of SQL table used for \"insert\" mode", 4342 ".nonce STRING Suspend safe mode for one command if nonce matches", 4343 ".nullvalue STRING Use STRING in place of NULL values", 4344 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 4345 " If FILE begins with '|' then open as a pipe", 4346 " --bom Put a UTF8 byte-order mark at the beginning", 4347 " -e Send output to the system text editor", 4348 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 4349 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 4350 " Options:", 4351 " --append Use appendvfs to append database to the end of FILE", 4352#ifndef SQLITE_OMIT_DESERIALIZE 4353 " --deserialize Load into memory using sqlite3_deserialize()", 4354 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 4355 " --maxsize N Maximum size for --hexdb or --deserialized database", 4356#endif 4357 " --new Initialize FILE to an empty database", 4358 " --nofollow Do not follow symbolic links", 4359 " --readonly Open FILE readonly", 4360 " --zip FILE is a ZIP archive", 4361 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 4362 " If FILE begins with '|' then open it as a pipe.", 4363 " Options:", 4364 " --bom Prefix output with a UTF8 byte-order mark", 4365 " -e Send output to the system text editor", 4366 " -x Send output as CSV to a spreadsheet", 4367 ".parameter CMD ... Manage SQL parameter bindings", 4368 " clear Erase all bindings", 4369 " init Initialize the TEMP table that holds bindings", 4370 " list List the current parameter bindings", 4371 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 4372 " PARAMETER should start with one of: $ : @ ?", 4373 " unset PARAMETER Remove PARAMETER from the binding table", 4374 ".print STRING... Print literal STRING", 4375#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 4376 ".progress N Invoke progress handler after every N opcodes", 4377 " --limit N Interrupt after N progress callbacks", 4378 " --once Do no more than one progress interrupt", 4379 " --quiet|-q No output except at interrupts", 4380 " --reset Reset the count for each input and interrupt", 4381#endif 4382 ".prompt MAIN CONTINUE Replace the standard prompts", 4383 ".quit Exit this program", 4384 ".read FILE Read input from FILE or command output", 4385 " If FILE begins with \"|\", it is a command that generates the input.", 4386#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4387 ".recover Recover as much data as possible from corrupt db.", 4388 " --freelist-corrupt Assume the freelist is corrupt", 4389 " --recovery-db NAME Store recovery metadata in database file NAME", 4390 " --lost-and-found TABLE Alternative name for the lost-and-found table", 4391 " --no-rowids Do not attempt to recover rowid values", 4392 " that are not also INTEGER PRIMARY KEYs", 4393#endif 4394 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 4395 ".save FILE Write in-memory database into FILE", 4396 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 4397 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 4398 " Options:", 4399 " --indent Try to pretty-print the schema", 4400 " --nosys Omit objects whose names start with \"sqlite_\"", 4401 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 4402 " Options:", 4403 " --init Create a new SELFTEST table", 4404 " -v Verbose output", 4405 ".separator COL ?ROW? Change the column and row separators", 4406#if defined(SQLITE_ENABLE_SESSION) 4407 ".session ?NAME? CMD ... Create or control sessions", 4408 " Subcommands:", 4409 " attach TABLE Attach TABLE", 4410 " changeset FILE Write a changeset into FILE", 4411 " close Close one session", 4412 " enable ?BOOLEAN? Set or query the enable bit", 4413 " filter GLOB... Reject tables matching GLOBs", 4414 " indirect ?BOOLEAN? Mark or query the indirect status", 4415 " isempty Query whether the session is empty", 4416 " list List currently open session names", 4417 " open DB NAME Open a new session on DB", 4418 " patchset FILE Write a patchset into FILE", 4419 " If ?NAME? is omitted, the first defined session is used.", 4420#endif 4421 ".sha3sum ... Compute a SHA3 hash of database content", 4422 " Options:", 4423 " --schema Also hash the sqlite_schema table", 4424 " --sha3-224 Use the sha3-224 algorithm", 4425 " --sha3-256 Use the sha3-256 algorithm (default)", 4426 " --sha3-384 Use the sha3-384 algorithm", 4427 " --sha3-512 Use the sha3-512 algorithm", 4428 " Any other argument is a LIKE pattern for tables to hash", 4429#ifndef SQLITE_NOHAVE_SYSTEM 4430 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 4431#endif 4432 ".show Show the current values for various settings", 4433 ".stats ?ARG? Show stats or turn stats on or off", 4434 " off Turn off automatic stat display", 4435 " on Turn on automatic stat display", 4436 " stmt Show statement stats", 4437 " vmstep Show the virtual machine step count only", 4438#ifndef SQLITE_NOHAVE_SYSTEM 4439 ".system CMD ARGS... Run CMD ARGS... in a system shell", 4440#endif 4441 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 4442 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 4443 ".testctrl CMD ... Run various sqlite3_test_control() operations", 4444 " Run \".testctrl\" with no arguments for details", 4445 ".timeout MS Try opening locked tables for MS milliseconds", 4446 ".timer on|off Turn SQL timer on or off", 4447#ifndef SQLITE_OMIT_TRACE 4448 ".trace ?OPTIONS? Output each SQL statement as it is run", 4449 " FILE Send output to FILE", 4450 " stdout Send output to stdout", 4451 " stderr Send output to stderr", 4452 " off Disable tracing", 4453 " --expanded Expand query parameters", 4454#ifdef SQLITE_ENABLE_NORMALIZE 4455 " --normalized Normal the SQL statements", 4456#endif 4457 " --plain Show SQL as it is input", 4458 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 4459 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 4460 " --row Trace each row (SQLITE_TRACE_ROW)", 4461 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 4462#endif /* SQLITE_OMIT_TRACE */ 4463#ifdef SQLITE_DEBUG 4464 ".unmodule NAME ... Unregister virtual table modules", 4465 " --allexcept Unregister everything except those named", 4466#endif 4467 ".vfsinfo ?AUX? Information about the top-level VFS", 4468 ".vfslist List all available VFSes", 4469 ".vfsname ?AUX? Print the name of the VFS stack", 4470 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 4471 " Negative values right-justify", 4472}; 4473 4474/* 4475** Output help text. 4476** 4477** zPattern describes the set of commands for which help text is provided. 4478** If zPattern is NULL, then show all commands, but only give a one-line 4479** description of each. 4480** 4481** Return the number of matches. 4482*/ 4483static int showHelp(FILE *out, const char *zPattern){ 4484 int i = 0; 4485 int j = 0; 4486 int n = 0; 4487 char *zPat; 4488 if( zPattern==0 4489 || zPattern[0]=='0' 4490 || strcmp(zPattern,"-a")==0 4491 || strcmp(zPattern,"-all")==0 4492 || strcmp(zPattern,"--all")==0 4493 ){ 4494 /* Show all commands, but only one line per command */ 4495 if( zPattern==0 ) zPattern = ""; 4496 for(i=0; i<ArraySize(azHelp); i++){ 4497 if( azHelp[i][0]=='.' || zPattern[0] ){ 4498 utf8_printf(out, "%s\n", azHelp[i]); 4499 n++; 4500 } 4501 } 4502 }else{ 4503 /* Look for commands that for which zPattern is an exact prefix */ 4504 zPat = sqlite3_mprintf(".%s*", zPattern); 4505 shell_check_oom(zPat); 4506 for(i=0; i<ArraySize(azHelp); i++){ 4507 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 4508 utf8_printf(out, "%s\n", azHelp[i]); 4509 j = i+1; 4510 n++; 4511 } 4512 } 4513 sqlite3_free(zPat); 4514 if( n ){ 4515 if( n==1 ){ 4516 /* when zPattern is a prefix of exactly one command, then include the 4517 ** details of that command, which should begin at offset j */ 4518 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 4519 utf8_printf(out, "%s\n", azHelp[j]); 4520 j++; 4521 } 4522 } 4523 return n; 4524 } 4525 /* Look for commands that contain zPattern anywhere. Show the complete 4526 ** text of all commands that match. */ 4527 zPat = sqlite3_mprintf("%%%s%%", zPattern); 4528 shell_check_oom(zPat); 4529 for(i=0; i<ArraySize(azHelp); i++){ 4530 if( azHelp[i][0]=='.' ) j = i; 4531 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 4532 utf8_printf(out, "%s\n", azHelp[j]); 4533 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 4534 j++; 4535 utf8_printf(out, "%s\n", azHelp[j]); 4536 } 4537 i = j; 4538 n++; 4539 } 4540 } 4541 sqlite3_free(zPat); 4542 } 4543 return n; 4544} 4545 4546/* Forward reference */ 4547static int process_input(ShellState *p); 4548 4549/* 4550** Read the content of file zName into memory obtained from sqlite3_malloc64() 4551** and return a pointer to the buffer. The caller is responsible for freeing 4552** the memory. 4553** 4554** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 4555** read. 4556** 4557** For convenience, a nul-terminator byte is always appended to the data read 4558** from the file before the buffer is returned. This byte is not included in 4559** the final value of (*pnByte), if applicable. 4560** 4561** NULL is returned if any error is encountered. The final value of *pnByte 4562** is undefined in this case. 4563*/ 4564static char *readFile(const char *zName, int *pnByte){ 4565 FILE *in = fopen(zName, "rb"); 4566 long nIn; 4567 size_t nRead; 4568 char *pBuf; 4569 if( in==0 ) return 0; 4570 fseek(in, 0, SEEK_END); 4571 nIn = ftell(in); 4572 rewind(in); 4573 pBuf = sqlite3_malloc64( nIn+1 ); 4574 if( pBuf==0 ){ fclose(in); return 0; } 4575 nRead = fread(pBuf, nIn, 1, in); 4576 fclose(in); 4577 if( nRead!=1 ){ 4578 sqlite3_free(pBuf); 4579 return 0; 4580 } 4581 pBuf[nIn] = 0; 4582 if( pnByte ) *pnByte = nIn; 4583 return pBuf; 4584} 4585 4586#if defined(SQLITE_ENABLE_SESSION) 4587/* 4588** Close a single OpenSession object and release all of its associated 4589** resources. 4590*/ 4591static void session_close(OpenSession *pSession){ 4592 int i; 4593 sqlite3session_delete(pSession->p); 4594 sqlite3_free(pSession->zName); 4595 for(i=0; i<pSession->nFilter; i++){ 4596 sqlite3_free(pSession->azFilter[i]); 4597 } 4598 sqlite3_free(pSession->azFilter); 4599 memset(pSession, 0, sizeof(OpenSession)); 4600} 4601#endif 4602 4603/* 4604** Close all OpenSession objects and release all associated resources. 4605*/ 4606#if defined(SQLITE_ENABLE_SESSION) 4607static void session_close_all(ShellState *p, int i){ 4608 int j; 4609 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; 4610 for(j=0; j<pAuxDb->nSession; j++){ 4611 session_close(&pAuxDb->aSession[j]); 4612 } 4613 pAuxDb->nSession = 0; 4614} 4615#else 4616# define session_close_all(X,Y) 4617#endif 4618 4619/* 4620** Implementation of the xFilter function for an open session. Omit 4621** any tables named by ".session filter" but let all other table through. 4622*/ 4623#if defined(SQLITE_ENABLE_SESSION) 4624static int session_filter(void *pCtx, const char *zTab){ 4625 OpenSession *pSession = (OpenSession*)pCtx; 4626 int i; 4627 for(i=0; i<pSession->nFilter; i++){ 4628 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 4629 } 4630 return 1; 4631} 4632#endif 4633 4634/* 4635** Try to deduce the type of file for zName based on its content. Return 4636** one of the SHELL_OPEN_* constants. 4637** 4638** If the file does not exist or is empty but its name looks like a ZIP 4639** archive and the dfltZip flag is true, then assume it is a ZIP archive. 4640** Otherwise, assume an ordinary database regardless of the filename if 4641** the type cannot be determined from content. 4642*/ 4643int deduceDatabaseType(const char *zName, int dfltZip){ 4644 FILE *f = fopen(zName, "rb"); 4645 size_t n; 4646 int rc = SHELL_OPEN_UNSPEC; 4647 char zBuf[100]; 4648 if( f==0 ){ 4649 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4650 return SHELL_OPEN_ZIPFILE; 4651 }else{ 4652 return SHELL_OPEN_NORMAL; 4653 } 4654 } 4655 n = fread(zBuf, 16, 1, f); 4656 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 4657 fclose(f); 4658 return SHELL_OPEN_NORMAL; 4659 } 4660 fseek(f, -25, SEEK_END); 4661 n = fread(zBuf, 25, 1, f); 4662 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 4663 rc = SHELL_OPEN_APPENDVFS; 4664 }else{ 4665 fseek(f, -22, SEEK_END); 4666 n = fread(zBuf, 22, 1, f); 4667 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 4668 && zBuf[3]==0x06 ){ 4669 rc = SHELL_OPEN_ZIPFILE; 4670 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 4671 rc = SHELL_OPEN_ZIPFILE; 4672 } 4673 } 4674 fclose(f); 4675 return rc; 4676} 4677 4678#ifndef SQLITE_OMIT_DESERIALIZE 4679/* 4680** Reconstruct an in-memory database using the output from the "dbtotxt" 4681** program. Read content from the file in p->aAuxDb[].zDbFilename. 4682** If p->aAuxDb[].zDbFilename is 0, then read from standard input. 4683*/ 4684static unsigned char *readHexDb(ShellState *p, int *pnData){ 4685 unsigned char *a = 0; 4686 int nLine; 4687 int n = 0; 4688 int pgsz = 0; 4689 int iOffset = 0; 4690 int j, k; 4691 int rc; 4692 FILE *in; 4693 const char *zDbFilename = p->pAuxDb->zDbFilename; 4694 unsigned int x[16]; 4695 char zLine[1000]; 4696 if( zDbFilename ){ 4697 in = fopen(zDbFilename, "r"); 4698 if( in==0 ){ 4699 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename); 4700 return 0; 4701 } 4702 nLine = 0; 4703 }else{ 4704 in = p->in; 4705 nLine = p->lineno; 4706 if( in==0 ) in = stdin; 4707 } 4708 *pnData = 0; 4709 nLine++; 4710 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 4711 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 4712 if( rc!=2 ) goto readHexDb_error; 4713 if( n<0 ) goto readHexDb_error; 4714 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 4715 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 4716 a = sqlite3_malloc( n ? n : 1 ); 4717 shell_check_oom(a); 4718 memset(a, 0, n); 4719 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 4720 utf8_printf(stderr, "invalid pagesize\n"); 4721 goto readHexDb_error; 4722 } 4723 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 4724 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 4725 if( rc==2 ){ 4726 iOffset = k; 4727 continue; 4728 } 4729 if( strncmp(zLine, "| end ", 6)==0 ){ 4730 break; 4731 } 4732 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 4733 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 4734 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 4735 if( rc==17 ){ 4736 k = iOffset+j; 4737 if( k+16<=n && k>=0 ){ 4738 int ii; 4739 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 4740 } 4741 } 4742 } 4743 *pnData = n; 4744 if( in!=p->in ){ 4745 fclose(in); 4746 }else{ 4747 p->lineno = nLine; 4748 } 4749 return a; 4750 4751readHexDb_error: 4752 if( in!=p->in ){ 4753 fclose(in); 4754 }else{ 4755 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 4756 nLine++; 4757 if(strncmp(zLine, "| end ", 6)==0 ) break; 4758 } 4759 p->lineno = nLine; 4760 } 4761 sqlite3_free(a); 4762 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 4763 return 0; 4764} 4765#endif /* SQLITE_OMIT_DESERIALIZE */ 4766 4767/* 4768** Scalar function "shell_int32". The first argument to this function 4769** must be a blob. The second a non-negative integer. This function 4770** reads and returns a 32-bit big-endian integer from byte 4771** offset (4*<arg2>) of the blob. 4772*/ 4773static void shellInt32( 4774 sqlite3_context *context, 4775 int argc, 4776 sqlite3_value **argv 4777){ 4778 const unsigned char *pBlob; 4779 int nBlob; 4780 int iInt; 4781 4782 UNUSED_PARAMETER(argc); 4783 nBlob = sqlite3_value_bytes(argv[0]); 4784 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 4785 iInt = sqlite3_value_int(argv[1]); 4786 4787 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 4788 const unsigned char *a = &pBlob[iInt*4]; 4789 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 4790 + ((sqlite3_int64)a[1]<<16) 4791 + ((sqlite3_int64)a[2]<< 8) 4792 + ((sqlite3_int64)a[3]<< 0); 4793 sqlite3_result_int64(context, iVal); 4794 } 4795} 4796 4797/* 4798** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 4799** using "..." with internal double-quote characters doubled. 4800*/ 4801static void shellIdQuote( 4802 sqlite3_context *context, 4803 int argc, 4804 sqlite3_value **argv 4805){ 4806 const char *zName = (const char*)sqlite3_value_text(argv[0]); 4807 UNUSED_PARAMETER(argc); 4808 if( zName ){ 4809 char *z = sqlite3_mprintf("\"%w\"", zName); 4810 sqlite3_result_text(context, z, -1, sqlite3_free); 4811 } 4812} 4813 4814/* 4815** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 4816*/ 4817static void shellUSleepFunc( 4818 sqlite3_context *context, 4819 int argcUnused, 4820 sqlite3_value **argv 4821){ 4822 int sleep = sqlite3_value_int(argv[0]); 4823 (void)argcUnused; 4824 sqlite3_sleep(sleep/1000); 4825 sqlite3_result_int(context, sleep); 4826} 4827 4828/* 4829** Scalar function "shell_escape_crnl" used by the .recover command. 4830** The argument passed to this function is the output of built-in 4831** function quote(). If the first character of the input is "'", 4832** indicating that the value passed to quote() was a text value, 4833** then this function searches the input for "\n" and "\r" characters 4834** and adds a wrapper similar to the following: 4835** 4836** replace(replace(<input>, '\n', char(10), '\r', char(13)); 4837** 4838** Or, if the first character of the input is not "'", then a copy 4839** of the input is returned. 4840*/ 4841static void shellEscapeCrnl( 4842 sqlite3_context *context, 4843 int argc, 4844 sqlite3_value **argv 4845){ 4846 const char *zText = (const char*)sqlite3_value_text(argv[0]); 4847 UNUSED_PARAMETER(argc); 4848 if( zText && zText[0]=='\'' ){ 4849 int nText = sqlite3_value_bytes(argv[0]); 4850 int i; 4851 char zBuf1[20]; 4852 char zBuf2[20]; 4853 const char *zNL = 0; 4854 const char *zCR = 0; 4855 int nCR = 0; 4856 int nNL = 0; 4857 4858 for(i=0; zText[i]; i++){ 4859 if( zNL==0 && zText[i]=='\n' ){ 4860 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 4861 nNL = (int)strlen(zNL); 4862 } 4863 if( zCR==0 && zText[i]=='\r' ){ 4864 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 4865 nCR = (int)strlen(zCR); 4866 } 4867 } 4868 4869 if( zNL || zCR ){ 4870 int iOut = 0; 4871 i64 nMax = (nNL > nCR) ? nNL : nCR; 4872 i64 nAlloc = nMax * nText + (nMax+64)*2; 4873 char *zOut = (char*)sqlite3_malloc64(nAlloc); 4874 if( zOut==0 ){ 4875 sqlite3_result_error_nomem(context); 4876 return; 4877 } 4878 4879 if( zNL && zCR ){ 4880 memcpy(&zOut[iOut], "replace(replace(", 16); 4881 iOut += 16; 4882 }else{ 4883 memcpy(&zOut[iOut], "replace(", 8); 4884 iOut += 8; 4885 } 4886 for(i=0; zText[i]; i++){ 4887 if( zText[i]=='\n' ){ 4888 memcpy(&zOut[iOut], zNL, nNL); 4889 iOut += nNL; 4890 }else if( zText[i]=='\r' ){ 4891 memcpy(&zOut[iOut], zCR, nCR); 4892 iOut += nCR; 4893 }else{ 4894 zOut[iOut] = zText[i]; 4895 iOut++; 4896 } 4897 } 4898 4899 if( zNL ){ 4900 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4901 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 4902 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 4903 } 4904 if( zCR ){ 4905 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 4906 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 4907 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 4908 } 4909 4910 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 4911 sqlite3_free(zOut); 4912 return; 4913 } 4914 } 4915 4916 sqlite3_result_value(context, argv[0]); 4917} 4918 4919/* Flags for open_db(). 4920** 4921** The default behavior of open_db() is to exit(1) if the database fails to 4922** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 4923** but still returns without calling exit. 4924** 4925** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 4926** ZIP archive if the file does not exist or is empty and its name matches 4927** the *.zip pattern. 4928*/ 4929#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 4930#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 4931 4932/* 4933** Make sure the database is open. If it is not, then open it. If 4934** the database fails to open, print an error message and exit. 4935*/ 4936static void open_db(ShellState *p, int openFlags){ 4937 if( p->db==0 ){ 4938 const char *zDbFilename = p->pAuxDb->zDbFilename; 4939 if( p->openMode==SHELL_OPEN_UNSPEC ){ 4940 if( zDbFilename==0 || zDbFilename[0]==0 ){ 4941 p->openMode = SHELL_OPEN_NORMAL; 4942 }else{ 4943 p->openMode = (u8)deduceDatabaseType(zDbFilename, 4944 (openFlags & OPEN_DB_ZIPFILE)!=0); 4945 } 4946 } 4947 switch( p->openMode ){ 4948 case SHELL_OPEN_APPENDVFS: { 4949 sqlite3_open_v2(zDbFilename, &p->db, 4950 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 4951 break; 4952 } 4953 case SHELL_OPEN_HEXDB: 4954 case SHELL_OPEN_DESERIALIZE: { 4955 sqlite3_open(0, &p->db); 4956 break; 4957 } 4958 case SHELL_OPEN_ZIPFILE: { 4959 sqlite3_open(":memory:", &p->db); 4960 break; 4961 } 4962 case SHELL_OPEN_READONLY: { 4963 sqlite3_open_v2(zDbFilename, &p->db, 4964 SQLITE_OPEN_READONLY|p->openFlags, 0); 4965 break; 4966 } 4967 case SHELL_OPEN_UNSPEC: 4968 case SHELL_OPEN_NORMAL: { 4969 sqlite3_open_v2(zDbFilename, &p->db, 4970 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 4971 break; 4972 } 4973 } 4974 globalDb = p->db; 4975 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 4976 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 4977 zDbFilename, sqlite3_errmsg(p->db)); 4978 if( openFlags & OPEN_DB_KEEPALIVE ){ 4979 sqlite3_open(":memory:", &p->db); 4980 return; 4981 } 4982 exit(1); 4983 } 4984#ifndef SQLITE_OMIT_LOAD_EXTENSION 4985 sqlite3_enable_load_extension(p->db, 1); 4986#endif 4987 sqlite3_fileio_init(p->db, 0, 0); 4988 sqlite3_shathree_init(p->db, 0, 0); 4989 sqlite3_completion_init(p->db, 0, 0); 4990 sqlite3_uint_init(p->db, 0, 0); 4991 sqlite3_decimal_init(p->db, 0, 0); 4992 sqlite3_regexp_init(p->db, 0, 0); 4993 sqlite3_ieee_init(p->db, 0, 0); 4994 sqlite3_series_init(p->db, 0, 0); 4995#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 4996 sqlite3_dbdata_init(p->db, 0, 0); 4997#endif 4998#ifdef SQLITE_HAVE_ZLIB 4999 sqlite3_zipfile_init(p->db, 0, 0); 5000 sqlite3_sqlar_init(p->db, 0, 0); 5001#endif 5002 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 5003 shellAddSchemaName, 0, 0); 5004 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 5005 shellModuleSchema, 0, 0); 5006 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 5007 shellPutsFunc, 0, 0); 5008 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 5009 shellEscapeCrnl, 0, 0); 5010 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 5011 shellInt32, 0, 0); 5012 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 5013 shellIdQuote, 0, 0); 5014 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 5015 shellUSleepFunc, 0, 0); 5016#ifndef SQLITE_NOHAVE_SYSTEM 5017 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 5018 editFunc, 0, 0); 5019 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 5020 editFunc, 0, 0); 5021#endif 5022 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 5023 char *zSql = sqlite3_mprintf( 5024 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); 5025 shell_check_oom(zSql); 5026 sqlite3_exec(p->db, zSql, 0, 0, 0); 5027 sqlite3_free(zSql); 5028 } 5029#ifndef SQLITE_OMIT_DESERIALIZE 5030 else 5031 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 5032 int rc; 5033 int nData = 0; 5034 unsigned char *aData; 5035 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 5036 aData = (unsigned char*)readFile(zDbFilename, &nData); 5037 }else{ 5038 aData = readHexDb(p, &nData); 5039 if( aData==0 ){ 5040 return; 5041 } 5042 } 5043 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 5044 SQLITE_DESERIALIZE_RESIZEABLE | 5045 SQLITE_DESERIALIZE_FREEONCLOSE); 5046 if( rc ){ 5047 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 5048 } 5049 if( p->szMax>0 ){ 5050 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 5051 } 5052 } 5053#endif 5054 } 5055 if( p->bSafeModePersist && p->db!=0 ){ 5056 sqlite3_set_authorizer(p->db, safeModeAuth, p); 5057 } 5058} 5059 5060/* 5061** Attempt to close the databaes connection. Report errors. 5062*/ 5063void close_db(sqlite3 *db){ 5064 int rc = sqlite3_close(db); 5065 if( rc ){ 5066 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 5067 rc, sqlite3_errmsg(db)); 5068 } 5069} 5070 5071#if HAVE_READLINE || HAVE_EDITLINE 5072/* 5073** Readline completion callbacks 5074*/ 5075static char *readline_completion_generator(const char *text, int state){ 5076 static sqlite3_stmt *pStmt = 0; 5077 char *zRet; 5078 if( state==0 ){ 5079 char *zSql; 5080 sqlite3_finalize(pStmt); 5081 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 5082 " FROM completion(%Q) ORDER BY 1", text); 5083 shell_check_oom(zSql); 5084 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 5085 sqlite3_free(zSql); 5086 } 5087 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 5088 const char *z = (const char*)sqlite3_column_text(pStmt,0); 5089 zRet = z ? strdup(z) : 0; 5090 }else{ 5091 sqlite3_finalize(pStmt); 5092 pStmt = 0; 5093 zRet = 0; 5094 } 5095 return zRet; 5096} 5097static char **readline_completion(const char *zText, int iStart, int iEnd){ 5098 rl_attempted_completion_over = 1; 5099 return rl_completion_matches(zText, readline_completion_generator); 5100} 5101 5102#elif HAVE_LINENOISE 5103/* 5104** Linenoise completion callback 5105*/ 5106static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 5107 int nLine = strlen30(zLine); 5108 int i, iStart; 5109 sqlite3_stmt *pStmt = 0; 5110 char *zSql; 5111 char zBuf[1000]; 5112 5113 if( nLine>sizeof(zBuf)-30 ) return; 5114 if( zLine[0]=='.' || zLine[0]=='#') return; 5115 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 5116 if( i==nLine-1 ) return; 5117 iStart = i+1; 5118 memcpy(zBuf, zLine, iStart); 5119 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 5120 " FROM completion(%Q,%Q) ORDER BY 1", 5121 &zLine[iStart], zLine); 5122 shell_check_oom(zSql); 5123 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 5124 sqlite3_free(zSql); 5125 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 5126 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 5127 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 5128 int nCompletion = sqlite3_column_bytes(pStmt, 0); 5129 if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){ 5130 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 5131 linenoiseAddCompletion(lc, zBuf); 5132 } 5133 } 5134 sqlite3_finalize(pStmt); 5135} 5136#endif 5137 5138/* 5139** Do C-language style dequoting. 5140** 5141** \a -> alarm 5142** \b -> backspace 5143** \t -> tab 5144** \n -> newline 5145** \v -> vertical tab 5146** \f -> form feed 5147** \r -> carriage return 5148** \s -> space 5149** \" -> " 5150** \' -> ' 5151** \\ -> backslash 5152** \NNN -> ascii character NNN in octal 5153*/ 5154static void resolve_backslashes(char *z){ 5155 int i, j; 5156 char c; 5157 while( *z && *z!='\\' ) z++; 5158 for(i=j=0; (c = z[i])!=0; i++, j++){ 5159 if( c=='\\' && z[i+1]!=0 ){ 5160 c = z[++i]; 5161 if( c=='a' ){ 5162 c = '\a'; 5163 }else if( c=='b' ){ 5164 c = '\b'; 5165 }else if( c=='t' ){ 5166 c = '\t'; 5167 }else if( c=='n' ){ 5168 c = '\n'; 5169 }else if( c=='v' ){ 5170 c = '\v'; 5171 }else if( c=='f' ){ 5172 c = '\f'; 5173 }else if( c=='r' ){ 5174 c = '\r'; 5175 }else if( c=='"' ){ 5176 c = '"'; 5177 }else if( c=='\'' ){ 5178 c = '\''; 5179 }else if( c=='\\' ){ 5180 c = '\\'; 5181 }else if( c>='0' && c<='7' ){ 5182 c -= '0'; 5183 if( z[i+1]>='0' && z[i+1]<='7' ){ 5184 i++; 5185 c = (c<<3) + z[i] - '0'; 5186 if( z[i+1]>='0' && z[i+1]<='7' ){ 5187 i++; 5188 c = (c<<3) + z[i] - '0'; 5189 } 5190 } 5191 } 5192 } 5193 z[j] = c; 5194 } 5195 if( j<i ) z[j] = 0; 5196} 5197 5198/* 5199** Interpret zArg as either an integer or a boolean value. Return 1 or 0 5200** for TRUE and FALSE. Return the integer value if appropriate. 5201*/ 5202static int booleanValue(const char *zArg){ 5203 int i; 5204 if( zArg[0]=='0' && zArg[1]=='x' ){ 5205 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 5206 }else{ 5207 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 5208 } 5209 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 5210 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 5211 return 1; 5212 } 5213 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 5214 return 0; 5215 } 5216 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 5217 zArg); 5218 return 0; 5219} 5220 5221/* 5222** Set or clear a shell flag according to a boolean value. 5223*/ 5224static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 5225 if( booleanValue(zArg) ){ 5226 ShellSetFlag(p, mFlag); 5227 }else{ 5228 ShellClearFlag(p, mFlag); 5229 } 5230} 5231 5232/* 5233** Close an output file, assuming it is not stderr or stdout 5234*/ 5235static void output_file_close(FILE *f){ 5236 if( f && f!=stdout && f!=stderr ) fclose(f); 5237} 5238 5239/* 5240** Try to open an output file. The names "stdout" and "stderr" are 5241** recognized and do the right thing. NULL is returned if the output 5242** filename is "off". 5243*/ 5244static FILE *output_file_open(const char *zFile, int bTextMode){ 5245 FILE *f; 5246 if( strcmp(zFile,"stdout")==0 ){ 5247 f = stdout; 5248 }else if( strcmp(zFile, "stderr")==0 ){ 5249 f = stderr; 5250 }else if( strcmp(zFile, "off")==0 ){ 5251 f = 0; 5252 }else{ 5253 f = fopen(zFile, bTextMode ? "w" : "wb"); 5254 if( f==0 ){ 5255 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 5256 } 5257 } 5258 return f; 5259} 5260 5261#ifndef SQLITE_OMIT_TRACE 5262/* 5263** A routine for handling output from sqlite3_trace(). 5264*/ 5265static int sql_trace_callback( 5266 unsigned mType, /* The trace type */ 5267 void *pArg, /* The ShellState pointer */ 5268 void *pP, /* Usually a pointer to sqlite_stmt */ 5269 void *pX /* Auxiliary output */ 5270){ 5271 ShellState *p = (ShellState*)pArg; 5272 sqlite3_stmt *pStmt; 5273 const char *zSql; 5274 int nSql; 5275 if( p->traceOut==0 ) return 0; 5276 if( mType==SQLITE_TRACE_CLOSE ){ 5277 utf8_printf(p->traceOut, "-- closing database connection\n"); 5278 return 0; 5279 } 5280 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 5281 zSql = (const char*)pX; 5282 }else{ 5283 pStmt = (sqlite3_stmt*)pP; 5284 switch( p->eTraceType ){ 5285 case SHELL_TRACE_EXPANDED: { 5286 zSql = sqlite3_expanded_sql(pStmt); 5287 break; 5288 } 5289#ifdef SQLITE_ENABLE_NORMALIZE 5290 case SHELL_TRACE_NORMALIZED: { 5291 zSql = sqlite3_normalized_sql(pStmt); 5292 break; 5293 } 5294#endif 5295 default: { 5296 zSql = sqlite3_sql(pStmt); 5297 break; 5298 } 5299 } 5300 } 5301 if( zSql==0 ) return 0; 5302 nSql = strlen30(zSql); 5303 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 5304 switch( mType ){ 5305 case SQLITE_TRACE_ROW: 5306 case SQLITE_TRACE_STMT: { 5307 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 5308 break; 5309 } 5310 case SQLITE_TRACE_PROFILE: { 5311 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 5312 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 5313 break; 5314 } 5315 } 5316 return 0; 5317} 5318#endif 5319 5320/* 5321** A no-op routine that runs with the ".breakpoint" doc-command. This is 5322** a useful spot to set a debugger breakpoint. 5323*/ 5324static void test_breakpoint(void){ 5325 static int nCall = 0; 5326 nCall++; 5327} 5328 5329/* 5330** An object used to read a CSV and other files for import. 5331*/ 5332typedef struct ImportCtx ImportCtx; 5333struct ImportCtx { 5334 const char *zFile; /* Name of the input file */ 5335 FILE *in; /* Read the CSV text from this input stream */ 5336 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 5337 char *z; /* Accumulated text for a field */ 5338 int n; /* Number of bytes in z */ 5339 int nAlloc; /* Space allocated for z[] */ 5340 int nLine; /* Current line number */ 5341 int nRow; /* Number of rows imported */ 5342 int nErr; /* Number of errors encountered */ 5343 int bNotFirst; /* True if one or more bytes already read */ 5344 int cTerm; /* Character that terminated the most recent field */ 5345 int cColSep; /* The column separator character. (Usually ",") */ 5346 int cRowSep; /* The row separator character. (Usually "\n") */ 5347}; 5348 5349/* Clean up resourced used by an ImportCtx */ 5350static void import_cleanup(ImportCtx *p){ 5351 if( p->in!=0 && p->xCloser!=0 ){ 5352 p->xCloser(p->in); 5353 p->in = 0; 5354 } 5355 sqlite3_free(p->z); 5356 p->z = 0; 5357} 5358 5359/* Append a single byte to z[] */ 5360static void import_append_char(ImportCtx *p, int c){ 5361 if( p->n+1>=p->nAlloc ){ 5362 p->nAlloc += p->nAlloc + 100; 5363 p->z = sqlite3_realloc64(p->z, p->nAlloc); 5364 shell_check_oom(p->z); 5365 } 5366 p->z[p->n++] = (char)c; 5367} 5368 5369/* Read a single field of CSV text. Compatible with rfc4180 and extended 5370** with the option of having a separator other than ",". 5371** 5372** + Input comes from p->in. 5373** + Store results in p->z of length p->n. Space to hold p->z comes 5374** from sqlite3_malloc64(). 5375** + Use p->cSep as the column separator. The default is ",". 5376** + Use p->rSep as the row separator. The default is "\n". 5377** + Keep track of the line number in p->nLine. 5378** + Store the character that terminates the field in p->cTerm. Store 5379** EOF on end-of-file. 5380** + Report syntax errors on stderr 5381*/ 5382static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 5383 int c; 5384 int cSep = p->cColSep; 5385 int rSep = p->cRowSep; 5386 p->n = 0; 5387 c = fgetc(p->in); 5388 if( c==EOF || seenInterrupt ){ 5389 p->cTerm = EOF; 5390 return 0; 5391 } 5392 if( c=='"' ){ 5393 int pc, ppc; 5394 int startLine = p->nLine; 5395 int cQuote = c; 5396 pc = ppc = 0; 5397 while( 1 ){ 5398 c = fgetc(p->in); 5399 if( c==rSep ) p->nLine++; 5400 if( c==cQuote ){ 5401 if( pc==cQuote ){ 5402 pc = 0; 5403 continue; 5404 } 5405 } 5406 if( (c==cSep && pc==cQuote) 5407 || (c==rSep && pc==cQuote) 5408 || (c==rSep && pc=='\r' && ppc==cQuote) 5409 || (c==EOF && pc==cQuote) 5410 ){ 5411 do{ p->n--; }while( p->z[p->n]!=cQuote ); 5412 p->cTerm = c; 5413 break; 5414 } 5415 if( pc==cQuote && c!='\r' ){ 5416 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 5417 p->zFile, p->nLine, cQuote); 5418 } 5419 if( c==EOF ){ 5420 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 5421 p->zFile, startLine, cQuote); 5422 p->cTerm = c; 5423 break; 5424 } 5425 import_append_char(p, c); 5426 ppc = pc; 5427 pc = c; 5428 } 5429 }else{ 5430 /* If this is the first field being parsed and it begins with the 5431 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 5432 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 5433 import_append_char(p, c); 5434 c = fgetc(p->in); 5435 if( (c&0xff)==0xbb ){ 5436 import_append_char(p, c); 5437 c = fgetc(p->in); 5438 if( (c&0xff)==0xbf ){ 5439 p->bNotFirst = 1; 5440 p->n = 0; 5441 return csv_read_one_field(p); 5442 } 5443 } 5444 } 5445 while( c!=EOF && c!=cSep && c!=rSep ){ 5446 import_append_char(p, c); 5447 c = fgetc(p->in); 5448 } 5449 if( c==rSep ){ 5450 p->nLine++; 5451 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 5452 } 5453 p->cTerm = c; 5454 } 5455 if( p->z ) p->z[p->n] = 0; 5456 p->bNotFirst = 1; 5457 return p->z; 5458} 5459 5460/* Read a single field of ASCII delimited text. 5461** 5462** + Input comes from p->in. 5463** + Store results in p->z of length p->n. Space to hold p->z comes 5464** from sqlite3_malloc64(). 5465** + Use p->cSep as the column separator. The default is "\x1F". 5466** + Use p->rSep as the row separator. The default is "\x1E". 5467** + Keep track of the row number in p->nLine. 5468** + Store the character that terminates the field in p->cTerm. Store 5469** EOF on end-of-file. 5470** + Report syntax errors on stderr 5471*/ 5472static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 5473 int c; 5474 int cSep = p->cColSep; 5475 int rSep = p->cRowSep; 5476 p->n = 0; 5477 c = fgetc(p->in); 5478 if( c==EOF || seenInterrupt ){ 5479 p->cTerm = EOF; 5480 return 0; 5481 } 5482 while( c!=EOF && c!=cSep && c!=rSep ){ 5483 import_append_char(p, c); 5484 c = fgetc(p->in); 5485 } 5486 if( c==rSep ){ 5487 p->nLine++; 5488 } 5489 p->cTerm = c; 5490 if( p->z ) p->z[p->n] = 0; 5491 return p->z; 5492} 5493 5494/* 5495** Try to transfer data for table zTable. If an error is seen while 5496** moving forward, try to go backwards. The backwards movement won't 5497** work for WITHOUT ROWID tables. 5498*/ 5499static void tryToCloneData( 5500 ShellState *p, 5501 sqlite3 *newDb, 5502 const char *zTable 5503){ 5504 sqlite3_stmt *pQuery = 0; 5505 sqlite3_stmt *pInsert = 0; 5506 char *zQuery = 0; 5507 char *zInsert = 0; 5508 int rc; 5509 int i, j, n; 5510 int nTable = strlen30(zTable); 5511 int k = 0; 5512 int cnt = 0; 5513 const int spinRate = 10000; 5514 5515 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 5516 shell_check_oom(zQuery); 5517 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5518 if( rc ){ 5519 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5520 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5521 zQuery); 5522 goto end_data_xfer; 5523 } 5524 n = sqlite3_column_count(pQuery); 5525 zInsert = sqlite3_malloc64(200 + nTable + n*3); 5526 shell_check_oom(zInsert); 5527 sqlite3_snprintf(200+nTable,zInsert, 5528 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 5529 i = strlen30(zInsert); 5530 for(j=1; j<n; j++){ 5531 memcpy(zInsert+i, ",?", 2); 5532 i += 2; 5533 } 5534 memcpy(zInsert+i, ");", 3); 5535 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 5536 if( rc ){ 5537 utf8_printf(stderr, "Error %d: %s on [%s]\n", 5538 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 5539 zQuery); 5540 goto end_data_xfer; 5541 } 5542 for(k=0; k<2; k++){ 5543 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5544 for(i=0; i<n; i++){ 5545 switch( sqlite3_column_type(pQuery, i) ){ 5546 case SQLITE_NULL: { 5547 sqlite3_bind_null(pInsert, i+1); 5548 break; 5549 } 5550 case SQLITE_INTEGER: { 5551 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 5552 break; 5553 } 5554 case SQLITE_FLOAT: { 5555 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 5556 break; 5557 } 5558 case SQLITE_TEXT: { 5559 sqlite3_bind_text(pInsert, i+1, 5560 (const char*)sqlite3_column_text(pQuery,i), 5561 -1, SQLITE_STATIC); 5562 break; 5563 } 5564 case SQLITE_BLOB: { 5565 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 5566 sqlite3_column_bytes(pQuery,i), 5567 SQLITE_STATIC); 5568 break; 5569 } 5570 } 5571 } /* End for */ 5572 rc = sqlite3_step(pInsert); 5573 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 5574 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 5575 sqlite3_errmsg(newDb)); 5576 } 5577 sqlite3_reset(pInsert); 5578 cnt++; 5579 if( (cnt%spinRate)==0 ){ 5580 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 5581 fflush(stdout); 5582 } 5583 } /* End while */ 5584 if( rc==SQLITE_DONE ) break; 5585 sqlite3_finalize(pQuery); 5586 sqlite3_free(zQuery); 5587 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 5588 zTable); 5589 shell_check_oom(zQuery); 5590 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5591 if( rc ){ 5592 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 5593 break; 5594 } 5595 } /* End for(k=0...) */ 5596 5597end_data_xfer: 5598 sqlite3_finalize(pQuery); 5599 sqlite3_finalize(pInsert); 5600 sqlite3_free(zQuery); 5601 sqlite3_free(zInsert); 5602} 5603 5604 5605/* 5606** Try to transfer all rows of the schema that match zWhere. For 5607** each row, invoke xForEach() on the object defined by that row. 5608** If an error is encountered while moving forward through the 5609** sqlite_schema table, try again moving backwards. 5610*/ 5611static void tryToCloneSchema( 5612 ShellState *p, 5613 sqlite3 *newDb, 5614 const char *zWhere, 5615 void (*xForEach)(ShellState*,sqlite3*,const char*) 5616){ 5617 sqlite3_stmt *pQuery = 0; 5618 char *zQuery = 0; 5619 int rc; 5620 const unsigned char *zName; 5621 const unsigned char *zSql; 5622 char *zErrMsg = 0; 5623 5624 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5625 " WHERE %s", zWhere); 5626 shell_check_oom(zQuery); 5627 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5628 if( rc ){ 5629 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5630 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5631 zQuery); 5632 goto end_schema_xfer; 5633 } 5634 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 5635 zName = sqlite3_column_text(pQuery, 0); 5636 zSql = sqlite3_column_text(pQuery, 1); 5637 if( zName==0 || zSql==0 ) continue; 5638 printf("%s... ", zName); fflush(stdout); 5639 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5640 if( zErrMsg ){ 5641 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5642 sqlite3_free(zErrMsg); 5643 zErrMsg = 0; 5644 } 5645 if( xForEach ){ 5646 xForEach(p, newDb, (const char*)zName); 5647 } 5648 printf("done\n"); 5649 } 5650 if( rc!=SQLITE_DONE ){ 5651 sqlite3_finalize(pQuery); 5652 sqlite3_free(zQuery); 5653 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 5654 " WHERE %s ORDER BY rowid DESC", zWhere); 5655 shell_check_oom(zQuery); 5656 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 5657 if( rc ){ 5658 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 5659 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 5660 zQuery); 5661 goto end_schema_xfer; 5662 } 5663 while( sqlite3_step(pQuery)==SQLITE_ROW ){ 5664 zName = sqlite3_column_text(pQuery, 0); 5665 zSql = sqlite3_column_text(pQuery, 1); 5666 if( zName==0 || zSql==0 ) continue; 5667 printf("%s... ", zName); fflush(stdout); 5668 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 5669 if( zErrMsg ){ 5670 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 5671 sqlite3_free(zErrMsg); 5672 zErrMsg = 0; 5673 } 5674 if( xForEach ){ 5675 xForEach(p, newDb, (const char*)zName); 5676 } 5677 printf("done\n"); 5678 } 5679 } 5680end_schema_xfer: 5681 sqlite3_finalize(pQuery); 5682 sqlite3_free(zQuery); 5683} 5684 5685/* 5686** Open a new database file named "zNewDb". Try to recover as much information 5687** as possible out of the main database (which might be corrupt) and write it 5688** into zNewDb. 5689*/ 5690static void tryToClone(ShellState *p, const char *zNewDb){ 5691 int rc; 5692 sqlite3 *newDb = 0; 5693 if( access(zNewDb,0)==0 ){ 5694 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 5695 return; 5696 } 5697 rc = sqlite3_open(zNewDb, &newDb); 5698 if( rc ){ 5699 utf8_printf(stderr, "Cannot create output database: %s\n", 5700 sqlite3_errmsg(newDb)); 5701 }else{ 5702 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 5703 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 5704 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 5705 tryToCloneSchema(p, newDb, "type!='table'", 0); 5706 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 5707 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 5708 } 5709 close_db(newDb); 5710} 5711 5712/* 5713** Change the output file back to stdout. 5714** 5715** If the p->doXdgOpen flag is set, that means the output was being 5716** redirected to a temporary file named by p->zTempFile. In that case, 5717** launch start/open/xdg-open on that temporary file. 5718*/ 5719static void output_reset(ShellState *p){ 5720 if( p->outfile[0]=='|' ){ 5721#ifndef SQLITE_OMIT_POPEN 5722 pclose(p->out); 5723#endif 5724 }else{ 5725 output_file_close(p->out); 5726#ifndef SQLITE_NOHAVE_SYSTEM 5727 if( p->doXdgOpen ){ 5728 const char *zXdgOpenCmd = 5729#if defined(_WIN32) 5730 "start"; 5731#elif defined(__APPLE__) 5732 "open"; 5733#else 5734 "xdg-open"; 5735#endif 5736 char *zCmd; 5737 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 5738 if( system(zCmd) ){ 5739 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 5740 }else{ 5741 /* Give the start/open/xdg-open command some time to get 5742 ** going before we continue, and potential delete the 5743 ** p->zTempFile data file out from under it */ 5744 sqlite3_sleep(2000); 5745 } 5746 sqlite3_free(zCmd); 5747 outputModePop(p); 5748 p->doXdgOpen = 0; 5749 } 5750#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 5751 } 5752 p->outfile[0] = 0; 5753 p->out = stdout; 5754} 5755 5756/* 5757** Run an SQL command and return the single integer result. 5758*/ 5759static int db_int(sqlite3 *db, const char *zSql){ 5760 sqlite3_stmt *pStmt; 5761 int res = 0; 5762 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 5763 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 5764 res = sqlite3_column_int(pStmt,0); 5765 } 5766 sqlite3_finalize(pStmt); 5767 return res; 5768} 5769 5770/* 5771** Convert a 2-byte or 4-byte big-endian integer into a native integer 5772*/ 5773static unsigned int get2byteInt(unsigned char *a){ 5774 return (a[0]<<8) + a[1]; 5775} 5776static unsigned int get4byteInt(unsigned char *a){ 5777 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 5778} 5779 5780/* 5781** Implementation of the ".dbinfo" command. 5782** 5783** Return 1 on error, 2 to exit, and 0 otherwise. 5784*/ 5785static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 5786 static const struct { const char *zName; int ofst; } aField[] = { 5787 { "file change counter:", 24 }, 5788 { "database page count:", 28 }, 5789 { "freelist page count:", 36 }, 5790 { "schema cookie:", 40 }, 5791 { "schema format:", 44 }, 5792 { "default cache size:", 48 }, 5793 { "autovacuum top root:", 52 }, 5794 { "incremental vacuum:", 64 }, 5795 { "text encoding:", 56 }, 5796 { "user version:", 60 }, 5797 { "application id:", 68 }, 5798 { "software version:", 96 }, 5799 }; 5800 static const struct { const char *zName; const char *zSql; } aQuery[] = { 5801 { "number of tables:", 5802 "SELECT count(*) FROM %s WHERE type='table'" }, 5803 { "number of indexes:", 5804 "SELECT count(*) FROM %s WHERE type='index'" }, 5805 { "number of triggers:", 5806 "SELECT count(*) FROM %s WHERE type='trigger'" }, 5807 { "number of views:", 5808 "SELECT count(*) FROM %s WHERE type='view'" }, 5809 { "schema size:", 5810 "SELECT total(length(sql)) FROM %s" }, 5811 }; 5812 int i, rc; 5813 unsigned iDataVersion; 5814 char *zSchemaTab; 5815 char *zDb = nArg>=2 ? azArg[1] : "main"; 5816 sqlite3_stmt *pStmt = 0; 5817 unsigned char aHdr[100]; 5818 open_db(p, 0); 5819 if( p->db==0 ) return 1; 5820 rc = sqlite3_prepare_v2(p->db, 5821 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 5822 -1, &pStmt, 0); 5823 if( rc ){ 5824 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 5825 sqlite3_finalize(pStmt); 5826 return 1; 5827 } 5828 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 5829 if( sqlite3_step(pStmt)==SQLITE_ROW 5830 && sqlite3_column_bytes(pStmt,0)>100 5831 ){ 5832 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 5833 sqlite3_finalize(pStmt); 5834 }else{ 5835 raw_printf(stderr, "unable to read database header\n"); 5836 sqlite3_finalize(pStmt); 5837 return 1; 5838 } 5839 i = get2byteInt(aHdr+16); 5840 if( i==1 ) i = 65536; 5841 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 5842 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 5843 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 5844 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 5845 for(i=0; i<ArraySize(aField); i++){ 5846 int ofst = aField[i].ofst; 5847 unsigned int val = get4byteInt(aHdr + ofst); 5848 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 5849 switch( ofst ){ 5850 case 56: { 5851 if( val==1 ) raw_printf(p->out, " (utf8)"); 5852 if( val==2 ) raw_printf(p->out, " (utf16le)"); 5853 if( val==3 ) raw_printf(p->out, " (utf16be)"); 5854 } 5855 } 5856 raw_printf(p->out, "\n"); 5857 } 5858 if( zDb==0 ){ 5859 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 5860 }else if( strcmp(zDb,"temp")==0 ){ 5861 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 5862 }else{ 5863 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 5864 } 5865 for(i=0; i<ArraySize(aQuery); i++){ 5866 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 5867 int val = db_int(p->db, zSql); 5868 sqlite3_free(zSql); 5869 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 5870 } 5871 sqlite3_free(zSchemaTab); 5872 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 5873 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 5874 return 0; 5875} 5876 5877/* 5878** Print the current sqlite3_errmsg() value to stderr and return 1. 5879*/ 5880static int shellDatabaseError(sqlite3 *db){ 5881 const char *zErr = sqlite3_errmsg(db); 5882 utf8_printf(stderr, "Error: %s\n", zErr); 5883 return 1; 5884} 5885 5886/* 5887** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 5888** if they match and FALSE (0) if they do not match. 5889** 5890** Globbing rules: 5891** 5892** '*' Matches any sequence of zero or more characters. 5893** 5894** '?' Matches exactly one character. 5895** 5896** [...] Matches one character from the enclosed list of 5897** characters. 5898** 5899** [^...] Matches one character not in the enclosed list. 5900** 5901** '#' Matches any sequence of one or more digits with an 5902** optional + or - sign in front 5903** 5904** ' ' Any span of whitespace matches any other span of 5905** whitespace. 5906** 5907** Extra whitespace at the end of z[] is ignored. 5908*/ 5909static int testcase_glob(const char *zGlob, const char *z){ 5910 int c, c2; 5911 int invert; 5912 int seen; 5913 5914 while( (c = (*(zGlob++)))!=0 ){ 5915 if( IsSpace(c) ){ 5916 if( !IsSpace(*z) ) return 0; 5917 while( IsSpace(*zGlob) ) zGlob++; 5918 while( IsSpace(*z) ) z++; 5919 }else if( c=='*' ){ 5920 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 5921 if( c=='?' && (*(z++))==0 ) return 0; 5922 } 5923 if( c==0 ){ 5924 return 1; 5925 }else if( c=='[' ){ 5926 while( *z && testcase_glob(zGlob-1,z)==0 ){ 5927 z++; 5928 } 5929 return (*z)!=0; 5930 } 5931 while( (c2 = (*(z++)))!=0 ){ 5932 while( c2!=c ){ 5933 c2 = *(z++); 5934 if( c2==0 ) return 0; 5935 } 5936 if( testcase_glob(zGlob,z) ) return 1; 5937 } 5938 return 0; 5939 }else if( c=='?' ){ 5940 if( (*(z++))==0 ) return 0; 5941 }else if( c=='[' ){ 5942 int prior_c = 0; 5943 seen = 0; 5944 invert = 0; 5945 c = *(z++); 5946 if( c==0 ) return 0; 5947 c2 = *(zGlob++); 5948 if( c2=='^' ){ 5949 invert = 1; 5950 c2 = *(zGlob++); 5951 } 5952 if( c2==']' ){ 5953 if( c==']' ) seen = 1; 5954 c2 = *(zGlob++); 5955 } 5956 while( c2 && c2!=']' ){ 5957 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 5958 c2 = *(zGlob++); 5959 if( c>=prior_c && c<=c2 ) seen = 1; 5960 prior_c = 0; 5961 }else{ 5962 if( c==c2 ){ 5963 seen = 1; 5964 } 5965 prior_c = c2; 5966 } 5967 c2 = *(zGlob++); 5968 } 5969 if( c2==0 || (seen ^ invert)==0 ) return 0; 5970 }else if( c=='#' ){ 5971 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 5972 if( !IsDigit(z[0]) ) return 0; 5973 z++; 5974 while( IsDigit(z[0]) ){ z++; } 5975 }else{ 5976 if( c!=(*(z++)) ) return 0; 5977 } 5978 } 5979 while( IsSpace(*z) ){ z++; } 5980 return *z==0; 5981} 5982 5983 5984/* 5985** Compare the string as a command-line option with either one or two 5986** initial "-" characters. 5987*/ 5988static int optionMatch(const char *zStr, const char *zOpt){ 5989 if( zStr[0]!='-' ) return 0; 5990 zStr++; 5991 if( zStr[0]=='-' ) zStr++; 5992 return strcmp(zStr, zOpt)==0; 5993} 5994 5995/* 5996** Delete a file. 5997*/ 5998int shellDeleteFile(const char *zFilename){ 5999 int rc; 6000#ifdef _WIN32 6001 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 6002 rc = _wunlink(z); 6003 sqlite3_free(z); 6004#else 6005 rc = unlink(zFilename); 6006#endif 6007 return rc; 6008} 6009 6010/* 6011** Try to delete the temporary file (if there is one) and free the 6012** memory used to hold the name of the temp file. 6013*/ 6014static void clearTempFile(ShellState *p){ 6015 if( p->zTempFile==0 ) return; 6016 if( p->doXdgOpen ) return; 6017 if( shellDeleteFile(p->zTempFile) ) return; 6018 sqlite3_free(p->zTempFile); 6019 p->zTempFile = 0; 6020} 6021 6022/* 6023** Create a new temp file name with the given suffix. 6024*/ 6025static void newTempFile(ShellState *p, const char *zSuffix){ 6026 clearTempFile(p); 6027 sqlite3_free(p->zTempFile); 6028 p->zTempFile = 0; 6029 if( p->db ){ 6030 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 6031 } 6032 if( p->zTempFile==0 ){ 6033 /* If p->db is an in-memory database then the TEMPFILENAME file-control 6034 ** will not work and we will need to fallback to guessing */ 6035 char *zTemp; 6036 sqlite3_uint64 r; 6037 sqlite3_randomness(sizeof(r), &r); 6038 zTemp = getenv("TEMP"); 6039 if( zTemp==0 ) zTemp = getenv("TMP"); 6040 if( zTemp==0 ){ 6041#ifdef _WIN32 6042 zTemp = "\\tmp"; 6043#else 6044 zTemp = "/tmp"; 6045#endif 6046 } 6047 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 6048 }else{ 6049 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 6050 } 6051 shell_check_oom(p->zTempFile); 6052} 6053 6054 6055/* 6056** The implementation of SQL scalar function fkey_collate_clause(), used 6057** by the ".lint fkey-indexes" command. This scalar function is always 6058** called with four arguments - the parent table name, the parent column name, 6059** the child table name and the child column name. 6060** 6061** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 6062** 6063** If either of the named tables or columns do not exist, this function 6064** returns an empty string. An empty string is also returned if both tables 6065** and columns exist but have the same default collation sequence. Or, 6066** if both exist but the default collation sequences are different, this 6067** function returns the string " COLLATE <parent-collation>", where 6068** <parent-collation> is the default collation sequence of the parent column. 6069*/ 6070static void shellFkeyCollateClause( 6071 sqlite3_context *pCtx, 6072 int nVal, 6073 sqlite3_value **apVal 6074){ 6075 sqlite3 *db = sqlite3_context_db_handle(pCtx); 6076 const char *zParent; 6077 const char *zParentCol; 6078 const char *zParentSeq; 6079 const char *zChild; 6080 const char *zChildCol; 6081 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 6082 int rc; 6083 6084 assert( nVal==4 ); 6085 zParent = (const char*)sqlite3_value_text(apVal[0]); 6086 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 6087 zChild = (const char*)sqlite3_value_text(apVal[2]); 6088 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 6089 6090 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 6091 rc = sqlite3_table_column_metadata( 6092 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 6093 ); 6094 if( rc==SQLITE_OK ){ 6095 rc = sqlite3_table_column_metadata( 6096 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 6097 ); 6098 } 6099 6100 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 6101 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 6102 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 6103 sqlite3_free(z); 6104 } 6105} 6106 6107 6108/* 6109** The implementation of dot-command ".lint fkey-indexes". 6110*/ 6111static int lintFkeyIndexes( 6112 ShellState *pState, /* Current shell tool state */ 6113 char **azArg, /* Array of arguments passed to dot command */ 6114 int nArg /* Number of entries in azArg[] */ 6115){ 6116 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 6117 FILE *out = pState->out; /* Stream to write non-error output to */ 6118 int bVerbose = 0; /* If -verbose is present */ 6119 int bGroupByParent = 0; /* If -groupbyparent is present */ 6120 int i; /* To iterate through azArg[] */ 6121 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 6122 int rc; /* Return code */ 6123 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 6124 6125 /* 6126 ** This SELECT statement returns one row for each foreign key constraint 6127 ** in the schema of the main database. The column values are: 6128 ** 6129 ** 0. The text of an SQL statement similar to: 6130 ** 6131 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 6132 ** 6133 ** This SELECT is similar to the one that the foreign keys implementation 6134 ** needs to run internally on child tables. If there is an index that can 6135 ** be used to optimize this query, then it can also be used by the FK 6136 ** implementation to optimize DELETE or UPDATE statements on the parent 6137 ** table. 6138 ** 6139 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 6140 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 6141 ** contains an index that can be used to optimize the query. 6142 ** 6143 ** 2. Human readable text that describes the child table and columns. e.g. 6144 ** 6145 ** "child_table(child_key1, child_key2)" 6146 ** 6147 ** 3. Human readable text that describes the parent table and columns. e.g. 6148 ** 6149 ** "parent_table(parent_key1, parent_key2)" 6150 ** 6151 ** 4. A full CREATE INDEX statement for an index that could be used to 6152 ** optimize DELETE or UPDATE statements on the parent table. e.g. 6153 ** 6154 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 6155 ** 6156 ** 5. The name of the parent table. 6157 ** 6158 ** These six values are used by the C logic below to generate the report. 6159 */ 6160 const char *zSql = 6161 "SELECT " 6162 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 6163 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 6164 " || fkey_collate_clause(" 6165 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 6166 ", " 6167 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('" 6168 " || group_concat('*=?', ' AND ') || ')'" 6169 ", " 6170 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 6171 ", " 6172 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 6173 ", " 6174 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 6175 " || ' ON ' || quote(s.name) || '('" 6176 " || group_concat(quote(f.[from]) ||" 6177 " fkey_collate_clause(" 6178 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 6179 " || ');'" 6180 ", " 6181 " f.[table] " 6182 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 6183 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 6184 "GROUP BY s.name, f.id " 6185 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 6186 ; 6187 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)"; 6188 6189 for(i=2; i<nArg; i++){ 6190 int n = strlen30(azArg[i]); 6191 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 6192 bVerbose = 1; 6193 } 6194 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 6195 bGroupByParent = 1; 6196 zIndent = " "; 6197 } 6198 else{ 6199 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 6200 azArg[0], azArg[1] 6201 ); 6202 return SQLITE_ERROR; 6203 } 6204 } 6205 6206 /* Register the fkey_collate_clause() SQL function */ 6207 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 6208 0, shellFkeyCollateClause, 0, 0 6209 ); 6210 6211 6212 if( rc==SQLITE_OK ){ 6213 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 6214 } 6215 if( rc==SQLITE_OK ){ 6216 sqlite3_bind_int(pSql, 1, bGroupByParent); 6217 } 6218 6219 if( rc==SQLITE_OK ){ 6220 int rc2; 6221 char *zPrev = 0; 6222 while( SQLITE_ROW==sqlite3_step(pSql) ){ 6223 int res = -1; 6224 sqlite3_stmt *pExplain = 0; 6225 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 6226 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 6227 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 6228 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 6229 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 6230 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 6231 6232 if( zEQP==0 ) continue; 6233 if( zGlob==0 ) continue; 6234 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 6235 if( rc!=SQLITE_OK ) break; 6236 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 6237 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 6238 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan) 6239 || 0==sqlite3_strglob(zGlobIPK, zPlan)); 6240 } 6241 rc = sqlite3_finalize(pExplain); 6242 if( rc!=SQLITE_OK ) break; 6243 6244 if( res<0 ){ 6245 raw_printf(stderr, "Error: internal error"); 6246 break; 6247 }else{ 6248 if( bGroupByParent 6249 && (bVerbose || res==0) 6250 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 6251 ){ 6252 raw_printf(out, "-- Parent table %s\n", zParent); 6253 sqlite3_free(zPrev); 6254 zPrev = sqlite3_mprintf("%s", zParent); 6255 } 6256 6257 if( res==0 ){ 6258 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 6259 }else if( bVerbose ){ 6260 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 6261 zIndent, zFrom, zTarget 6262 ); 6263 } 6264 } 6265 } 6266 sqlite3_free(zPrev); 6267 6268 if( rc!=SQLITE_OK ){ 6269 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6270 } 6271 6272 rc2 = sqlite3_finalize(pSql); 6273 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 6274 rc = rc2; 6275 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6276 } 6277 }else{ 6278 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 6279 } 6280 6281 return rc; 6282} 6283 6284/* 6285** Implementation of ".lint" dot command. 6286*/ 6287static int lintDotCommand( 6288 ShellState *pState, /* Current shell tool state */ 6289 char **azArg, /* Array of arguments passed to dot command */ 6290 int nArg /* Number of entries in azArg[] */ 6291){ 6292 int n; 6293 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 6294 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 6295 return lintFkeyIndexes(pState, azArg, nArg); 6296 6297 usage: 6298 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 6299 raw_printf(stderr, "Where sub-commands are:\n"); 6300 raw_printf(stderr, " fkey-indexes\n"); 6301 return SQLITE_ERROR; 6302} 6303 6304#if !defined SQLITE_OMIT_VIRTUALTABLE 6305static void shellPrepare( 6306 sqlite3 *db, 6307 int *pRc, 6308 const char *zSql, 6309 sqlite3_stmt **ppStmt 6310){ 6311 *ppStmt = 0; 6312 if( *pRc==SQLITE_OK ){ 6313 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 6314 if( rc!=SQLITE_OK ){ 6315 raw_printf(stderr, "sql error: %s (%d)\n", 6316 sqlite3_errmsg(db), sqlite3_errcode(db) 6317 ); 6318 *pRc = rc; 6319 } 6320 } 6321} 6322 6323/* 6324** Create a prepared statement using printf-style arguments for the SQL. 6325** 6326** This routine is could be marked "static". But it is not always used, 6327** depending on compile-time options. By omitting the "static", we avoid 6328** nuisance compiler warnings about "defined but not used". 6329*/ 6330void shellPreparePrintf( 6331 sqlite3 *db, 6332 int *pRc, 6333 sqlite3_stmt **ppStmt, 6334 const char *zFmt, 6335 ... 6336){ 6337 *ppStmt = 0; 6338 if( *pRc==SQLITE_OK ){ 6339 va_list ap; 6340 char *z; 6341 va_start(ap, zFmt); 6342 z = sqlite3_vmprintf(zFmt, ap); 6343 va_end(ap); 6344 if( z==0 ){ 6345 *pRc = SQLITE_NOMEM; 6346 }else{ 6347 shellPrepare(db, pRc, z, ppStmt); 6348 sqlite3_free(z); 6349 } 6350 } 6351} 6352 6353/* Finalize the prepared statement created using shellPreparePrintf(). 6354** 6355** This routine is could be marked "static". But it is not always used, 6356** depending on compile-time options. By omitting the "static", we avoid 6357** nuisance compiler warnings about "defined but not used". 6358*/ 6359void shellFinalize( 6360 int *pRc, 6361 sqlite3_stmt *pStmt 6362){ 6363 if( pStmt ){ 6364 sqlite3 *db = sqlite3_db_handle(pStmt); 6365 int rc = sqlite3_finalize(pStmt); 6366 if( *pRc==SQLITE_OK ){ 6367 if( rc!=SQLITE_OK ){ 6368 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6369 } 6370 *pRc = rc; 6371 } 6372 } 6373} 6374 6375/* Reset the prepared statement created using shellPreparePrintf(). 6376** 6377** This routine is could be marked "static". But it is not always used, 6378** depending on compile-time options. By omitting the "static", we avoid 6379** nuisance compiler warnings about "defined but not used". 6380*/ 6381void shellReset( 6382 int *pRc, 6383 sqlite3_stmt *pStmt 6384){ 6385 int rc = sqlite3_reset(pStmt); 6386 if( *pRc==SQLITE_OK ){ 6387 if( rc!=SQLITE_OK ){ 6388 sqlite3 *db = sqlite3_db_handle(pStmt); 6389 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 6390 } 6391 *pRc = rc; 6392 } 6393} 6394#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 6395 6396#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 6397/****************************************************************************** 6398** The ".archive" or ".ar" command. 6399*/ 6400/* 6401** Structure representing a single ".ar" command. 6402*/ 6403typedef struct ArCommand ArCommand; 6404struct ArCommand { 6405 u8 eCmd; /* An AR_CMD_* value */ 6406 u8 bVerbose; /* True if --verbose */ 6407 u8 bZip; /* True if the archive is a ZIP */ 6408 u8 bDryRun; /* True if --dry-run */ 6409 u8 bAppend; /* True if --append */ 6410 u8 bGlob; /* True if --glob */ 6411 u8 fromCmdLine; /* Run from -A instead of .archive */ 6412 int nArg; /* Number of command arguments */ 6413 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 6414 const char *zFile; /* --file argument, or NULL */ 6415 const char *zDir; /* --directory argument, or NULL */ 6416 char **azArg; /* Array of command arguments */ 6417 ShellState *p; /* Shell state */ 6418 sqlite3 *db; /* Database containing the archive */ 6419}; 6420 6421/* 6422** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 6423*/ 6424static int arUsage(FILE *f){ 6425 showHelp(f,"archive"); 6426 return SQLITE_ERROR; 6427} 6428 6429/* 6430** Print an error message for the .ar command to stderr and return 6431** SQLITE_ERROR. 6432*/ 6433static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 6434 va_list ap; 6435 char *z; 6436 va_start(ap, zFmt); 6437 z = sqlite3_vmprintf(zFmt, ap); 6438 va_end(ap); 6439 utf8_printf(stderr, "Error: %s\n", z); 6440 if( pAr->fromCmdLine ){ 6441 utf8_printf(stderr, "Use \"-A\" for more help\n"); 6442 }else{ 6443 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 6444 } 6445 sqlite3_free(z); 6446 return SQLITE_ERROR; 6447} 6448 6449/* 6450** Values for ArCommand.eCmd. 6451*/ 6452#define AR_CMD_CREATE 1 6453#define AR_CMD_UPDATE 2 6454#define AR_CMD_INSERT 3 6455#define AR_CMD_EXTRACT 4 6456#define AR_CMD_LIST 5 6457#define AR_CMD_HELP 6 6458#define AR_CMD_REMOVE 7 6459 6460/* 6461** Other (non-command) switches. 6462*/ 6463#define AR_SWITCH_VERBOSE 8 6464#define AR_SWITCH_FILE 9 6465#define AR_SWITCH_DIRECTORY 10 6466#define AR_SWITCH_APPEND 11 6467#define AR_SWITCH_DRYRUN 12 6468#define AR_SWITCH_GLOB 13 6469 6470static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 6471 switch( eSwitch ){ 6472 case AR_CMD_CREATE: 6473 case AR_CMD_EXTRACT: 6474 case AR_CMD_LIST: 6475 case AR_CMD_REMOVE: 6476 case AR_CMD_UPDATE: 6477 case AR_CMD_INSERT: 6478 case AR_CMD_HELP: 6479 if( pAr->eCmd ){ 6480 return arErrorMsg(pAr, "multiple command options"); 6481 } 6482 pAr->eCmd = eSwitch; 6483 break; 6484 6485 case AR_SWITCH_DRYRUN: 6486 pAr->bDryRun = 1; 6487 break; 6488 case AR_SWITCH_GLOB: 6489 pAr->bGlob = 1; 6490 break; 6491 case AR_SWITCH_VERBOSE: 6492 pAr->bVerbose = 1; 6493 break; 6494 case AR_SWITCH_APPEND: 6495 pAr->bAppend = 1; 6496 /* Fall thru into --file */ 6497 case AR_SWITCH_FILE: 6498 pAr->zFile = zArg; 6499 break; 6500 case AR_SWITCH_DIRECTORY: 6501 pAr->zDir = zArg; 6502 break; 6503 } 6504 6505 return SQLITE_OK; 6506} 6507 6508/* 6509** Parse the command line for an ".ar" command. The results are written into 6510** structure (*pAr). SQLITE_OK is returned if the command line is parsed 6511** successfully, otherwise an error message is written to stderr and 6512** SQLITE_ERROR returned. 6513*/ 6514static int arParseCommand( 6515 char **azArg, /* Array of arguments passed to dot command */ 6516 int nArg, /* Number of entries in azArg[] */ 6517 ArCommand *pAr /* Populate this object */ 6518){ 6519 struct ArSwitch { 6520 const char *zLong; 6521 char cShort; 6522 u8 eSwitch; 6523 u8 bArg; 6524 } aSwitch[] = { 6525 { "create", 'c', AR_CMD_CREATE, 0 }, 6526 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 6527 { "insert", 'i', AR_CMD_INSERT, 0 }, 6528 { "list", 't', AR_CMD_LIST, 0 }, 6529 { "remove", 'r', AR_CMD_REMOVE, 0 }, 6530 { "update", 'u', AR_CMD_UPDATE, 0 }, 6531 { "help", 'h', AR_CMD_HELP, 0 }, 6532 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 6533 { "file", 'f', AR_SWITCH_FILE, 1 }, 6534 { "append", 'a', AR_SWITCH_APPEND, 1 }, 6535 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 6536 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 6537 { "glob", 'g', AR_SWITCH_GLOB, 0 }, 6538 }; 6539 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 6540 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 6541 6542 if( nArg<=1 ){ 6543 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 6544 return arUsage(stderr); 6545 }else{ 6546 char *z = azArg[1]; 6547 if( z[0]!='-' ){ 6548 /* Traditional style [tar] invocation */ 6549 int i; 6550 int iArg = 2; 6551 for(i=0; z[i]; i++){ 6552 const char *zArg = 0; 6553 struct ArSwitch *pOpt; 6554 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6555 if( z[i]==pOpt->cShort ) break; 6556 } 6557 if( pOpt==pEnd ){ 6558 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6559 } 6560 if( pOpt->bArg ){ 6561 if( iArg>=nArg ){ 6562 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 6563 } 6564 zArg = azArg[iArg++]; 6565 } 6566 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6567 } 6568 pAr->nArg = nArg-iArg; 6569 if( pAr->nArg>0 ){ 6570 pAr->azArg = &azArg[iArg]; 6571 } 6572 }else{ 6573 /* Non-traditional invocation */ 6574 int iArg; 6575 for(iArg=1; iArg<nArg; iArg++){ 6576 int n; 6577 z = azArg[iArg]; 6578 if( z[0]!='-' ){ 6579 /* All remaining command line words are command arguments. */ 6580 pAr->azArg = &azArg[iArg]; 6581 pAr->nArg = nArg-iArg; 6582 break; 6583 } 6584 n = strlen30(z); 6585 6586 if( z[1]!='-' ){ 6587 int i; 6588 /* One or more short options */ 6589 for(i=1; i<n; i++){ 6590 const char *zArg = 0; 6591 struct ArSwitch *pOpt; 6592 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6593 if( z[i]==pOpt->cShort ) break; 6594 } 6595 if( pOpt==pEnd ){ 6596 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 6597 } 6598 if( pOpt->bArg ){ 6599 if( i<(n-1) ){ 6600 zArg = &z[i+1]; 6601 i = n; 6602 }else{ 6603 if( iArg>=(nArg-1) ){ 6604 return arErrorMsg(pAr, "option requires an argument: %c", 6605 z[i]); 6606 } 6607 zArg = azArg[++iArg]; 6608 } 6609 } 6610 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 6611 } 6612 }else if( z[2]=='\0' ){ 6613 /* A -- option, indicating that all remaining command line words 6614 ** are command arguments. */ 6615 pAr->azArg = &azArg[iArg+1]; 6616 pAr->nArg = nArg-iArg-1; 6617 break; 6618 }else{ 6619 /* A long option */ 6620 const char *zArg = 0; /* Argument for option, if any */ 6621 struct ArSwitch *pMatch = 0; /* Matching option */ 6622 struct ArSwitch *pOpt; /* Iterator */ 6623 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 6624 const char *zLong = pOpt->zLong; 6625 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 6626 if( pMatch ){ 6627 return arErrorMsg(pAr, "ambiguous option: %s",z); 6628 }else{ 6629 pMatch = pOpt; 6630 } 6631 } 6632 } 6633 6634 if( pMatch==0 ){ 6635 return arErrorMsg(pAr, "unrecognized option: %s", z); 6636 } 6637 if( pMatch->bArg ){ 6638 if( iArg>=(nArg-1) ){ 6639 return arErrorMsg(pAr, "option requires an argument: %s", z); 6640 } 6641 zArg = azArg[++iArg]; 6642 } 6643 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 6644 } 6645 } 6646 } 6647 } 6648 6649 return SQLITE_OK; 6650} 6651 6652/* 6653** This function assumes that all arguments within the ArCommand.azArg[] 6654** array refer to archive members, as for the --extract, --list or --remove 6655** commands. It checks that each of them are "present". If any specified 6656** file is not present in the archive, an error is printed to stderr and an 6657** error code returned. Otherwise, if all specified arguments are present 6658** in the archive, SQLITE_OK is returned. Here, "present" means either an 6659** exact equality when pAr->bGlob is false or a "name GLOB pattern" match 6660** when pAr->bGlob is true. 6661** 6662** This function strips any trailing '/' characters from each argument. 6663** This is consistent with the way the [tar] command seems to work on 6664** Linux. 6665*/ 6666static int arCheckEntries(ArCommand *pAr){ 6667 int rc = SQLITE_OK; 6668 if( pAr->nArg ){ 6669 int i, j; 6670 sqlite3_stmt *pTest = 0; 6671 const char *zSel = (pAr->bGlob) 6672 ? "SELECT name FROM %s WHERE glob($name,name)" 6673 : "SELECT name FROM %s WHERE name=$name"; 6674 6675 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); 6676 j = sqlite3_bind_parameter_index(pTest, "$name"); 6677 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 6678 char *z = pAr->azArg[i]; 6679 int n = strlen30(z); 6680 int bOk = 0; 6681 while( n>0 && z[n-1]=='/' ) n--; 6682 z[n] = '\0'; 6683 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 6684 if( SQLITE_ROW==sqlite3_step(pTest) ){ 6685 bOk = 1; 6686 } 6687 shellReset(&rc, pTest); 6688 if( rc==SQLITE_OK && bOk==0 ){ 6689 utf8_printf(stderr, "not found in archive: %s\n", z); 6690 rc = SQLITE_ERROR; 6691 } 6692 } 6693 shellFinalize(&rc, pTest); 6694 } 6695 return rc; 6696} 6697 6698/* 6699** Format a WHERE clause that can be used against the "sqlar" table to 6700** identify all archive members that match the command arguments held 6701** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 6702** The caller is responsible for eventually calling sqlite3_free() on 6703** any non-NULL (*pzWhere) value. Here, "match" means strict equality 6704** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. 6705*/ 6706static void arWhereClause( 6707 int *pRc, 6708 ArCommand *pAr, 6709 char **pzWhere /* OUT: New WHERE clause */ 6710){ 6711 char *zWhere = 0; 6712 const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; 6713 if( *pRc==SQLITE_OK ){ 6714 if( pAr->nArg==0 ){ 6715 zWhere = sqlite3_mprintf("1"); 6716 }else{ 6717 int i; 6718 const char *zSep = ""; 6719 for(i=0; i<pAr->nArg; i++){ 6720 const char *z = pAr->azArg[i]; 6721 zWhere = sqlite3_mprintf( 6722 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", 6723 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z 6724 ); 6725 if( zWhere==0 ){ 6726 *pRc = SQLITE_NOMEM; 6727 break; 6728 } 6729 zSep = " OR "; 6730 } 6731 } 6732 } 6733 *pzWhere = zWhere; 6734} 6735 6736/* 6737** Implementation of .ar "lisT" command. 6738*/ 6739static int arListCommand(ArCommand *pAr){ 6740 const char *zSql = "SELECT %s FROM %s WHERE %s"; 6741 const char *azCols[] = { 6742 "name", 6743 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 6744 }; 6745 6746 char *zWhere = 0; 6747 sqlite3_stmt *pSql = 0; 6748 int rc; 6749 6750 rc = arCheckEntries(pAr); 6751 arWhereClause(&rc, pAr, &zWhere); 6752 6753 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 6754 pAr->zSrcTable, zWhere); 6755 if( pAr->bDryRun ){ 6756 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6757 }else{ 6758 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6759 if( pAr->bVerbose ){ 6760 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 6761 sqlite3_column_text(pSql, 0), 6762 sqlite3_column_int(pSql, 1), 6763 sqlite3_column_text(pSql, 2), 6764 sqlite3_column_text(pSql, 3) 6765 ); 6766 }else{ 6767 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6768 } 6769 } 6770 } 6771 shellFinalize(&rc, pSql); 6772 sqlite3_free(zWhere); 6773 return rc; 6774} 6775 6776 6777/* 6778** Implementation of .ar "Remove" command. 6779*/ 6780static int arRemoveCommand(ArCommand *pAr){ 6781 int rc = 0; 6782 char *zSql = 0; 6783 char *zWhere = 0; 6784 6785 if( pAr->nArg ){ 6786 /* Verify that args actually exist within the archive before proceeding. 6787 ** And formulate a WHERE clause to match them. */ 6788 rc = arCheckEntries(pAr); 6789 arWhereClause(&rc, pAr, &zWhere); 6790 } 6791 if( rc==SQLITE_OK ){ 6792 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", 6793 pAr->zSrcTable, zWhere); 6794 if( pAr->bDryRun ){ 6795 utf8_printf(pAr->p->out, "%s\n", zSql); 6796 }else{ 6797 char *zErr = 0; 6798 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); 6799 if( rc==SQLITE_OK ){ 6800 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6801 if( rc!=SQLITE_OK ){ 6802 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 6803 }else{ 6804 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); 6805 } 6806 } 6807 if( zErr ){ 6808 utf8_printf(stdout, "ERROR: %s\n", zErr); 6809 sqlite3_free(zErr); 6810 } 6811 } 6812 } 6813 sqlite3_free(zWhere); 6814 sqlite3_free(zSql); 6815 return rc; 6816} 6817 6818/* 6819** Implementation of .ar "eXtract" command. 6820*/ 6821static int arExtractCommand(ArCommand *pAr){ 6822 const char *zSql1 = 6823 "SELECT " 6824 " ($dir || name)," 6825 " writefile(($dir || name), %s, mode, mtime) " 6826 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 6827 " AND name NOT GLOB '*..[/\\]*'"; 6828 6829 const char *azExtraArg[] = { 6830 "sqlar_uncompress(data, sz)", 6831 "data" 6832 }; 6833 6834 sqlite3_stmt *pSql = 0; 6835 int rc = SQLITE_OK; 6836 char *zDir = 0; 6837 char *zWhere = 0; 6838 int i, j; 6839 6840 /* If arguments are specified, check that they actually exist within 6841 ** the archive before proceeding. And formulate a WHERE clause to 6842 ** match them. */ 6843 rc = arCheckEntries(pAr); 6844 arWhereClause(&rc, pAr, &zWhere); 6845 6846 if( rc==SQLITE_OK ){ 6847 if( pAr->zDir ){ 6848 zDir = sqlite3_mprintf("%s/", pAr->zDir); 6849 }else{ 6850 zDir = sqlite3_mprintf(""); 6851 } 6852 if( zDir==0 ) rc = SQLITE_NOMEM; 6853 } 6854 6855 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 6856 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 6857 ); 6858 6859 if( rc==SQLITE_OK ){ 6860 j = sqlite3_bind_parameter_index(pSql, "$dir"); 6861 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 6862 6863 /* Run the SELECT statement twice. The first time, writefile() is called 6864 ** for all archive members that should be extracted. The second time, 6865 ** only for the directories. This is because the timestamps for 6866 ** extracted directories must be reset after they are populated (as 6867 ** populating them changes the timestamp). */ 6868 for(i=0; i<2; i++){ 6869 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 6870 sqlite3_bind_int(pSql, j, i); 6871 if( pAr->bDryRun ){ 6872 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 6873 }else{ 6874 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 6875 if( i==0 && pAr->bVerbose ){ 6876 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 6877 } 6878 } 6879 } 6880 shellReset(&rc, pSql); 6881 } 6882 shellFinalize(&rc, pSql); 6883 } 6884 6885 sqlite3_free(zDir); 6886 sqlite3_free(zWhere); 6887 return rc; 6888} 6889 6890/* 6891** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 6892*/ 6893static int arExecSql(ArCommand *pAr, const char *zSql){ 6894 int rc; 6895 if( pAr->bDryRun ){ 6896 utf8_printf(pAr->p->out, "%s\n", zSql); 6897 rc = SQLITE_OK; 6898 }else{ 6899 char *zErr = 0; 6900 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 6901 if( zErr ){ 6902 utf8_printf(stdout, "ERROR: %s\n", zErr); 6903 sqlite3_free(zErr); 6904 } 6905 } 6906 return rc; 6907} 6908 6909 6910/* 6911** Implementation of .ar "create", "insert", and "update" commands. 6912** 6913** create -> Create a new SQL archive 6914** insert -> Insert or reinsert all files listed 6915** update -> Insert files that have changed or that were not 6916** previously in the archive 6917** 6918** Create the "sqlar" table in the database if it does not already exist. 6919** Then add each file in the azFile[] array to the archive. Directories 6920** are added recursively. If argument bVerbose is non-zero, a message is 6921** printed on stdout for each file archived. 6922** 6923** The create command is the same as update, except that it drops 6924** any existing "sqlar" table before beginning. The "insert" command 6925** always overwrites every file named on the command-line, where as 6926** "update" only overwrites if the size or mtime or mode has changed. 6927*/ 6928static int arCreateOrUpdateCommand( 6929 ArCommand *pAr, /* Command arguments and options */ 6930 int bUpdate, /* true for a --create. */ 6931 int bOnlyIfChanged /* Only update if file has changed */ 6932){ 6933 const char *zCreate = 6934 "CREATE TABLE IF NOT EXISTS sqlar(\n" 6935 " name TEXT PRIMARY KEY, -- name of the file\n" 6936 " mode INT, -- access permissions\n" 6937 " mtime INT, -- last modification time\n" 6938 " sz INT, -- original file size\n" 6939 " data BLOB -- compressed content\n" 6940 ")"; 6941 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 6942 const char *zInsertFmt[2] = { 6943 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 6944 " SELECT\n" 6945 " %s,\n" 6946 " mode,\n" 6947 " mtime,\n" 6948 " CASE substr(lsmode(mode),1,1)\n" 6949 " WHEN '-' THEN length(data)\n" 6950 " WHEN 'd' THEN 0\n" 6951 " ELSE -1 END,\n" 6952 " sqlar_compress(data)\n" 6953 " FROM fsdir(%Q,%Q) AS disk\n" 6954 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6955 , 6956 "REPLACE INTO %s(name,mode,mtime,data)\n" 6957 " SELECT\n" 6958 " %s,\n" 6959 " mode,\n" 6960 " mtime,\n" 6961 " data\n" 6962 " FROM fsdir(%Q,%Q) AS disk\n" 6963 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 6964 }; 6965 int i; /* For iterating through azFile[] */ 6966 int rc; /* Return code */ 6967 const char *zTab = 0; /* SQL table into which to insert */ 6968 char *zSql; 6969 char zTemp[50]; 6970 char *zExists = 0; 6971 6972 arExecSql(pAr, "PRAGMA page_size=512"); 6973 rc = arExecSql(pAr, "SAVEPOINT ar;"); 6974 if( rc!=SQLITE_OK ) return rc; 6975 zTemp[0] = 0; 6976 if( pAr->bZip ){ 6977 /* Initialize the zipfile virtual table, if necessary */ 6978 if( pAr->zFile ){ 6979 sqlite3_uint64 r; 6980 sqlite3_randomness(sizeof(r),&r); 6981 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 6982 zTab = zTemp; 6983 zSql = sqlite3_mprintf( 6984 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 6985 zTab, pAr->zFile 6986 ); 6987 rc = arExecSql(pAr, zSql); 6988 sqlite3_free(zSql); 6989 }else{ 6990 zTab = "zip"; 6991 } 6992 }else{ 6993 /* Initialize the table for an SQLAR */ 6994 zTab = "sqlar"; 6995 if( bUpdate==0 ){ 6996 rc = arExecSql(pAr, zDrop); 6997 if( rc!=SQLITE_OK ) goto end_ar_transaction; 6998 } 6999 rc = arExecSql(pAr, zCreate); 7000 } 7001 if( bOnlyIfChanged ){ 7002 zExists = sqlite3_mprintf( 7003 " AND NOT EXISTS(" 7004 "SELECT 1 FROM %s AS mem" 7005 " WHERE mem.name=disk.name" 7006 " AND mem.mtime=disk.mtime" 7007 " AND mem.mode=disk.mode)", zTab); 7008 }else{ 7009 zExists = sqlite3_mprintf(""); 7010 } 7011 if( zExists==0 ) rc = SQLITE_NOMEM; 7012 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 7013 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 7014 pAr->bVerbose ? "shell_putsnl(name)" : "name", 7015 pAr->azArg[i], pAr->zDir, zExists); 7016 rc = arExecSql(pAr, zSql2); 7017 sqlite3_free(zSql2); 7018 } 7019end_ar_transaction: 7020 if( rc!=SQLITE_OK ){ 7021 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 7022 }else{ 7023 rc = arExecSql(pAr, "RELEASE ar;"); 7024 if( pAr->bZip && pAr->zFile ){ 7025 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 7026 arExecSql(pAr, zSql); 7027 sqlite3_free(zSql); 7028 } 7029 } 7030 sqlite3_free(zExists); 7031 return rc; 7032} 7033 7034/* 7035** Implementation of ".ar" dot command. 7036*/ 7037static int arDotCommand( 7038 ShellState *pState, /* Current shell tool state */ 7039 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 7040 char **azArg, /* Array of arguments passed to dot command */ 7041 int nArg /* Number of entries in azArg[] */ 7042){ 7043 ArCommand cmd; 7044 int rc; 7045 memset(&cmd, 0, sizeof(cmd)); 7046 cmd.fromCmdLine = fromCmdLine; 7047 rc = arParseCommand(azArg, nArg, &cmd); 7048 if( rc==SQLITE_OK ){ 7049 int eDbType = SHELL_OPEN_UNSPEC; 7050 cmd.p = pState; 7051 cmd.db = pState->db; 7052 if( cmd.zFile ){ 7053 eDbType = deduceDatabaseType(cmd.zFile, 1); 7054 }else{ 7055 eDbType = pState->openMode; 7056 } 7057 if( eDbType==SHELL_OPEN_ZIPFILE ){ 7058 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 7059 if( cmd.zFile==0 ){ 7060 cmd.zSrcTable = sqlite3_mprintf("zip"); 7061 }else{ 7062 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 7063 } 7064 } 7065 cmd.bZip = 1; 7066 }else if( cmd.zFile ){ 7067 int flags; 7068 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 7069 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 7070 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ 7071 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 7072 }else{ 7073 flags = SQLITE_OPEN_READONLY; 7074 } 7075 cmd.db = 0; 7076 if( cmd.bDryRun ){ 7077 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 7078 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 7079 } 7080 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 7081 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 7082 if( rc!=SQLITE_OK ){ 7083 utf8_printf(stderr, "cannot open file: %s (%s)\n", 7084 cmd.zFile, sqlite3_errmsg(cmd.db) 7085 ); 7086 goto end_ar_command; 7087 } 7088 sqlite3_fileio_init(cmd.db, 0, 0); 7089 sqlite3_sqlar_init(cmd.db, 0, 0); 7090 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 7091 shellPutsFunc, 0, 0); 7092 7093 } 7094 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 7095 if( cmd.eCmd!=AR_CMD_CREATE 7096 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 7097 ){ 7098 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 7099 rc = SQLITE_ERROR; 7100 goto end_ar_command; 7101 } 7102 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 7103 } 7104 7105 switch( cmd.eCmd ){ 7106 case AR_CMD_CREATE: 7107 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 7108 break; 7109 7110 case AR_CMD_EXTRACT: 7111 rc = arExtractCommand(&cmd); 7112 break; 7113 7114 case AR_CMD_LIST: 7115 rc = arListCommand(&cmd); 7116 break; 7117 7118 case AR_CMD_HELP: 7119 arUsage(pState->out); 7120 break; 7121 7122 case AR_CMD_INSERT: 7123 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 7124 break; 7125 7126 case AR_CMD_REMOVE: 7127 rc = arRemoveCommand(&cmd); 7128 break; 7129 7130 default: 7131 assert( cmd.eCmd==AR_CMD_UPDATE ); 7132 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 7133 break; 7134 } 7135 } 7136end_ar_command: 7137 if( cmd.db!=pState->db ){ 7138 close_db(cmd.db); 7139 } 7140 sqlite3_free(cmd.zSrcTable); 7141 7142 return rc; 7143} 7144/* End of the ".archive" or ".ar" command logic 7145*******************************************************************************/ 7146#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 7147 7148#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 7149/* 7150** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 7151** Otherwise, the SQL statement or statements in zSql are executed using 7152** database connection db and the error code written to *pRc before 7153** this function returns. 7154*/ 7155static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 7156 int rc = *pRc; 7157 if( rc==SQLITE_OK ){ 7158 char *zErr = 0; 7159 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 7160 if( rc!=SQLITE_OK ){ 7161 raw_printf(stderr, "SQL error: %s\n", zErr); 7162 } 7163 sqlite3_free(zErr); 7164 *pRc = rc; 7165 } 7166} 7167 7168/* 7169** Like shellExec(), except that zFmt is a printf() style format string. 7170*/ 7171static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 7172 char *z = 0; 7173 if( *pRc==SQLITE_OK ){ 7174 va_list ap; 7175 va_start(ap, zFmt); 7176 z = sqlite3_vmprintf(zFmt, ap); 7177 va_end(ap); 7178 if( z==0 ){ 7179 *pRc = SQLITE_NOMEM; 7180 }else{ 7181 shellExec(db, pRc, z); 7182 } 7183 sqlite3_free(z); 7184 } 7185} 7186 7187/* 7188** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 7189** Otherwise, an attempt is made to allocate, zero and return a pointer 7190** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 7191** to SQLITE_NOMEM and NULL returned. 7192*/ 7193static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 7194 void *pRet = 0; 7195 if( *pRc==SQLITE_OK ){ 7196 pRet = sqlite3_malloc64(nByte); 7197 if( pRet==0 ){ 7198 *pRc = SQLITE_NOMEM; 7199 }else{ 7200 memset(pRet, 0, nByte); 7201 } 7202 } 7203 return pRet; 7204} 7205 7206/* 7207** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 7208** Otherwise, zFmt is treated as a printf() style string. The result of 7209** formatting it along with any trailing arguments is written into a 7210** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 7211** It is the responsibility of the caller to eventually free this buffer 7212** using a call to sqlite3_free(). 7213** 7214** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 7215** pointer returned. 7216*/ 7217static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 7218 char *z = 0; 7219 if( *pRc==SQLITE_OK ){ 7220 va_list ap; 7221 va_start(ap, zFmt); 7222 z = sqlite3_vmprintf(zFmt, ap); 7223 va_end(ap); 7224 if( z==0 ){ 7225 *pRc = SQLITE_NOMEM; 7226 } 7227 } 7228 return z; 7229} 7230 7231 7232/* 7233** When running the ".recover" command, each output table, and the special 7234** orphaned row table if it is required, is represented by an instance 7235** of the following struct. 7236*/ 7237typedef struct RecoverTable RecoverTable; 7238struct RecoverTable { 7239 char *zQuoted; /* Quoted version of table name */ 7240 int nCol; /* Number of columns in table */ 7241 char **azlCol; /* Array of column lists */ 7242 int iPk; /* Index of IPK column */ 7243}; 7244 7245/* 7246** Free a RecoverTable object allocated by recoverFindTable() or 7247** recoverOrphanTable(). 7248*/ 7249static void recoverFreeTable(RecoverTable *pTab){ 7250 if( pTab ){ 7251 sqlite3_free(pTab->zQuoted); 7252 if( pTab->azlCol ){ 7253 int i; 7254 for(i=0; i<=pTab->nCol; i++){ 7255 sqlite3_free(pTab->azlCol[i]); 7256 } 7257 sqlite3_free(pTab->azlCol); 7258 } 7259 sqlite3_free(pTab); 7260 } 7261} 7262 7263/* 7264** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 7265** Otherwise, it allocates and returns a RecoverTable object based on the 7266** final four arguments passed to this function. It is the responsibility 7267** of the caller to eventually free the returned object using 7268** recoverFreeTable(). 7269*/ 7270static RecoverTable *recoverNewTable( 7271 int *pRc, /* IN/OUT: Error code */ 7272 const char *zName, /* Name of table */ 7273 const char *zSql, /* CREATE TABLE statement */ 7274 int bIntkey, 7275 int nCol 7276){ 7277 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 7278 int rc = *pRc; 7279 RecoverTable *pTab = 0; 7280 7281 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 7282 if( rc==SQLITE_OK ){ 7283 int nSqlCol = 0; 7284 int bSqlIntkey = 0; 7285 sqlite3_stmt *pStmt = 0; 7286 7287 rc = sqlite3_open("", &dbtmp); 7288 if( rc==SQLITE_OK ){ 7289 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 7290 shellIdQuote, 0, 0); 7291 } 7292 if( rc==SQLITE_OK ){ 7293 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 7294 } 7295 if( rc==SQLITE_OK ){ 7296 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 7297 if( rc==SQLITE_ERROR ){ 7298 rc = SQLITE_OK; 7299 goto finished; 7300 } 7301 } 7302 shellPreparePrintf(dbtmp, &rc, &pStmt, 7303 "SELECT count(*) FROM pragma_table_info(%Q)", zName 7304 ); 7305 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7306 nSqlCol = sqlite3_column_int(pStmt, 0); 7307 } 7308 shellFinalize(&rc, pStmt); 7309 7310 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 7311 goto finished; 7312 } 7313 7314 shellPreparePrintf(dbtmp, &rc, &pStmt, 7315 "SELECT (" 7316 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 7317 ") FROM sqlite_schema WHERE name = %Q", zName 7318 ); 7319 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7320 bSqlIntkey = sqlite3_column_int(pStmt, 0); 7321 } 7322 shellFinalize(&rc, pStmt); 7323 7324 if( bIntkey==bSqlIntkey ){ 7325 int i; 7326 const char *zPk = "_rowid_"; 7327 sqlite3_stmt *pPkFinder = 0; 7328 7329 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 7330 ** set zPk to the name of the PK column, and pTab->iPk to the index 7331 ** of the column, where columns are 0-numbered from left to right. 7332 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 7333 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 7334 pTab->iPk = -2; 7335 if( bIntkey ){ 7336 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 7337 "SELECT cid, name FROM pragma_table_info(%Q) " 7338 " WHERE pk=1 AND type='integer' COLLATE nocase" 7339 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 7340 , zName, zName 7341 ); 7342 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 7343 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 7344 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 7345 if( zPk==0 ){ zPk = "_"; /* Defensive. Should never happen */ } 7346 } 7347 } 7348 7349 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 7350 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 7351 pTab->nCol = nSqlCol; 7352 7353 if( bIntkey ){ 7354 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 7355 }else{ 7356 pTab->azlCol[0] = shellMPrintf(&rc, ""); 7357 } 7358 i = 1; 7359 shellPreparePrintf(dbtmp, &rc, &pStmt, 7360 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 7361 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 7362 "FROM pragma_table_info(%Q)", 7363 bIntkey ? ", " : "", pTab->iPk, 7364 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 7365 zName 7366 ); 7367 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7368 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 7369 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 7370 i++; 7371 } 7372 shellFinalize(&rc, pStmt); 7373 7374 shellFinalize(&rc, pPkFinder); 7375 } 7376 } 7377 7378 finished: 7379 sqlite3_close(dbtmp); 7380 *pRc = rc; 7381 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 7382 recoverFreeTable(pTab); 7383 pTab = 0; 7384 } 7385 return pTab; 7386} 7387 7388/* 7389** This function is called to search the schema recovered from the 7390** sqlite_schema table of the (possibly) corrupt database as part 7391** of a ".recover" command. Specifically, for a table with root page 7392** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 7393** table must be a WITHOUT ROWID table, or if non-zero, not one of 7394** those. 7395** 7396** If a table is found, a (RecoverTable*) object is returned. Or, if 7397** no such table is found, but bIntkey is false and iRoot is the 7398** root page of an index in the recovered schema, then (*pbNoop) is 7399** set to true and NULL returned. Or, if there is no such table or 7400** index, NULL is returned and (*pbNoop) set to 0, indicating that 7401** the caller should write data to the orphans table. 7402*/ 7403static RecoverTable *recoverFindTable( 7404 ShellState *pState, /* Shell state object */ 7405 int *pRc, /* IN/OUT: Error code */ 7406 int iRoot, /* Root page of table */ 7407 int bIntkey, /* True for an intkey table */ 7408 int nCol, /* Number of columns in table */ 7409 int *pbNoop /* OUT: True if iRoot is root of index */ 7410){ 7411 sqlite3_stmt *pStmt = 0; 7412 RecoverTable *pRet = 0; 7413 int bNoop = 0; 7414 const char *zSql = 0; 7415 const char *zName = 0; 7416 7417 /* Search the recovered schema for an object with root page iRoot. */ 7418 shellPreparePrintf(pState->db, pRc, &pStmt, 7419 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 7420 ); 7421 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7422 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 7423 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 7424 bNoop = 1; 7425 break; 7426 } 7427 if( sqlite3_stricmp(zType, "table")==0 ){ 7428 zName = (const char*)sqlite3_column_text(pStmt, 1); 7429 zSql = (const char*)sqlite3_column_text(pStmt, 2); 7430 if( zName!=0 && zSql!=0 ){ 7431 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 7432 break; 7433 } 7434 } 7435 } 7436 7437 shellFinalize(pRc, pStmt); 7438 *pbNoop = bNoop; 7439 return pRet; 7440} 7441 7442/* 7443** Return a RecoverTable object representing the orphans table. 7444*/ 7445static RecoverTable *recoverOrphanTable( 7446 ShellState *pState, /* Shell state object */ 7447 int *pRc, /* IN/OUT: Error code */ 7448 const char *zLostAndFound, /* Base name for orphans table */ 7449 int nCol /* Number of user data columns */ 7450){ 7451 RecoverTable *pTab = 0; 7452 if( nCol>=0 && *pRc==SQLITE_OK ){ 7453 int i; 7454 7455 /* This block determines the name of the orphan table. The prefered 7456 ** name is zLostAndFound. But if that clashes with another name 7457 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 7458 ** and so on until a non-clashing name is found. */ 7459 int iTab = 0; 7460 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); 7461 sqlite3_stmt *pTest = 0; 7462 shellPrepare(pState->db, pRc, 7463 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest 7464 ); 7465 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 7466 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ 7467 shellReset(pRc, pTest); 7468 sqlite3_free(zTab); 7469 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); 7470 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 7471 } 7472 shellFinalize(pRc, pTest); 7473 7474 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); 7475 if( pTab ){ 7476 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); 7477 pTab->nCol = nCol; 7478 pTab->iPk = -2; 7479 if( nCol>0 ){ 7480 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); 7481 if( pTab->azlCol ){ 7482 pTab->azlCol[nCol] = shellMPrintf(pRc, ""); 7483 for(i=nCol-1; i>=0; i--){ 7484 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); 7485 } 7486 } 7487 } 7488 7489 if( *pRc!=SQLITE_OK ){ 7490 recoverFreeTable(pTab); 7491 pTab = 0; 7492 }else{ 7493 raw_printf(pState->out, 7494 "CREATE TABLE %s(rootpgno INTEGER, " 7495 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted 7496 ); 7497 for(i=0; i<nCol; i++){ 7498 raw_printf(pState->out, ", c%d", i); 7499 } 7500 raw_printf(pState->out, ");\n"); 7501 } 7502 } 7503 sqlite3_free(zTab); 7504 } 7505 return pTab; 7506} 7507 7508/* 7509** This function is called to recover data from the database. A script 7510** to construct a new database containing all recovered data is output 7511** on stream pState->out. 7512*/ 7513static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 7514 int rc = SQLITE_OK; 7515 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ 7516 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ 7517 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ 7518 const char *zRecoveryDb = ""; /* Name of "recovery" database */ 7519 const char *zLostAndFound = "lost_and_found"; 7520 int i; 7521 int nOrphan = -1; 7522 RecoverTable *pOrphan = 0; 7523 7524 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ 7525 int bRowids = 1; /* 0 if --no-rowids */ 7526 for(i=1; i<nArg; i++){ 7527 char *z = azArg[i]; 7528 int n; 7529 if( z[0]=='-' && z[1]=='-' ) z++; 7530 n = strlen30(z); 7531 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ 7532 bFreelist = 0; 7533 }else 7534 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 7535 i++; 7536 zRecoveryDb = azArg[i]; 7537 }else 7538 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 7539 i++; 7540 zLostAndFound = azArg[i]; 7541 }else 7542 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 7543 bRowids = 0; 7544 } 7545 else{ 7546 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); 7547 showHelp(pState->out, azArg[0]); 7548 return 1; 7549 } 7550 } 7551 7552 shellExecPrintf(pState->db, &rc, 7553 /* Attach an in-memory database named 'recovery'. Create an indexed 7554 ** cache of the sqlite_dbptr virtual table. */ 7555 "PRAGMA writable_schema = on;" 7556 "ATTACH %Q AS recovery;" 7557 "DROP TABLE IF EXISTS recovery.dbptr;" 7558 "DROP TABLE IF EXISTS recovery.freelist;" 7559 "DROP TABLE IF EXISTS recovery.map;" 7560 "DROP TABLE IF EXISTS recovery.schema;" 7561 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb 7562 ); 7563 7564 if( bFreelist ){ 7565 shellExec(pState->db, &rc, 7566 "WITH trunk(pgno) AS (" 7567 " SELECT shell_int32(" 7568 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " 7569 " WHERE x>0" 7570 " UNION" 7571 " SELECT shell_int32(" 7572 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " 7573 " FROM trunk WHERE x>0" 7574 ")," 7575 "freelist(data, n, freepgno) AS (" 7576 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " 7577 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" 7578 " UNION ALL" 7579 " SELECT data, n-1, shell_int32(data, 2+n) " 7580 " FROM freelist WHERE n>=0" 7581 ")" 7582 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" 7583 ); 7584 } 7585 7586 /* If this is an auto-vacuum database, add all pointer-map pages to 7587 ** the freelist table. Do this regardless of whether or not 7588 ** --freelist-corrupt was specified. */ 7589 shellExec(pState->db, &rc, 7590 "WITH ptrmap(pgno) AS (" 7591 " SELECT 2 WHERE shell_int32(" 7592 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" 7593 " )" 7594 " UNION ALL " 7595 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " 7596 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" 7597 ")" 7598 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" 7599 ); 7600 7601 shellExec(pState->db, &rc, 7602 "CREATE TABLE recovery.dbptr(" 7603 " pgno, child, PRIMARY KEY(child, pgno)" 7604 ") WITHOUT ROWID;" 7605 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " 7606 " SELECT * FROM sqlite_dbptr" 7607 " WHERE pgno NOT IN freelist AND child NOT IN freelist;" 7608 7609 /* Delete any pointer to page 1. This ensures that page 1 is considered 7610 ** a root page, regardless of how corrupt the db is. */ 7611 "DELETE FROM recovery.dbptr WHERE child = 1;" 7612 7613 /* Delete all pointers to any pages that have more than one pointer 7614 ** to them. Such pages will be treated as root pages when recovering 7615 ** data. */ 7616 "DELETE FROM recovery.dbptr WHERE child IN (" 7617 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" 7618 ");" 7619 7620 /* Create the "map" table that will (eventually) contain instructions 7621 ** for dealing with each page in the db that contains one or more 7622 ** records. */ 7623 "CREATE TABLE recovery.map(" 7624 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" 7625 ");" 7626 7627 /* Populate table [map]. If there are circular loops of pages in the 7628 ** database, the following adds all pages in such a loop to the map 7629 ** as individual root pages. This could be handled better. */ 7630 "WITH pages(i, maxlen) AS (" 7631 " SELECT page_count, (" 7632 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" 7633 " ) FROM pragma_page_count WHERE page_count>0" 7634 " UNION ALL" 7635 " SELECT i-1, (" 7636 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" 7637 " ) FROM pages WHERE i>=2" 7638 ")" 7639 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " 7640 " SELECT i, maxlen, NULL, (" 7641 " WITH p(orig, pgno, parent) AS (" 7642 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" 7643 " UNION " 7644 " SELECT i, p.parent, " 7645 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" 7646 " )" 7647 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" 7648 ") " 7649 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" 7650 "UPDATE recovery.map AS o SET intkey = (" 7651 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" 7652 ");" 7653 7654 /* Extract data from page 1 and any linked pages into table 7655 ** recovery.schema. With the same schema as an sqlite_schema table. */ 7656 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 7657 "INSERT INTO recovery.schema SELECT " 7658 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 7659 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 7660 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 7661 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 7662 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 7663 "FROM sqlite_dbdata WHERE pgno IN (" 7664 " SELECT pgno FROM recovery.map WHERE root=1" 7665 ")" 7666 "GROUP BY pgno, cell;" 7667 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" 7668 ); 7669 7670 /* Open a transaction, then print out all non-virtual, non-"sqlite_%" 7671 ** CREATE TABLE statements that extracted from the existing schema. */ 7672 if( rc==SQLITE_OK ){ 7673 sqlite3_stmt *pStmt = 0; 7674 /* ".recover" might output content in an order which causes immediate 7675 ** foreign key constraints to be violated. So disable foreign-key 7676 ** constraint enforcement to prevent problems when running the output 7677 ** script. */ 7678 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); 7679 raw_printf(pState->out, "BEGIN;\n"); 7680 raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); 7681 shellPrepare(pState->db, &rc, 7682 "SELECT sql FROM recovery.schema " 7683 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt 7684 ); 7685 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7686 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); 7687 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", 7688 &zCreateTable[12] 7689 ); 7690 } 7691 shellFinalize(&rc, pStmt); 7692 } 7693 7694 /* Figure out if an orphan table will be required. And if so, how many 7695 ** user columns it should contain */ 7696 shellPrepare(pState->db, &rc, 7697 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" 7698 , &pLoop 7699 ); 7700 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 7701 nOrphan = sqlite3_column_int(pLoop, 0); 7702 } 7703 shellFinalize(&rc, pLoop); 7704 pLoop = 0; 7705 7706 shellPrepare(pState->db, &rc, 7707 "SELECT pgno FROM recovery.map WHERE root=?", &pPages 7708 ); 7709 7710 shellPrepare(pState->db, &rc, 7711 "SELECT max(field), group_concat(shell_escape_crnl(quote" 7712 "(case when (? AND field<0) then NULL else value end)" 7713 "), ', ')" 7714 ", min(field) " 7715 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" 7716 "GROUP BY cell", &pCells 7717 ); 7718 7719 /* Loop through each root page. */ 7720 shellPrepare(pState->db, &rc, 7721 "SELECT root, intkey, max(maxlen) FROM recovery.map" 7722 " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" 7723 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" 7724 ")", &pLoop 7725 ); 7726 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 7727 int iRoot = sqlite3_column_int(pLoop, 0); 7728 int bIntkey = sqlite3_column_int(pLoop, 1); 7729 int nCol = sqlite3_column_int(pLoop, 2); 7730 int bNoop = 0; 7731 RecoverTable *pTab; 7732 7733 assert( bIntkey==0 || bIntkey==1 ); 7734 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); 7735 if( bNoop || rc ) continue; 7736 if( pTab==0 ){ 7737 if( pOrphan==0 ){ 7738 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 7739 } 7740 pTab = pOrphan; 7741 if( pTab==0 ) break; 7742 } 7743 7744 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ 7745 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); 7746 } 7747 sqlite3_bind_int(pPages, 1, iRoot); 7748 if( bRowids==0 && pTab->iPk<0 ){ 7749 sqlite3_bind_int(pCells, 1, 1); 7750 }else{ 7751 sqlite3_bind_int(pCells, 1, 0); 7752 } 7753 sqlite3_bind_int(pCells, 3, pTab->iPk); 7754 7755 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ 7756 int iPgno = sqlite3_column_int(pPages, 0); 7757 sqlite3_bind_int(pCells, 2, iPgno); 7758 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ 7759 int nField = sqlite3_column_int(pCells, 0); 7760 int iMin = sqlite3_column_int(pCells, 2); 7761 const char *zVal = (const char*)sqlite3_column_text(pCells, 1); 7762 7763 RecoverTable *pTab2 = pTab; 7764 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ 7765 if( pOrphan==0 ){ 7766 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 7767 } 7768 pTab2 = pOrphan; 7769 if( pTab2==0 ) break; 7770 } 7771 7772 nField = nField+1; 7773 if( pTab2==pOrphan ){ 7774 raw_printf(pState->out, 7775 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", 7776 pTab2->zQuoted, iRoot, iPgno, nField, 7777 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] 7778 ); 7779 }else{ 7780 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", 7781 pTab2->zQuoted, pTab2->azlCol[nField], zVal 7782 ); 7783 } 7784 } 7785 shellReset(&rc, pCells); 7786 } 7787 shellReset(&rc, pPages); 7788 if( pTab!=pOrphan ) recoverFreeTable(pTab); 7789 } 7790 shellFinalize(&rc, pLoop); 7791 shellFinalize(&rc, pPages); 7792 shellFinalize(&rc, pCells); 7793 recoverFreeTable(pOrphan); 7794 7795 /* The rest of the schema */ 7796 if( rc==SQLITE_OK ){ 7797 sqlite3_stmt *pStmt = 0; 7798 shellPrepare(pState->db, &rc, 7799 "SELECT sql, name FROM recovery.schema " 7800 "WHERE sql NOT LIKE 'create table%'", &pStmt 7801 ); 7802 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 7803 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); 7804 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ 7805 const char *zName = (const char*)sqlite3_column_text(pStmt, 1); 7806 char *zPrint = shellMPrintf(&rc, 7807 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 7808 zName, zName, zSql 7809 ); 7810 raw_printf(pState->out, "%s;\n", zPrint); 7811 sqlite3_free(zPrint); 7812 }else{ 7813 raw_printf(pState->out, "%s;\n", zSql); 7814 } 7815 } 7816 shellFinalize(&rc, pStmt); 7817 } 7818 7819 if( rc==SQLITE_OK ){ 7820 raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); 7821 raw_printf(pState->out, "COMMIT;\n"); 7822 } 7823 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); 7824 return rc; 7825} 7826#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 7827 7828 7829/* 7830 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it. 7831 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE, 7832 * close db and set it to 0, and return the columns spec, to later 7833 * be sqlite3_free()'ed by the caller. 7834 * The return is 0 when either: 7835 * (a) The db was not initialized and zCol==0 (There are no columns.) 7836 * (b) zCol!=0 (Column was added, db initialized as needed.) 7837 * The 3rd argument, pRenamed, references an out parameter. If the 7838 * pointer is non-zero, its referent will be set to a summary of renames 7839 * done if renaming was necessary, or set to 0 if none was done. The out 7840 * string (if any) must be sqlite3_free()'ed by the caller. 7841 */ 7842#ifdef SHELL_DEBUG 7843#define rc_err_oom_die(rc) \ 7844 if( rc==SQLITE_NOMEM ) shell_check_oom(0); \ 7845 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \ 7846 fprintf(stderr,"E:%d\n",rc), assert(0) 7847#else 7848static void rc_err_oom_die(int rc){ 7849 if( rc==SQLITE_NOMEM ) shell_check_oom(0); 7850 assert(rc==SQLITE_OK||rc==SQLITE_DONE); 7851} 7852#endif 7853 7854#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */ 7855static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB); 7856#else /* Otherwise, memory is faster/better for the transient DB. */ 7857static const char *zCOL_DB = ":memory:"; 7858#endif 7859 7860/* Define character (as C string) to separate generated column ordinal 7861 * from protected part of incoming column names. This defaults to "_" 7862 * so that incoming column identifiers that did not need not be quoted 7863 * remain usable without being quoted. It must be one character. 7864 */ 7865#ifndef SHELL_AUTOCOLUMN_SEP 7866# define AUTOCOLUMN_SEP "_" 7867#else 7868# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP) 7869#endif 7870 7871static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){ 7872 /* Queries and D{D,M}L used here */ 7873 static const char * const zTabMake = "\ 7874CREATE TABLE ColNames(\ 7875 cpos INTEGER PRIMARY KEY,\ 7876 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\ 7877CREATE VIEW RepeatedNames AS \ 7878SELECT DISTINCT t.name FROM ColNames t \ 7879WHERE t.name COLLATE NOCASE IN (\ 7880 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\ 7881);\ 7882"; 7883 static const char * const zTabFill = "\ 7884INSERT INTO ColNames(name,nlen,chop,reps,suff)\ 7885 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\ 7886"; 7887 static const char * const zHasDupes = "\ 7888SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\ 7889 <count(name) FROM ColNames\ 7890"; 7891#ifdef SHELL_COLUMN_RENAME_CLEAN 7892 static const char * const zDedoctor = "\ 7893UPDATE ColNames SET chop=iif(\ 7894 (substring(name,nlen,1) BETWEEN '0' AND '9')\ 7895 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\ 7896 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\ 7897 0\ 7898)\ 7899"; 7900#endif 7901 static const char * const zSetReps = "\ 7902UPDATE ColNames AS t SET reps=\ 7903(SELECT count(*) FROM ColNames d \ 7904 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\ 7905 COLLATE NOCASE\ 7906)\ 7907"; 7908#ifdef SQLITE_ENABLE_MATH_FUNCTIONS 7909 static const char * const zColDigits = "\ 7910SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \ 7911"; 7912#endif 7913 static const char * const zRenameRank = 7914#ifdef SHELL_COLUMN_RENAME_CLEAN 7915 "UPDATE ColNames AS t SET suff=" 7916 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')" 7917#else /* ...RENAME_MINIMAL_ONE_PASS */ 7918"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */ 7919" SELECT 0 AS nlz" 7920" UNION" 7921" SELECT nlz+1 AS nlz FROM Lzn" 7922" WHERE EXISTS(" 7923" SELECT 1" 7924" FROM ColNames t, ColNames o" 7925" WHERE" 7926" iif(t.name IN (SELECT * FROM RepeatedNames)," 7927" printf('%s"AUTOCOLUMN_SEP"%s'," 7928" t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2))," 7929" t.name" 7930" )" 7931" =" 7932" iif(o.name IN (SELECT * FROM RepeatedNames)," 7933" printf('%s"AUTOCOLUMN_SEP"%s'," 7934" o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2))," 7935" o.name" 7936" )" 7937" COLLATE NOCASE" 7938" AND o.cpos<>t.cpos" 7939" GROUP BY t.cpos" 7940" )" 7941") UPDATE Colnames AS t SET" 7942" chop = 0," /* No chopping, never touch incoming names. */ 7943" suff = iif(name IN (SELECT * FROM RepeatedNames)," 7944" printf('"AUTOCOLUMN_SEP"%s', substring(" 7945" printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2))," 7946" ''" 7947" )" 7948#endif 7949 ; 7950 static const char * const zCollectVar = "\ 7951SELECT\ 7952 '('||x'0a'\ 7953 || group_concat(\ 7954 cname||' TEXT',\ 7955 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\ 7956 ||')' AS ColsSpec \ 7957FROM (\ 7958 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \ 7959 FROM ColNames ORDER BY cpos\ 7960)"; 7961 static const char * const zRenamesDone = 7962 "SELECT group_concat(" 7963 " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff))," 7964 " ','||x'0a')" 7965 "FROM ColNames WHERE suff<>'' OR chop!=0" 7966 ; 7967 int rc; 7968 sqlite3_stmt *pStmt = 0; 7969 assert(pDb!=0); 7970 if( zColNew ){ 7971 /* Add initial or additional column. Init db if necessary. */ 7972 if( *pDb==0 ){ 7973 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0; 7974#ifdef SHELL_COLFIX_DB 7975 if(*zCOL_DB!=':') 7976 sqlite3_exec(*pDb,"drop table if exists ColNames;" 7977 "drop view if exists RepeatedNames;",0,0,0); 7978#endif 7979 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0); 7980 rc_err_oom_die(rc); 7981 } 7982 assert(*pDb!=0); 7983 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0); 7984 rc_err_oom_die(rc); 7985 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0); 7986 rc_err_oom_die(rc); 7987 rc = sqlite3_step(pStmt); 7988 rc_err_oom_die(rc); 7989 sqlite3_finalize(pStmt); 7990 return 0; 7991 }else if( *pDb==0 ){ 7992 return 0; 7993 }else{ 7994 /* Formulate the columns spec, close the DB, zero *pDb. */ 7995 char *zColsSpec = 0; 7996 int hasDupes = db_int(*pDb, zHasDupes); 7997#ifdef SQLITE_ENABLE_MATH_FUNCTIONS 7998 int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0; 7999#else 8000# define nDigits 2 8001#endif 8002 if( hasDupes ){ 8003#ifdef SHELL_COLUMN_RENAME_CLEAN 8004 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0); 8005 rc_err_oom_die(rc); 8006#endif 8007 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0); 8008 rc_err_oom_die(rc); 8009 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0); 8010 rc_err_oom_die(rc); 8011 sqlite3_bind_int(pStmt, 1, nDigits); 8012 rc = sqlite3_step(pStmt); 8013 sqlite3_finalize(pStmt); 8014 assert(rc==SQLITE_DONE); 8015 } 8016 assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */ 8017 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0); 8018 rc_err_oom_die(rc); 8019 rc = sqlite3_step(pStmt); 8020 if( rc==SQLITE_ROW ){ 8021 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 8022 }else{ 8023 zColsSpec = 0; 8024 } 8025 if( pzRenamed!=0 ){ 8026 if( !hasDupes ) *pzRenamed = 0; 8027 else{ 8028 sqlite3_finalize(pStmt); 8029 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0) 8030 && SQLITE_ROW==sqlite3_step(pStmt) ){ 8031 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 8032 }else 8033 *pzRenamed = 0; 8034 } 8035 } 8036 sqlite3_finalize(pStmt); 8037 sqlite3_close(*pDb); 8038 *pDb = 0; 8039 return zColsSpec; 8040 } 8041} 8042 8043/* 8044** If an input line begins with "." then invoke this routine to 8045** process that line. 8046** 8047** Return 1 on error, 2 to exit, and 0 otherwise. 8048*/ 8049static int do_meta_command(char *zLine, ShellState *p){ 8050 int h = 1; 8051 int nArg = 0; 8052 int n, c; 8053 int rc = 0; 8054 char *azArg[52]; 8055 8056#ifndef SQLITE_OMIT_VIRTUALTABLE 8057 if( p->expert.pExpert ){ 8058 expertFinish(p, 1, 0); 8059 } 8060#endif 8061 8062 /* Parse the input line into tokens. 8063 */ 8064 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 8065 while( IsSpace(zLine[h]) ){ h++; } 8066 if( zLine[h]==0 ) break; 8067 if( zLine[h]=='\'' || zLine[h]=='"' ){ 8068 int delim = zLine[h++]; 8069 azArg[nArg++] = &zLine[h]; 8070 while( zLine[h] && zLine[h]!=delim ){ 8071 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 8072 h++; 8073 } 8074 if( zLine[h]==delim ){ 8075 zLine[h++] = 0; 8076 } 8077 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 8078 }else{ 8079 azArg[nArg++] = &zLine[h]; 8080 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 8081 if( zLine[h] ) zLine[h++] = 0; 8082 resolve_backslashes(azArg[nArg-1]); 8083 } 8084 } 8085 azArg[nArg] = 0; 8086 8087 /* Process the input line. 8088 */ 8089 if( nArg==0 ) return 0; /* no tokens, no error */ 8090 n = strlen30(azArg[0]); 8091 c = azArg[0][0]; 8092 clearTempFile(p); 8093 8094#ifndef SQLITE_OMIT_AUTHORIZATION 8095 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 8096 if( nArg!=2 ){ 8097 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 8098 rc = 1; 8099 goto meta_command_exit; 8100 } 8101 open_db(p, 0); 8102 if( booleanValue(azArg[1]) ){ 8103 sqlite3_set_authorizer(p->db, shellAuth, p); 8104 }else if( p->bSafeModePersist ){ 8105 sqlite3_set_authorizer(p->db, safeModeAuth, p); 8106 }else{ 8107 sqlite3_set_authorizer(p->db, 0, 0); 8108 } 8109 }else 8110#endif 8111 8112#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 8113 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 8114 open_db(p, 0); 8115 failIfSafeMode(p, "cannot run .archive in safe mode"); 8116 rc = arDotCommand(p, 0, azArg, nArg); 8117 }else 8118#endif 8119 8120 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 8121 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 8122 ){ 8123 const char *zDestFile = 0; 8124 const char *zDb = 0; 8125 sqlite3 *pDest; 8126 sqlite3_backup *pBackup; 8127 int j; 8128 int bAsync = 0; 8129 const char *zVfs = 0; 8130 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 8131 for(j=1; j<nArg; j++){ 8132 const char *z = azArg[j]; 8133 if( z[0]=='-' ){ 8134 if( z[1]=='-' ) z++; 8135 if( strcmp(z, "-append")==0 ){ 8136 zVfs = "apndvfs"; 8137 }else 8138 if( strcmp(z, "-async")==0 ){ 8139 bAsync = 1; 8140 }else 8141 { 8142 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 8143 return 1; 8144 } 8145 }else if( zDestFile==0 ){ 8146 zDestFile = azArg[j]; 8147 }else if( zDb==0 ){ 8148 zDb = zDestFile; 8149 zDestFile = azArg[j]; 8150 }else{ 8151 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 8152 return 1; 8153 } 8154 } 8155 if( zDestFile==0 ){ 8156 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 8157 return 1; 8158 } 8159 if( zDb==0 ) zDb = "main"; 8160 rc = sqlite3_open_v2(zDestFile, &pDest, 8161 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 8162 if( rc!=SQLITE_OK ){ 8163 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 8164 close_db(pDest); 8165 return 1; 8166 } 8167 if( bAsync ){ 8168 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 8169 0, 0, 0); 8170 } 8171 open_db(p, 0); 8172 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 8173 if( pBackup==0 ){ 8174 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 8175 close_db(pDest); 8176 return 1; 8177 } 8178 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 8179 sqlite3_backup_finish(pBackup); 8180 if( rc==SQLITE_DONE ){ 8181 rc = 0; 8182 }else{ 8183 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 8184 rc = 1; 8185 } 8186 close_db(pDest); 8187 }else 8188 8189 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 8190 if( nArg==2 ){ 8191 bail_on_error = booleanValue(azArg[1]); 8192 }else{ 8193 raw_printf(stderr, "Usage: .bail on|off\n"); 8194 rc = 1; 8195 } 8196 }else 8197 8198 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 8199 if( nArg==2 ){ 8200 if( booleanValue(azArg[1]) ){ 8201 setBinaryMode(p->out, 1); 8202 }else{ 8203 setTextMode(p->out, 1); 8204 } 8205 }else{ 8206 raw_printf(stderr, "Usage: .binary on|off\n"); 8207 rc = 1; 8208 } 8209 }else 8210 8211 /* The undocumented ".breakpoint" command causes a call to the no-op 8212 ** routine named test_breakpoint(). 8213 */ 8214 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 8215 test_breakpoint(); 8216 }else 8217 8218 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 8219 failIfSafeMode(p, "cannot run .cd in safe mode"); 8220 if( nArg==2 ){ 8221#if defined(_WIN32) || defined(WIN32) 8222 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 8223 rc = !SetCurrentDirectoryW(z); 8224 sqlite3_free(z); 8225#else 8226 rc = chdir(azArg[1]); 8227#endif 8228 if( rc ){ 8229 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 8230 rc = 1; 8231 } 8232 }else{ 8233 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 8234 rc = 1; 8235 } 8236 }else 8237 8238 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 8239 if( nArg==2 ){ 8240 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 8241 }else{ 8242 raw_printf(stderr, "Usage: .changes on|off\n"); 8243 rc = 1; 8244 } 8245 }else 8246 8247 /* Cancel output redirection, if it is currently set (by .testcase) 8248 ** Then read the content of the testcase-out.txt file and compare against 8249 ** azArg[1]. If there are differences, report an error and exit. 8250 */ 8251 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 8252 char *zRes = 0; 8253 output_reset(p); 8254 if( nArg!=2 ){ 8255 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 8256 rc = 2; 8257 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 8258 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 8259 rc = 2; 8260 }else if( testcase_glob(azArg[1],zRes)==0 ){ 8261 utf8_printf(stderr, 8262 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 8263 p->zTestcase, azArg[1], zRes); 8264 rc = 1; 8265 }else{ 8266 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 8267 p->nCheck++; 8268 } 8269 sqlite3_free(zRes); 8270 }else 8271 8272 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 8273 failIfSafeMode(p, "cannot run .clone in safe mode"); 8274 if( nArg==2 ){ 8275 tryToClone(p, azArg[1]); 8276 }else{ 8277 raw_printf(stderr, "Usage: .clone FILENAME\n"); 8278 rc = 1; 8279 } 8280 }else 8281 8282 if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){ 8283 if( nArg==1 ){ 8284 /* List available connections */ 8285 int i; 8286 for(i=0; i<ArraySize(p->aAuxDb); i++){ 8287 const char *zFile = p->aAuxDb[i].zDbFilename; 8288 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){ 8289 zFile = "(not open)"; 8290 }else if( zFile==0 ){ 8291 zFile = "(memory)"; 8292 }else if( zFile[0]==0 ){ 8293 zFile = "(temporary-file)"; 8294 } 8295 if( p->pAuxDb == &p->aAuxDb[i] ){ 8296 utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile); 8297 }else if( p->aAuxDb[i].db!=0 ){ 8298 utf8_printf(stdout, " %d: %s\n", i, zFile); 8299 } 8300 } 8301 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){ 8302 int i = azArg[1][0] - '0'; 8303 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){ 8304 p->pAuxDb->db = p->db; 8305 p->pAuxDb = &p->aAuxDb[i]; 8306 globalDb = p->db = p->pAuxDb->db; 8307 p->pAuxDb->db = 0; 8308 } 8309 }else if( nArg==3 && strcmp(azArg[1], "close")==0 8310 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){ 8311 int i = azArg[2][0] - '0'; 8312 if( i<0 || i>=ArraySize(p->aAuxDb) ){ 8313 /* No-op */ 8314 }else if( p->pAuxDb == &p->aAuxDb[i] ){ 8315 raw_printf(stderr, "cannot close the active database connection\n"); 8316 rc = 1; 8317 }else if( p->aAuxDb[i].db ){ 8318 session_close_all(p, i); 8319 close_db(p->aAuxDb[i].db); 8320 p->aAuxDb[i].db = 0; 8321 } 8322 }else{ 8323 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n"); 8324 rc = 1; 8325 } 8326 }else 8327 8328 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 8329 char **azName = 0; 8330 int nName = 0; 8331 sqlite3_stmt *pStmt; 8332 int i; 8333 open_db(p, 0); 8334 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 8335 if( rc ){ 8336 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 8337 rc = 1; 8338 }else{ 8339 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 8340 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1); 8341 const char *zFile = (const char*)sqlite3_column_text(pStmt,2); 8342 if( zSchema==0 || zFile==0 ) continue; 8343 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 8344 shell_check_oom(azName); 8345 azName[nName*2] = strdup(zSchema); 8346 azName[nName*2+1] = strdup(zFile); 8347 nName++; 8348 } 8349 } 8350 sqlite3_finalize(pStmt); 8351 for(i=0; i<nName; i++){ 8352 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 8353 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 8354 const char *z = azName[i*2+1]; 8355 utf8_printf(p->out, "%s: %s %s%s\n", 8356 azName[i*2], 8357 z && z[0] ? z : "\"\"", 8358 bRdonly ? "r/o" : "r/w", 8359 eTxn==SQLITE_TXN_NONE ? "" : 8360 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 8361 free(azName[i*2]); 8362 free(azName[i*2+1]); 8363 } 8364 sqlite3_free(azName); 8365 }else 8366 8367 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 8368 static const struct DbConfigChoices { 8369 const char *zName; 8370 int op; 8371 } aDbConfig[] = { 8372 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 8373 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 8374 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 8375 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 8376 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 8377 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 8378 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 8379 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 8380 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 8381 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 8382 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 8383 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 8384 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 8385 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 8386 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 8387 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 8388 }; 8389 int ii, v; 8390 open_db(p, 0); 8391 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 8392 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 8393 if( nArg>=3 ){ 8394 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 8395 } 8396 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 8397 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 8398 if( nArg>1 ) break; 8399 } 8400 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 8401 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 8402 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 8403 } 8404 }else 8405 8406 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 8407 rc = shell_dbinfo_command(p, nArg, azArg); 8408 }else 8409 8410#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 8411 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 8412 open_db(p, 0); 8413 rc = recoverDatabaseCmd(p, nArg, azArg); 8414 }else 8415#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 8416 8417 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 8418 char *zLike = 0; 8419 char *zSql; 8420 int i; 8421 int savedShowHeader = p->showHeader; 8422 int savedShellFlags = p->shellFlgs; 8423 ShellClearFlag(p, 8424 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 8425 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 8426 for(i=1; i<nArg; i++){ 8427 if( azArg[i][0]=='-' ){ 8428 const char *z = azArg[i]+1; 8429 if( z[0]=='-' ) z++; 8430 if( strcmp(z,"preserve-rowids")==0 ){ 8431#ifdef SQLITE_OMIT_VIRTUALTABLE 8432 raw_printf(stderr, "The --preserve-rowids option is not compatible" 8433 " with SQLITE_OMIT_VIRTUALTABLE\n"); 8434 rc = 1; 8435 sqlite3_free(zLike); 8436 goto meta_command_exit; 8437#else 8438 ShellSetFlag(p, SHFLG_PreserveRowid); 8439#endif 8440 }else 8441 if( strcmp(z,"newlines")==0 ){ 8442 ShellSetFlag(p, SHFLG_Newlines); 8443 }else 8444 if( strcmp(z,"data-only")==0 ){ 8445 ShellSetFlag(p, SHFLG_DumpDataOnly); 8446 }else 8447 if( strcmp(z,"nosys")==0 ){ 8448 ShellSetFlag(p, SHFLG_DumpNoSys); 8449 }else 8450 { 8451 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 8452 rc = 1; 8453 sqlite3_free(zLike); 8454 goto meta_command_exit; 8455 } 8456 }else{ 8457 /* azArg[i] contains a LIKE pattern. This ".dump" request should 8458 ** only dump data for tables for which either the table name matches 8459 ** the LIKE pattern, or the table appears to be a shadow table of 8460 ** a virtual table for which the name matches the LIKE pattern. 8461 */ 8462 char *zExpr = sqlite3_mprintf( 8463 "name LIKE %Q ESCAPE '\\' OR EXISTS (" 8464 " SELECT 1 FROM sqlite_schema WHERE " 8465 " name LIKE %Q ESCAPE '\\' AND" 8466 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" 8467 " substr(o.name, 1, length(name)+1) == (name||'_')" 8468 ")", azArg[i], azArg[i] 8469 ); 8470 8471 if( zLike ){ 8472 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); 8473 }else{ 8474 zLike = zExpr; 8475 } 8476 } 8477 } 8478 8479 open_db(p, 0); 8480 8481 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8482 /* When playing back a "dump", the content might appear in an order 8483 ** which causes immediate foreign key constraints to be violated. 8484 ** So disable foreign-key constraint enforcement to prevent problems. */ 8485 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 8486 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 8487 } 8488 p->writableSchema = 0; 8489 p->showHeader = 0; 8490 /* Set writable_schema=ON since doing so forces SQLite to initialize 8491 ** as much of the schema as it can even if the sqlite_schema table is 8492 ** corrupt. */ 8493 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 8494 p->nErr = 0; 8495 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 8496 zSql = sqlite3_mprintf( 8497 "SELECT name, type, sql FROM sqlite_schema AS o " 8498 "WHERE (%s) AND type=='table'" 8499 " AND sql NOT NULL" 8500 " ORDER BY tbl_name='sqlite_sequence', rowid", 8501 zLike 8502 ); 8503 run_schema_dump_query(p,zSql); 8504 sqlite3_free(zSql); 8505 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8506 zSql = sqlite3_mprintf( 8507 "SELECT sql FROM sqlite_schema AS o " 8508 "WHERE (%s) AND sql NOT NULL" 8509 " AND type IN ('index','trigger','view')", 8510 zLike 8511 ); 8512 run_table_dump_query(p, zSql); 8513 sqlite3_free(zSql); 8514 } 8515 sqlite3_free(zLike); 8516 if( p->writableSchema ){ 8517 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 8518 p->writableSchema = 0; 8519 } 8520 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 8521 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 8522 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 8523 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 8524 } 8525 p->showHeader = savedShowHeader; 8526 p->shellFlgs = savedShellFlags; 8527 }else 8528 8529 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 8530 if( nArg==2 ){ 8531 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 8532 }else{ 8533 raw_printf(stderr, "Usage: .echo on|off\n"); 8534 rc = 1; 8535 } 8536 }else 8537 8538 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 8539 if( nArg==2 ){ 8540 p->autoEQPtest = 0; 8541 if( p->autoEQPtrace ){ 8542 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 8543 p->autoEQPtrace = 0; 8544 } 8545 if( strcmp(azArg[1],"full")==0 ){ 8546 p->autoEQP = AUTOEQP_full; 8547 }else if( strcmp(azArg[1],"trigger")==0 ){ 8548 p->autoEQP = AUTOEQP_trigger; 8549#ifdef SQLITE_DEBUG 8550 }else if( strcmp(azArg[1],"test")==0 ){ 8551 p->autoEQP = AUTOEQP_on; 8552 p->autoEQPtest = 1; 8553 }else if( strcmp(azArg[1],"trace")==0 ){ 8554 p->autoEQP = AUTOEQP_full; 8555 p->autoEQPtrace = 1; 8556 open_db(p, 0); 8557 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 8558 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 8559#endif 8560 }else{ 8561 p->autoEQP = (u8)booleanValue(azArg[1]); 8562 } 8563 }else{ 8564 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 8565 rc = 1; 8566 } 8567 }else 8568 8569 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 8570 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 8571 rc = 2; 8572 }else 8573 8574 /* The ".explain" command is automatic now. It is largely pointless. It 8575 ** retained purely for backwards compatibility */ 8576 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 8577 int val = 1; 8578 if( nArg>=2 ){ 8579 if( strcmp(azArg[1],"auto")==0 ){ 8580 val = 99; 8581 }else{ 8582 val = booleanValue(azArg[1]); 8583 } 8584 } 8585 if( val==1 && p->mode!=MODE_Explain ){ 8586 p->normalMode = p->mode; 8587 p->mode = MODE_Explain; 8588 p->autoExplain = 0; 8589 }else if( val==0 ){ 8590 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8591 p->autoExplain = 0; 8592 }else if( val==99 ){ 8593 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 8594 p->autoExplain = 1; 8595 } 8596 }else 8597 8598#ifndef SQLITE_OMIT_VIRTUALTABLE 8599 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 8600 if( p->bSafeMode ){ 8601 raw_printf(stderr, 8602 "Cannot run experimental commands such as \"%s\" in safe mode\n", 8603 azArg[0]); 8604 rc = 1; 8605 }else{ 8606 open_db(p, 0); 8607 expertDotCommand(p, azArg, nArg); 8608 } 8609 }else 8610#endif 8611 8612 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 8613 static const struct { 8614 const char *zCtrlName; /* Name of a test-control option */ 8615 int ctrlCode; /* Integer code for that option */ 8616 const char *zUsage; /* Usage notes */ 8617 } aCtrl[] = { 8618 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 8619 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" }, 8620 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 8621 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 8622 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 8623 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 8624 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 8625 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 8626 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 8627 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 8628 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 8629 }; 8630 int filectrl = -1; 8631 int iCtrl = -1; 8632 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 8633 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 8634 int n2, i; 8635 const char *zCmd = 0; 8636 const char *zSchema = 0; 8637 8638 open_db(p, 0); 8639 zCmd = nArg>=2 ? azArg[1] : "help"; 8640 8641 if( zCmd[0]=='-' 8642 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 8643 && nArg>=4 8644 ){ 8645 zSchema = azArg[2]; 8646 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 8647 nArg -= 2; 8648 zCmd = azArg[1]; 8649 } 8650 8651 /* The argument can optionally begin with "-" or "--" */ 8652 if( zCmd[0]=='-' && zCmd[1] ){ 8653 zCmd++; 8654 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 8655 } 8656 8657 /* --help lists all file-controls */ 8658 if( strcmp(zCmd,"help")==0 ){ 8659 utf8_printf(p->out, "Available file-controls:\n"); 8660 for(i=0; i<ArraySize(aCtrl); i++){ 8661 utf8_printf(p->out, " .filectrl %s %s\n", 8662 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 8663 } 8664 rc = 1; 8665 goto meta_command_exit; 8666 } 8667 8668 /* convert filectrl text option to value. allow any unique prefix 8669 ** of the option name, or a numerical value. */ 8670 n2 = strlen30(zCmd); 8671 for(i=0; i<ArraySize(aCtrl); i++){ 8672 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 8673 if( filectrl<0 ){ 8674 filectrl = aCtrl[i].ctrlCode; 8675 iCtrl = i; 8676 }else{ 8677 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 8678 "Use \".filectrl --help\" for help\n", zCmd); 8679 rc = 1; 8680 goto meta_command_exit; 8681 } 8682 } 8683 } 8684 if( filectrl<0 ){ 8685 utf8_printf(stderr,"Error: unknown file-control: %s\n" 8686 "Use \".filectrl --help\" for help\n", zCmd); 8687 }else{ 8688 switch(filectrl){ 8689 case SQLITE_FCNTL_SIZE_LIMIT: { 8690 if( nArg!=2 && nArg!=3 ) break; 8691 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 8692 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 8693 isOk = 1; 8694 break; 8695 } 8696 case SQLITE_FCNTL_LOCK_TIMEOUT: 8697 case SQLITE_FCNTL_CHUNK_SIZE: { 8698 int x; 8699 if( nArg!=3 ) break; 8700 x = (int)integerValue(azArg[2]); 8701 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8702 isOk = 2; 8703 break; 8704 } 8705 case SQLITE_FCNTL_PERSIST_WAL: 8706 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 8707 int x; 8708 if( nArg!=2 && nArg!=3 ) break; 8709 x = nArg==3 ? booleanValue(azArg[2]) : -1; 8710 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8711 iRes = x; 8712 isOk = 1; 8713 break; 8714 } 8715 case SQLITE_FCNTL_DATA_VERSION: 8716 case SQLITE_FCNTL_HAS_MOVED: { 8717 int x; 8718 if( nArg!=2 ) break; 8719 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8720 iRes = x; 8721 isOk = 1; 8722 break; 8723 } 8724 case SQLITE_FCNTL_TEMPFILENAME: { 8725 char *z = 0; 8726 if( nArg!=2 ) break; 8727 sqlite3_file_control(p->db, zSchema, filectrl, &z); 8728 if( z ){ 8729 utf8_printf(p->out, "%s\n", z); 8730 sqlite3_free(z); 8731 } 8732 isOk = 2; 8733 break; 8734 } 8735 case SQLITE_FCNTL_RESERVE_BYTES: { 8736 int x; 8737 if( nArg>=3 ){ 8738 x = atoi(azArg[2]); 8739 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8740 } 8741 x = -1; 8742 sqlite3_file_control(p->db, zSchema, filectrl, &x); 8743 utf8_printf(p->out,"%d\n", x); 8744 isOk = 2; 8745 break; 8746 } 8747 } 8748 } 8749 if( isOk==0 && iCtrl>=0 ){ 8750 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 8751 rc = 1; 8752 }else if( isOk==1 ){ 8753 char zBuf[100]; 8754 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 8755 raw_printf(p->out, "%s\n", zBuf); 8756 } 8757 }else 8758 8759 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 8760 ShellState data; 8761 int doStats = 0; 8762 memcpy(&data, p, sizeof(data)); 8763 data.showHeader = 0; 8764 data.cMode = data.mode = MODE_Semi; 8765 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 8766 data.cMode = data.mode = MODE_Pretty; 8767 nArg = 1; 8768 } 8769 if( nArg!=1 ){ 8770 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 8771 rc = 1; 8772 goto meta_command_exit; 8773 } 8774 open_db(p, 0); 8775 rc = sqlite3_exec(p->db, 8776 "SELECT sql FROM" 8777 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 8778 " FROM sqlite_schema UNION ALL" 8779 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 8780 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 8781 "ORDER BY x", 8782 callback, &data, 0 8783 ); 8784 if( rc==SQLITE_OK ){ 8785 sqlite3_stmt *pStmt; 8786 rc = sqlite3_prepare_v2(p->db, 8787 "SELECT rowid FROM sqlite_schema" 8788 " WHERE name GLOB 'sqlite_stat[134]'", 8789 -1, &pStmt, 0); 8790 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 8791 sqlite3_finalize(pStmt); 8792 } 8793 if( doStats==0 ){ 8794 raw_printf(p->out, "/* No STAT tables available */\n"); 8795 }else{ 8796 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8797 data.cMode = data.mode = MODE_Insert; 8798 data.zDestTable = "sqlite_stat1"; 8799 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); 8800 data.zDestTable = "sqlite_stat4"; 8801 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0); 8802 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 8803 } 8804 }else 8805 8806 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 8807 if( nArg==2 ){ 8808 p->showHeader = booleanValue(azArg[1]); 8809 p->shellFlgs |= SHFLG_HeaderSet; 8810 }else{ 8811 raw_printf(stderr, "Usage: .headers on|off\n"); 8812 rc = 1; 8813 } 8814 }else 8815 8816 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 8817 if( nArg>=2 ){ 8818 n = showHelp(p->out, azArg[1]); 8819 if( n==0 ){ 8820 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 8821 } 8822 }else{ 8823 showHelp(p->out, 0); 8824 } 8825 }else 8826 8827 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 8828 char *zTable = 0; /* Insert data into this table */ 8829 char *zSchema = "main"; /* within this schema */ 8830 char *zFile = 0; /* Name of file to extra content from */ 8831 sqlite3_stmt *pStmt = NULL; /* A statement */ 8832 int nCol; /* Number of columns in the table */ 8833 int nByte; /* Number of bytes in an SQL string */ 8834 int i, j; /* Loop counters */ 8835 int needCommit; /* True to COMMIT or ROLLBACK at end */ 8836 int nSep; /* Number of bytes in p->colSeparator[] */ 8837 char *zSql; /* An SQL statement */ 8838 ImportCtx sCtx; /* Reader context */ 8839 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 8840 int eVerbose = 0; /* Larger for more console output */ 8841 int nSkip = 0; /* Initial lines to skip */ 8842 int useOutputMode = 1; /* Use output mode to determine separators */ 8843 8844 failIfSafeMode(p, "cannot run .import in safe mode"); 8845 memset(&sCtx, 0, sizeof(sCtx)); 8846 sCtx.z = sqlite3_malloc64(120); 8847 if( sCtx.z==0 ){ 8848 import_cleanup(&sCtx); 8849 shell_out_of_memory(); 8850 } 8851 if( p->mode==MODE_Ascii ){ 8852 xRead = ascii_read_one_field; 8853 }else{ 8854 xRead = csv_read_one_field; 8855 } 8856 for(i=1; i<nArg; i++){ 8857 char *z = azArg[i]; 8858 if( z[0]=='-' && z[1]=='-' ) z++; 8859 if( z[0]!='-' ){ 8860 if( zFile==0 ){ 8861 zFile = z; 8862 }else if( zTable==0 ){ 8863 zTable = z; 8864 }else{ 8865 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 8866 showHelp(p->out, "import"); 8867 rc = 1; 8868 goto meta_command_exit; 8869 } 8870 }else if( strcmp(z,"-v")==0 ){ 8871 eVerbose++; 8872 }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){ 8873 zSchema = azArg[++i]; 8874 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 8875 nSkip = integerValue(azArg[++i]); 8876 }else if( strcmp(z,"-ascii")==0 ){ 8877 sCtx.cColSep = SEP_Unit[0]; 8878 sCtx.cRowSep = SEP_Record[0]; 8879 xRead = ascii_read_one_field; 8880 useOutputMode = 0; 8881 }else if( strcmp(z,"-csv")==0 ){ 8882 sCtx.cColSep = ','; 8883 sCtx.cRowSep = '\n'; 8884 xRead = csv_read_one_field; 8885 useOutputMode = 0; 8886 }else{ 8887 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 8888 showHelp(p->out, "import"); 8889 rc = 1; 8890 goto meta_command_exit; 8891 } 8892 } 8893 if( zTable==0 ){ 8894 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 8895 zFile==0 ? "FILE" : "TABLE"); 8896 showHelp(p->out, "import"); 8897 rc = 1; 8898 goto meta_command_exit; 8899 } 8900 seenInterrupt = 0; 8901 open_db(p, 0); 8902 if( useOutputMode ){ 8903 /* If neither the --csv or --ascii options are specified, then set 8904 ** the column and row separator characters from the output mode. */ 8905 nSep = strlen30(p->colSeparator); 8906 if( nSep==0 ){ 8907 raw_printf(stderr, 8908 "Error: non-null column separator required for import\n"); 8909 rc = 1; 8910 goto meta_command_exit; 8911 } 8912 if( nSep>1 ){ 8913 raw_printf(stderr, 8914 "Error: multi-character column separators not allowed" 8915 " for import\n"); 8916 rc = 1; 8917 goto meta_command_exit; 8918 } 8919 nSep = strlen30(p->rowSeparator); 8920 if( nSep==0 ){ 8921 raw_printf(stderr, 8922 "Error: non-null row separator required for import\n"); 8923 rc = 1; 8924 goto meta_command_exit; 8925 } 8926 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 8927 /* When importing CSV (only), if the row separator is set to the 8928 ** default output row separator, change it to the default input 8929 ** row separator. This avoids having to maintain different input 8930 ** and output row separators. */ 8931 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 8932 nSep = strlen30(p->rowSeparator); 8933 } 8934 if( nSep>1 ){ 8935 raw_printf(stderr, "Error: multi-character row separators not allowed" 8936 " for import\n"); 8937 rc = 1; 8938 goto meta_command_exit; 8939 } 8940 sCtx.cColSep = p->colSeparator[0]; 8941 sCtx.cRowSep = p->rowSeparator[0]; 8942 } 8943 sCtx.zFile = zFile; 8944 sCtx.nLine = 1; 8945 if( sCtx.zFile[0]=='|' ){ 8946#ifdef SQLITE_OMIT_POPEN 8947 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 8948 rc = 1; 8949 goto meta_command_exit; 8950#else 8951 sCtx.in = popen(sCtx.zFile+1, "r"); 8952 sCtx.zFile = "<pipe>"; 8953 sCtx.xCloser = pclose; 8954#endif 8955 }else{ 8956 sCtx.in = fopen(sCtx.zFile, "rb"); 8957 sCtx.xCloser = fclose; 8958 } 8959 if( sCtx.in==0 ){ 8960 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 8961 rc = 1; 8962 import_cleanup(&sCtx); 8963 goto meta_command_exit; 8964 } 8965 /* Below, resources must be freed before exit. */ 8966 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 8967 char zSep[2]; 8968 zSep[1] = 0; 8969 zSep[0] = sCtx.cColSep; 8970 utf8_printf(p->out, "Column separator "); 8971 output_c_string(p->out, zSep); 8972 utf8_printf(p->out, ", row separator "); 8973 zSep[0] = sCtx.cRowSep; 8974 output_c_string(p->out, zSep); 8975 utf8_printf(p->out, "\n"); 8976 } 8977 while( (nSkip--)>0 ){ 8978 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 8979 } 8980 zSql = sqlite3_mprintf("SELECT * FROM \"%w\".\"%w\"", zSchema, zTable); 8981 if( zSql==0 ){ 8982 import_cleanup(&sCtx); 8983 shell_out_of_memory(); 8984 } 8985 nByte = strlen30(zSql); 8986 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 8987 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 8988 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 8989 char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", 8990 zSchema, zTable); 8991 sqlite3 *dbCols = 0; 8992 char *zRenames = 0; 8993 char *zColDefs; 8994 while( xRead(&sCtx) ){ 8995 zAutoColumn(sCtx.z, &dbCols, 0); 8996 if( sCtx.cTerm!=sCtx.cColSep ) break; 8997 } 8998 zColDefs = zAutoColumn(0, &dbCols, &zRenames); 8999 if( zRenames!=0 ){ 9000 utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr, 9001 "Columns renamed during .import %s due to duplicates:\n" 9002 "%s\n", sCtx.zFile, zRenames); 9003 sqlite3_free(zRenames); 9004 } 9005 assert(dbCols==0); 9006 if( zColDefs==0 ){ 9007 sqlite3_free(zCreate); 9008 import_cleanup(&sCtx); 9009 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 9010 rc = 1; 9011 goto meta_command_exit; 9012 } 9013 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs); 9014 if( eVerbose>=1 ){ 9015 utf8_printf(p->out, "%s\n", zCreate); 9016 } 9017 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 9018 if( rc ){ 9019 utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db)); 9020 sqlite3_free(zCreate); 9021 import_cleanup(&sCtx); 9022 rc = 1; 9023 goto meta_command_exit; 9024 } 9025 sqlite3_free(zCreate); 9026 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9027 } 9028 sqlite3_free(zSql); 9029 if( rc ){ 9030 if (pStmt) sqlite3_finalize(pStmt); 9031 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 9032 import_cleanup(&sCtx); 9033 rc = 1; 9034 goto meta_command_exit; 9035 } 9036 nCol = sqlite3_column_count(pStmt); 9037 sqlite3_finalize(pStmt); 9038 pStmt = 0; 9039 if( nCol==0 ) return 0; /* no columns, no error */ 9040 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 9041 if( zSql==0 ){ 9042 import_cleanup(&sCtx); 9043 shell_out_of_memory(); 9044 } 9045 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?", 9046 zSchema, zTable); 9047 j = strlen30(zSql); 9048 for(i=1; i<nCol; i++){ 9049 zSql[j++] = ','; 9050 zSql[j++] = '?'; 9051 } 9052 zSql[j++] = ')'; 9053 zSql[j] = 0; 9054 if( eVerbose>=2 ){ 9055 utf8_printf(p->out, "Insert using: %s\n", zSql); 9056 } 9057 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9058 sqlite3_free(zSql); 9059 if( rc ){ 9060 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9061 if (pStmt) sqlite3_finalize(pStmt); 9062 import_cleanup(&sCtx); 9063 rc = 1; 9064 goto meta_command_exit; 9065 } 9066 needCommit = sqlite3_get_autocommit(p->db); 9067 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 9068 do{ 9069 int startLine = sCtx.nLine; 9070 for(i=0; i<nCol; i++){ 9071 char *z = xRead(&sCtx); 9072 /* 9073 ** Did we reach end-of-file before finding any columns? 9074 ** If so, stop instead of NULL filling the remaining columns. 9075 */ 9076 if( z==0 && i==0 ) break; 9077 /* 9078 ** Did we reach end-of-file OR end-of-line before finding any 9079 ** columns in ASCII mode? If so, stop instead of NULL filling 9080 ** the remaining columns. 9081 */ 9082 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 9083 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 9084 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 9085 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 9086 "filling the rest with NULL\n", 9087 sCtx.zFile, startLine, nCol, i+1); 9088 i += 2; 9089 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 9090 } 9091 } 9092 if( sCtx.cTerm==sCtx.cColSep ){ 9093 do{ 9094 xRead(&sCtx); 9095 i++; 9096 }while( sCtx.cTerm==sCtx.cColSep ); 9097 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 9098 "extras ignored\n", 9099 sCtx.zFile, startLine, nCol, i); 9100 } 9101 if( i>=nCol ){ 9102 sqlite3_step(pStmt); 9103 rc = sqlite3_reset(pStmt); 9104 if( rc!=SQLITE_OK ){ 9105 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 9106 startLine, sqlite3_errmsg(p->db)); 9107 sCtx.nErr++; 9108 }else{ 9109 sCtx.nRow++; 9110 } 9111 } 9112 }while( sCtx.cTerm!=EOF ); 9113 9114 import_cleanup(&sCtx); 9115 sqlite3_finalize(pStmt); 9116 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 9117 if( eVerbose>0 ){ 9118 utf8_printf(p->out, 9119 "Added %d rows with %d errors using %d lines of input\n", 9120 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 9121 } 9122 }else 9123 9124#ifndef SQLITE_UNTESTABLE 9125 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 9126 char *zSql; 9127 char *zCollist = 0; 9128 sqlite3_stmt *pStmt; 9129 int tnum = 0; 9130 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 9131 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 9132 int i; 9133 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 9134 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 9135 " .imposter off\n"); 9136 /* Also allowed, but not documented: 9137 ** 9138 ** .imposter TABLE IMPOSTER 9139 ** 9140 ** where TABLE is a WITHOUT ROWID table. In that case, the 9141 ** imposter is another WITHOUT ROWID table with the columns in 9142 ** storage order. */ 9143 rc = 1; 9144 goto meta_command_exit; 9145 } 9146 open_db(p, 0); 9147 if( nArg==2 ){ 9148 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 9149 goto meta_command_exit; 9150 } 9151 zSql = sqlite3_mprintf( 9152 "SELECT rootpage, 0 FROM sqlite_schema" 9153 " WHERE name='%q' AND type='index'" 9154 "UNION ALL " 9155 "SELECT rootpage, 1 FROM sqlite_schema" 9156 " WHERE name='%q' AND type='table'" 9157 " AND sql LIKE '%%without%%rowid%%'", 9158 azArg[1], azArg[1] 9159 ); 9160 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9161 sqlite3_free(zSql); 9162 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 9163 tnum = sqlite3_column_int(pStmt, 0); 9164 isWO = sqlite3_column_int(pStmt, 1); 9165 } 9166 sqlite3_finalize(pStmt); 9167 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 9168 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9169 sqlite3_free(zSql); 9170 i = 0; 9171 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9172 char zLabel[20]; 9173 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 9174 i++; 9175 if( zCol==0 ){ 9176 if( sqlite3_column_int(pStmt,1)==-1 ){ 9177 zCol = "_ROWID_"; 9178 }else{ 9179 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 9180 zCol = zLabel; 9181 } 9182 } 9183 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 9184 lenPK = (int)strlen(zCollist); 9185 } 9186 if( zCollist==0 ){ 9187 zCollist = sqlite3_mprintf("\"%w\"", zCol); 9188 }else{ 9189 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 9190 } 9191 } 9192 sqlite3_finalize(pStmt); 9193 if( i==0 || tnum==0 ){ 9194 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 9195 rc = 1; 9196 sqlite3_free(zCollist); 9197 goto meta_command_exit; 9198 } 9199 if( lenPK==0 ) lenPK = 100000; 9200 zSql = sqlite3_mprintf( 9201 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 9202 azArg[2], zCollist, lenPK, zCollist); 9203 sqlite3_free(zCollist); 9204 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 9205 if( rc==SQLITE_OK ){ 9206 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 9207 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 9208 if( rc ){ 9209 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 9210 }else{ 9211 utf8_printf(stdout, "%s;\n", zSql); 9212 raw_printf(stdout, 9213 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 9214 azArg[1], isWO ? "table" : "index" 9215 ); 9216 } 9217 }else{ 9218 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 9219 rc = 1; 9220 } 9221 sqlite3_free(zSql); 9222 }else 9223#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 9224 9225#ifdef SQLITE_ENABLE_IOTRACE 9226 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 9227 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 9228 if( iotrace && iotrace!=stdout ) fclose(iotrace); 9229 iotrace = 0; 9230 if( nArg<2 ){ 9231 sqlite3IoTrace = 0; 9232 }else if( strcmp(azArg[1], "-")==0 ){ 9233 sqlite3IoTrace = iotracePrintf; 9234 iotrace = stdout; 9235 }else{ 9236 iotrace = fopen(azArg[1], "w"); 9237 if( iotrace==0 ){ 9238 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 9239 sqlite3IoTrace = 0; 9240 rc = 1; 9241 }else{ 9242 sqlite3IoTrace = iotracePrintf; 9243 } 9244 } 9245 }else 9246#endif 9247 9248 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 9249 static const struct { 9250 const char *zLimitName; /* Name of a limit */ 9251 int limitCode; /* Integer code for that limit */ 9252 } aLimit[] = { 9253 { "length", SQLITE_LIMIT_LENGTH }, 9254 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 9255 { "column", SQLITE_LIMIT_COLUMN }, 9256 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 9257 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 9258 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 9259 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 9260 { "attached", SQLITE_LIMIT_ATTACHED }, 9261 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 9262 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 9263 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 9264 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 9265 }; 9266 int i, n2; 9267 open_db(p, 0); 9268 if( nArg==1 ){ 9269 for(i=0; i<ArraySize(aLimit); i++){ 9270 printf("%20s %d\n", aLimit[i].zLimitName, 9271 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 9272 } 9273 }else if( nArg>3 ){ 9274 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 9275 rc = 1; 9276 goto meta_command_exit; 9277 }else{ 9278 int iLimit = -1; 9279 n2 = strlen30(azArg[1]); 9280 for(i=0; i<ArraySize(aLimit); i++){ 9281 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 9282 if( iLimit<0 ){ 9283 iLimit = i; 9284 }else{ 9285 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 9286 rc = 1; 9287 goto meta_command_exit; 9288 } 9289 } 9290 } 9291 if( iLimit<0 ){ 9292 utf8_printf(stderr, "unknown limit: \"%s\"\n" 9293 "enter \".limits\" with no arguments for a list.\n", 9294 azArg[1]); 9295 rc = 1; 9296 goto meta_command_exit; 9297 } 9298 if( nArg==3 ){ 9299 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 9300 (int)integerValue(azArg[2])); 9301 } 9302 printf("%20s %d\n", aLimit[iLimit].zLimitName, 9303 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 9304 } 9305 }else 9306 9307 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 9308 open_db(p, 0); 9309 lintDotCommand(p, azArg, nArg); 9310 }else 9311 9312#ifndef SQLITE_OMIT_LOAD_EXTENSION 9313 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 9314 const char *zFile, *zProc; 9315 char *zErrMsg = 0; 9316 failIfSafeMode(p, "cannot run .load in safe mode"); 9317 if( nArg<2 ){ 9318 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 9319 rc = 1; 9320 goto meta_command_exit; 9321 } 9322 zFile = azArg[1]; 9323 zProc = nArg>=3 ? azArg[2] : 0; 9324 open_db(p, 0); 9325 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 9326 if( rc!=SQLITE_OK ){ 9327 utf8_printf(stderr, "Error: %s\n", zErrMsg); 9328 sqlite3_free(zErrMsg); 9329 rc = 1; 9330 } 9331 }else 9332#endif 9333 9334 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 9335 failIfSafeMode(p, "cannot run .log in safe mode"); 9336 if( nArg!=2 ){ 9337 raw_printf(stderr, "Usage: .log FILENAME\n"); 9338 rc = 1; 9339 }else{ 9340 const char *zFile = azArg[1]; 9341 output_file_close(p->pLog); 9342 p->pLog = output_file_open(zFile, 0); 9343 } 9344 }else 9345 9346 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 9347 const char *zMode = 0; 9348 const char *zTabname = 0; 9349 int i, n2; 9350 ColModeOpts cmOpts = ColModeOpts_default; 9351 for(i=1; i<nArg; i++){ 9352 const char *z = azArg[i]; 9353 if( optionMatch(z,"wrap") && i+1<nArg ){ 9354 cmOpts.iWrap = integerValue(azArg[++i]); 9355 }else if( optionMatch(z,"ww") ){ 9356 cmOpts.bWordWrap = 1; 9357 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){ 9358 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]); 9359 }else if( optionMatch(z,"quote") ){ 9360 cmOpts.bQuote = 1; 9361 }else if( optionMatch(z,"noquote") ){ 9362 cmOpts.bQuote = 0; 9363 }else if( zMode==0 ){ 9364 zMode = z; 9365 /* Apply defaults for qbox pseudo-mods. If that 9366 * overwrites already-set values, user was informed of this. 9367 */ 9368 if( strcmp(z, "qbox")==0 ){ 9369 ColModeOpts cmo = ColModeOpts_default_qbox; 9370 zMode = "box"; 9371 cmOpts = cmo; 9372 } 9373 }else if( zTabname==0 ){ 9374 zTabname = z; 9375 }else if( z[0]=='-' ){ 9376 utf8_printf(stderr, "unknown option: %s\n", z); 9377 utf8_printf(stderr, "options:\n" 9378 " --noquote\n" 9379 " --quote\n" 9380 " --wordwrap on/off\n" 9381 " --wrap N\n" 9382 " --ww\n"); 9383 rc = 1; 9384 goto meta_command_exit; 9385 }else{ 9386 utf8_printf(stderr, "extra argument: \"%s\"\n", z); 9387 rc = 1; 9388 goto meta_command_exit; 9389 } 9390 } 9391 if( zMode==0 ){ 9392 if( p->mode==MODE_Column 9393 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box) 9394 ){ 9395 raw_printf 9396 (p->out, 9397 "current output mode: %s --wrap %d --wordwrap %s --%squote\n", 9398 modeDescr[p->mode], p->cmOpts.iWrap, 9399 p->cmOpts.bWordWrap ? "on" : "off", 9400 p->cmOpts.bQuote ? "" : "no"); 9401 }else{ 9402 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 9403 } 9404 zMode = modeDescr[p->mode]; 9405 } 9406 n2 = strlen30(zMode); 9407 if( strncmp(zMode,"lines",n2)==0 ){ 9408 p->mode = MODE_Line; 9409 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 9410 }else if( strncmp(zMode,"columns",n2)==0 ){ 9411 p->mode = MODE_Column; 9412 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 9413 p->showHeader = 1; 9414 } 9415 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 9416 p->cmOpts = cmOpts; 9417 }else if( strncmp(zMode,"list",n2)==0 ){ 9418 p->mode = MODE_List; 9419 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 9420 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 9421 }else if( strncmp(zMode,"html",n2)==0 ){ 9422 p->mode = MODE_Html; 9423 }else if( strncmp(zMode,"tcl",n2)==0 ){ 9424 p->mode = MODE_Tcl; 9425 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 9426 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 9427 }else if( strncmp(zMode,"csv",n2)==0 ){ 9428 p->mode = MODE_Csv; 9429 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 9430 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 9431 }else if( strncmp(zMode,"tabs",n2)==0 ){ 9432 p->mode = MODE_List; 9433 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 9434 }else if( strncmp(zMode,"insert",n2)==0 ){ 9435 p->mode = MODE_Insert; 9436 set_table_name(p, zTabname ? zTabname : "table"); 9437 }else if( strncmp(zMode,"quote",n2)==0 ){ 9438 p->mode = MODE_Quote; 9439 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 9440 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 9441 }else if( strncmp(zMode,"ascii",n2)==0 ){ 9442 p->mode = MODE_Ascii; 9443 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 9444 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 9445 }else if( strncmp(zMode,"markdown",n2)==0 ){ 9446 p->mode = MODE_Markdown; 9447 p->cmOpts = cmOpts; 9448 }else if( strncmp(zMode,"table",n2)==0 ){ 9449 p->mode = MODE_Table; 9450 p->cmOpts = cmOpts; 9451 }else if( strncmp(zMode,"box",n2)==0 ){ 9452 p->mode = MODE_Box; 9453 p->cmOpts = cmOpts; 9454 }else if( strncmp(zMode,"count",n2)==0 ){ 9455 p->mode = MODE_Count; 9456 }else if( strncmp(zMode,"off",n2)==0 ){ 9457 p->mode = MODE_Off; 9458 }else if( strncmp(zMode,"json",n2)==0 ){ 9459 p->mode = MODE_Json; 9460 }else{ 9461 raw_printf(stderr, "Error: mode should be one of: " 9462 "ascii box column csv html insert json line list markdown " 9463 "qbox quote table tabs tcl\n"); 9464 rc = 1; 9465 } 9466 p->cMode = p->mode; 9467 }else 9468 9469 if( c=='n' && strcmp(azArg[0], "nonce")==0 ){ 9470 if( nArg!=2 ){ 9471 raw_printf(stderr, "Usage: .nonce NONCE\n"); 9472 rc = 1; 9473 }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ 9474 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", 9475 p->lineno, azArg[1]); 9476 exit(1); 9477 }else{ 9478 p->bSafeMode = 0; 9479 return 0; /* Return immediately to bypass the safe mode reset 9480 ** at the end of this procedure */ 9481 } 9482 }else 9483 9484 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 9485 if( nArg==2 ){ 9486 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 9487 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 9488 }else{ 9489 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 9490 rc = 1; 9491 } 9492 }else 9493 9494 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 9495 const char *zFN = 0; /* Pointer to constant filename */ 9496 char *zNewFilename = 0; /* Name of the database file to open */ 9497 int iName = 1; /* Index in azArg[] of the filename */ 9498 int newFlag = 0; /* True to delete file before opening */ 9499 int openMode = SHELL_OPEN_UNSPEC; 9500 9501 /* Check for command-line arguments */ 9502 for(iName=1; iName<nArg; iName++){ 9503 const char *z = azArg[iName]; 9504 if( optionMatch(z,"new") ){ 9505 newFlag = 1; 9506#ifdef SQLITE_HAVE_ZLIB 9507 }else if( optionMatch(z, "zip") ){ 9508 openMode = SHELL_OPEN_ZIPFILE; 9509#endif 9510 }else if( optionMatch(z, "append") ){ 9511 openMode = SHELL_OPEN_APPENDVFS; 9512 }else if( optionMatch(z, "readonly") ){ 9513 openMode = SHELL_OPEN_READONLY; 9514 }else if( optionMatch(z, "nofollow") ){ 9515 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 9516#ifndef SQLITE_OMIT_DESERIALIZE 9517 }else if( optionMatch(z, "deserialize") ){ 9518 openMode = SHELL_OPEN_DESERIALIZE; 9519 }else if( optionMatch(z, "hexdb") ){ 9520 openMode = SHELL_OPEN_HEXDB; 9521 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 9522 p->szMax = integerValue(azArg[++iName]); 9523#endif /* SQLITE_OMIT_DESERIALIZE */ 9524 }else if( z[0]=='-' ){ 9525 utf8_printf(stderr, "unknown option: %s\n", z); 9526 rc = 1; 9527 goto meta_command_exit; 9528 }else if( zFN ){ 9529 utf8_printf(stderr, "extra argument: \"%s\"\n", z); 9530 rc = 1; 9531 goto meta_command_exit; 9532 }else{ 9533 zFN = z; 9534 } 9535 } 9536 9537 /* Close the existing database */ 9538 session_close_all(p, -1); 9539 close_db(p->db); 9540 p->db = 0; 9541 p->pAuxDb->zDbFilename = 0; 9542 sqlite3_free(p->pAuxDb->zFreeOnClose); 9543 p->pAuxDb->zFreeOnClose = 0; 9544 p->openMode = openMode; 9545 p->openFlags = 0; 9546 p->szMax = 0; 9547 9548 /* If a filename is specified, try to open it first */ 9549 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){ 9550 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN); 9551 if( p->bSafeMode 9552 && p->openMode!=SHELL_OPEN_HEXDB 9553 && zFN 9554 && strcmp(zFN,":memory:")!=0 9555 ){ 9556 failIfSafeMode(p, "cannot open disk-based database files in safe mode"); 9557 } 9558 if( zFN ){ 9559 zNewFilename = sqlite3_mprintf("%s", zFN); 9560 shell_check_oom(zNewFilename); 9561 }else{ 9562 zNewFilename = 0; 9563 } 9564 p->pAuxDb->zDbFilename = zNewFilename; 9565 open_db(p, OPEN_DB_KEEPALIVE); 9566 if( p->db==0 ){ 9567 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 9568 sqlite3_free(zNewFilename); 9569 }else{ 9570 p->pAuxDb->zFreeOnClose = zNewFilename; 9571 } 9572 } 9573 if( p->db==0 ){ 9574 /* As a fall-back open a TEMP database */ 9575 p->pAuxDb->zDbFilename = 0; 9576 open_db(p, 0); 9577 } 9578 }else 9579 9580 if( (c=='o' 9581 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 9582 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 9583 ){ 9584 char *zFile = 0; 9585 int bTxtMode = 0; 9586 int i; 9587 int eMode = 0; 9588 int bBOM = 0; 9589 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 9590 9591 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 9592 if( c=='e' ){ 9593 eMode = 'x'; 9594 bOnce = 2; 9595 }else if( strncmp(azArg[0],"once",n)==0 ){ 9596 bOnce = 1; 9597 } 9598 for(i=1; i<nArg; i++){ 9599 char *z = azArg[i]; 9600 if( z[0]=='-' ){ 9601 if( z[1]=='-' ) z++; 9602 if( strcmp(z,"-bom")==0 ){ 9603 bBOM = 1; 9604 }else if( c!='e' && strcmp(z,"-x")==0 ){ 9605 eMode = 'x'; /* spreadsheet */ 9606 }else if( c!='e' && strcmp(z,"-e")==0 ){ 9607 eMode = 'e'; /* text editor */ 9608 }else{ 9609 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 9610 azArg[i]); 9611 showHelp(p->out, azArg[0]); 9612 rc = 1; 9613 goto meta_command_exit; 9614 } 9615 }else if( zFile==0 && eMode!='e' && eMode!='x' ){ 9616 zFile = sqlite3_mprintf("%s", z); 9617 if( zFile && zFile[0]=='|' ){ 9618 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]); 9619 break; 9620 } 9621 }else{ 9622 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 9623 azArg[i]); 9624 showHelp(p->out, azArg[0]); 9625 rc = 1; 9626 sqlite3_free(zFile); 9627 goto meta_command_exit; 9628 } 9629 } 9630 if( zFile==0 ){ 9631 zFile = sqlite3_mprintf("stdout"); 9632 } 9633 if( bOnce ){ 9634 p->outCount = 2; 9635 }else{ 9636 p->outCount = 0; 9637 } 9638 output_reset(p); 9639#ifndef SQLITE_NOHAVE_SYSTEM 9640 if( eMode=='e' || eMode=='x' ){ 9641 p->doXdgOpen = 1; 9642 outputModePush(p); 9643 if( eMode=='x' ){ 9644 /* spreadsheet mode. Output as CSV. */ 9645 newTempFile(p, "csv"); 9646 ShellClearFlag(p, SHFLG_Echo); 9647 p->mode = MODE_Csv; 9648 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 9649 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 9650 }else{ 9651 /* text editor mode */ 9652 newTempFile(p, "txt"); 9653 bTxtMode = 1; 9654 } 9655 sqlite3_free(zFile); 9656 zFile = sqlite3_mprintf("%s", p->zTempFile); 9657 } 9658#endif /* SQLITE_NOHAVE_SYSTEM */ 9659 shell_check_oom(zFile); 9660 if( zFile[0]=='|' ){ 9661#ifdef SQLITE_OMIT_POPEN 9662 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9663 rc = 1; 9664 p->out = stdout; 9665#else 9666 p->out = popen(zFile + 1, "w"); 9667 if( p->out==0 ){ 9668 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 9669 p->out = stdout; 9670 rc = 1; 9671 }else{ 9672 if( bBOM ) fprintf(p->out,"\357\273\277"); 9673 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9674 } 9675#endif 9676 }else{ 9677 p->out = output_file_open(zFile, bTxtMode); 9678 if( p->out==0 ){ 9679 if( strcmp(zFile,"off")!=0 ){ 9680 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 9681 } 9682 p->out = stdout; 9683 rc = 1; 9684 } else { 9685 if( bBOM ) fprintf(p->out,"\357\273\277"); 9686 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 9687 } 9688 } 9689 sqlite3_free(zFile); 9690 }else 9691 9692 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 9693 open_db(p,0); 9694 if( nArg<=1 ) goto parameter_syntax_error; 9695 9696 /* .parameter clear 9697 ** Clear all bind parameters by dropping the TEMP table that holds them. 9698 */ 9699 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 9700 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 9701 0, 0, 0); 9702 }else 9703 9704 /* .parameter list 9705 ** List all bind parameters. 9706 */ 9707 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 9708 sqlite3_stmt *pStmt = 0; 9709 int rx; 9710 int len = 0; 9711 rx = sqlite3_prepare_v2(p->db, 9712 "SELECT max(length(key)) " 9713 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9714 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9715 len = sqlite3_column_int(pStmt, 0); 9716 if( len>40 ) len = 40; 9717 } 9718 sqlite3_finalize(pStmt); 9719 pStmt = 0; 9720 if( len ){ 9721 rx = sqlite3_prepare_v2(p->db, 9722 "SELECT key, quote(value) " 9723 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 9724 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 9725 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 9726 sqlite3_column_text(pStmt,1)); 9727 } 9728 sqlite3_finalize(pStmt); 9729 } 9730 }else 9731 9732 /* .parameter init 9733 ** Make sure the TEMP table used to hold bind parameters exists. 9734 ** Create it if necessary. 9735 */ 9736 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 9737 bind_table_init(p); 9738 }else 9739 9740 /* .parameter set NAME VALUE 9741 ** Set or reset a bind parameter. NAME should be the full parameter 9742 ** name exactly as it appears in the query. (ex: $abc, @def). The 9743 ** VALUE can be in either SQL literal notation, or if not it will be 9744 ** understood to be a text string. 9745 */ 9746 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 9747 int rx; 9748 char *zSql; 9749 sqlite3_stmt *pStmt; 9750 const char *zKey = azArg[2]; 9751 const char *zValue = azArg[3]; 9752 bind_table_init(p); 9753 zSql = sqlite3_mprintf( 9754 "REPLACE INTO temp.sqlite_parameters(key,value)" 9755 "VALUES(%Q,%s);", zKey, zValue); 9756 shell_check_oom(zSql); 9757 pStmt = 0; 9758 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9759 sqlite3_free(zSql); 9760 if( rx!=SQLITE_OK ){ 9761 sqlite3_finalize(pStmt); 9762 pStmt = 0; 9763 zSql = sqlite3_mprintf( 9764 "REPLACE INTO temp.sqlite_parameters(key,value)" 9765 "VALUES(%Q,%Q);", zKey, zValue); 9766 shell_check_oom(zSql); 9767 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 9768 sqlite3_free(zSql); 9769 if( rx!=SQLITE_OK ){ 9770 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 9771 sqlite3_finalize(pStmt); 9772 pStmt = 0; 9773 rc = 1; 9774 } 9775 } 9776 sqlite3_step(pStmt); 9777 sqlite3_finalize(pStmt); 9778 }else 9779 9780 /* .parameter unset NAME 9781 ** Remove the NAME binding from the parameter binding table, if it 9782 ** exists. 9783 */ 9784 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 9785 char *zSql = sqlite3_mprintf( 9786 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 9787 shell_check_oom(zSql); 9788 sqlite3_exec(p->db, zSql, 0, 0, 0); 9789 sqlite3_free(zSql); 9790 }else 9791 /* If no command name matches, show a syntax error */ 9792 parameter_syntax_error: 9793 showHelp(p->out, "parameter"); 9794 }else 9795 9796 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 9797 int i; 9798 for(i=1; i<nArg; i++){ 9799 if( i>1 ) raw_printf(p->out, " "); 9800 utf8_printf(p->out, "%s", azArg[i]); 9801 } 9802 raw_printf(p->out, "\n"); 9803 }else 9804 9805#ifndef SQLITE_OMIT_PROGRESS_CALLBACK 9806 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 9807 int i; 9808 int nn = 0; 9809 p->flgProgress = 0; 9810 p->mxProgress = 0; 9811 p->nProgress = 0; 9812 for(i=1; i<nArg; i++){ 9813 const char *z = azArg[i]; 9814 if( z[0]=='-' ){ 9815 z++; 9816 if( z[0]=='-' ) z++; 9817 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 9818 p->flgProgress |= SHELL_PROGRESS_QUIET; 9819 continue; 9820 } 9821 if( strcmp(z,"reset")==0 ){ 9822 p->flgProgress |= SHELL_PROGRESS_RESET; 9823 continue; 9824 } 9825 if( strcmp(z,"once")==0 ){ 9826 p->flgProgress |= SHELL_PROGRESS_ONCE; 9827 continue; 9828 } 9829 if( strcmp(z,"limit")==0 ){ 9830 if( i+1>=nArg ){ 9831 utf8_printf(stderr, "Error: missing argument on --limit\n"); 9832 rc = 1; 9833 goto meta_command_exit; 9834 }else{ 9835 p->mxProgress = (int)integerValue(azArg[++i]); 9836 } 9837 continue; 9838 } 9839 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 9840 rc = 1; 9841 goto meta_command_exit; 9842 }else{ 9843 nn = (int)integerValue(z); 9844 } 9845 } 9846 open_db(p, 0); 9847 sqlite3_progress_handler(p->db, nn, progress_handler, p); 9848 }else 9849#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 9850 9851 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 9852 if( nArg >= 2) { 9853 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 9854 } 9855 if( nArg >= 3) { 9856 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 9857 } 9858 }else 9859 9860 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 9861 rc = 2; 9862 }else 9863 9864 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 9865 FILE *inSaved = p->in; 9866 int savedLineno = p->lineno; 9867 failIfSafeMode(p, "cannot run .read in safe mode"); 9868 if( nArg!=2 ){ 9869 raw_printf(stderr, "Usage: .read FILE\n"); 9870 rc = 1; 9871 goto meta_command_exit; 9872 } 9873 if( azArg[1][0]=='|' ){ 9874#ifdef SQLITE_OMIT_POPEN 9875 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 9876 rc = 1; 9877 p->out = stdout; 9878#else 9879 p->in = popen(azArg[1]+1, "r"); 9880 if( p->in==0 ){ 9881 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 9882 rc = 1; 9883 }else{ 9884 rc = process_input(p); 9885 pclose(p->in); 9886 } 9887#endif 9888 }else if( (p->in = openChrSource(azArg[1]))==0 ){ 9889 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 9890 rc = 1; 9891 }else{ 9892 rc = process_input(p); 9893 fclose(p->in); 9894 } 9895 p->in = inSaved; 9896 p->lineno = savedLineno; 9897 }else 9898 9899 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 9900 const char *zSrcFile; 9901 const char *zDb; 9902 sqlite3 *pSrc; 9903 sqlite3_backup *pBackup; 9904 int nTimeout = 0; 9905 9906 failIfSafeMode(p, "cannot run .restore in safe mode"); 9907 if( nArg==2 ){ 9908 zSrcFile = azArg[1]; 9909 zDb = "main"; 9910 }else if( nArg==3 ){ 9911 zSrcFile = azArg[2]; 9912 zDb = azArg[1]; 9913 }else{ 9914 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 9915 rc = 1; 9916 goto meta_command_exit; 9917 } 9918 rc = sqlite3_open(zSrcFile, &pSrc); 9919 if( rc!=SQLITE_OK ){ 9920 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 9921 close_db(pSrc); 9922 return 1; 9923 } 9924 open_db(p, 0); 9925 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 9926 if( pBackup==0 ){ 9927 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9928 close_db(pSrc); 9929 return 1; 9930 } 9931 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 9932 || rc==SQLITE_BUSY ){ 9933 if( rc==SQLITE_BUSY ){ 9934 if( nTimeout++ >= 3 ) break; 9935 sqlite3_sleep(100); 9936 } 9937 } 9938 sqlite3_backup_finish(pBackup); 9939 if( rc==SQLITE_DONE ){ 9940 rc = 0; 9941 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 9942 raw_printf(stderr, "Error: source database is busy\n"); 9943 rc = 1; 9944 }else{ 9945 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 9946 rc = 1; 9947 } 9948 close_db(pSrc); 9949 }else 9950 9951 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 9952 if( nArg==2 ){ 9953 p->scanstatsOn = (u8)booleanValue(azArg[1]); 9954#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 9955 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 9956#endif 9957 }else{ 9958 raw_printf(stderr, "Usage: .scanstats on|off\n"); 9959 rc = 1; 9960 } 9961 }else 9962 9963 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 9964 ShellText sSelect; 9965 ShellState data; 9966 char *zErrMsg = 0; 9967 const char *zDiv = "("; 9968 const char *zName = 0; 9969 int iSchema = 0; 9970 int bDebug = 0; 9971 int bNoSystemTabs = 0; 9972 int ii; 9973 9974 open_db(p, 0); 9975 memcpy(&data, p, sizeof(data)); 9976 data.showHeader = 0; 9977 data.cMode = data.mode = MODE_Semi; 9978 initText(&sSelect); 9979 for(ii=1; ii<nArg; ii++){ 9980 if( optionMatch(azArg[ii],"indent") ){ 9981 data.cMode = data.mode = MODE_Pretty; 9982 }else if( optionMatch(azArg[ii],"debug") ){ 9983 bDebug = 1; 9984 }else if( optionMatch(azArg[ii],"nosys") ){ 9985 bNoSystemTabs = 1; 9986 }else if( azArg[ii][0]=='-' ){ 9987 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]); 9988 rc = 1; 9989 goto meta_command_exit; 9990 }else if( zName==0 ){ 9991 zName = azArg[ii]; 9992 }else{ 9993 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 9994 rc = 1; 9995 goto meta_command_exit; 9996 } 9997 } 9998 if( zName!=0 ){ 9999 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 10000 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 10001 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 10002 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 10003 if( isSchema ){ 10004 char *new_argv[2], *new_colv[2]; 10005 new_argv[0] = sqlite3_mprintf( 10006 "CREATE TABLE %s (\n" 10007 " type text,\n" 10008 " name text,\n" 10009 " tbl_name text,\n" 10010 " rootpage integer,\n" 10011 " sql text\n" 10012 ")", zName); 10013 shell_check_oom(new_argv[0]); 10014 new_argv[1] = 0; 10015 new_colv[0] = "sql"; 10016 new_colv[1] = 0; 10017 callback(&data, 1, new_argv, new_colv); 10018 sqlite3_free(new_argv[0]); 10019 } 10020 } 10021 if( zDiv ){ 10022 sqlite3_stmt *pStmt = 0; 10023 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 10024 -1, &pStmt, 0); 10025 if( rc ){ 10026 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 10027 sqlite3_finalize(pStmt); 10028 rc = 1; 10029 goto meta_command_exit; 10030 } 10031 appendText(&sSelect, "SELECT sql FROM", 0); 10032 iSchema = 0; 10033 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 10034 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 10035 char zScNum[30]; 10036 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 10037 appendText(&sSelect, zDiv, 0); 10038 zDiv = " UNION ALL "; 10039 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 10040 if( sqlite3_stricmp(zDb, "main")!=0 ){ 10041 appendText(&sSelect, zDb, '\''); 10042 }else{ 10043 appendText(&sSelect, "NULL", 0); 10044 } 10045 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 10046 appendText(&sSelect, zScNum, 0); 10047 appendText(&sSelect, " AS snum, ", 0); 10048 appendText(&sSelect, zDb, '\''); 10049 appendText(&sSelect, " AS sname FROM ", 0); 10050 appendText(&sSelect, zDb, quoteChar(zDb)); 10051 appendText(&sSelect, ".sqlite_schema", 0); 10052 } 10053 sqlite3_finalize(pStmt); 10054#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 10055 if( zName ){ 10056 appendText(&sSelect, 10057 " UNION ALL SELECT shell_module_schema(name)," 10058 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 10059 0); 10060 } 10061#endif 10062 appendText(&sSelect, ") WHERE ", 0); 10063 if( zName ){ 10064 char *zQarg = sqlite3_mprintf("%Q", zName); 10065 int bGlob; 10066 shell_check_oom(zQarg); 10067 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 10068 strchr(zName, '[') != 0; 10069 if( strchr(zName, '.') ){ 10070 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 10071 }else{ 10072 appendText(&sSelect, "lower(tbl_name)", 0); 10073 } 10074 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 10075 appendText(&sSelect, zQarg, 0); 10076 if( !bGlob ){ 10077 appendText(&sSelect, " ESCAPE '\\' ", 0); 10078 } 10079 appendText(&sSelect, " AND ", 0); 10080 sqlite3_free(zQarg); 10081 } 10082 if( bNoSystemTabs ){ 10083 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 10084 } 10085 appendText(&sSelect, "sql IS NOT NULL" 10086 " ORDER BY snum, rowid", 0); 10087 if( bDebug ){ 10088 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 10089 }else{ 10090 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 10091 } 10092 freeText(&sSelect); 10093 } 10094 if( zErrMsg ){ 10095 utf8_printf(stderr,"Error: %s\n", zErrMsg); 10096 sqlite3_free(zErrMsg); 10097 rc = 1; 10098 }else if( rc != SQLITE_OK ){ 10099 raw_printf(stderr,"Error: querying schema information\n"); 10100 rc = 1; 10101 }else{ 10102 rc = 0; 10103 } 10104 }else 10105 10106 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 10107 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 10108 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x); 10109 }else 10110 10111#if defined(SQLITE_ENABLE_SESSION) 10112 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 10113 struct AuxDb *pAuxDb = p->pAuxDb; 10114 OpenSession *pSession = &pAuxDb->aSession[0]; 10115 char **azCmd = &azArg[1]; 10116 int iSes = 0; 10117 int nCmd = nArg - 1; 10118 int i; 10119 if( nArg<=1 ) goto session_syntax_error; 10120 open_db(p, 0); 10121 if( nArg>=3 ){ 10122 for(iSes=0; iSes<pAuxDb->nSession; iSes++){ 10123 if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; 10124 } 10125 if( iSes<pAuxDb->nSession ){ 10126 pSession = &pAuxDb->aSession[iSes]; 10127 azCmd++; 10128 nCmd--; 10129 }else{ 10130 pSession = &pAuxDb->aSession[0]; 10131 iSes = 0; 10132 } 10133 } 10134 10135 /* .session attach TABLE 10136 ** Invoke the sqlite3session_attach() interface to attach a particular 10137 ** table so that it is never filtered. 10138 */ 10139 if( strcmp(azCmd[0],"attach")==0 ){ 10140 if( nCmd!=2 ) goto session_syntax_error; 10141 if( pSession->p==0 ){ 10142 session_not_open: 10143 raw_printf(stderr, "ERROR: No sessions are open\n"); 10144 }else{ 10145 rc = sqlite3session_attach(pSession->p, azCmd[1]); 10146 if( rc ){ 10147 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 10148 rc = 0; 10149 } 10150 } 10151 }else 10152 10153 /* .session changeset FILE 10154 ** .session patchset FILE 10155 ** Write a changeset or patchset into a file. The file is overwritten. 10156 */ 10157 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 10158 FILE *out = 0; 10159 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); 10160 if( nCmd!=2 ) goto session_syntax_error; 10161 if( pSession->p==0 ) goto session_not_open; 10162 out = fopen(azCmd[1], "wb"); 10163 if( out==0 ){ 10164 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 10165 azCmd[1]); 10166 }else{ 10167 int szChng; 10168 void *pChng; 10169 if( azCmd[0][0]=='c' ){ 10170 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 10171 }else{ 10172 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 10173 } 10174 if( rc ){ 10175 printf("Error: error code %d\n", rc); 10176 rc = 0; 10177 } 10178 if( pChng 10179 && fwrite(pChng, szChng, 1, out)!=1 ){ 10180 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 10181 szChng); 10182 } 10183 sqlite3_free(pChng); 10184 fclose(out); 10185 } 10186 }else 10187 10188 /* .session close 10189 ** Close the identified session 10190 */ 10191 if( strcmp(azCmd[0], "close")==0 ){ 10192 if( nCmd!=1 ) goto session_syntax_error; 10193 if( pAuxDb->nSession ){ 10194 session_close(pSession); 10195 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; 10196 } 10197 }else 10198 10199 /* .session enable ?BOOLEAN? 10200 ** Query or set the enable flag 10201 */ 10202 if( strcmp(azCmd[0], "enable")==0 ){ 10203 int ii; 10204 if( nCmd>2 ) goto session_syntax_error; 10205 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 10206 if( pAuxDb->nSession ){ 10207 ii = sqlite3session_enable(pSession->p, ii); 10208 utf8_printf(p->out, "session %s enable flag = %d\n", 10209 pSession->zName, ii); 10210 } 10211 }else 10212 10213 /* .session filter GLOB .... 10214 ** Set a list of GLOB patterns of table names to be excluded. 10215 */ 10216 if( strcmp(azCmd[0], "filter")==0 ){ 10217 int ii, nByte; 10218 if( nCmd<2 ) goto session_syntax_error; 10219 if( pAuxDb->nSession ){ 10220 for(ii=0; ii<pSession->nFilter; ii++){ 10221 sqlite3_free(pSession->azFilter[ii]); 10222 } 10223 sqlite3_free(pSession->azFilter); 10224 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 10225 pSession->azFilter = sqlite3_malloc( nByte ); 10226 if( pSession->azFilter==0 ){ 10227 raw_printf(stderr, "Error: out or memory\n"); 10228 exit(1); 10229 } 10230 for(ii=1; ii<nCmd; ii++){ 10231 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 10232 shell_check_oom(x); 10233 } 10234 pSession->nFilter = ii-1; 10235 } 10236 }else 10237 10238 /* .session indirect ?BOOLEAN? 10239 ** Query or set the indirect flag 10240 */ 10241 if( strcmp(azCmd[0], "indirect")==0 ){ 10242 int ii; 10243 if( nCmd>2 ) goto session_syntax_error; 10244 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 10245 if( pAuxDb->nSession ){ 10246 ii = sqlite3session_indirect(pSession->p, ii); 10247 utf8_printf(p->out, "session %s indirect flag = %d\n", 10248 pSession->zName, ii); 10249 } 10250 }else 10251 10252 /* .session isempty 10253 ** Determine if the session is empty 10254 */ 10255 if( strcmp(azCmd[0], "isempty")==0 ){ 10256 int ii; 10257 if( nCmd!=1 ) goto session_syntax_error; 10258 if( pAuxDb->nSession ){ 10259 ii = sqlite3session_isempty(pSession->p); 10260 utf8_printf(p->out, "session %s isempty flag = %d\n", 10261 pSession->zName, ii); 10262 } 10263 }else 10264 10265 /* .session list 10266 ** List all currently open sessions 10267 */ 10268 if( strcmp(azCmd[0],"list")==0 ){ 10269 for(i=0; i<pAuxDb->nSession; i++){ 10270 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName); 10271 } 10272 }else 10273 10274 /* .session open DB NAME 10275 ** Open a new session called NAME on the attached database DB. 10276 ** DB is normally "main". 10277 */ 10278 if( strcmp(azCmd[0],"open")==0 ){ 10279 char *zName; 10280 if( nCmd!=3 ) goto session_syntax_error; 10281 zName = azCmd[2]; 10282 if( zName[0]==0 ) goto session_syntax_error; 10283 for(i=0; i<pAuxDb->nSession; i++){ 10284 if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ 10285 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 10286 goto meta_command_exit; 10287 } 10288 } 10289 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ 10290 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); 10291 goto meta_command_exit; 10292 } 10293 pSession = &pAuxDb->aSession[pAuxDb->nSession]; 10294 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 10295 if( rc ){ 10296 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 10297 rc = 0; 10298 goto meta_command_exit; 10299 } 10300 pSession->nFilter = 0; 10301 sqlite3session_table_filter(pSession->p, session_filter, pSession); 10302 pAuxDb->nSession++; 10303 pSession->zName = sqlite3_mprintf("%s", zName); 10304 shell_check_oom(pSession->zName); 10305 }else 10306 /* If no command name matches, show a syntax error */ 10307 session_syntax_error: 10308 showHelp(p->out, "session"); 10309 }else 10310#endif 10311 10312#ifdef SQLITE_DEBUG 10313 /* Undocumented commands for internal testing. Subject to change 10314 ** without notice. */ 10315 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 10316 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 10317 int i, v; 10318 for(i=1; i<nArg; i++){ 10319 v = booleanValue(azArg[i]); 10320 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 10321 } 10322 } 10323 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 10324 int i; sqlite3_int64 v; 10325 for(i=1; i<nArg; i++){ 10326 char zBuf[200]; 10327 v = integerValue(azArg[i]); 10328 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 10329 utf8_printf(p->out, "%s", zBuf); 10330 } 10331 } 10332 }else 10333#endif 10334 10335 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 10336 int bIsInit = 0; /* True to initialize the SELFTEST table */ 10337 int bVerbose = 0; /* Verbose output */ 10338 int bSelftestExists; /* True if SELFTEST already exists */ 10339 int i, k; /* Loop counters */ 10340 int nTest = 0; /* Number of tests runs */ 10341 int nErr = 0; /* Number of errors seen */ 10342 ShellText str; /* Answer for a query */ 10343 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 10344 10345 open_db(p,0); 10346 for(i=1; i<nArg; i++){ 10347 const char *z = azArg[i]; 10348 if( z[0]=='-' && z[1]=='-' ) z++; 10349 if( strcmp(z,"-init")==0 ){ 10350 bIsInit = 1; 10351 }else 10352 if( strcmp(z,"-v")==0 ){ 10353 bVerbose++; 10354 }else 10355 { 10356 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 10357 azArg[i], azArg[0]); 10358 raw_printf(stderr, "Should be one of: --init -v\n"); 10359 rc = 1; 10360 goto meta_command_exit; 10361 } 10362 } 10363 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 10364 != SQLITE_OK ){ 10365 bSelftestExists = 0; 10366 }else{ 10367 bSelftestExists = 1; 10368 } 10369 if( bIsInit ){ 10370 createSelftestTable(p); 10371 bSelftestExists = 1; 10372 } 10373 initText(&str); 10374 appendText(&str, "x", 0); 10375 for(k=bSelftestExists; k>=0; k--){ 10376 if( k==1 ){ 10377 rc = sqlite3_prepare_v2(p->db, 10378 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 10379 -1, &pStmt, 0); 10380 }else{ 10381 rc = sqlite3_prepare_v2(p->db, 10382 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 10383 " (1,'run','PRAGMA integrity_check','ok')", 10384 -1, &pStmt, 0); 10385 } 10386 if( rc ){ 10387 raw_printf(stderr, "Error querying the selftest table\n"); 10388 rc = 1; 10389 sqlite3_finalize(pStmt); 10390 goto meta_command_exit; 10391 } 10392 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 10393 int tno = sqlite3_column_int(pStmt, 0); 10394 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 10395 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 10396 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 10397 10398 if( zOp==0 ) continue; 10399 if( zSql==0 ) continue; 10400 if( zAns==0 ) continue; 10401 k = 0; 10402 if( bVerbose>0 ){ 10403 printf("%d: %s %s\n", tno, zOp, zSql); 10404 } 10405 if( strcmp(zOp,"memo")==0 ){ 10406 utf8_printf(p->out, "%s\n", zSql); 10407 }else 10408 if( strcmp(zOp,"run")==0 ){ 10409 char *zErrMsg = 0; 10410 str.n = 0; 10411 str.z[0] = 0; 10412 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 10413 nTest++; 10414 if( bVerbose ){ 10415 utf8_printf(p->out, "Result: %s\n", str.z); 10416 } 10417 if( rc || zErrMsg ){ 10418 nErr++; 10419 rc = 1; 10420 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 10421 sqlite3_free(zErrMsg); 10422 }else if( strcmp(zAns,str.z)!=0 ){ 10423 nErr++; 10424 rc = 1; 10425 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 10426 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 10427 } 10428 }else 10429 { 10430 utf8_printf(stderr, 10431 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 10432 rc = 1; 10433 break; 10434 } 10435 } /* End loop over rows of content from SELFTEST */ 10436 sqlite3_finalize(pStmt); 10437 } /* End loop over k */ 10438 freeText(&str); 10439 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 10440 }else 10441 10442 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 10443 if( nArg<2 || nArg>3 ){ 10444 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 10445 rc = 1; 10446 } 10447 if( nArg>=2 ){ 10448 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 10449 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 10450 } 10451 if( nArg>=3 ){ 10452 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 10453 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 10454 } 10455 }else 10456 10457 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 10458 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 10459 int i; /* Loop counter */ 10460 int bSchema = 0; /* Also hash the schema */ 10461 int bSeparate = 0; /* Hash each table separately */ 10462 int iSize = 224; /* Hash algorithm to use */ 10463 int bDebug = 0; /* Only show the query that would have run */ 10464 sqlite3_stmt *pStmt; /* For querying tables names */ 10465 char *zSql; /* SQL to be run */ 10466 char *zSep; /* Separator */ 10467 ShellText sSql; /* Complete SQL for the query to run the hash */ 10468 ShellText sQuery; /* Set of queries used to read all content */ 10469 open_db(p, 0); 10470 for(i=1; i<nArg; i++){ 10471 const char *z = azArg[i]; 10472 if( z[0]=='-' ){ 10473 z++; 10474 if( z[0]=='-' ) z++; 10475 if( strcmp(z,"schema")==0 ){ 10476 bSchema = 1; 10477 }else 10478 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 10479 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 10480 ){ 10481 iSize = atoi(&z[5]); 10482 }else 10483 if( strcmp(z,"debug")==0 ){ 10484 bDebug = 1; 10485 }else 10486 { 10487 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 10488 azArg[i], azArg[0]); 10489 showHelp(p->out, azArg[0]); 10490 rc = 1; 10491 goto meta_command_exit; 10492 } 10493 }else if( zLike ){ 10494 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 10495 rc = 1; 10496 goto meta_command_exit; 10497 }else{ 10498 zLike = z; 10499 bSeparate = 1; 10500 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 10501 } 10502 } 10503 if( bSchema ){ 10504 zSql = "SELECT lower(name) FROM sqlite_schema" 10505 " WHERE type='table' AND coalesce(rootpage,0)>1" 10506 " UNION ALL SELECT 'sqlite_schema'" 10507 " ORDER BY 1 collate nocase"; 10508 }else{ 10509 zSql = "SELECT lower(name) FROM sqlite_schema" 10510 " WHERE type='table' AND coalesce(rootpage,0)>1" 10511 " AND name NOT LIKE 'sqlite_%'" 10512 " ORDER BY 1 collate nocase"; 10513 } 10514 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 10515 initText(&sQuery); 10516 initText(&sSql); 10517 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 10518 zSep = "VALUES("; 10519 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 10520 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 10521 if( zTab==0 ) continue; 10522 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 10523 if( strncmp(zTab, "sqlite_",7)!=0 ){ 10524 appendText(&sQuery,"SELECT * FROM ", 0); 10525 appendText(&sQuery,zTab,'"'); 10526 appendText(&sQuery," NOT INDEXED;", 0); 10527 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 10528 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 10529 " ORDER BY name;", 0); 10530 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 10531 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 10532 " ORDER BY name;", 0); 10533 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 10534 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 10535 " ORDER BY tbl,idx;", 0); 10536 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 10537 appendText(&sQuery, "SELECT * FROM ", 0); 10538 appendText(&sQuery, zTab, 0); 10539 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 10540 } 10541 appendText(&sSql, zSep, 0); 10542 appendText(&sSql, sQuery.z, '\''); 10543 sQuery.n = 0; 10544 appendText(&sSql, ",", 0); 10545 appendText(&sSql, zTab, '\''); 10546 zSep = "),("; 10547 } 10548 sqlite3_finalize(pStmt); 10549 if( bSeparate ){ 10550 zSql = sqlite3_mprintf( 10551 "%s))" 10552 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 10553 " FROM [sha3sum$query]", 10554 sSql.z, iSize); 10555 }else{ 10556 zSql = sqlite3_mprintf( 10557 "%s))" 10558 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 10559 " FROM [sha3sum$query]", 10560 sSql.z, iSize); 10561 } 10562 shell_check_oom(zSql); 10563 freeText(&sQuery); 10564 freeText(&sSql); 10565 if( bDebug ){ 10566 utf8_printf(p->out, "%s\n", zSql); 10567 }else{ 10568 shell_exec(p, zSql, 0); 10569 } 10570 sqlite3_free(zSql); 10571 }else 10572 10573#ifndef SQLITE_NOHAVE_SYSTEM 10574 if( c=='s' 10575 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 10576 ){ 10577 char *zCmd; 10578 int i, x; 10579 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 10580 if( nArg<2 ){ 10581 raw_printf(stderr, "Usage: .system COMMAND\n"); 10582 rc = 1; 10583 goto meta_command_exit; 10584 } 10585 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 10586 for(i=2; i<nArg && zCmd!=0; i++){ 10587 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 10588 zCmd, azArg[i]); 10589 } 10590 x = zCmd!=0 ? system(zCmd) : 1; 10591 sqlite3_free(zCmd); 10592 if( x ) raw_printf(stderr, "System command returns %d\n", x); 10593 }else 10594#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 10595 10596 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 10597 static const char *azBool[] = { "off", "on", "trigger", "full"}; 10598 const char *zOut; 10599 int i; 10600 if( nArg!=1 ){ 10601 raw_printf(stderr, "Usage: .show\n"); 10602 rc = 1; 10603 goto meta_command_exit; 10604 } 10605 utf8_printf(p->out, "%12.12s: %s\n","echo", 10606 azBool[ShellHasFlag(p, SHFLG_Echo)]); 10607 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 10608 utf8_printf(p->out, "%12.12s: %s\n","explain", 10609 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 10610 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 10611 if( p->mode==MODE_Column 10612 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box) 10613 ){ 10614 utf8_printf 10615 (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode", 10616 modeDescr[p->mode], p->cmOpts.iWrap, 10617 p->cmOpts.bWordWrap ? "on" : "off", 10618 p->cmOpts.bQuote ? "" : "no"); 10619 }else{ 10620 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 10621 } 10622 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 10623 output_c_string(p->out, p->nullValue); 10624 raw_printf(p->out, "\n"); 10625 utf8_printf(p->out,"%12.12s: %s\n","output", 10626 strlen30(p->outfile) ? p->outfile : "stdout"); 10627 utf8_printf(p->out,"%12.12s: ", "colseparator"); 10628 output_c_string(p->out, p->colSeparator); 10629 raw_printf(p->out, "\n"); 10630 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 10631 output_c_string(p->out, p->rowSeparator); 10632 raw_printf(p->out, "\n"); 10633 switch( p->statsOn ){ 10634 case 0: zOut = "off"; break; 10635 default: zOut = "on"; break; 10636 case 2: zOut = "stmt"; break; 10637 case 3: zOut = "vmstep"; break; 10638 } 10639 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut); 10640 utf8_printf(p->out, "%12.12s: ", "width"); 10641 for (i=0;i<p->nWidth;i++) { 10642 raw_printf(p->out, "%d ", p->colWidth[i]); 10643 } 10644 raw_printf(p->out, "\n"); 10645 utf8_printf(p->out, "%12.12s: %s\n", "filename", 10646 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); 10647 }else 10648 10649 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 10650 if( nArg==2 ){ 10651 if( strcmp(azArg[1],"stmt")==0 ){ 10652 p->statsOn = 2; 10653 }else if( strcmp(azArg[1],"vmstep")==0 ){ 10654 p->statsOn = 3; 10655 }else{ 10656 p->statsOn = (u8)booleanValue(azArg[1]); 10657 } 10658 }else if( nArg==1 ){ 10659 display_stats(p->db, p, 0); 10660 }else{ 10661 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n"); 10662 rc = 1; 10663 } 10664 }else 10665 10666 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 10667 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 10668 || strncmp(azArg[0], "indexes", n)==0) ) 10669 ){ 10670 sqlite3_stmt *pStmt; 10671 char **azResult; 10672 int nRow, nAlloc; 10673 int ii; 10674 ShellText s; 10675 initText(&s); 10676 open_db(p, 0); 10677 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 10678 if( rc ){ 10679 sqlite3_finalize(pStmt); 10680 return shellDatabaseError(p->db); 10681 } 10682 10683 if( nArg>2 && c=='i' ){ 10684 /* It is an historical accident that the .indexes command shows an error 10685 ** when called with the wrong number of arguments whereas the .tables 10686 ** command does not. */ 10687 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 10688 rc = 1; 10689 sqlite3_finalize(pStmt); 10690 goto meta_command_exit; 10691 } 10692 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 10693 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 10694 if( zDbName==0 ) continue; 10695 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 10696 if( sqlite3_stricmp(zDbName, "main")==0 ){ 10697 appendText(&s, "SELECT name FROM ", 0); 10698 }else{ 10699 appendText(&s, "SELECT ", 0); 10700 appendText(&s, zDbName, '\''); 10701 appendText(&s, "||'.'||name FROM ", 0); 10702 } 10703 appendText(&s, zDbName, '"'); 10704 appendText(&s, ".sqlite_schema ", 0); 10705 if( c=='t' ){ 10706 appendText(&s," WHERE type IN ('table','view')" 10707 " AND name NOT LIKE 'sqlite_%'" 10708 " AND name LIKE ?1", 0); 10709 }else{ 10710 appendText(&s," WHERE type='index'" 10711 " AND tbl_name LIKE ?1", 0); 10712 } 10713 } 10714 rc = sqlite3_finalize(pStmt); 10715 if( rc==SQLITE_OK ){ 10716 appendText(&s, " ORDER BY 1", 0); 10717 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 10718 } 10719 freeText(&s); 10720 if( rc ) return shellDatabaseError(p->db); 10721 10722 /* Run the SQL statement prepared by the above block. Store the results 10723 ** as an array of nul-terminated strings in azResult[]. */ 10724 nRow = nAlloc = 0; 10725 azResult = 0; 10726 if( nArg>1 ){ 10727 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 10728 }else{ 10729 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 10730 } 10731 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 10732 if( nRow>=nAlloc ){ 10733 char **azNew; 10734 int n2 = nAlloc*2 + 10; 10735 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 10736 shell_check_oom(azNew); 10737 nAlloc = n2; 10738 azResult = azNew; 10739 } 10740 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 10741 shell_check_oom(azResult[nRow]); 10742 nRow++; 10743 } 10744 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 10745 rc = shellDatabaseError(p->db); 10746 } 10747 10748 /* Pretty-print the contents of array azResult[] to the output */ 10749 if( rc==0 && nRow>0 ){ 10750 int len, maxlen = 0; 10751 int i, j; 10752 int nPrintCol, nPrintRow; 10753 for(i=0; i<nRow; i++){ 10754 len = strlen30(azResult[i]); 10755 if( len>maxlen ) maxlen = len; 10756 } 10757 nPrintCol = 80/(maxlen+2); 10758 if( nPrintCol<1 ) nPrintCol = 1; 10759 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 10760 for(i=0; i<nPrintRow; i++){ 10761 for(j=i; j<nRow; j+=nPrintRow){ 10762 char *zSp = j<nPrintRow ? "" : " "; 10763 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 10764 azResult[j] ? azResult[j]:""); 10765 } 10766 raw_printf(p->out, "\n"); 10767 } 10768 } 10769 10770 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 10771 sqlite3_free(azResult); 10772 }else 10773 10774 /* Begin redirecting output to the file "testcase-out.txt" */ 10775 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 10776 output_reset(p); 10777 p->out = output_file_open("testcase-out.txt", 0); 10778 if( p->out==0 ){ 10779 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 10780 } 10781 if( nArg>=2 ){ 10782 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 10783 }else{ 10784 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 10785 } 10786 }else 10787 10788#ifndef SQLITE_UNTESTABLE 10789 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 10790 static const struct { 10791 const char *zCtrlName; /* Name of a test-control option */ 10792 int ctrlCode; /* Integer code for that option */ 10793 int unSafe; /* Not valid for --safe mode */ 10794 const char *zUsage; /* Usage notes */ 10795 } aCtrl[] = { 10796 { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" }, 10797 { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" }, 10798 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/ 10799 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/ 10800 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" }, 10801 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" }, 10802 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/ 10803 { "imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, 10804 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, 10805 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, 10806 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, 10807 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, 10808#ifdef YYCOVERAGE 10809 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" }, 10810#endif 10811 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " }, 10812 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" }, 10813 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" }, 10814 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" }, 10815 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" }, 10816 { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" }, 10817 { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" }, 10818 }; 10819 int testctrl = -1; 10820 int iCtrl = -1; 10821 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 10822 int isOk = 0; 10823 int i, n2; 10824 const char *zCmd = 0; 10825 10826 open_db(p, 0); 10827 zCmd = nArg>=2 ? azArg[1] : "help"; 10828 10829 /* The argument can optionally begin with "-" or "--" */ 10830 if( zCmd[0]=='-' && zCmd[1] ){ 10831 zCmd++; 10832 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 10833 } 10834 10835 /* --help lists all test-controls */ 10836 if( strcmp(zCmd,"help")==0 ){ 10837 utf8_printf(p->out, "Available test-controls:\n"); 10838 for(i=0; i<ArraySize(aCtrl); i++){ 10839 utf8_printf(p->out, " .testctrl %s %s\n", 10840 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 10841 } 10842 rc = 1; 10843 goto meta_command_exit; 10844 } 10845 10846 /* convert testctrl text option to value. allow any unique prefix 10847 ** of the option name, or a numerical value. */ 10848 n2 = strlen30(zCmd); 10849 for(i=0; i<ArraySize(aCtrl); i++){ 10850 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 10851 if( testctrl<0 ){ 10852 testctrl = aCtrl[i].ctrlCode; 10853 iCtrl = i; 10854 }else{ 10855 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 10856 "Use \".testctrl --help\" for help\n", zCmd); 10857 rc = 1; 10858 goto meta_command_exit; 10859 } 10860 } 10861 } 10862 if( testctrl<0 ){ 10863 utf8_printf(stderr,"Error: unknown test-control: %s\n" 10864 "Use \".testctrl --help\" for help\n", zCmd); 10865 }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){ 10866 utf8_printf(stderr, 10867 "line %d: \".testctrl %s\" may not be used in safe mode\n", 10868 p->lineno, aCtrl[iCtrl].zCtrlName); 10869 exit(1); 10870 }else{ 10871 switch(testctrl){ 10872 10873 /* sqlite3_test_control(int, db, int) */ 10874 case SQLITE_TESTCTRL_OPTIMIZATIONS: 10875 if( nArg==3 ){ 10876 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0); 10877 rc2 = sqlite3_test_control(testctrl, p->db, opt); 10878 isOk = 3; 10879 } 10880 break; 10881 10882 /* sqlite3_test_control(int) */ 10883 case SQLITE_TESTCTRL_PRNG_SAVE: 10884 case SQLITE_TESTCTRL_PRNG_RESTORE: 10885 case SQLITE_TESTCTRL_BYTEORDER: 10886 if( nArg==2 ){ 10887 rc2 = sqlite3_test_control(testctrl); 10888 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 10889 } 10890 break; 10891 10892 /* sqlite3_test_control(int, uint) */ 10893 case SQLITE_TESTCTRL_PENDING_BYTE: 10894 if( nArg==3 ){ 10895 unsigned int opt = (unsigned int)integerValue(azArg[2]); 10896 rc2 = sqlite3_test_control(testctrl, opt); 10897 isOk = 3; 10898 } 10899 break; 10900 10901 /* sqlite3_test_control(int, int, sqlite3*) */ 10902 case SQLITE_TESTCTRL_PRNG_SEED: 10903 if( nArg==3 || nArg==4 ){ 10904 int ii = (int)integerValue(azArg[2]); 10905 sqlite3 *db; 10906 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 10907 sqlite3_randomness(sizeof(ii),&ii); 10908 printf("-- random seed: %d\n", ii); 10909 } 10910 if( nArg==3 ){ 10911 db = 0; 10912 }else{ 10913 db = p->db; 10914 /* Make sure the schema has been loaded */ 10915 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 10916 } 10917 rc2 = sqlite3_test_control(testctrl, ii, db); 10918 isOk = 3; 10919 } 10920 break; 10921 10922 /* sqlite3_test_control(int, int) */ 10923 case SQLITE_TESTCTRL_ASSERT: 10924 case SQLITE_TESTCTRL_ALWAYS: 10925 if( nArg==3 ){ 10926 int opt = booleanValue(azArg[2]); 10927 rc2 = sqlite3_test_control(testctrl, opt); 10928 isOk = 1; 10929 } 10930 break; 10931 10932 /* sqlite3_test_control(int, int) */ 10933 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 10934 case SQLITE_TESTCTRL_NEVER_CORRUPT: 10935 if( nArg==3 ){ 10936 int opt = booleanValue(azArg[2]); 10937 rc2 = sqlite3_test_control(testctrl, opt); 10938 isOk = 3; 10939 } 10940 break; 10941 10942 /* sqlite3_test_control(sqlite3*) */ 10943 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 10944 rc2 = sqlite3_test_control(testctrl, p->db); 10945 isOk = 3; 10946 break; 10947 10948 case SQLITE_TESTCTRL_IMPOSTER: 10949 if( nArg==5 ){ 10950 rc2 = sqlite3_test_control(testctrl, p->db, 10951 azArg[2], 10952 integerValue(azArg[3]), 10953 integerValue(azArg[4])); 10954 isOk = 3; 10955 } 10956 break; 10957 10958 case SQLITE_TESTCTRL_SEEK_COUNT: { 10959 u64 x = 0; 10960 rc2 = sqlite3_test_control(testctrl, p->db, &x); 10961 utf8_printf(p->out, "%llu\n", x); 10962 isOk = 3; 10963 break; 10964 } 10965 10966#ifdef YYCOVERAGE 10967 case SQLITE_TESTCTRL_PARSER_COVERAGE: { 10968 if( nArg==2 ){ 10969 sqlite3_test_control(testctrl, p->out); 10970 isOk = 3; 10971 } 10972 break; 10973 } 10974#endif 10975#ifdef SQLITE_DEBUG 10976 case SQLITE_TESTCTRL_TUNE: { 10977 if( nArg==4 ){ 10978 int id = (int)integerValue(azArg[2]); 10979 int val = (int)integerValue(azArg[3]); 10980 sqlite3_test_control(testctrl, id, &val); 10981 isOk = 3; 10982 }else if( nArg==3 ){ 10983 int id = (int)integerValue(azArg[2]); 10984 sqlite3_test_control(testctrl, -id, &rc2); 10985 isOk = 1; 10986 }else if( nArg==2 ){ 10987 int id = 1; 10988 while(1){ 10989 int val = 0; 10990 rc2 = sqlite3_test_control(testctrl, -id, &val); 10991 if( rc2!=SQLITE_OK ) break; 10992 if( id>1 ) utf8_printf(p->out, " "); 10993 utf8_printf(p->out, "%d: %d", id, val); 10994 id++; 10995 } 10996 if( id>1 ) utf8_printf(p->out, "\n"); 10997 isOk = 3; 10998 } 10999 break; 11000 } 11001#endif 11002 case SQLITE_TESTCTRL_SORTER_MMAP: 11003 if( nArg==3 ){ 11004 int opt = (unsigned int)integerValue(azArg[2]); 11005 rc2 = sqlite3_test_control(testctrl, p->db, opt); 11006 isOk = 3; 11007 } 11008 break; 11009 } 11010 } 11011 if( isOk==0 && iCtrl>=0 ){ 11012 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 11013 rc = 1; 11014 }else if( isOk==1 ){ 11015 raw_printf(p->out, "%d\n", rc2); 11016 }else if( isOk==2 ){ 11017 raw_printf(p->out, "0x%08x\n", rc2); 11018 } 11019 }else 11020#endif /* !defined(SQLITE_UNTESTABLE) */ 11021 11022 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 11023 open_db(p, 0); 11024 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 11025 }else 11026 11027 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 11028 if( nArg==2 ){ 11029 enableTimer = booleanValue(azArg[1]); 11030 if( enableTimer && !HAS_TIMER ){ 11031 raw_printf(stderr, "Error: timer not available on this system.\n"); 11032 enableTimer = 0; 11033 } 11034 }else{ 11035 raw_printf(stderr, "Usage: .timer on|off\n"); 11036 rc = 1; 11037 } 11038 }else 11039 11040#ifndef SQLITE_OMIT_TRACE 11041 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 11042 int mType = 0; 11043 int jj; 11044 open_db(p, 0); 11045 for(jj=1; jj<nArg; jj++){ 11046 const char *z = azArg[jj]; 11047 if( z[0]=='-' ){ 11048 if( optionMatch(z, "expanded") ){ 11049 p->eTraceType = SHELL_TRACE_EXPANDED; 11050 } 11051#ifdef SQLITE_ENABLE_NORMALIZE 11052 else if( optionMatch(z, "normalized") ){ 11053 p->eTraceType = SHELL_TRACE_NORMALIZED; 11054 } 11055#endif 11056 else if( optionMatch(z, "plain") ){ 11057 p->eTraceType = SHELL_TRACE_PLAIN; 11058 } 11059 else if( optionMatch(z, "profile") ){ 11060 mType |= SQLITE_TRACE_PROFILE; 11061 } 11062 else if( optionMatch(z, "row") ){ 11063 mType |= SQLITE_TRACE_ROW; 11064 } 11065 else if( optionMatch(z, "stmt") ){ 11066 mType |= SQLITE_TRACE_STMT; 11067 } 11068 else if( optionMatch(z, "close") ){ 11069 mType |= SQLITE_TRACE_CLOSE; 11070 } 11071 else { 11072 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 11073 rc = 1; 11074 goto meta_command_exit; 11075 } 11076 }else{ 11077 output_file_close(p->traceOut); 11078 p->traceOut = output_file_open(azArg[1], 0); 11079 } 11080 } 11081 if( p->traceOut==0 ){ 11082 sqlite3_trace_v2(p->db, 0, 0, 0); 11083 }else{ 11084 if( mType==0 ) mType = SQLITE_TRACE_STMT; 11085 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 11086 } 11087 }else 11088#endif /* !defined(SQLITE_OMIT_TRACE) */ 11089 11090#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 11091 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 11092 int ii; 11093 int lenOpt; 11094 char *zOpt; 11095 if( nArg<2 ){ 11096 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 11097 rc = 1; 11098 goto meta_command_exit; 11099 } 11100 open_db(p, 0); 11101 zOpt = azArg[1]; 11102 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 11103 lenOpt = (int)strlen(zOpt); 11104 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 11105 assert( azArg[nArg]==0 ); 11106 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 11107 }else{ 11108 for(ii=1; ii<nArg; ii++){ 11109 sqlite3_create_module(p->db, azArg[ii], 0, 0); 11110 } 11111 } 11112 }else 11113#endif 11114 11115#if SQLITE_USER_AUTHENTICATION 11116 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 11117 if( nArg<2 ){ 11118 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 11119 rc = 1; 11120 goto meta_command_exit; 11121 } 11122 open_db(p, 0); 11123 if( strcmp(azArg[1],"login")==0 ){ 11124 if( nArg!=4 ){ 11125 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 11126 rc = 1; 11127 goto meta_command_exit; 11128 } 11129 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 11130 strlen30(azArg[3])); 11131 if( rc ){ 11132 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 11133 rc = 1; 11134 } 11135 }else if( strcmp(azArg[1],"add")==0 ){ 11136 if( nArg!=5 ){ 11137 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 11138 rc = 1; 11139 goto meta_command_exit; 11140 } 11141 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 11142 booleanValue(azArg[4])); 11143 if( rc ){ 11144 raw_printf(stderr, "User-Add failed: %d\n", rc); 11145 rc = 1; 11146 } 11147 }else if( strcmp(azArg[1],"edit")==0 ){ 11148 if( nArg!=5 ){ 11149 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 11150 rc = 1; 11151 goto meta_command_exit; 11152 } 11153 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 11154 booleanValue(azArg[4])); 11155 if( rc ){ 11156 raw_printf(stderr, "User-Edit failed: %d\n", rc); 11157 rc = 1; 11158 } 11159 }else if( strcmp(azArg[1],"delete")==0 ){ 11160 if( nArg!=3 ){ 11161 raw_printf(stderr, "Usage: .user delete USER\n"); 11162 rc = 1; 11163 goto meta_command_exit; 11164 } 11165 rc = sqlite3_user_delete(p->db, azArg[2]); 11166 if( rc ){ 11167 raw_printf(stderr, "User-Delete failed: %d\n", rc); 11168 rc = 1; 11169 } 11170 }else{ 11171 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 11172 rc = 1; 11173 goto meta_command_exit; 11174 } 11175 }else 11176#endif /* SQLITE_USER_AUTHENTICATION */ 11177 11178 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 11179 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 11180 sqlite3_libversion(), sqlite3_sourceid()); 11181#if SQLITE_HAVE_ZLIB 11182 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 11183#endif 11184#define CTIMEOPT_VAL_(opt) #opt 11185#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 11186#if defined(__clang__) && defined(__clang_major__) 11187 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 11188 CTIMEOPT_VAL(__clang_minor__) "." 11189 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 11190#elif defined(_MSC_VER) 11191 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 11192#elif defined(__GNUC__) && defined(__VERSION__) 11193 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 11194#endif 11195 }else 11196 11197 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 11198 const char *zDbName = nArg==2 ? azArg[1] : "main"; 11199 sqlite3_vfs *pVfs = 0; 11200 if( p->db ){ 11201 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 11202 if( pVfs ){ 11203 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 11204 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 11205 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 11206 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 11207 } 11208 } 11209 }else 11210 11211 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 11212 sqlite3_vfs *pVfs; 11213 sqlite3_vfs *pCurrent = 0; 11214 if( p->db ){ 11215 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 11216 } 11217 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 11218 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 11219 pVfs==pCurrent ? " <--- CURRENT" : ""); 11220 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 11221 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 11222 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 11223 if( pVfs->pNext ){ 11224 raw_printf(p->out, "-----------------------------------\n"); 11225 } 11226 } 11227 }else 11228 11229 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 11230 const char *zDbName = nArg==2 ? azArg[1] : "main"; 11231 char *zVfsName = 0; 11232 if( p->db ){ 11233 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 11234 if( zVfsName ){ 11235 utf8_printf(p->out, "%s\n", zVfsName); 11236 sqlite3_free(zVfsName); 11237 } 11238 } 11239 }else 11240 11241 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 11242 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 11243 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x); 11244 }else 11245 11246 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 11247 int j; 11248 assert( nArg<=ArraySize(azArg) ); 11249 p->nWidth = nArg-1; 11250 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); 11251 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 11252 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 11253 for(j=1; j<nArg; j++){ 11254 p->colWidth[j-1] = (int)integerValue(azArg[j]); 11255 } 11256 }else 11257 11258 { 11259 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 11260 " \"%s\". Enter \".help\" for help\n", azArg[0]); 11261 rc = 1; 11262 } 11263 11264meta_command_exit: 11265 if( p->outCount ){ 11266 p->outCount--; 11267 if( p->outCount==0 ) output_reset(p); 11268 } 11269 p->bSafeMode = p->bSafeModePersist; 11270 return rc; 11271} 11272 11273/* Line scan result and intermediate states (supporting scan resumption) 11274*/ 11275#ifndef CHAR_BIT 11276# define CHAR_BIT 8 11277#endif 11278typedef enum { 11279 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT, 11280 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT, 11281 QSS_Start = 0 11282} QuickScanState; 11283#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask)) 11284#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start) 11285#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start) 11286#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark) 11287#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi) 11288 11289/* 11290** Scan line for classification to guide shell's handling. 11291** The scan is resumable for subsequent lines when prior 11292** return values are passed as the 2nd argument. 11293*/ 11294static QuickScanState quickscan(char *zLine, QuickScanState qss){ 11295 char cin; 11296 char cWait = (char)qss; /* intentional narrowing loss */ 11297 if( cWait==0 ){ 11298 PlainScan: 11299 assert( cWait==0 ); 11300 while( (cin = *zLine++)!=0 ){ 11301 if( IsSpace(cin) ) 11302 continue; 11303 switch (cin){ 11304 case '-': 11305 if( *zLine!='-' ) 11306 break; 11307 while((cin = *++zLine)!=0 ) 11308 if( cin=='\n') 11309 goto PlainScan; 11310 return qss; 11311 case ';': 11312 qss |= QSS_EndingSemi; 11313 continue; 11314 case '/': 11315 if( *zLine=='*' ){ 11316 ++zLine; 11317 cWait = '*'; 11318 qss = QSS_SETV(qss, cWait); 11319 goto TermScan; 11320 } 11321 break; 11322 case '[': 11323 cin = ']'; 11324 /* fall thru */ 11325 case '`': case '\'': case '"': 11326 cWait = cin; 11327 qss = QSS_HasDark | cWait; 11328 goto TermScan; 11329 default: 11330 break; 11331 } 11332 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark; 11333 } 11334 }else{ 11335 TermScan: 11336 while( (cin = *zLine++)!=0 ){ 11337 if( cin==cWait ){ 11338 switch( cWait ){ 11339 case '*': 11340 if( *zLine != '/' ) 11341 continue; 11342 ++zLine; 11343 cWait = 0; 11344 qss = QSS_SETV(qss, 0); 11345 goto PlainScan; 11346 case '`': case '\'': case '"': 11347 if(*zLine==cWait){ 11348 ++zLine; 11349 continue; 11350 } 11351 /* fall thru */ 11352 case ']': 11353 cWait = 0; 11354 qss = QSS_SETV(qss, 0); 11355 goto PlainScan; 11356 default: assert(0); 11357 } 11358 } 11359 } 11360 } 11361 return qss; 11362} 11363 11364/* 11365** Return TRUE if the line typed in is an SQL command terminator other 11366** than a semi-colon. The SQL Server style "go" command is understood 11367** as is the Oracle "/". 11368*/ 11369static int line_is_command_terminator(char *zLine){ 11370 while( IsSpace(zLine[0]) ){ zLine++; }; 11371 if( zLine[0]=='/' ) 11372 zLine += 1; /* Oracle */ 11373 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' ) 11374 zLine += 2; /* SQL Server */ 11375 else 11376 return 0; 11377 return quickscan(zLine,QSS_Start)==QSS_Start; 11378} 11379 11380/* 11381** We need a default sqlite3_complete() implementation to use in case 11382** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 11383** any arbitrary text is a complete SQL statement. This is not very 11384** user-friendly, but it does seem to work. 11385*/ 11386#ifdef SQLITE_OMIT_COMPLETE 11387#define sqlite3_complete(x) 1 11388#endif 11389 11390/* 11391** Return true if zSql is a complete SQL statement. Return false if it 11392** ends in the middle of a string literal or C-style comment. 11393*/ 11394static int line_is_complete(char *zSql, int nSql){ 11395 int rc; 11396 if( zSql==0 ) return 1; 11397 zSql[nSql] = ';'; 11398 zSql[nSql+1] = 0; 11399 rc = sqlite3_complete(zSql); 11400 zSql[nSql] = 0; 11401 return rc; 11402} 11403 11404/* 11405** Run a single line of SQL. Return the number of errors. 11406*/ 11407static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 11408 int rc; 11409 char *zErrMsg = 0; 11410 11411 open_db(p, 0); 11412 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 11413 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 11414 BEGIN_TIMER; 11415 rc = shell_exec(p, zSql, &zErrMsg); 11416 END_TIMER; 11417 if( rc || zErrMsg ){ 11418 char zPrefix[100]; 11419 const char *zErrorTail; 11420 const char *zErrorType; 11421 if( zErrMsg==0 ){ 11422 zErrorType = "Error"; 11423 zErrorTail = sqlite3_errmsg(p->db); 11424 }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){ 11425 zErrorType = "Parse error"; 11426 zErrorTail = &zErrMsg[12]; 11427 }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){ 11428 zErrorType = "Runtime error"; 11429 zErrorTail = &zErrMsg[10]; 11430 }else{ 11431 zErrorType = "Error"; 11432 zErrorTail = zErrMsg; 11433 } 11434 if( in!=0 || !stdin_is_interactive ){ 11435 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 11436 "%s near line %d:", zErrorType, startline); 11437 }else{ 11438 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType); 11439 } 11440 utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail); 11441 sqlite3_free(zErrMsg); 11442 zErrMsg = 0; 11443 return 1; 11444 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 11445 char zLineBuf[2000]; 11446 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, 11447 "changes: %lld total_changes: %lld", 11448 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); 11449 raw_printf(p->out, "%s\n", zLineBuf); 11450 } 11451 return 0; 11452} 11453 11454 11455/* 11456** Read input from *in and process it. If *in==0 then input 11457** is interactive - the user is typing it it. Otherwise, input 11458** is coming from a file or device. A prompt is issued and history 11459** is saved only if input is interactive. An interrupt signal will 11460** cause this routine to exit immediately, unless input is interactive. 11461** 11462** Return the number of errors. 11463*/ 11464static int process_input(ShellState *p){ 11465 char *zLine = 0; /* A single input line */ 11466 char *zSql = 0; /* Accumulated SQL text */ 11467 int nLine; /* Length of current line */ 11468 int nSql = 0; /* Bytes of zSql[] used */ 11469 int nAlloc = 0; /* Allocated zSql[] space */ 11470 int rc; /* Error code */ 11471 int errCnt = 0; /* Number of errors seen */ 11472 int startline = 0; /* Line number for start of current input */ 11473 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */ 11474 11475 if( p->inputNesting==MAX_INPUT_NESTING ){ 11476 /* This will be more informative in a later version. */ 11477 utf8_printf(stderr,"Input nesting limit (%d) reached at line %d." 11478 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno); 11479 return 1; 11480 } 11481 ++p->inputNesting; 11482 p->lineno = 0; 11483 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 11484 fflush(p->out); 11485 zLine = one_input_line(p->in, zLine, nSql>0); 11486 if( zLine==0 ){ 11487 /* End of input */ 11488 if( p->in==0 && stdin_is_interactive ) printf("\n"); 11489 break; 11490 } 11491 if( seenInterrupt ){ 11492 if( p->in!=0 ) break; 11493 seenInterrupt = 0; 11494 } 11495 p->lineno++; 11496 if( QSS_INPLAIN(qss) 11497 && line_is_command_terminator(zLine) 11498 && line_is_complete(zSql, nSql) ){ 11499 memcpy(zLine,";",2); 11500 } 11501 qss = quickscan(zLine, qss); 11502 if( QSS_PLAINWHITE(qss) && nSql==0 ){ 11503 if( ShellHasFlag(p, SHFLG_Echo) ) 11504 printf("%s\n", zLine); 11505 /* Just swallow single-line whitespace */ 11506 qss = QSS_Start; 11507 continue; 11508 } 11509 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 11510 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 11511 if( zLine[0]=='.' ){ 11512 rc = do_meta_command(zLine, p); 11513 if( rc==2 ){ /* exit requested */ 11514 break; 11515 }else if( rc ){ 11516 errCnt++; 11517 } 11518 } 11519 qss = QSS_Start; 11520 continue; 11521 } 11522 /* No single-line dispositions remain; accumulate line(s). */ 11523 nLine = strlen30(zLine); 11524 if( nSql+nLine+2>=nAlloc ){ 11525 /* Grow buffer by half-again increments when big. */ 11526 nAlloc = nSql+(nSql>>1)+nLine+100; 11527 zSql = realloc(zSql, nAlloc); 11528 shell_check_oom(zSql); 11529 } 11530 if( nSql==0 ){ 11531 int i; 11532 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 11533 assert( nAlloc>0 && zSql!=0 ); 11534 memcpy(zSql, zLine+i, nLine+1-i); 11535 startline = p->lineno; 11536 nSql = nLine-i; 11537 }else{ 11538 zSql[nSql++] = '\n'; 11539 memcpy(zSql+nSql, zLine, nLine+1); 11540 nSql += nLine; 11541 } 11542 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ 11543 errCnt += runOneSqlLine(p, zSql, p->in, startline); 11544 nSql = 0; 11545 if( p->outCount ){ 11546 output_reset(p); 11547 p->outCount = 0; 11548 }else{ 11549 clearTempFile(p); 11550 } 11551 p->bSafeMode = p->bSafeModePersist; 11552 qss = QSS_Start; 11553 }else if( nSql && QSS_PLAINWHITE(qss) ){ 11554 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 11555 nSql = 0; 11556 qss = QSS_Start; 11557 } 11558 } 11559 if( nSql && QSS_PLAINDARK(qss) ){ 11560 errCnt += runOneSqlLine(p, zSql, p->in, startline); 11561 } 11562 free(zSql); 11563 free(zLine); 11564 --p->inputNesting; 11565 return errCnt>0; 11566} 11567 11568/* 11569** Return a pathname which is the user's home directory. A 11570** 0 return indicates an error of some kind. 11571*/ 11572static char *find_home_dir(int clearFlag){ 11573 static char *home_dir = NULL; 11574 if( clearFlag ){ 11575 free(home_dir); 11576 home_dir = 0; 11577 return 0; 11578 } 11579 if( home_dir ) return home_dir; 11580 11581#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 11582 && !defined(__RTP__) && !defined(_WRS_KERNEL) 11583 { 11584 struct passwd *pwent; 11585 uid_t uid = getuid(); 11586 if( (pwent=getpwuid(uid)) != NULL) { 11587 home_dir = pwent->pw_dir; 11588 } 11589 } 11590#endif 11591 11592#if defined(_WIN32_WCE) 11593 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 11594 */ 11595 home_dir = "/"; 11596#else 11597 11598#if defined(_WIN32) || defined(WIN32) 11599 if (!home_dir) { 11600 home_dir = getenv("USERPROFILE"); 11601 } 11602#endif 11603 11604 if (!home_dir) { 11605 home_dir = getenv("HOME"); 11606 } 11607 11608#if defined(_WIN32) || defined(WIN32) 11609 if (!home_dir) { 11610 char *zDrive, *zPath; 11611 int n; 11612 zDrive = getenv("HOMEDRIVE"); 11613 zPath = getenv("HOMEPATH"); 11614 if( zDrive && zPath ){ 11615 n = strlen30(zDrive) + strlen30(zPath) + 1; 11616 home_dir = malloc( n ); 11617 if( home_dir==0 ) return 0; 11618 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 11619 return home_dir; 11620 } 11621 home_dir = "c:\\"; 11622 } 11623#endif 11624 11625#endif /* !_WIN32_WCE */ 11626 11627 if( home_dir ){ 11628 int n = strlen30(home_dir) + 1; 11629 char *z = malloc( n ); 11630 if( z ) memcpy(z, home_dir, n); 11631 home_dir = z; 11632 } 11633 11634 return home_dir; 11635} 11636 11637/* 11638** Read input from the file given by sqliterc_override. Or if that 11639** parameter is NULL, take input from ~/.sqliterc 11640** 11641** Returns the number of errors. 11642*/ 11643static void process_sqliterc( 11644 ShellState *p, /* Configuration data */ 11645 const char *sqliterc_override /* Name of config file. NULL to use default */ 11646){ 11647 char *home_dir = NULL; 11648 const char *sqliterc = sqliterc_override; 11649 char *zBuf = 0; 11650 FILE *inSaved = p->in; 11651 int savedLineno = p->lineno; 11652 11653 if (sqliterc == NULL) { 11654 home_dir = find_home_dir(0); 11655 if( home_dir==0 ){ 11656 raw_printf(stderr, "-- warning: cannot find home directory;" 11657 " cannot read ~/.sqliterc\n"); 11658 return; 11659 } 11660 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 11661 shell_check_oom(zBuf); 11662 sqliterc = zBuf; 11663 } 11664 p->in = fopen(sqliterc,"rb"); 11665 if( p->in ){ 11666 if( stdin_is_interactive ){ 11667 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 11668 } 11669 if( process_input(p) && bail_on_error ) exit(1); 11670 fclose(p->in); 11671 }else if( sqliterc_override!=0 ){ 11672 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc); 11673 if( bail_on_error ) exit(1); 11674 } 11675 p->in = inSaved; 11676 p->lineno = savedLineno; 11677 sqlite3_free(zBuf); 11678} 11679 11680/* 11681** Show available command line options 11682*/ 11683static const char zOptions[] = 11684#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 11685 " -A ARGS... run \".archive ARGS\" and exit\n" 11686#endif 11687 " -append append the database to the end of the file\n" 11688 " -ascii set output mode to 'ascii'\n" 11689 " -bail stop after hitting an error\n" 11690 " -batch force batch I/O\n" 11691 " -box set output mode to 'box'\n" 11692 " -column set output mode to 'column'\n" 11693 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 11694 " -csv set output mode to 'csv'\n" 11695#if !defined(SQLITE_OMIT_DESERIALIZE) 11696 " -deserialize open the database using sqlite3_deserialize()\n" 11697#endif 11698 " -echo print commands before execution\n" 11699 " -init FILENAME read/process named file\n" 11700 " -[no]header turn headers on or off\n" 11701#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11702 " -heap SIZE Size of heap for memsys3 or memsys5\n" 11703#endif 11704 " -help show this message\n" 11705 " -html set output mode to HTML\n" 11706 " -interactive force interactive I/O\n" 11707 " -json set output mode to 'json'\n" 11708 " -line set output mode to 'line'\n" 11709 " -list set output mode to 'list'\n" 11710 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 11711 " -markdown set output mode to 'markdown'\n" 11712#if !defined(SQLITE_OMIT_DESERIALIZE) 11713 " -maxsize N maximum size for a --deserialize database\n" 11714#endif 11715 " -memtrace trace all memory allocations and deallocations\n" 11716 " -mmap N default mmap size set to N\n" 11717#ifdef SQLITE_ENABLE_MULTIPLEX 11718 " -multiplex enable the multiplexor VFS\n" 11719#endif 11720 " -newline SEP set output row separator. Default: '\\n'\n" 11721 " -nofollow refuse to open symbolic links to database files\n" 11722 " -nonce STRING set the safe-mode escape nonce\n" 11723 " -nullvalue TEXT set text string for NULL values. Default ''\n" 11724 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 11725 " -quote set output mode to 'quote'\n" 11726 " -readonly open the database read-only\n" 11727 " -safe enable safe-mode\n" 11728 " -separator SEP set output column separator. Default: '|'\n" 11729#ifdef SQLITE_ENABLE_SORTER_REFERENCES 11730 " -sorterref SIZE sorter references threshold size\n" 11731#endif 11732 " -stats print memory stats before each finalize\n" 11733 " -table set output mode to 'table'\n" 11734 " -tabs set output mode to 'tabs'\n" 11735 " -version show SQLite version\n" 11736 " -vfs NAME use NAME as the default VFS\n" 11737#ifdef SQLITE_ENABLE_VFSTRACE 11738 " -vfstrace enable tracing of all VFS calls\n" 11739#endif 11740#ifdef SQLITE_HAVE_ZLIB 11741 " -zip open the file as a ZIP Archive\n" 11742#endif 11743; 11744static void usage(int showDetail){ 11745 utf8_printf(stderr, 11746 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 11747 "FILENAME is the name of an SQLite database. A new database is created\n" 11748 "if the file does not previously exist.\n", Argv0); 11749 if( showDetail ){ 11750 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 11751 }else{ 11752 raw_printf(stderr, "Use the -help option for additional information\n"); 11753 } 11754 exit(1); 11755} 11756 11757/* 11758** Internal check: Verify that the SQLite is uninitialized. Print a 11759** error message if it is initialized. 11760*/ 11761static void verify_uninitialized(void){ 11762 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 11763 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 11764 " initialization.\n"); 11765 } 11766} 11767 11768/* 11769** Initialize the state information in data 11770*/ 11771static void main_init(ShellState *data) { 11772 memset(data, 0, sizeof(*data)); 11773 data->normalMode = data->cMode = data->mode = MODE_List; 11774 data->autoExplain = 1; 11775 data->pAuxDb = &data->aAuxDb[0]; 11776 memcpy(data->colSeparator,SEP_Column, 2); 11777 memcpy(data->rowSeparator,SEP_Row, 2); 11778 data->showHeader = 0; 11779 data->shellFlgs = SHFLG_Lookaside; 11780 verify_uninitialized(); 11781 sqlite3_config(SQLITE_CONFIG_URI, 1); 11782 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 11783 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 11784 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 11785 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 11786} 11787 11788/* 11789** Output text to the console in a font that attracts extra attention. 11790*/ 11791#ifdef _WIN32 11792static void printBold(const char *zText){ 11793#if !SQLITE_OS_WINRT 11794 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 11795 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 11796 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 11797 SetConsoleTextAttribute(out, 11798 FOREGROUND_RED|FOREGROUND_INTENSITY 11799 ); 11800#endif 11801 printf("%s", zText); 11802#if !SQLITE_OS_WINRT 11803 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 11804#endif 11805} 11806#else 11807static void printBold(const char *zText){ 11808 printf("\033[1m%s\033[0m", zText); 11809} 11810#endif 11811 11812/* 11813** Get the argument to an --option. Throw an error and die if no argument 11814** is available. 11815*/ 11816static char *cmdline_option_value(int argc, char **argv, int i){ 11817 if( i==argc ){ 11818 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 11819 argv[0], argv[argc-1]); 11820 exit(1); 11821 } 11822 return argv[i]; 11823} 11824 11825#ifndef SQLITE_SHELL_IS_UTF8 11826# if (defined(_WIN32) || defined(WIN32)) \ 11827 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__))) 11828# define SQLITE_SHELL_IS_UTF8 (0) 11829# else 11830# define SQLITE_SHELL_IS_UTF8 (1) 11831# endif 11832#endif 11833 11834#if SQLITE_SHELL_IS_UTF8 11835int SQLITE_CDECL main(int argc, char **argv){ 11836#else 11837int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 11838 char **argv; 11839#endif 11840 char *zErrMsg = 0; 11841 ShellState data; 11842 const char *zInitFile = 0; 11843 int i; 11844 int rc = 0; 11845 int warnInmemoryDb = 0; 11846 int readStdin = 1; 11847 int nCmd = 0; 11848 char **azCmd = 0; 11849 const char *zVfs = 0; /* Value of -vfs command-line option */ 11850#if !SQLITE_SHELL_IS_UTF8 11851 char **argvToFree = 0; 11852 int argcToFree = 0; 11853#endif 11854 11855 setBinaryMode(stdin, 0); 11856 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 11857 stdin_is_interactive = isatty(0); 11858 stdout_is_console = isatty(1); 11859 11860#if !defined(_WIN32_WCE) 11861 if( getenv("SQLITE_DEBUG_BREAK") ){ 11862 if( isatty(0) && isatty(2) ){ 11863 fprintf(stderr, 11864 "attach debugger to process %d and press any key to continue.\n", 11865 GETPID()); 11866 fgetc(stdin); 11867 }else{ 11868#if defined(_WIN32) || defined(WIN32) 11869#if SQLITE_OS_WINRT 11870 __debugbreak(); 11871#else 11872 DebugBreak(); 11873#endif 11874#elif defined(SIGTRAP) 11875 raise(SIGTRAP); 11876#endif 11877 } 11878 } 11879#endif 11880 11881#if USE_SYSTEM_SQLITE+0!=1 11882 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 11883 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 11884 sqlite3_sourceid(), SQLITE_SOURCE_ID); 11885 exit(1); 11886 } 11887#endif 11888 main_init(&data); 11889 11890 /* On Windows, we must translate command-line arguments into UTF-8. 11891 ** The SQLite memory allocator subsystem has to be enabled in order to 11892 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 11893 ** subsequent sqlite3_config() calls will work. So copy all results into 11894 ** memory that does not come from the SQLite memory allocator. 11895 */ 11896#if !SQLITE_SHELL_IS_UTF8 11897 sqlite3_initialize(); 11898 argvToFree = malloc(sizeof(argv[0])*argc*2); 11899 shell_check_oom(argvToFree); 11900 argcToFree = argc; 11901 argv = argvToFree + argc; 11902 for(i=0; i<argc; i++){ 11903 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 11904 int n; 11905 shell_check_oom(z); 11906 n = (int)strlen(z); 11907 argv[i] = malloc( n+1 ); 11908 shell_check_oom(argv[i]); 11909 memcpy(argv[i], z, n+1); 11910 argvToFree[i] = argv[i]; 11911 sqlite3_free(z); 11912 } 11913 sqlite3_shutdown(); 11914#endif 11915 11916 assert( argc>=1 && argv && argv[0] ); 11917 Argv0 = argv[0]; 11918 11919 /* Make sure we have a valid signal handler early, before anything 11920 ** else is done. 11921 */ 11922#ifdef SIGINT 11923 signal(SIGINT, interrupt_handler); 11924#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 11925 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 11926#endif 11927 11928#ifdef SQLITE_SHELL_DBNAME_PROC 11929 { 11930 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 11931 ** of a C-function that will provide the name of the database file. Use 11932 ** this compile-time option to embed this shell program in larger 11933 ** applications. */ 11934 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 11935 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); 11936 warnInmemoryDb = 0; 11937 } 11938#endif 11939 11940 /* Do an initial pass through the command-line argument to locate 11941 ** the name of the database file, the name of the initialization file, 11942 ** the size of the alternative malloc heap, 11943 ** and the first command to execute. 11944 */ 11945 verify_uninitialized(); 11946 for(i=1; i<argc; i++){ 11947 char *z; 11948 z = argv[i]; 11949 if( z[0]!='-' ){ 11950 if( data.aAuxDb->zDbFilename==0 ){ 11951 data.aAuxDb->zDbFilename = z; 11952 }else{ 11953 /* Excesss arguments are interpreted as SQL (or dot-commands) and 11954 ** mean that nothing is read from stdin */ 11955 readStdin = 0; 11956 nCmd++; 11957 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 11958 shell_check_oom(azCmd); 11959 azCmd[nCmd-1] = z; 11960 } 11961 } 11962 if( z[1]=='-' ) z++; 11963 if( strcmp(z,"-separator")==0 11964 || strcmp(z,"-nullvalue")==0 11965 || strcmp(z,"-newline")==0 11966 || strcmp(z,"-cmd")==0 11967 ){ 11968 (void)cmdline_option_value(argc, argv, ++i); 11969 }else if( strcmp(z,"-init")==0 ){ 11970 zInitFile = cmdline_option_value(argc, argv, ++i); 11971 }else if( strcmp(z,"-batch")==0 ){ 11972 /* Need to check for batch mode here to so we can avoid printing 11973 ** informational messages (like from process_sqliterc) before 11974 ** we do the actual processing of arguments later in a second pass. 11975 */ 11976 stdin_is_interactive = 0; 11977 }else if( strcmp(z,"-heap")==0 ){ 11978#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 11979 const char *zSize; 11980 sqlite3_int64 szHeap; 11981 11982 zSize = cmdline_option_value(argc, argv, ++i); 11983 szHeap = integerValue(zSize); 11984 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 11985 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 11986#else 11987 (void)cmdline_option_value(argc, argv, ++i); 11988#endif 11989 }else if( strcmp(z,"-pagecache")==0 ){ 11990 sqlite3_int64 n, sz; 11991 sz = integerValue(cmdline_option_value(argc,argv,++i)); 11992 if( sz>70000 ) sz = 70000; 11993 if( sz<0 ) sz = 0; 11994 n = integerValue(cmdline_option_value(argc,argv,++i)); 11995 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 11996 n = 0xffffffffffffLL/sz; 11997 } 11998 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 11999 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 12000 data.shellFlgs |= SHFLG_Pagecache; 12001 }else if( strcmp(z,"-lookaside")==0 ){ 12002 int n, sz; 12003 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 12004 if( sz<0 ) sz = 0; 12005 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 12006 if( n<0 ) n = 0; 12007 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 12008 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 12009 }else if( strcmp(z,"-threadsafe")==0 ){ 12010 int n; 12011 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 12012 switch( n ){ 12013 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break; 12014 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break; 12015 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break; 12016 } 12017#ifdef SQLITE_ENABLE_VFSTRACE 12018 }else if( strcmp(z,"-vfstrace")==0 ){ 12019 extern int vfstrace_register( 12020 const char *zTraceName, 12021 const char *zOldVfsName, 12022 int (*xOut)(const char*,void*), 12023 void *pOutArg, 12024 int makeDefault 12025 ); 12026 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 12027#endif 12028#ifdef SQLITE_ENABLE_MULTIPLEX 12029 }else if( strcmp(z,"-multiplex")==0 ){ 12030 extern int sqlite3_multiple_initialize(const char*,int); 12031 sqlite3_multiplex_initialize(0, 1); 12032#endif 12033 }else if( strcmp(z,"-mmap")==0 ){ 12034 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 12035 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 12036#ifdef SQLITE_ENABLE_SORTER_REFERENCES 12037 }else if( strcmp(z,"-sorterref")==0 ){ 12038 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 12039 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 12040#endif 12041 }else if( strcmp(z,"-vfs")==0 ){ 12042 zVfs = cmdline_option_value(argc, argv, ++i); 12043#ifdef SQLITE_HAVE_ZLIB 12044 }else if( strcmp(z,"-zip")==0 ){ 12045 data.openMode = SHELL_OPEN_ZIPFILE; 12046#endif 12047 }else if( strcmp(z,"-append")==0 ){ 12048 data.openMode = SHELL_OPEN_APPENDVFS; 12049#ifndef SQLITE_OMIT_DESERIALIZE 12050 }else if( strcmp(z,"-deserialize")==0 ){ 12051 data.openMode = SHELL_OPEN_DESERIALIZE; 12052 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 12053 data.szMax = integerValue(argv[++i]); 12054#endif 12055 }else if( strcmp(z,"-readonly")==0 ){ 12056 data.openMode = SHELL_OPEN_READONLY; 12057 }else if( strcmp(z,"-nofollow")==0 ){ 12058 data.openFlags = SQLITE_OPEN_NOFOLLOW; 12059#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 12060 }else if( strncmp(z, "-A",2)==0 ){ 12061 /* All remaining command-line arguments are passed to the ".archive" 12062 ** command, so ignore them */ 12063 break; 12064#endif 12065 }else if( strcmp(z, "-memtrace")==0 ){ 12066 sqlite3MemTraceActivate(stderr); 12067 }else if( strcmp(z,"-bail")==0 ){ 12068 bail_on_error = 1; 12069 }else if( strcmp(z,"-nonce")==0 ){ 12070 free(data.zNonce); 12071 data.zNonce = strdup(argv[++i]); 12072 }else if( strcmp(z,"-safe")==0 ){ 12073 /* no-op - catch this on the second pass */ 12074 } 12075 } 12076 verify_uninitialized(); 12077 12078 12079#ifdef SQLITE_SHELL_INIT_PROC 12080 { 12081 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 12082 ** of a C-function that will perform initialization actions on SQLite that 12083 ** occur just before or after sqlite3_initialize(). Use this compile-time 12084 ** option to embed this shell program in larger applications. */ 12085 extern void SQLITE_SHELL_INIT_PROC(void); 12086 SQLITE_SHELL_INIT_PROC(); 12087 } 12088#else 12089 /* All the sqlite3_config() calls have now been made. So it is safe 12090 ** to call sqlite3_initialize() and process any command line -vfs option. */ 12091 sqlite3_initialize(); 12092#endif 12093 12094 if( zVfs ){ 12095 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 12096 if( pVfs ){ 12097 sqlite3_vfs_register(pVfs, 1); 12098 }else{ 12099 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 12100 exit(1); 12101 } 12102 } 12103 12104 if( data.pAuxDb->zDbFilename==0 ){ 12105#ifndef SQLITE_OMIT_MEMORYDB 12106 data.pAuxDb->zDbFilename = ":memory:"; 12107 warnInmemoryDb = argc==1; 12108#else 12109 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 12110 return 1; 12111#endif 12112 } 12113 data.out = stdout; 12114 sqlite3_appendvfs_init(0,0,0); 12115 12116 /* Go ahead and open the database file if it already exists. If the 12117 ** file does not exist, delay opening it. This prevents empty database 12118 ** files from being created if a user mistypes the database name argument 12119 ** to the sqlite command-line tool. 12120 */ 12121 if( access(data.pAuxDb->zDbFilename, 0)==0 ){ 12122 open_db(&data, 0); 12123 } 12124 12125 /* Process the initialization file if there is one. If no -init option 12126 ** is given on the command line, look for a file named ~/.sqliterc and 12127 ** try to process it. 12128 */ 12129 process_sqliterc(&data,zInitFile); 12130 12131 /* Make a second pass through the command-line argument and set 12132 ** options. This second pass is delayed until after the initialization 12133 ** file is processed so that the command-line arguments will override 12134 ** settings in the initialization file. 12135 */ 12136 for(i=1; i<argc; i++){ 12137 char *z = argv[i]; 12138 if( z[0]!='-' ) continue; 12139 if( z[1]=='-' ){ z++; } 12140 if( strcmp(z,"-init")==0 ){ 12141 i++; 12142 }else if( strcmp(z,"-html")==0 ){ 12143 data.mode = MODE_Html; 12144 }else if( strcmp(z,"-list")==0 ){ 12145 data.mode = MODE_List; 12146 }else if( strcmp(z,"-quote")==0 ){ 12147 data.mode = MODE_Quote; 12148 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 12149 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 12150 }else if( strcmp(z,"-line")==0 ){ 12151 data.mode = MODE_Line; 12152 }else if( strcmp(z,"-column")==0 ){ 12153 data.mode = MODE_Column; 12154 }else if( strcmp(z,"-json")==0 ){ 12155 data.mode = MODE_Json; 12156 }else if( strcmp(z,"-markdown")==0 ){ 12157 data.mode = MODE_Markdown; 12158 }else if( strcmp(z,"-table")==0 ){ 12159 data.mode = MODE_Table; 12160 }else if( strcmp(z,"-box")==0 ){ 12161 data.mode = MODE_Box; 12162 }else if( strcmp(z,"-csv")==0 ){ 12163 data.mode = MODE_Csv; 12164 memcpy(data.colSeparator,",",2); 12165#ifdef SQLITE_HAVE_ZLIB 12166 }else if( strcmp(z,"-zip")==0 ){ 12167 data.openMode = SHELL_OPEN_ZIPFILE; 12168#endif 12169 }else if( strcmp(z,"-append")==0 ){ 12170 data.openMode = SHELL_OPEN_APPENDVFS; 12171#ifndef SQLITE_OMIT_DESERIALIZE 12172 }else if( strcmp(z,"-deserialize")==0 ){ 12173 data.openMode = SHELL_OPEN_DESERIALIZE; 12174 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 12175 data.szMax = integerValue(argv[++i]); 12176#endif 12177 }else if( strcmp(z,"-readonly")==0 ){ 12178 data.openMode = SHELL_OPEN_READONLY; 12179 }else if( strcmp(z,"-nofollow")==0 ){ 12180 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 12181 }else if( strcmp(z,"-ascii")==0 ){ 12182 data.mode = MODE_Ascii; 12183 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit); 12184 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record); 12185 }else if( strcmp(z,"-tabs")==0 ){ 12186 data.mode = MODE_List; 12187 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab); 12188 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 12189 }else if( strcmp(z,"-separator")==0 ){ 12190 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 12191 "%s",cmdline_option_value(argc,argv,++i)); 12192 }else if( strcmp(z,"-newline")==0 ){ 12193 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 12194 "%s",cmdline_option_value(argc,argv,++i)); 12195 }else if( strcmp(z,"-nullvalue")==0 ){ 12196 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 12197 "%s",cmdline_option_value(argc,argv,++i)); 12198 }else if( strcmp(z,"-header")==0 ){ 12199 data.showHeader = 1; 12200 ShellSetFlag(&data, SHFLG_HeaderSet); 12201 }else if( strcmp(z,"-noheader")==0 ){ 12202 data.showHeader = 0; 12203 ShellSetFlag(&data, SHFLG_HeaderSet); 12204 }else if( strcmp(z,"-echo")==0 ){ 12205 ShellSetFlag(&data, SHFLG_Echo); 12206 }else if( strcmp(z,"-eqp")==0 ){ 12207 data.autoEQP = AUTOEQP_on; 12208 }else if( strcmp(z,"-eqpfull")==0 ){ 12209 data.autoEQP = AUTOEQP_full; 12210 }else if( strcmp(z,"-stats")==0 ){ 12211 data.statsOn = 1; 12212 }else if( strcmp(z,"-scanstats")==0 ){ 12213 data.scanstatsOn = 1; 12214 }else if( strcmp(z,"-backslash")==0 ){ 12215 /* Undocumented command-line option: -backslash 12216 ** Causes C-style backslash escapes to be evaluated in SQL statements 12217 ** prior to sending the SQL into SQLite. Useful for injecting 12218 ** crazy bytes in the middle of SQL statements for testing and debugging. 12219 */ 12220 ShellSetFlag(&data, SHFLG_Backslash); 12221 }else if( strcmp(z,"-bail")==0 ){ 12222 /* No-op. The bail_on_error flag should already be set. */ 12223 }else if( strcmp(z,"-version")==0 ){ 12224 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 12225 return 0; 12226 }else if( strcmp(z,"-interactive")==0 ){ 12227 stdin_is_interactive = 1; 12228 }else if( strcmp(z,"-batch")==0 ){ 12229 stdin_is_interactive = 0; 12230 }else if( strcmp(z,"-heap")==0 ){ 12231 i++; 12232 }else if( strcmp(z,"-pagecache")==0 ){ 12233 i+=2; 12234 }else if( strcmp(z,"-lookaside")==0 ){ 12235 i+=2; 12236 }else if( strcmp(z,"-threadsafe")==0 ){ 12237 i+=2; 12238 }else if( strcmp(z,"-nonce")==0 ){ 12239 i += 2; 12240 }else if( strcmp(z,"-mmap")==0 ){ 12241 i++; 12242 }else if( strcmp(z,"-memtrace")==0 ){ 12243 i++; 12244#ifdef SQLITE_ENABLE_SORTER_REFERENCES 12245 }else if( strcmp(z,"-sorterref")==0 ){ 12246 i++; 12247#endif 12248 }else if( strcmp(z,"-vfs")==0 ){ 12249 i++; 12250#ifdef SQLITE_ENABLE_VFSTRACE 12251 }else if( strcmp(z,"-vfstrace")==0 ){ 12252 i++; 12253#endif 12254#ifdef SQLITE_ENABLE_MULTIPLEX 12255 }else if( strcmp(z,"-multiplex")==0 ){ 12256 i++; 12257#endif 12258 }else if( strcmp(z,"-help")==0 ){ 12259 usage(1); 12260 }else if( strcmp(z,"-cmd")==0 ){ 12261 /* Run commands that follow -cmd first and separately from commands 12262 ** that simply appear on the command-line. This seems goofy. It would 12263 ** be better if all commands ran in the order that they appear. But 12264 ** we retain the goofy behavior for historical compatibility. */ 12265 if( i==argc-1 ) break; 12266 z = cmdline_option_value(argc,argv,++i); 12267 if( z[0]=='.' ){ 12268 rc = do_meta_command(z, &data); 12269 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 12270 }else{ 12271 open_db(&data, 0); 12272 rc = shell_exec(&data, z, &zErrMsg); 12273 if( zErrMsg!=0 ){ 12274 utf8_printf(stderr,"Error: %s\n", zErrMsg); 12275 if( bail_on_error ) return rc!=0 ? rc : 1; 12276 }else if( rc!=0 ){ 12277 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 12278 if( bail_on_error ) return rc; 12279 } 12280 } 12281#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 12282 }else if( strncmp(z, "-A", 2)==0 ){ 12283 if( nCmd>0 ){ 12284 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 12285 " with \"%s\"\n", z); 12286 return 1; 12287 } 12288 open_db(&data, OPEN_DB_ZIPFILE); 12289 if( z[2] ){ 12290 argv[i] = &z[2]; 12291 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 12292 }else{ 12293 arDotCommand(&data, 1, argv+i, argc-i); 12294 } 12295 readStdin = 0; 12296 break; 12297#endif 12298 }else if( strcmp(z,"-safe")==0 ){ 12299 data.bSafeMode = data.bSafeModePersist = 1; 12300 }else{ 12301 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 12302 raw_printf(stderr,"Use -help for a list of options.\n"); 12303 return 1; 12304 } 12305 data.cMode = data.mode; 12306 } 12307 12308 if( !readStdin ){ 12309 /* Run all arguments that do not begin with '-' as if they were separate 12310 ** command-line inputs, except for the argToSkip argument which contains 12311 ** the database filename. 12312 */ 12313 for(i=0; i<nCmd; i++){ 12314 if( azCmd[i][0]=='.' ){ 12315 rc = do_meta_command(azCmd[i], &data); 12316 if( rc ){ 12317 free(azCmd); 12318 return rc==2 ? 0 : rc; 12319 } 12320 }else{ 12321 open_db(&data, 0); 12322 rc = shell_exec(&data, azCmd[i], &zErrMsg); 12323 if( zErrMsg || rc ){ 12324 if( zErrMsg!=0 ){ 12325 utf8_printf(stderr,"Error: %s\n", zErrMsg); 12326 }else{ 12327 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 12328 } 12329 sqlite3_free(zErrMsg); 12330 free(azCmd); 12331 return rc!=0 ? rc : 1; 12332 } 12333 } 12334 } 12335 }else{ 12336 /* Run commands received from standard input 12337 */ 12338 if( stdin_is_interactive ){ 12339 char *zHome; 12340 char *zHistory; 12341 int nHistory; 12342 printf( 12343 "SQLite version %s %.19s\n" /*extra-version-info*/ 12344 "Enter \".help\" for usage hints.\n", 12345 sqlite3_libversion(), sqlite3_sourceid() 12346 ); 12347 if( warnInmemoryDb ){ 12348 printf("Connected to a "); 12349 printBold("transient in-memory database"); 12350 printf(".\nUse \".open FILENAME\" to reopen on a " 12351 "persistent database.\n"); 12352 } 12353 zHistory = getenv("SQLITE_HISTORY"); 12354 if( zHistory ){ 12355 zHistory = strdup(zHistory); 12356 }else if( (zHome = find_home_dir(0))!=0 ){ 12357 nHistory = strlen30(zHome) + 20; 12358 if( (zHistory = malloc(nHistory))!=0 ){ 12359 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 12360 } 12361 } 12362 if( zHistory ){ shell_read_history(zHistory); } 12363#if HAVE_READLINE || HAVE_EDITLINE 12364 rl_attempted_completion_function = readline_completion; 12365#elif HAVE_LINENOISE 12366 linenoiseSetCompletionCallback(linenoise_completion); 12367#endif 12368 data.in = 0; 12369 rc = process_input(&data); 12370 if( zHistory ){ 12371 shell_stifle_history(2000); 12372 shell_write_history(zHistory); 12373 free(zHistory); 12374 } 12375 }else{ 12376 data.in = stdin; 12377 rc = process_input(&data); 12378 } 12379 } 12380 free(azCmd); 12381 set_table_name(&data, 0); 12382 if( data.db ){ 12383 session_close_all(&data, -1); 12384 close_db(data.db); 12385 } 12386 for(i=0; i<ArraySize(data.aAuxDb); i++){ 12387 sqlite3_free(data.aAuxDb[i].zFreeOnClose); 12388 if( data.aAuxDb[i].db ){ 12389 session_close_all(&data, i); 12390 close_db(data.aAuxDb[i].db); 12391 } 12392 } 12393 find_home_dir(1); 12394 output_reset(&data); 12395 data.doXdgOpen = 0; 12396 clearTempFile(&data); 12397#if !SQLITE_SHELL_IS_UTF8 12398 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 12399 free(argvToFree); 12400#endif 12401 free(data.colWidth); 12402 free(data.zNonce); 12403 /* Clear the global data structure so that valgrind will detect memory 12404 ** leaks */ 12405 memset(&data, 0, sizeof(data)); 12406 return rc; 12407} 12408