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** Warning pragmas copied from msvc.h in the core. 22*/ 23#if defined(_MSC_VER) 24#pragma warning(disable : 4054) 25#pragma warning(disable : 4055) 26#pragma warning(disable : 4100) 27#pragma warning(disable : 4127) 28#pragma warning(disable : 4130) 29#pragma warning(disable : 4152) 30#pragma warning(disable : 4189) 31#pragma warning(disable : 4206) 32#pragma warning(disable : 4210) 33#pragma warning(disable : 4232) 34#pragma warning(disable : 4244) 35#pragma warning(disable : 4305) 36#pragma warning(disable : 4306) 37#pragma warning(disable : 4702) 38#pragma warning(disable : 4706) 39#endif /* defined(_MSC_VER) */ 40 41/* 42** No support for loadable extensions in VxWorks. 43*/ 44#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 45# define SQLITE_OMIT_LOAD_EXTENSION 1 46#endif 47 48/* 49** Enable large-file support for fopen() and friends on unix. 50*/ 51#ifndef SQLITE_DISABLE_LFS 52# define _LARGE_FILE 1 53# ifndef _FILE_OFFSET_BITS 54# define _FILE_OFFSET_BITS 64 55# endif 56# define _LARGEFILE_SOURCE 1 57#endif 58 59#include <stdlib.h> 60#include <string.h> 61#include <stdio.h> 62#include <assert.h> 63#include "sqlite3.h" 64typedef sqlite3_int64 i64; 65typedef sqlite3_uint64 u64; 66typedef unsigned char u8; 67#if SQLITE_USER_AUTHENTICATION 68# include "sqlite3userauth.h" 69#endif 70#include <ctype.h> 71#include <stdarg.h> 72 73#if !defined(_WIN32) && !defined(WIN32) 74# include <signal.h> 75# if !defined(__RTP__) && !defined(_WRS_KERNEL) 76# include <pwd.h> 77# endif 78#endif 79#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 80# include <unistd.h> 81# include <dirent.h> 82# if defined(__MINGW32__) 83# define DIRENT dirent 84# ifndef S_ISLNK 85# define S_ISLNK(mode) (0) 86# endif 87# endif 88#endif 89#include <sys/types.h> 90#include <sys/stat.h> 91 92#if HAVE_READLINE 93# include <readline/readline.h> 94# include <readline/history.h> 95#endif 96 97#if HAVE_EDITLINE 98# include <editline/readline.h> 99#endif 100 101#if HAVE_EDITLINE || HAVE_READLINE 102 103# define shell_add_history(X) add_history(X) 104# define shell_read_history(X) read_history(X) 105# define shell_write_history(X) write_history(X) 106# define shell_stifle_history(X) stifle_history(X) 107# define shell_readline(X) readline(X) 108 109#elif HAVE_LINENOISE 110 111# include "linenoise.h" 112# define shell_add_history(X) linenoiseHistoryAdd(X) 113# define shell_read_history(X) linenoiseHistoryLoad(X) 114# define shell_write_history(X) linenoiseHistorySave(X) 115# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 116# define shell_readline(X) linenoise(X) 117 118#else 119 120# define shell_read_history(X) 121# define shell_write_history(X) 122# define shell_stifle_history(X) 123 124# define SHELL_USE_LOCAL_GETLINE 1 125#endif 126 127 128#if defined(_WIN32) || defined(WIN32) 129# include <io.h> 130# include <fcntl.h> 131# define isatty(h) _isatty(h) 132# ifndef access 133# define access(f,m) _access((f),(m)) 134# endif 135# ifndef unlink 136# define unlink _unlink 137# endif 138# undef popen 139# define popen _popen 140# undef pclose 141# define pclose _pclose 142#else 143 /* Make sure isatty() has a prototype. */ 144 extern int isatty(int); 145 146# if !defined(__RTP__) && !defined(_WRS_KERNEL) 147 /* popen and pclose are not C89 functions and so are 148 ** sometimes omitted from the <stdio.h> header */ 149 extern FILE *popen(const char*,const char*); 150 extern int pclose(FILE*); 151# else 152# define SQLITE_OMIT_POPEN 1 153# endif 154#endif 155 156#if defined(_WIN32_WCE) 157/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 158 * thus we always assume that we have a console. That can be 159 * overridden with the -batch command line option. 160 */ 161#define isatty(x) 1 162#endif 163 164/* ctype macros that work with signed characters */ 165#define IsSpace(X) isspace((unsigned char)X) 166#define IsDigit(X) isdigit((unsigned char)X) 167#define ToLower(X) (char)tolower((unsigned char)X) 168 169#if defined(_WIN32) || defined(WIN32) 170#include <windows.h> 171 172/* string conversion routines only needed on Win32 */ 173extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 174extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 175extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 176extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 177#endif 178 179/* On Windows, we normally run with output mode of TEXT so that \n characters 180** are automatically translated into \r\n. However, this behavior needs 181** to be disabled in some cases (ex: when generating CSV output and when 182** rendering quoted strings that contain \n characters). The following 183** routines take care of that. 184*/ 185#if defined(_WIN32) || defined(WIN32) 186static void setBinaryMode(FILE *file, int isOutput){ 187 if( isOutput ) fflush(file); 188 _setmode(_fileno(file), _O_BINARY); 189} 190static void setTextMode(FILE *file, int isOutput){ 191 if( isOutput ) fflush(file); 192 _setmode(_fileno(file), _O_TEXT); 193} 194#else 195# define setBinaryMode(X,Y) 196# define setTextMode(X,Y) 197#endif 198 199 200/* True if the timer is enabled */ 201static int enableTimer = 0; 202 203/* Return the current wall-clock time */ 204static sqlite3_int64 timeOfDay(void){ 205 static sqlite3_vfs *clockVfs = 0; 206 sqlite3_int64 t; 207 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 208 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 209 clockVfs->xCurrentTimeInt64(clockVfs, &t); 210 }else{ 211 double r; 212 clockVfs->xCurrentTime(clockVfs, &r); 213 t = (sqlite3_int64)(r*86400000.0); 214 } 215 return t; 216} 217 218#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 219#include <sys/time.h> 220#include <sys/resource.h> 221 222/* VxWorks does not support getrusage() as far as we can determine */ 223#if defined(_WRS_KERNEL) || defined(__RTP__) 224struct rusage { 225 struct timeval ru_utime; /* user CPU time used */ 226 struct timeval ru_stime; /* system CPU time used */ 227}; 228#define getrusage(A,B) memset(B,0,sizeof(*B)) 229#endif 230 231/* Saved resource information for the beginning of an operation */ 232static struct rusage sBegin; /* CPU time at start */ 233static sqlite3_int64 iBegin; /* Wall-clock time at start */ 234 235/* 236** Begin timing an operation 237*/ 238static void beginTimer(void){ 239 if( enableTimer ){ 240 getrusage(RUSAGE_SELF, &sBegin); 241 iBegin = timeOfDay(); 242 } 243} 244 245/* Return the difference of two time_structs in seconds */ 246static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 247 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 248 (double)(pEnd->tv_sec - pStart->tv_sec); 249} 250 251/* 252** Print the timing results. 253*/ 254static void endTimer(void){ 255 if( enableTimer ){ 256 sqlite3_int64 iEnd = timeOfDay(); 257 struct rusage sEnd; 258 getrusage(RUSAGE_SELF, &sEnd); 259 printf("Run Time: real %.3f user %f sys %f\n", 260 (iEnd - iBegin)*0.001, 261 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 262 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 263 } 264} 265 266#define BEGIN_TIMER beginTimer() 267#define END_TIMER endTimer() 268#define HAS_TIMER 1 269 270#elif (defined(_WIN32) || defined(WIN32)) 271 272/* Saved resource information for the beginning of an operation */ 273static HANDLE hProcess; 274static FILETIME ftKernelBegin; 275static FILETIME ftUserBegin; 276static sqlite3_int64 ftWallBegin; 277typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 278 LPFILETIME, LPFILETIME); 279static GETPROCTIMES getProcessTimesAddr = NULL; 280 281/* 282** Check to see if we have timer support. Return 1 if necessary 283** support found (or found previously). 284*/ 285static int hasTimer(void){ 286 if( getProcessTimesAddr ){ 287 return 1; 288 } else { 289 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 290 ** versions. See if the version we are running on has it, and if it 291 ** does, save off a pointer to it and the current process handle. 292 */ 293 hProcess = GetCurrentProcess(); 294 if( hProcess ){ 295 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 296 if( NULL != hinstLib ){ 297 getProcessTimesAddr = 298 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 299 if( NULL != getProcessTimesAddr ){ 300 return 1; 301 } 302 FreeLibrary(hinstLib); 303 } 304 } 305 } 306 return 0; 307} 308 309/* 310** Begin timing an operation 311*/ 312static void beginTimer(void){ 313 if( enableTimer && getProcessTimesAddr ){ 314 FILETIME ftCreation, ftExit; 315 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 316 &ftKernelBegin,&ftUserBegin); 317 ftWallBegin = timeOfDay(); 318 } 319} 320 321/* Return the difference of two FILETIME structs in seconds */ 322static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 323 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 324 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 325 return (double) ((i64End - i64Start) / 10000000.0); 326} 327 328/* 329** Print the timing results. 330*/ 331static void endTimer(void){ 332 if( enableTimer && getProcessTimesAddr){ 333 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 334 sqlite3_int64 ftWallEnd = timeOfDay(); 335 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 336 printf("Run Time: real %.3f user %f sys %f\n", 337 (ftWallEnd - ftWallBegin)*0.001, 338 timeDiff(&ftUserBegin, &ftUserEnd), 339 timeDiff(&ftKernelBegin, &ftKernelEnd)); 340 } 341} 342 343#define BEGIN_TIMER beginTimer() 344#define END_TIMER endTimer() 345#define HAS_TIMER hasTimer() 346 347#else 348#define BEGIN_TIMER 349#define END_TIMER 350#define HAS_TIMER 0 351#endif 352 353/* 354** Used to prevent warnings about unused parameters 355*/ 356#define UNUSED_PARAMETER(x) (void)(x) 357 358/* 359** Number of elements in an array 360*/ 361#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 362 363/* 364** If the following flag is set, then command execution stops 365** at an error if we are not interactive. 366*/ 367static int bail_on_error = 0; 368 369/* 370** Threat stdin as an interactive input if the following variable 371** is true. Otherwise, assume stdin is connected to a file or pipe. 372*/ 373static int stdin_is_interactive = 1; 374 375/* 376** On Windows systems we have to know if standard output is a console 377** in order to translate UTF-8 into MBCS. The following variable is 378** true if translation is required. 379*/ 380static int stdout_is_console = 1; 381 382/* 383** The following is the open SQLite database. We make a pointer 384** to this database a static variable so that it can be accessed 385** by the SIGINT handler to interrupt database processing. 386*/ 387static sqlite3 *globalDb = 0; 388 389/* 390** True if an interrupt (Control-C) has been received. 391*/ 392static volatile int seenInterrupt = 0; 393 394/* 395** This is the name of our program. It is set in main(), used 396** in a number of other places, mostly for error messages. 397*/ 398static char *Argv0; 399 400/* 401** Prompt strings. Initialized in main. Settable with 402** .prompt main continue 403*/ 404static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 405static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 406 407/* 408** Render output like fprintf(). Except, if the output is going to the 409** console and if this is running on a Windows machine, translate the 410** output from UTF-8 into MBCS. 411*/ 412#if defined(_WIN32) || defined(WIN32) 413void utf8_printf(FILE *out, const char *zFormat, ...){ 414 va_list ap; 415 va_start(ap, zFormat); 416 if( stdout_is_console && (out==stdout || out==stderr) ){ 417 char *z1 = sqlite3_vmprintf(zFormat, ap); 418 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 419 sqlite3_free(z1); 420 fputs(z2, out); 421 sqlite3_free(z2); 422 }else{ 423 vfprintf(out, zFormat, ap); 424 } 425 va_end(ap); 426} 427#elif !defined(utf8_printf) 428# define utf8_printf fprintf 429#endif 430 431/* 432** Render output like fprintf(). This should not be used on anything that 433** includes string formatting (e.g. "%s"). 434*/ 435#if !defined(raw_printf) 436# define raw_printf fprintf 437#endif 438 439/* Indicate out-of-memory and exit. */ 440static void shell_out_of_memory(void){ 441 raw_printf(stderr,"Error: out of memory\n"); 442 exit(1); 443} 444 445/* 446** Write I/O traces to the following stream. 447*/ 448#ifdef SQLITE_ENABLE_IOTRACE 449static FILE *iotrace = 0; 450#endif 451 452/* 453** This routine works like printf in that its first argument is a 454** format string and subsequent arguments are values to be substituted 455** in place of % fields. The result of formatting this string 456** is written to iotrace. 457*/ 458#ifdef SQLITE_ENABLE_IOTRACE 459static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 460 va_list ap; 461 char *z; 462 if( iotrace==0 ) return; 463 va_start(ap, zFormat); 464 z = sqlite3_vmprintf(zFormat, ap); 465 va_end(ap); 466 utf8_printf(iotrace, "%s", z); 467 sqlite3_free(z); 468} 469#endif 470 471/* 472** Output string zUtf to stream pOut as w characters. If w is negative, 473** then right-justify the text. W is the width in UTF-8 characters, not 474** in bytes. This is different from the %*.*s specification in printf 475** since with %*.*s the width is measured in bytes, not characters. 476*/ 477static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 478 int i; 479 int n; 480 int aw = w<0 ? -w : w; 481 char zBuf[1000]; 482 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3; 483 for(i=n=0; zUtf[i]; i++){ 484 if( (zUtf[i]&0xc0)!=0x80 ){ 485 n++; 486 if( n==aw ){ 487 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 488 break; 489 } 490 } 491 } 492 if( n>=aw ){ 493 utf8_printf(pOut, "%.*s", i, zUtf); 494 }else if( w<0 ){ 495 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 496 }else{ 497 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 498 } 499} 500 501 502/* 503** Determines if a string is a number of not. 504*/ 505static int isNumber(const char *z, int *realnum){ 506 if( *z=='-' || *z=='+' ) z++; 507 if( !IsDigit(*z) ){ 508 return 0; 509 } 510 z++; 511 if( realnum ) *realnum = 0; 512 while( IsDigit(*z) ){ z++; } 513 if( *z=='.' ){ 514 z++; 515 if( !IsDigit(*z) ) return 0; 516 while( IsDigit(*z) ){ z++; } 517 if( realnum ) *realnum = 1; 518 } 519 if( *z=='e' || *z=='E' ){ 520 z++; 521 if( *z=='+' || *z=='-' ) z++; 522 if( !IsDigit(*z) ) return 0; 523 while( IsDigit(*z) ){ z++; } 524 if( realnum ) *realnum = 1; 525 } 526 return *z==0; 527} 528 529/* 530** Compute a string length that is limited to what can be stored in 531** lower 30 bits of a 32-bit signed integer. 532*/ 533static int strlen30(const char *z){ 534 const char *z2 = z; 535 while( *z2 ){ z2++; } 536 return 0x3fffffff & (int)(z2 - z); 537} 538 539/* 540** Return the length of a string in characters. Multibyte UTF8 characters 541** count as a single character. 542*/ 543static int strlenChar(const char *z){ 544 int n = 0; 545 while( *z ){ 546 if( (0xc0&*(z++))!=0x80 ) n++; 547 } 548 return n; 549} 550 551/* 552** This routine reads a line of text from FILE in, stores 553** the text in memory obtained from malloc() and returns a pointer 554** to the text. NULL is returned at end of file, or if malloc() 555** fails. 556** 557** If zLine is not NULL then it is a malloced buffer returned from 558** a previous call to this routine that may be reused. 559*/ 560static char *local_getline(char *zLine, FILE *in){ 561 int nLine = zLine==0 ? 0 : 100; 562 int n = 0; 563 564 while( 1 ){ 565 if( n+100>nLine ){ 566 nLine = nLine*2 + 100; 567 zLine = realloc(zLine, nLine); 568 if( zLine==0 ) return 0; 569 } 570 if( fgets(&zLine[n], nLine - n, in)==0 ){ 571 if( n==0 ){ 572 free(zLine); 573 return 0; 574 } 575 zLine[n] = 0; 576 break; 577 } 578 while( zLine[n] ) n++; 579 if( n>0 && zLine[n-1]=='\n' ){ 580 n--; 581 if( n>0 && zLine[n-1]=='\r' ) n--; 582 zLine[n] = 0; 583 break; 584 } 585 } 586#if defined(_WIN32) || defined(WIN32) 587 /* For interactive input on Windows systems, translate the 588 ** multi-byte characterset characters into UTF-8. */ 589 if( stdin_is_interactive && in==stdin ){ 590 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 591 if( zTrans ){ 592 int nTrans = strlen30(zTrans)+1; 593 if( nTrans>nLine ){ 594 zLine = realloc(zLine, nTrans); 595 if( zLine==0 ){ 596 sqlite3_free(zTrans); 597 return 0; 598 } 599 } 600 memcpy(zLine, zTrans, nTrans); 601 sqlite3_free(zTrans); 602 } 603 } 604#endif /* defined(_WIN32) || defined(WIN32) */ 605 return zLine; 606} 607 608/* 609** Retrieve a single line of input text. 610** 611** If in==0 then read from standard input and prompt before each line. 612** If isContinuation is true, then a continuation prompt is appropriate. 613** If isContinuation is zero, then the main prompt should be used. 614** 615** If zPrior is not NULL then it is a buffer from a prior call to this 616** routine that can be reused. 617** 618** The result is stored in space obtained from malloc() and must either 619** be freed by the caller or else passed back into this routine via the 620** zPrior argument for reuse. 621*/ 622static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 623 char *zPrompt; 624 char *zResult; 625 if( in!=0 ){ 626 zResult = local_getline(zPrior, in); 627 }else{ 628 zPrompt = isContinuation ? continuePrompt : mainPrompt; 629#if SHELL_USE_LOCAL_GETLINE 630 printf("%s", zPrompt); 631 fflush(stdout); 632 zResult = local_getline(zPrior, stdin); 633#else 634 free(zPrior); 635 zResult = shell_readline(zPrompt); 636 if( zResult && *zResult ) shell_add_history(zResult); 637#endif 638 } 639 return zResult; 640} 641 642 643/* 644** Return the value of a hexadecimal digit. Return -1 if the input 645** is not a hex digit. 646*/ 647static int hexDigitValue(char c){ 648 if( c>='0' && c<='9' ) return c - '0'; 649 if( c>='a' && c<='f' ) return c - 'a' + 10; 650 if( c>='A' && c<='F' ) return c - 'A' + 10; 651 return -1; 652} 653 654/* 655** Interpret zArg as an integer value, possibly with suffixes. 656*/ 657static sqlite3_int64 integerValue(const char *zArg){ 658 sqlite3_int64 v = 0; 659 static const struct { char *zSuffix; int iMult; } aMult[] = { 660 { "KiB", 1024 }, 661 { "MiB", 1024*1024 }, 662 { "GiB", 1024*1024*1024 }, 663 { "KB", 1000 }, 664 { "MB", 1000000 }, 665 { "GB", 1000000000 }, 666 { "K", 1000 }, 667 { "M", 1000000 }, 668 { "G", 1000000000 }, 669 }; 670 int i; 671 int isNeg = 0; 672 if( zArg[0]=='-' ){ 673 isNeg = 1; 674 zArg++; 675 }else if( zArg[0]=='+' ){ 676 zArg++; 677 } 678 if( zArg[0]=='0' && zArg[1]=='x' ){ 679 int x; 680 zArg += 2; 681 while( (x = hexDigitValue(zArg[0]))>=0 ){ 682 v = (v<<4) + x; 683 zArg++; 684 } 685 }else{ 686 while( IsDigit(zArg[0]) ){ 687 v = v*10 + zArg[0] - '0'; 688 zArg++; 689 } 690 } 691 for(i=0; i<ArraySize(aMult); i++){ 692 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 693 v *= aMult[i].iMult; 694 break; 695 } 696 } 697 return isNeg? -v : v; 698} 699 700/* 701** A variable length string to which one can append text. 702*/ 703typedef struct ShellText ShellText; 704struct ShellText { 705 char *z; 706 int n; 707 int nAlloc; 708}; 709 710/* 711** Initialize and destroy a ShellText object 712*/ 713static void initText(ShellText *p){ 714 memset(p, 0, sizeof(*p)); 715} 716static void freeText(ShellText *p){ 717 free(p->z); 718 initText(p); 719} 720 721/* zIn is either a pointer to a NULL-terminated string in memory obtained 722** from malloc(), or a NULL pointer. The string pointed to by zAppend is 723** added to zIn, and the result returned in memory obtained from malloc(). 724** zIn, if it was not NULL, is freed. 725** 726** If the third argument, quote, is not '\0', then it is used as a 727** quote character for zAppend. 728*/ 729static void appendText(ShellText *p, char const *zAppend, char quote){ 730 int len; 731 int i; 732 int nAppend = strlen30(zAppend); 733 734 len = nAppend+p->n+1; 735 if( quote ){ 736 len += 2; 737 for(i=0; i<nAppend; i++){ 738 if( zAppend[i]==quote ) len++; 739 } 740 } 741 742 if( p->n+len>=p->nAlloc ){ 743 p->nAlloc = p->nAlloc*2 + len + 20; 744 p->z = realloc(p->z, p->nAlloc); 745 if( p->z==0 ){ 746 memset(p, 0, sizeof(*p)); 747 return; 748 } 749 } 750 751 if( quote ){ 752 char *zCsr = p->z+p->n; 753 *zCsr++ = quote; 754 for(i=0; i<nAppend; i++){ 755 *zCsr++ = zAppend[i]; 756 if( zAppend[i]==quote ) *zCsr++ = quote; 757 } 758 *zCsr++ = quote; 759 p->n = (int)(zCsr - p->z); 760 *zCsr = '\0'; 761 }else{ 762 memcpy(p->z+p->n, zAppend, nAppend); 763 p->n += nAppend; 764 p->z[p->n] = '\0'; 765 } 766} 767 768/* 769** Attempt to determine if identifier zName needs to be quoted, either 770** because it contains non-alphanumeric characters, or because it is an 771** SQLite keyword. Be conservative in this estimate: When in doubt assume 772** that quoting is required. 773** 774** Return '"' if quoting is required. Return 0 if no quoting is required. 775*/ 776static char quoteChar(const char *zName){ 777 int i; 778 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 779 for(i=0; zName[i]; i++){ 780 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 781 } 782 return sqlite3_keyword_check(zName, i) ? '"' : 0; 783} 784 785/* 786** Construct a fake object name and column list to describe the structure 787** of the view, virtual table, or table valued function zSchema.zName. 788*/ 789static char *shellFakeSchema( 790 sqlite3 *db, /* The database connection containing the vtab */ 791 const char *zSchema, /* Schema of the database holding the vtab */ 792 const char *zName /* The name of the virtual table */ 793){ 794 sqlite3_stmt *pStmt = 0; 795 char *zSql; 796 ShellText s; 797 char cQuote; 798 char *zDiv = "("; 799 int nRow = 0; 800 801 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 802 zSchema ? zSchema : "main", zName); 803 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 804 sqlite3_free(zSql); 805 initText(&s); 806 if( zSchema ){ 807 cQuote = quoteChar(zSchema); 808 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 809 appendText(&s, zSchema, cQuote); 810 appendText(&s, ".", 0); 811 } 812 cQuote = quoteChar(zName); 813 appendText(&s, zName, cQuote); 814 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 815 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 816 nRow++; 817 appendText(&s, zDiv, 0); 818 zDiv = ","; 819 cQuote = quoteChar(zCol); 820 appendText(&s, zCol, cQuote); 821 } 822 appendText(&s, ")", 0); 823 sqlite3_finalize(pStmt); 824 if( nRow==0 ){ 825 freeText(&s); 826 s.z = 0; 827 } 828 return s.z; 829} 830 831/* 832** SQL function: shell_module_schema(X) 833** 834** Return a fake schema for the table-valued function or eponymous virtual 835** table X. 836*/ 837static void shellModuleSchema( 838 sqlite3_context *pCtx, 839 int nVal, 840 sqlite3_value **apVal 841){ 842 const char *zName = (const char*)sqlite3_value_text(apVal[0]); 843 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName); 844 UNUSED_PARAMETER(nVal); 845 if( zFake ){ 846 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 847 -1, sqlite3_free); 848 free(zFake); 849 } 850} 851 852/* 853** SQL function: shell_add_schema(S,X) 854** 855** Add the schema name X to the CREATE statement in S and return the result. 856** Examples: 857** 858** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 859** 860** Also works on 861** 862** CREATE INDEX 863** CREATE UNIQUE INDEX 864** CREATE VIEW 865** CREATE TRIGGER 866** CREATE VIRTUAL TABLE 867** 868** This UDF is used by the .schema command to insert the schema name of 869** attached databases into the middle of the sqlite_master.sql field. 870*/ 871static void shellAddSchemaName( 872 sqlite3_context *pCtx, 873 int nVal, 874 sqlite3_value **apVal 875){ 876 static const char *aPrefix[] = { 877 "TABLE", 878 "INDEX", 879 "UNIQUE INDEX", 880 "VIEW", 881 "TRIGGER", 882 "VIRTUAL TABLE" 883 }; 884 int i = 0; 885 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 886 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 887 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 888 sqlite3 *db = sqlite3_context_db_handle(pCtx); 889 UNUSED_PARAMETER(nVal); 890 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 891 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){ 892 int n = strlen30(aPrefix[i]); 893 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 894 char *z = 0; 895 char *zFake = 0; 896 if( zSchema ){ 897 char cQuote = quoteChar(zSchema); 898 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 899 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 900 }else{ 901 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 902 } 903 } 904 if( zName 905 && aPrefix[i][0]=='V' 906 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 907 ){ 908 if( z==0 ){ 909 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 910 }else{ 911 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 912 } 913 free(zFake); 914 } 915 if( z ){ 916 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 917 return; 918 } 919 } 920 } 921 } 922 sqlite3_result_value(pCtx, apVal[0]); 923} 924 925/* 926** The source code for several run-time loadable extensions is inserted 927** below by the ../tool/mkshellc.tcl script. Before processing that included 928** code, we need to override some macros to make the included program code 929** work here in the middle of this regular program. 930*/ 931#define SQLITE_EXTENSION_INIT1 932#define SQLITE_EXTENSION_INIT2(X) (void)(X) 933 934#if defined(_WIN32) && defined(_MSC_VER) 935INCLUDE test_windirent.h 936INCLUDE test_windirent.c 937#define dirent DIRENT 938#endif 939INCLUDE ../ext/misc/shathree.c 940INCLUDE ../ext/misc/fileio.c 941INCLUDE ../ext/misc/completion.c 942INCLUDE ../ext/misc/appendvfs.c 943#ifdef SQLITE_HAVE_ZLIB 944INCLUDE ../ext/misc/zipfile.c 945INCLUDE ../ext/misc/sqlar.c 946#endif 947INCLUDE ../ext/expert/sqlite3expert.h 948INCLUDE ../ext/expert/sqlite3expert.c 949 950#if defined(SQLITE_ENABLE_SESSION) 951/* 952** State information for a single open session 953*/ 954typedef struct OpenSession OpenSession; 955struct OpenSession { 956 char *zName; /* Symbolic name for this session */ 957 int nFilter; /* Number of xFilter rejection GLOB patterns */ 958 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 959 sqlite3_session *p; /* The open session */ 960}; 961#endif 962 963/* 964** Shell output mode information from before ".explain on", 965** saved so that it can be restored by ".explain off" 966*/ 967typedef struct SavedModeInfo SavedModeInfo; 968struct SavedModeInfo { 969 int valid; /* Is there legit data in here? */ 970 int mode; /* Mode prior to ".explain on" */ 971 int showHeader; /* The ".header" setting prior to ".explain on" */ 972 int colWidth[100]; /* Column widths prior to ".explain on" */ 973}; 974 975typedef struct ExpertInfo ExpertInfo; 976struct ExpertInfo { 977 sqlite3expert *pExpert; 978 int bVerbose; 979}; 980 981/* A single line in the EQP output */ 982typedef struct EQPGraphRow EQPGraphRow; 983struct EQPGraphRow { 984 int iEqpId; /* ID for this row */ 985 int iParentId; /* ID of the parent row */ 986 EQPGraphRow *pNext; /* Next row in sequence */ 987 char zText[1]; /* Text to display for this row */ 988}; 989 990/* All EQP output is collected into an instance of the following */ 991typedef struct EQPGraph EQPGraph; 992struct EQPGraph { 993 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 994 EQPGraphRow *pLast; /* Last element of the pRow list */ 995 char zPrefix[100]; /* Graph prefix */ 996}; 997 998/* 999** State information about the database connection is contained in an 1000** instance of the following structure. 1001*/ 1002typedef struct ShellState ShellState; 1003struct ShellState { 1004 sqlite3 *db; /* The database */ 1005 u8 autoExplain; /* Automatically turn on .explain mode */ 1006 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 1007 u8 autoEQPtest; /* autoEQP is in test mode */ 1008 u8 statsOn; /* True to display memory stats before each finalize */ 1009 u8 scanstatsOn; /* True to display scan stats before each finalize */ 1010 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 1011 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 1012 u8 nEqpLevel; /* Depth of the EQP output graph */ 1013 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 1014 int outCount; /* Revert to stdout when reaching zero */ 1015 int cnt; /* Number of records displayed so far */ 1016 FILE *out; /* Write results here */ 1017 FILE *traceOut; /* Output for sqlite3_trace() */ 1018 int nErr; /* Number of errors seen */ 1019 int mode; /* An output mode setting */ 1020 int modePrior; /* Saved mode */ 1021 int cMode; /* temporary output mode for the current query */ 1022 int normalMode; /* Output mode before ".explain on" */ 1023 int writableSchema; /* True if PRAGMA writable_schema=ON */ 1024 int showHeader; /* True to show column names in List or Column mode */ 1025 int nCheck; /* Number of ".check" commands run */ 1026 unsigned shellFlgs; /* Various flags */ 1027 char *zDestTable; /* Name of destination table when MODE_Insert */ 1028 char *zTempFile; /* Temporary file that might need deleting */ 1029 char zTestcase[30]; /* Name of current test case */ 1030 char colSeparator[20]; /* Column separator character for several modes */ 1031 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 1032 char colSepPrior[20]; /* Saved column separator */ 1033 char rowSepPrior[20]; /* Saved row separator */ 1034 int colWidth[100]; /* Requested width of each column when in column mode*/ 1035 int actualWidth[100]; /* Actual width of each column */ 1036 char nullValue[20]; /* The text to print when a NULL comes back from 1037 ** the database */ 1038 char outfile[FILENAME_MAX]; /* Filename for *out */ 1039 const char *zDbFilename; /* name of the database file */ 1040 char *zFreeOnClose; /* Filename to free when closing */ 1041 const char *zVfs; /* Name of VFS to use */ 1042 sqlite3_stmt *pStmt; /* Current statement if any. */ 1043 FILE *pLog; /* Write log output here */ 1044 int *aiIndent; /* Array of indents used in MODE_Explain */ 1045 int nIndent; /* Size of array aiIndent[] */ 1046 int iIndent; /* Index of current op in aiIndent[] */ 1047 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 1048#if defined(SQLITE_ENABLE_SESSION) 1049 int nSession; /* Number of active sessions */ 1050 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 1051#endif 1052 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 1053}; 1054 1055 1056/* Allowed values for ShellState.autoEQP 1057*/ 1058#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 1059#define AUTOEQP_on 1 /* Automatic EQP is on */ 1060#define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 1061#define AUTOEQP_full 3 /* Show full EXPLAIN */ 1062 1063/* Allowed values for ShellState.openMode 1064*/ 1065#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 1066#define SHELL_OPEN_NORMAL 1 /* Normal database file */ 1067#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 1068#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 1069#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 1070 1071/* 1072** These are the allowed shellFlgs values 1073*/ 1074#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 1075#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 1076#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 1077#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 1078#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 1079#define SHFLG_CountChanges 0x00000020 /* .changes setting */ 1080#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 1081 1082/* 1083** Macros for testing and setting shellFlgs 1084*/ 1085#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 1086#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 1087#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 1088 1089/* 1090** These are the allowed modes. 1091*/ 1092#define MODE_Line 0 /* One column per line. Blank line between records */ 1093#define MODE_Column 1 /* One record per line in neat columns */ 1094#define MODE_List 2 /* One record per line with a separator */ 1095#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 1096#define MODE_Html 4 /* Generate an XHTML table */ 1097#define MODE_Insert 5 /* Generate SQL "insert" statements */ 1098#define MODE_Quote 6 /* Quote values as for SQL */ 1099#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 1100#define MODE_Csv 8 /* Quote strings, numbers are plain */ 1101#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 1102#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 1103#define MODE_Pretty 11 /* Pretty-print schemas */ 1104#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 1105 1106static const char *modeDescr[] = { 1107 "line", 1108 "column", 1109 "list", 1110 "semi", 1111 "html", 1112 "insert", 1113 "quote", 1114 "tcl", 1115 "csv", 1116 "explain", 1117 "ascii", 1118 "prettyprint", 1119 "eqp" 1120}; 1121 1122/* 1123** These are the column/row/line separators used by the various 1124** import/export modes. 1125*/ 1126#define SEP_Column "|" 1127#define SEP_Row "\n" 1128#define SEP_Tab "\t" 1129#define SEP_Space " " 1130#define SEP_Comma "," 1131#define SEP_CrLf "\r\n" 1132#define SEP_Unit "\x1F" 1133#define SEP_Record "\x1E" 1134 1135/* 1136** A callback for the sqlite3_log() interface. 1137*/ 1138static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 1139 ShellState *p = (ShellState*)pArg; 1140 if( p->pLog==0 ) return; 1141 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 1142 fflush(p->pLog); 1143} 1144 1145/* 1146** SQL function: shell_putsnl(X) 1147** 1148** Write the text X to the screen (or whatever output is being directed) 1149** adding a newline at the end, and then return X. 1150*/ 1151static void shellPutsFunc( 1152 sqlite3_context *pCtx, 1153 int nVal, 1154 sqlite3_value **apVal 1155){ 1156 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 1157 (void)nVal; 1158 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 1159 sqlite3_result_value(pCtx, apVal[0]); 1160} 1161 1162/* 1163** SQL function: edit(VALUE) 1164** edit(VALUE,EDITOR) 1165** 1166** These steps: 1167** 1168** (1) Write VALUE into a temporary file. 1169** (2) Run program EDITOR on that temporary file. 1170** (3) Read the temporary file back and return its content as the result. 1171** (4) Delete the temporary file 1172** 1173** If the EDITOR argument is omitted, use the value in the VISUAL 1174** environment variable. If still there is no EDITOR, through an error. 1175** 1176** Also throw an error if the EDITOR program returns a non-zero exit code. 1177*/ 1178#ifndef SQLITE_NOHAVE_SYSTEM 1179static void editFunc( 1180 sqlite3_context *context, 1181 int argc, 1182 sqlite3_value **argv 1183){ 1184 const char *zEditor; 1185 char *zTempFile = 0; 1186 sqlite3 *db; 1187 char *zCmd = 0; 1188 int bBin; 1189 int rc; 1190 FILE *f = 0; 1191 sqlite3_int64 sz; 1192 sqlite3_int64 x; 1193 unsigned char *p = 0; 1194 1195 if( argc==2 ){ 1196 zEditor = (const char*)sqlite3_value_text(argv[1]); 1197 }else{ 1198 zEditor = getenv("VISUAL"); 1199 } 1200 if( zEditor==0 ){ 1201 sqlite3_result_error(context, "no editor for edit()", -1); 1202 return; 1203 } 1204 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 1205 sqlite3_result_error(context, "NULL input to edit()", -1); 1206 return; 1207 } 1208 db = sqlite3_context_db_handle(context); 1209 zTempFile = 0; 1210 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 1211 if( zTempFile==0 ){ 1212 sqlite3_uint64 r = 0; 1213 sqlite3_randomness(sizeof(r), &r); 1214 zTempFile = sqlite3_mprintf("temp%llx", r); 1215 if( zTempFile==0 ){ 1216 sqlite3_result_error_nomem(context); 1217 return; 1218 } 1219 } 1220 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 1221 f = fopen(zTempFile, bBin ? "wb" : "w"); 1222 if( f==0 ){ 1223 sqlite3_result_error(context, "edit() cannot open temp file", -1); 1224 goto edit_func_end; 1225 } 1226 sz = sqlite3_value_bytes(argv[0]); 1227 if( bBin ){ 1228 x = fwrite(sqlite3_value_blob(argv[0]), 1, sz, f); 1229 }else{ 1230 x = fwrite(sqlite3_value_text(argv[0]), 1, sz, f); 1231 } 1232 fclose(f); 1233 f = 0; 1234 if( x!=sz ){ 1235 sqlite3_result_error(context, "edit() could not write the whole file", -1); 1236 goto edit_func_end; 1237 } 1238 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 1239 if( zCmd==0 ){ 1240 sqlite3_result_error_nomem(context); 1241 goto edit_func_end; 1242 } 1243 rc = system(zCmd); 1244 sqlite3_free(zCmd); 1245 if( rc ){ 1246 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 1247 goto edit_func_end; 1248 } 1249 f = fopen(zTempFile, bBin ? "rb" : "r"); 1250 if( f==0 ){ 1251 sqlite3_result_error(context, 1252 "edit() cannot reopen temp file after edit", -1); 1253 goto edit_func_end; 1254 } 1255 fseek(f, 0, SEEK_END); 1256 sz = ftell(f); 1257 rewind(f); 1258 p = sqlite3_malloc64( sz+(bBin==0) ); 1259 if( p==0 ){ 1260 sqlite3_result_error_nomem(context); 1261 goto edit_func_end; 1262 } 1263 if( bBin ){ 1264 x = fread(p, 1, sz, f); 1265 }else{ 1266 x = fread(p, 1, sz, f); 1267 p[sz] = 0; 1268 } 1269 fclose(f); 1270 f = 0; 1271 if( x!=sz ){ 1272 sqlite3_result_error(context, "could not read back the whole file", -1); 1273 goto edit_func_end; 1274 } 1275 if( bBin ){ 1276 sqlite3_result_blob64(context, p, sz, sqlite3_free); 1277 }else{ 1278 sqlite3_result_text64(context, (const char*)p, sz, 1279 sqlite3_free, SQLITE_UTF8); 1280 } 1281 p = 0; 1282 1283edit_func_end: 1284 if( f ) fclose(f); 1285 unlink(zTempFile); 1286 sqlite3_free(zTempFile); 1287 sqlite3_free(p); 1288} 1289#endif /* SQLITE_NOHAVE_SYSTEM */ 1290 1291/* 1292** Save or restore the current output mode 1293*/ 1294static void outputModePush(ShellState *p){ 1295 p->modePrior = p->mode; 1296 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 1297 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 1298} 1299static void outputModePop(ShellState *p){ 1300 p->mode = p->modePrior; 1301 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 1302 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 1303} 1304 1305/* 1306** Output the given string as a hex-encoded blob (eg. X'1234' ) 1307*/ 1308static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 1309 int i; 1310 char *zBlob = (char *)pBlob; 1311 raw_printf(out,"X'"); 1312 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 1313 raw_printf(out,"'"); 1314} 1315 1316/* 1317** Find a string that is not found anywhere in z[]. Return a pointer 1318** to that string. 1319** 1320** Try to use zA and zB first. If both of those are already found in z[] 1321** then make up some string and store it in the buffer zBuf. 1322*/ 1323static const char *unused_string( 1324 const char *z, /* Result must not appear anywhere in z */ 1325 const char *zA, const char *zB, /* Try these first */ 1326 char *zBuf /* Space to store a generated string */ 1327){ 1328 unsigned i = 0; 1329 if( strstr(z, zA)==0 ) return zA; 1330 if( strstr(z, zB)==0 ) return zB; 1331 do{ 1332 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 1333 }while( strstr(z,zBuf)!=0 ); 1334 return zBuf; 1335} 1336 1337/* 1338** Output the given string as a quoted string using SQL quoting conventions. 1339** 1340** See also: output_quoted_escaped_string() 1341*/ 1342static void output_quoted_string(FILE *out, const char *z){ 1343 int i; 1344 char c; 1345 setBinaryMode(out, 1); 1346 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1347 if( c==0 ){ 1348 utf8_printf(out,"'%s'",z); 1349 }else{ 1350 raw_printf(out, "'"); 1351 while( *z ){ 1352 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 1353 if( c=='\'' ) i++; 1354 if( i ){ 1355 utf8_printf(out, "%.*s", i, z); 1356 z += i; 1357 } 1358 if( c=='\'' ){ 1359 raw_printf(out, "'"); 1360 continue; 1361 } 1362 if( c==0 ){ 1363 break; 1364 } 1365 z++; 1366 } 1367 raw_printf(out, "'"); 1368 } 1369 setTextMode(out, 1); 1370} 1371 1372/* 1373** Output the given string as a quoted string using SQL quoting conventions. 1374** Additionallly , escape the "\n" and "\r" characters so that they do not 1375** get corrupted by end-of-line translation facilities in some operating 1376** systems. 1377** 1378** This is like output_quoted_string() but with the addition of the \r\n 1379** escape mechanism. 1380*/ 1381static void output_quoted_escaped_string(FILE *out, const char *z){ 1382 int i; 1383 char c; 1384 setBinaryMode(out, 1); 1385 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 1386 if( c==0 ){ 1387 utf8_printf(out,"'%s'",z); 1388 }else{ 1389 const char *zNL = 0; 1390 const char *zCR = 0; 1391 int nNL = 0; 1392 int nCR = 0; 1393 char zBuf1[20], zBuf2[20]; 1394 for(i=0; z[i]; i++){ 1395 if( z[i]=='\n' ) nNL++; 1396 if( z[i]=='\r' ) nCR++; 1397 } 1398 if( nNL ){ 1399 raw_printf(out, "replace("); 1400 zNL = unused_string(z, "\\n", "\\012", zBuf1); 1401 } 1402 if( nCR ){ 1403 raw_printf(out, "replace("); 1404 zCR = unused_string(z, "\\r", "\\015", zBuf2); 1405 } 1406 raw_printf(out, "'"); 1407 while( *z ){ 1408 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 1409 if( c=='\'' ) i++; 1410 if( i ){ 1411 utf8_printf(out, "%.*s", i, z); 1412 z += i; 1413 } 1414 if( c=='\'' ){ 1415 raw_printf(out, "'"); 1416 continue; 1417 } 1418 if( c==0 ){ 1419 break; 1420 } 1421 z++; 1422 if( c=='\n' ){ 1423 raw_printf(out, "%s", zNL); 1424 continue; 1425 } 1426 raw_printf(out, "%s", zCR); 1427 } 1428 raw_printf(out, "'"); 1429 if( nCR ){ 1430 raw_printf(out, ",'%s',char(13))", zCR); 1431 } 1432 if( nNL ){ 1433 raw_printf(out, ",'%s',char(10))", zNL); 1434 } 1435 } 1436 setTextMode(out, 1); 1437} 1438 1439/* 1440** Output the given string as a quoted according to C or TCL quoting rules. 1441*/ 1442static void output_c_string(FILE *out, const char *z){ 1443 unsigned int c; 1444 fputc('"', out); 1445 while( (c = *(z++))!=0 ){ 1446 if( c=='\\' ){ 1447 fputc(c, out); 1448 fputc(c, out); 1449 }else if( c=='"' ){ 1450 fputc('\\', out); 1451 fputc('"', out); 1452 }else if( c=='\t' ){ 1453 fputc('\\', out); 1454 fputc('t', out); 1455 }else if( c=='\n' ){ 1456 fputc('\\', out); 1457 fputc('n', out); 1458 }else if( c=='\r' ){ 1459 fputc('\\', out); 1460 fputc('r', out); 1461 }else if( !isprint(c&0xff) ){ 1462 raw_printf(out, "\\%03o", c&0xff); 1463 }else{ 1464 fputc(c, out); 1465 } 1466 } 1467 fputc('"', out); 1468} 1469 1470/* 1471** Output the given string with characters that are special to 1472** HTML escaped. 1473*/ 1474static void output_html_string(FILE *out, const char *z){ 1475 int i; 1476 if( z==0 ) z = ""; 1477 while( *z ){ 1478 for(i=0; z[i] 1479 && z[i]!='<' 1480 && z[i]!='&' 1481 && z[i]!='>' 1482 && z[i]!='\"' 1483 && z[i]!='\''; 1484 i++){} 1485 if( i>0 ){ 1486 utf8_printf(out,"%.*s",i,z); 1487 } 1488 if( z[i]=='<' ){ 1489 raw_printf(out,"<"); 1490 }else if( z[i]=='&' ){ 1491 raw_printf(out,"&"); 1492 }else if( z[i]=='>' ){ 1493 raw_printf(out,">"); 1494 }else if( z[i]=='\"' ){ 1495 raw_printf(out,"""); 1496 }else if( z[i]=='\'' ){ 1497 raw_printf(out,"'"); 1498 }else{ 1499 break; 1500 } 1501 z += i + 1; 1502 } 1503} 1504 1505/* 1506** If a field contains any character identified by a 1 in the following 1507** array, then the string must be quoted for CSV. 1508*/ 1509static const char needCsvQuote[] = { 1510 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1511 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1512 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1513 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1515 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1518 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1519 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1520 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1521 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1522 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1523 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1524 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1525 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1526}; 1527 1528/* 1529** Output a single term of CSV. Actually, p->colSeparator is used for 1530** the separator, which may or may not be a comma. p->nullValue is 1531** the null value. Strings are quoted if necessary. The separator 1532** is only issued if bSep is true. 1533*/ 1534static void output_csv(ShellState *p, const char *z, int bSep){ 1535 FILE *out = p->out; 1536 if( z==0 ){ 1537 utf8_printf(out,"%s",p->nullValue); 1538 }else{ 1539 int i; 1540 int nSep = strlen30(p->colSeparator); 1541 for(i=0; z[i]; i++){ 1542 if( needCsvQuote[((unsigned char*)z)[i]] 1543 || (z[i]==p->colSeparator[0] && 1544 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ 1545 i = 0; 1546 break; 1547 } 1548 } 1549 if( i==0 ){ 1550 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 1551 utf8_printf(out, "%s", zQuoted); 1552 sqlite3_free(zQuoted); 1553 }else{ 1554 utf8_printf(out, "%s", z); 1555 } 1556 } 1557 if( bSep ){ 1558 utf8_printf(p->out, "%s", p->colSeparator); 1559 } 1560} 1561 1562/* 1563** This routine runs when the user presses Ctrl-C 1564*/ 1565static void interrupt_handler(int NotUsed){ 1566 UNUSED_PARAMETER(NotUsed); 1567 seenInterrupt++; 1568 if( seenInterrupt>2 ) exit(1); 1569 if( globalDb ) sqlite3_interrupt(globalDb); 1570} 1571 1572#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 1573/* 1574** This routine runs for console events (e.g. Ctrl-C) on Win32 1575*/ 1576static BOOL WINAPI ConsoleCtrlHandler( 1577 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 1578){ 1579 if( dwCtrlType==CTRL_C_EVENT ){ 1580 interrupt_handler(0); 1581 return TRUE; 1582 } 1583 return FALSE; 1584} 1585#endif 1586 1587#ifndef SQLITE_OMIT_AUTHORIZATION 1588/* 1589** When the ".auth ON" is set, the following authorizer callback is 1590** invoked. It always returns SQLITE_OK. 1591*/ 1592static int shellAuth( 1593 void *pClientData, 1594 int op, 1595 const char *zA1, 1596 const char *zA2, 1597 const char *zA3, 1598 const char *zA4 1599){ 1600 ShellState *p = (ShellState*)pClientData; 1601 static const char *azAction[] = { 0, 1602 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 1603 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 1604 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 1605 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 1606 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 1607 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 1608 "PRAGMA", "READ", "SELECT", 1609 "TRANSACTION", "UPDATE", "ATTACH", 1610 "DETACH", "ALTER_TABLE", "REINDEX", 1611 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 1612 "FUNCTION", "SAVEPOINT", "RECURSIVE" 1613 }; 1614 int i; 1615 const char *az[4]; 1616 az[0] = zA1; 1617 az[1] = zA2; 1618 az[2] = zA3; 1619 az[3] = zA4; 1620 utf8_printf(p->out, "authorizer: %s", azAction[op]); 1621 for(i=0; i<4; i++){ 1622 raw_printf(p->out, " "); 1623 if( az[i] ){ 1624 output_c_string(p->out, az[i]); 1625 }else{ 1626 raw_printf(p->out, "NULL"); 1627 } 1628 } 1629 raw_printf(p->out, "\n"); 1630 return SQLITE_OK; 1631} 1632#endif 1633 1634/* 1635** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 1636** 1637** This routine converts some CREATE TABLE statements for shadow tables 1638** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 1639*/ 1640static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 1641 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 1642 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 1643 }else{ 1644 utf8_printf(out, "%s%s", z, zTail); 1645 } 1646} 1647static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 1648 char c = z[n]; 1649 z[n] = 0; 1650 printSchemaLine(out, z, zTail); 1651 z[n] = c; 1652} 1653 1654/* 1655** Return true if string z[] has nothing but whitespace and comments to the 1656** end of the first line. 1657*/ 1658static int wsToEol(const char *z){ 1659 int i; 1660 for(i=0; z[i]; i++){ 1661 if( z[i]=='\n' ) return 1; 1662 if( IsSpace(z[i]) ) continue; 1663 if( z[i]=='-' && z[i+1]=='-' ) return 1; 1664 return 0; 1665 } 1666 return 1; 1667} 1668 1669/* 1670** Add a new entry to the EXPLAIN QUERY PLAN data 1671*/ 1672static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 1673 EQPGraphRow *pNew; 1674 int nText = strlen30(zText); 1675 if( p->autoEQPtest ){ 1676 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 1677 } 1678 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 1679 if( pNew==0 ) shell_out_of_memory(); 1680 pNew->iEqpId = iEqpId; 1681 pNew->iParentId = p2; 1682 memcpy(pNew->zText, zText, nText+1); 1683 pNew->pNext = 0; 1684 if( p->sGraph.pLast ){ 1685 p->sGraph.pLast->pNext = pNew; 1686 }else{ 1687 p->sGraph.pRow = pNew; 1688 } 1689 p->sGraph.pLast = pNew; 1690} 1691 1692/* 1693** Free and reset the EXPLAIN QUERY PLAN data that has been collected 1694** in p->sGraph. 1695*/ 1696static void eqp_reset(ShellState *p){ 1697 EQPGraphRow *pRow, *pNext; 1698 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 1699 pNext = pRow->pNext; 1700 sqlite3_free(pRow); 1701 } 1702 memset(&p->sGraph, 0, sizeof(p->sGraph)); 1703} 1704 1705/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 1706** pOld, or return the first such line if pOld is NULL 1707*/ 1708static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 1709 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 1710 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 1711 return pRow; 1712} 1713 1714/* Render a single level of the graph that has iEqpId as its parent. Called 1715** recursively to render sublevels. 1716*/ 1717static void eqp_render_level(ShellState *p, int iEqpId){ 1718 EQPGraphRow *pRow, *pNext; 1719 int n = strlen30(p->sGraph.zPrefix); 1720 char *z; 1721 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 1722 pNext = eqp_next_row(p, iEqpId, pRow); 1723 z = pRow->zText; 1724 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z); 1725 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 1726 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 1727 eqp_render_level(p, pRow->iEqpId); 1728 p->sGraph.zPrefix[n] = 0; 1729 } 1730 } 1731} 1732 1733/* 1734** Display and reset the EXPLAIN QUERY PLAN data 1735*/ 1736static void eqp_render(ShellState *p){ 1737 EQPGraphRow *pRow = p->sGraph.pRow; 1738 if( pRow ){ 1739 if( pRow->zText[0]=='-' ){ 1740 if( pRow->pNext==0 ){ 1741 eqp_reset(p); 1742 return; 1743 } 1744 utf8_printf(p->out, "%s\n", pRow->zText+3); 1745 p->sGraph.pRow = pRow->pNext; 1746 sqlite3_free(pRow); 1747 }else{ 1748 utf8_printf(p->out, "QUERY PLAN\n"); 1749 } 1750 p->sGraph.zPrefix[0] = 0; 1751 eqp_render_level(p, 0); 1752 eqp_reset(p); 1753 } 1754} 1755 1756/* 1757** This is the callback routine that the shell 1758** invokes for each row of a query result. 1759*/ 1760static int shell_callback( 1761 void *pArg, 1762 int nArg, /* Number of result columns */ 1763 char **azArg, /* Text of each result column */ 1764 char **azCol, /* Column names */ 1765 int *aiType /* Column types */ 1766){ 1767 int i; 1768 ShellState *p = (ShellState*)pArg; 1769 1770 if( azArg==0 ) return 0; 1771 switch( p->cMode ){ 1772 case MODE_Line: { 1773 int w = 5; 1774 if( azArg==0 ) break; 1775 for(i=0; i<nArg; i++){ 1776 int len = strlen30(azCol[i] ? azCol[i] : ""); 1777 if( len>w ) w = len; 1778 } 1779 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 1780 for(i=0; i<nArg; i++){ 1781 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 1782 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 1783 } 1784 break; 1785 } 1786 case MODE_Explain: 1787 case MODE_Column: { 1788 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; 1789 const int *colWidth; 1790 int showHdr; 1791 char *rowSep; 1792 if( p->cMode==MODE_Column ){ 1793 colWidth = p->colWidth; 1794 showHdr = p->showHeader; 1795 rowSep = p->rowSeparator; 1796 }else{ 1797 colWidth = aExplainWidths; 1798 showHdr = 1; 1799 rowSep = SEP_Row; 1800 } 1801 if( p->cnt++==0 ){ 1802 for(i=0; i<nArg; i++){ 1803 int w, n; 1804 if( i<ArraySize(p->colWidth) ){ 1805 w = colWidth[i]; 1806 }else{ 1807 w = 0; 1808 } 1809 if( w==0 ){ 1810 w = strlenChar(azCol[i] ? azCol[i] : ""); 1811 if( w<10 ) w = 10; 1812 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue); 1813 if( w<n ) w = n; 1814 } 1815 if( i<ArraySize(p->actualWidth) ){ 1816 p->actualWidth[i] = w; 1817 } 1818 if( showHdr ){ 1819 utf8_width_print(p->out, w, azCol[i]); 1820 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); 1821 } 1822 } 1823 if( showHdr ){ 1824 for(i=0; i<nArg; i++){ 1825 int w; 1826 if( i<ArraySize(p->actualWidth) ){ 1827 w = p->actualWidth[i]; 1828 if( w<0 ) w = -w; 1829 }else{ 1830 w = 10; 1831 } 1832 utf8_printf(p->out,"%-*.*s%s",w,w, 1833 "----------------------------------------------------------" 1834 "----------------------------------------------------------", 1835 i==nArg-1 ? rowSep : " "); 1836 } 1837 } 1838 } 1839 if( azArg==0 ) break; 1840 for(i=0; i<nArg; i++){ 1841 int w; 1842 if( i<ArraySize(p->actualWidth) ){ 1843 w = p->actualWidth[i]; 1844 }else{ 1845 w = 10; 1846 } 1847 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){ 1848 w = strlenChar(azArg[i]); 1849 } 1850 if( i==1 && p->aiIndent && p->pStmt ){ 1851 if( p->iIndent<p->nIndent ){ 1852 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 1853 } 1854 p->iIndent++; 1855 } 1856 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 1857 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); 1858 } 1859 break; 1860 } 1861 case MODE_Semi: { /* .schema and .fullschema output */ 1862 printSchemaLine(p->out, azArg[0], ";\n"); 1863 break; 1864 } 1865 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 1866 char *z; 1867 int j; 1868 int nParen = 0; 1869 char cEnd = 0; 1870 char c; 1871 int nLine = 0; 1872 assert( nArg==1 ); 1873 if( azArg[0]==0 ) break; 1874 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 1875 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 1876 ){ 1877 utf8_printf(p->out, "%s;\n", azArg[0]); 1878 break; 1879 } 1880 z = sqlite3_mprintf("%s", azArg[0]); 1881 j = 0; 1882 for(i=0; IsSpace(z[i]); i++){} 1883 for(; (c = z[i])!=0; i++){ 1884 if( IsSpace(c) ){ 1885 if( z[j-1]=='\r' ) z[j-1] = '\n'; 1886 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 1887 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 1888 j--; 1889 } 1890 z[j++] = c; 1891 } 1892 while( j>0 && IsSpace(z[j-1]) ){ j--; } 1893 z[j] = 0; 1894 if( strlen30(z)>=79 ){ 1895 for(i=j=0; (c = z[i])!=0; i++){ /* Copy changes from z[i] back to z[j] */ 1896 if( c==cEnd ){ 1897 cEnd = 0; 1898 }else if( c=='"' || c=='\'' || c=='`' ){ 1899 cEnd = c; 1900 }else if( c=='[' ){ 1901 cEnd = ']'; 1902 }else if( c=='-' && z[i+1]=='-' ){ 1903 cEnd = '\n'; 1904 }else if( c=='(' ){ 1905 nParen++; 1906 }else if( c==')' ){ 1907 nParen--; 1908 if( nLine>0 && nParen==0 && j>0 ){ 1909 printSchemaLineN(p->out, z, j, "\n"); 1910 j = 0; 1911 } 1912 } 1913 z[j++] = c; 1914 if( nParen==1 && cEnd==0 1915 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 1916 ){ 1917 if( c=='\n' ) j--; 1918 printSchemaLineN(p->out, z, j, "\n "); 1919 j = 0; 1920 nLine++; 1921 while( IsSpace(z[i+1]) ){ i++; } 1922 } 1923 } 1924 z[j] = 0; 1925 } 1926 printSchemaLine(p->out, z, ";\n"); 1927 sqlite3_free(z); 1928 break; 1929 } 1930 case MODE_List: { 1931 if( p->cnt++==0 && p->showHeader ){ 1932 for(i=0; i<nArg; i++){ 1933 utf8_printf(p->out,"%s%s",azCol[i], 1934 i==nArg-1 ? p->rowSeparator : p->colSeparator); 1935 } 1936 } 1937 if( azArg==0 ) break; 1938 for(i=0; i<nArg; i++){ 1939 char *z = azArg[i]; 1940 if( z==0 ) z = p->nullValue; 1941 utf8_printf(p->out, "%s", z); 1942 if( i<nArg-1 ){ 1943 utf8_printf(p->out, "%s", p->colSeparator); 1944 }else{ 1945 utf8_printf(p->out, "%s", p->rowSeparator); 1946 } 1947 } 1948 break; 1949 } 1950 case MODE_Html: { 1951 if( p->cnt++==0 && p->showHeader ){ 1952 raw_printf(p->out,"<TR>"); 1953 for(i=0; i<nArg; i++){ 1954 raw_printf(p->out,"<TH>"); 1955 output_html_string(p->out, azCol[i]); 1956 raw_printf(p->out,"</TH>\n"); 1957 } 1958 raw_printf(p->out,"</TR>\n"); 1959 } 1960 if( azArg==0 ) break; 1961 raw_printf(p->out,"<TR>"); 1962 for(i=0; i<nArg; i++){ 1963 raw_printf(p->out,"<TD>"); 1964 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 1965 raw_printf(p->out,"</TD>\n"); 1966 } 1967 raw_printf(p->out,"</TR>\n"); 1968 break; 1969 } 1970 case MODE_Tcl: { 1971 if( p->cnt++==0 && p->showHeader ){ 1972 for(i=0; i<nArg; i++){ 1973 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 1974 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 1975 } 1976 utf8_printf(p->out, "%s", p->rowSeparator); 1977 } 1978 if( azArg==0 ) break; 1979 for(i=0; i<nArg; i++){ 1980 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 1981 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 1982 } 1983 utf8_printf(p->out, "%s", p->rowSeparator); 1984 break; 1985 } 1986 case MODE_Csv: { 1987 setBinaryMode(p->out, 1); 1988 if( p->cnt++==0 && p->showHeader ){ 1989 for(i=0; i<nArg; i++){ 1990 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 1991 } 1992 utf8_printf(p->out, "%s", p->rowSeparator); 1993 } 1994 if( nArg>0 ){ 1995 for(i=0; i<nArg; i++){ 1996 output_csv(p, azArg[i], i<nArg-1); 1997 } 1998 utf8_printf(p->out, "%s", p->rowSeparator); 1999 } 2000 setTextMode(p->out, 1); 2001 break; 2002 } 2003 case MODE_Insert: { 2004 if( azArg==0 ) break; 2005 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 2006 if( p->showHeader ){ 2007 raw_printf(p->out,"("); 2008 for(i=0; i<nArg; i++){ 2009 if( i>0 ) raw_printf(p->out, ","); 2010 if( quoteChar(azCol[i]) ){ 2011 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 2012 utf8_printf(p->out, "%s", z); 2013 sqlite3_free(z); 2014 }else{ 2015 raw_printf(p->out, "%s", azCol[i]); 2016 } 2017 } 2018 raw_printf(p->out,")"); 2019 } 2020 p->cnt++; 2021 for(i=0; i<nArg; i++){ 2022 raw_printf(p->out, i>0 ? "," : " VALUES("); 2023 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2024 utf8_printf(p->out,"NULL"); 2025 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2026 if( ShellHasFlag(p, SHFLG_Newlines) ){ 2027 output_quoted_string(p->out, azArg[i]); 2028 }else{ 2029 output_quoted_escaped_string(p->out, azArg[i]); 2030 } 2031 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2032 utf8_printf(p->out,"%s", azArg[i]); 2033 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2034 char z[50]; 2035 double r = sqlite3_column_double(p->pStmt, i); 2036 sqlite3_snprintf(50,z,"%!.20g", r); 2037 raw_printf(p->out, "%s", z); 2038 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2039 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2040 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2041 output_hex_blob(p->out, pBlob, nBlob); 2042 }else if( isNumber(azArg[i], 0) ){ 2043 utf8_printf(p->out,"%s", azArg[i]); 2044 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 2045 output_quoted_string(p->out, azArg[i]); 2046 }else{ 2047 output_quoted_escaped_string(p->out, azArg[i]); 2048 } 2049 } 2050 raw_printf(p->out,");\n"); 2051 break; 2052 } 2053 case MODE_Quote: { 2054 if( azArg==0 ) break; 2055 if( p->cnt==0 && p->showHeader ){ 2056 for(i=0; i<nArg; i++){ 2057 if( i>0 ) raw_printf(p->out, ","); 2058 output_quoted_string(p->out, azCol[i]); 2059 } 2060 raw_printf(p->out,"\n"); 2061 } 2062 p->cnt++; 2063 for(i=0; i<nArg; i++){ 2064 if( i>0 ) raw_printf(p->out, ","); 2065 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 2066 utf8_printf(p->out,"NULL"); 2067 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 2068 output_quoted_string(p->out, azArg[i]); 2069 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 2070 utf8_printf(p->out,"%s", azArg[i]); 2071 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 2072 char z[50]; 2073 double r = sqlite3_column_double(p->pStmt, i); 2074 sqlite3_snprintf(50,z,"%!.20g", r); 2075 raw_printf(p->out, "%s", z); 2076 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 2077 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 2078 int nBlob = sqlite3_column_bytes(p->pStmt, i); 2079 output_hex_blob(p->out, pBlob, nBlob); 2080 }else if( isNumber(azArg[i], 0) ){ 2081 utf8_printf(p->out,"%s", azArg[i]); 2082 }else{ 2083 output_quoted_string(p->out, azArg[i]); 2084 } 2085 } 2086 raw_printf(p->out,"\n"); 2087 break; 2088 } 2089 case MODE_Ascii: { 2090 if( p->cnt++==0 && p->showHeader ){ 2091 for(i=0; i<nArg; i++){ 2092 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2093 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 2094 } 2095 utf8_printf(p->out, "%s", p->rowSeparator); 2096 } 2097 if( azArg==0 ) break; 2098 for(i=0; i<nArg; i++){ 2099 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 2100 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 2101 } 2102 utf8_printf(p->out, "%s", p->rowSeparator); 2103 break; 2104 } 2105 case MODE_EQP: { 2106 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 2107 break; 2108 } 2109 } 2110 return 0; 2111} 2112 2113/* 2114** This is the callback routine that the SQLite library 2115** invokes for each row of a query result. 2116*/ 2117static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 2118 /* since we don't have type info, call the shell_callback with a NULL value */ 2119 return shell_callback(pArg, nArg, azArg, azCol, NULL); 2120} 2121 2122/* 2123** This is the callback routine from sqlite3_exec() that appends all 2124** output onto the end of a ShellText object. 2125*/ 2126static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 2127 ShellText *p = (ShellText*)pArg; 2128 int i; 2129 UNUSED_PARAMETER(az); 2130 if( azArg==0 ) return 0; 2131 if( p->n ) appendText(p, "|", 0); 2132 for(i=0; i<nArg; i++){ 2133 if( i ) appendText(p, ",", 0); 2134 if( azArg[i] ) appendText(p, azArg[i], 0); 2135 } 2136 return 0; 2137} 2138 2139/* 2140** Generate an appropriate SELFTEST table in the main database. 2141*/ 2142static void createSelftestTable(ShellState *p){ 2143 char *zErrMsg = 0; 2144 sqlite3_exec(p->db, 2145 "SAVEPOINT selftest_init;\n" 2146 "CREATE TABLE IF NOT EXISTS selftest(\n" 2147 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 2148 " op TEXT,\n" /* Operator: memo run */ 2149 " cmd TEXT,\n" /* Command text */ 2150 " ans TEXT\n" /* Desired answer */ 2151 ");" 2152 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 2153 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 2154 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 2155 " 'memo','Tests generated by --init');\n" 2156 "INSERT INTO [_shell$self]\n" 2157 " SELECT 'run',\n" 2158 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 2159 "FROM sqlite_master ORDER BY 2'',224))',\n" 2160 " hex(sha3_query('SELECT type,name,tbl_name,sql " 2161 "FROM sqlite_master ORDER BY 2',224));\n" 2162 "INSERT INTO [_shell$self]\n" 2163 " SELECT 'run'," 2164 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 2165 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 2166 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 2167 " FROM (\n" 2168 " SELECT name FROM sqlite_master\n" 2169 " WHERE type='table'\n" 2170 " AND name<>'selftest'\n" 2171 " AND coalesce(rootpage,0)>0\n" 2172 " )\n" 2173 " ORDER BY name;\n" 2174 "INSERT INTO [_shell$self]\n" 2175 " VALUES('run','PRAGMA integrity_check','ok');\n" 2176 "INSERT INTO selftest(tno,op,cmd,ans)" 2177 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 2178 "DROP TABLE [_shell$self];" 2179 ,0,0,&zErrMsg); 2180 if( zErrMsg ){ 2181 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 2182 sqlite3_free(zErrMsg); 2183 } 2184 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 2185} 2186 2187 2188/* 2189** Set the destination table field of the ShellState structure to 2190** the name of the table given. Escape any quote characters in the 2191** table name. 2192*/ 2193static void set_table_name(ShellState *p, const char *zName){ 2194 int i, n; 2195 char cQuote; 2196 char *z; 2197 2198 if( p->zDestTable ){ 2199 free(p->zDestTable); 2200 p->zDestTable = 0; 2201 } 2202 if( zName==0 ) return; 2203 cQuote = quoteChar(zName); 2204 n = strlen30(zName); 2205 if( cQuote ) n += n+2; 2206 z = p->zDestTable = malloc( n+1 ); 2207 if( z==0 ) shell_out_of_memory(); 2208 n = 0; 2209 if( cQuote ) z[n++] = cQuote; 2210 for(i=0; zName[i]; i++){ 2211 z[n++] = zName[i]; 2212 if( zName[i]==cQuote ) z[n++] = cQuote; 2213 } 2214 if( cQuote ) z[n++] = cQuote; 2215 z[n] = 0; 2216} 2217 2218 2219/* 2220** Execute a query statement that will generate SQL output. Print 2221** the result columns, comma-separated, on a line and then add a 2222** semicolon terminator to the end of that line. 2223** 2224** If the number of columns is 1 and that column contains text "--" 2225** then write the semicolon on a separate line. That way, if a 2226** "--" comment occurs at the end of the statement, the comment 2227** won't consume the semicolon terminator. 2228*/ 2229static int run_table_dump_query( 2230 ShellState *p, /* Query context */ 2231 const char *zSelect, /* SELECT statement to extract content */ 2232 const char *zFirstRow /* Print before first row, if not NULL */ 2233){ 2234 sqlite3_stmt *pSelect; 2235 int rc; 2236 int nResult; 2237 int i; 2238 const char *z; 2239 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 2240 if( rc!=SQLITE_OK || !pSelect ){ 2241 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2242 sqlite3_errmsg(p->db)); 2243 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2244 return rc; 2245 } 2246 rc = sqlite3_step(pSelect); 2247 nResult = sqlite3_column_count(pSelect); 2248 while( rc==SQLITE_ROW ){ 2249 if( zFirstRow ){ 2250 utf8_printf(p->out, "%s", zFirstRow); 2251 zFirstRow = 0; 2252 } 2253 z = (const char*)sqlite3_column_text(pSelect, 0); 2254 utf8_printf(p->out, "%s", z); 2255 for(i=1; i<nResult; i++){ 2256 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 2257 } 2258 if( z==0 ) z = ""; 2259 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 2260 if( z[0] ){ 2261 raw_printf(p->out, "\n;\n"); 2262 }else{ 2263 raw_printf(p->out, ";\n"); 2264 } 2265 rc = sqlite3_step(pSelect); 2266 } 2267 rc = sqlite3_finalize(pSelect); 2268 if( rc!=SQLITE_OK ){ 2269 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 2270 sqlite3_errmsg(p->db)); 2271 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 2272 } 2273 return rc; 2274} 2275 2276/* 2277** Allocate space and save off current error string. 2278*/ 2279static char *save_err_msg( 2280 sqlite3 *db /* Database to query */ 2281){ 2282 int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); 2283 char *zErrMsg = sqlite3_malloc64(nErrMsg); 2284 if( zErrMsg ){ 2285 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); 2286 } 2287 return zErrMsg; 2288} 2289 2290#ifdef __linux__ 2291/* 2292** Attempt to display I/O stats on Linux using /proc/PID/io 2293*/ 2294static void displayLinuxIoStats(FILE *out){ 2295 FILE *in; 2296 char z[200]; 2297 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 2298 in = fopen(z, "rb"); 2299 if( in==0 ) return; 2300 while( fgets(z, sizeof(z), in)!=0 ){ 2301 static const struct { 2302 const char *zPattern; 2303 const char *zDesc; 2304 } aTrans[] = { 2305 { "rchar: ", "Bytes received by read():" }, 2306 { "wchar: ", "Bytes sent to write():" }, 2307 { "syscr: ", "Read() system calls:" }, 2308 { "syscw: ", "Write() system calls:" }, 2309 { "read_bytes: ", "Bytes read from storage:" }, 2310 { "write_bytes: ", "Bytes written to storage:" }, 2311 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 2312 }; 2313 int i; 2314 for(i=0; i<ArraySize(aTrans); i++){ 2315 int n = strlen30(aTrans[i].zPattern); 2316 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 2317 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 2318 break; 2319 } 2320 } 2321 } 2322 fclose(in); 2323} 2324#endif 2325 2326/* 2327** Display a single line of status using 64-bit values. 2328*/ 2329static void displayStatLine( 2330 ShellState *p, /* The shell context */ 2331 char *zLabel, /* Label for this one line */ 2332 char *zFormat, /* Format for the result */ 2333 int iStatusCtrl, /* Which status to display */ 2334 int bReset /* True to reset the stats */ 2335){ 2336 sqlite3_int64 iCur = -1; 2337 sqlite3_int64 iHiwtr = -1; 2338 int i, nPercent; 2339 char zLine[200]; 2340 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 2341 for(i=0, nPercent=0; zFormat[i]; i++){ 2342 if( zFormat[i]=='%' ) nPercent++; 2343 } 2344 if( nPercent>1 ){ 2345 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 2346 }else{ 2347 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 2348 } 2349 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 2350} 2351 2352/* 2353** Display memory stats. 2354*/ 2355static int display_stats( 2356 sqlite3 *db, /* Database to query */ 2357 ShellState *pArg, /* Pointer to ShellState */ 2358 int bReset /* True to reset the stats */ 2359){ 2360 int iCur; 2361 int iHiwtr; 2362 FILE *out; 2363 if( pArg==0 || pArg->out==0 ) return 0; 2364 out = pArg->out; 2365 2366 if( pArg->pStmt && (pArg->statsOn & 2) ){ 2367 int nCol, i, x; 2368 sqlite3_stmt *pStmt = pArg->pStmt; 2369 char z[100]; 2370 nCol = sqlite3_column_count(pStmt); 2371 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 2372 for(i=0; i<nCol; i++){ 2373 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 2374 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 2375#ifndef SQLITE_OMIT_DECLTYPE 2376 sqlite3_snprintf(30, z+x, "declared type:"); 2377 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 2378#endif 2379#ifdef SQLITE_ENABLE_COLUMN_METADATA 2380 sqlite3_snprintf(30, z+x, "database name:"); 2381 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 2382 sqlite3_snprintf(30, z+x, "table name:"); 2383 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 2384 sqlite3_snprintf(30, z+x, "origin name:"); 2385 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 2386#endif 2387 } 2388 } 2389 2390 displayStatLine(pArg, "Memory Used:", 2391 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 2392 displayStatLine(pArg, "Number of Outstanding Allocations:", 2393 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 2394 if( pArg->shellFlgs & SHFLG_Pagecache ){ 2395 displayStatLine(pArg, "Number of Pcache Pages Used:", 2396 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 2397 } 2398 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 2399 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 2400 displayStatLine(pArg, "Largest Allocation:", 2401 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 2402 displayStatLine(pArg, "Largest Pcache Allocation:", 2403 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 2404#ifdef YYTRACKMAXSTACKDEPTH 2405 displayStatLine(pArg, "Deepest Parser Stack:", 2406 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 2407#endif 2408 2409 if( db ){ 2410 if( pArg->shellFlgs & SHFLG_Lookaside ){ 2411 iHiwtr = iCur = -1; 2412 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 2413 &iCur, &iHiwtr, bReset); 2414 raw_printf(pArg->out, 2415 "Lookaside Slots Used: %d (max %d)\n", 2416 iCur, iHiwtr); 2417 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 2418 &iCur, &iHiwtr, bReset); 2419 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 2420 iHiwtr); 2421 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 2422 &iCur, &iHiwtr, bReset); 2423 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 2424 iHiwtr); 2425 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 2426 &iCur, &iHiwtr, bReset); 2427 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 2428 iHiwtr); 2429 } 2430 iHiwtr = iCur = -1; 2431 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 2432 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 2433 iCur); 2434 iHiwtr = iCur = -1; 2435 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 2436 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 2437 iHiwtr = iCur = -1; 2438 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 2439 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 2440 iHiwtr = iCur = -1; 2441 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 2442 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 2443 iHiwtr = iCur = -1; 2444 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 2445 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 2446 iHiwtr = iCur = -1; 2447 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 2448 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 2449 iCur); 2450 iHiwtr = iCur = -1; 2451 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 2452 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 2453 iCur); 2454 } 2455 2456 if( pArg->pStmt ){ 2457 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 2458 bReset); 2459 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 2460 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 2461 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 2462 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 2463 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 2464 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 2465 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 2466 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE, bReset); 2467 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 2468 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 2469 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 2470 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 2471 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 2472 } 2473 2474#ifdef __linux__ 2475 displayLinuxIoStats(pArg->out); 2476#endif 2477 2478 /* Do not remove this machine readable comment: extra-stats-output-here */ 2479 2480 return 0; 2481} 2482 2483/* 2484** Display scan stats. 2485*/ 2486static void display_scanstats( 2487 sqlite3 *db, /* Database to query */ 2488 ShellState *pArg /* Pointer to ShellState */ 2489){ 2490#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 2491 UNUSED_PARAMETER(db); 2492 UNUSED_PARAMETER(pArg); 2493#else 2494 int i, k, n, mx; 2495 raw_printf(pArg->out, "-------- scanstats --------\n"); 2496 mx = 0; 2497 for(k=0; k<=mx; k++){ 2498 double rEstLoop = 1.0; 2499 for(i=n=0; 1; i++){ 2500 sqlite3_stmt *p = pArg->pStmt; 2501 sqlite3_int64 nLoop, nVisit; 2502 double rEst; 2503 int iSid; 2504 const char *zExplain; 2505 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 2506 break; 2507 } 2508 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 2509 if( iSid>mx ) mx = iSid; 2510 if( iSid!=k ) continue; 2511 if( n==0 ){ 2512 rEstLoop = (double)nLoop; 2513 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 2514 } 2515 n++; 2516 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 2517 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 2518 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 2519 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 2520 rEstLoop *= rEst; 2521 raw_printf(pArg->out, 2522 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 2523 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 2524 ); 2525 } 2526 } 2527 raw_printf(pArg->out, "---------------------------\n"); 2528#endif 2529} 2530 2531/* 2532** Parameter azArray points to a zero-terminated array of strings. zStr 2533** points to a single nul-terminated string. Return non-zero if zStr 2534** is equal, according to strcmp(), to any of the strings in the array. 2535** Otherwise, return zero. 2536*/ 2537static int str_in_array(const char *zStr, const char **azArray){ 2538 int i; 2539 for(i=0; azArray[i]; i++){ 2540 if( 0==strcmp(zStr, azArray[i]) ) return 1; 2541 } 2542 return 0; 2543} 2544 2545/* 2546** If compiled statement pSql appears to be an EXPLAIN statement, allocate 2547** and populate the ShellState.aiIndent[] array with the number of 2548** spaces each opcode should be indented before it is output. 2549** 2550** The indenting rules are: 2551** 2552** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 2553** all opcodes that occur between the p2 jump destination and the opcode 2554** itself by 2 spaces. 2555** 2556** * For each "Goto", if the jump destination is earlier in the program 2557** and ends on one of: 2558** Yield SeekGt SeekLt RowSetRead Rewind 2559** or if the P1 parameter is one instead of zero, 2560** then indent all opcodes between the earlier instruction 2561** and "Goto" by 2 spaces. 2562*/ 2563static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 2564 const char *zSql; /* The text of the SQL statement */ 2565 const char *z; /* Used to check if this is an EXPLAIN */ 2566 int *abYield = 0; /* True if op is an OP_Yield */ 2567 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 2568 int iOp; /* Index of operation in p->aiIndent[] */ 2569 2570 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 2571 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 2572 "Rewind", 0 }; 2573 const char *azGoto[] = { "Goto", 0 }; 2574 2575 /* Try to figure out if this is really an EXPLAIN statement. If this 2576 ** cannot be verified, return early. */ 2577 if( sqlite3_column_count(pSql)!=8 ){ 2578 p->cMode = p->mode; 2579 return; 2580 } 2581 zSql = sqlite3_sql(pSql); 2582 if( zSql==0 ) return; 2583 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 2584 if( sqlite3_strnicmp(z, "explain", 7) ){ 2585 p->cMode = p->mode; 2586 return; 2587 } 2588 2589 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 2590 int i; 2591 int iAddr = sqlite3_column_int(pSql, 0); 2592 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 2593 2594 /* Set p2 to the P2 field of the current opcode. Then, assuming that 2595 ** p2 is an instruction address, set variable p2op to the index of that 2596 ** instruction in the aiIndent[] array. p2 and p2op may be different if 2597 ** the current instruction is part of a sub-program generated by an 2598 ** SQL trigger or foreign key. */ 2599 int p2 = sqlite3_column_int(pSql, 3); 2600 int p2op = (p2 + (iOp-iAddr)); 2601 2602 /* Grow the p->aiIndent array as required */ 2603 if( iOp>=nAlloc ){ 2604 if( iOp==0 ){ 2605 /* Do further verfication that this is explain output. Abort if 2606 ** it is not */ 2607 static const char *explainCols[] = { 2608 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 2609 int jj; 2610 for(jj=0; jj<ArraySize(explainCols); jj++){ 2611 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 2612 p->cMode = p->mode; 2613 sqlite3_reset(pSql); 2614 return; 2615 } 2616 } 2617 } 2618 nAlloc += 100; 2619 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 2620 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 2621 } 2622 abYield[iOp] = str_in_array(zOp, azYield); 2623 p->aiIndent[iOp] = 0; 2624 p->nIndent = iOp+1; 2625 2626 if( str_in_array(zOp, azNext) ){ 2627 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2628 } 2629 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 2630 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 2631 ){ 2632 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 2633 } 2634 } 2635 2636 p->iIndent = 0; 2637 sqlite3_free(abYield); 2638 sqlite3_reset(pSql); 2639} 2640 2641/* 2642** Free the array allocated by explain_data_prepare(). 2643*/ 2644static void explain_data_delete(ShellState *p){ 2645 sqlite3_free(p->aiIndent); 2646 p->aiIndent = 0; 2647 p->nIndent = 0; 2648 p->iIndent = 0; 2649} 2650 2651/* 2652** Disable and restore .wheretrace and .selecttrace settings. 2653*/ 2654#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2655extern int sqlite3SelectTrace; 2656static int savedSelectTrace; 2657#endif 2658#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2659extern int sqlite3WhereTrace; 2660static int savedWhereTrace; 2661#endif 2662static void disable_debug_trace_modes(void){ 2663#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2664 savedSelectTrace = sqlite3SelectTrace; 2665 sqlite3SelectTrace = 0; 2666#endif 2667#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2668 savedWhereTrace = sqlite3WhereTrace; 2669 sqlite3WhereTrace = 0; 2670#endif 2671} 2672static void restore_debug_trace_modes(void){ 2673#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 2674 sqlite3SelectTrace = savedSelectTrace; 2675#endif 2676#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 2677 sqlite3WhereTrace = savedWhereTrace; 2678#endif 2679} 2680 2681/* 2682** Run a prepared statement 2683*/ 2684static void exec_prepared_stmt( 2685 ShellState *pArg, /* Pointer to ShellState */ 2686 sqlite3_stmt *pStmt /* Statment to run */ 2687){ 2688 int rc; 2689 2690 /* perform the first step. this will tell us if we 2691 ** have a result set or not and how wide it is. 2692 */ 2693 rc = sqlite3_step(pStmt); 2694 /* if we have a result set... */ 2695 if( SQLITE_ROW == rc ){ 2696 /* allocate space for col name ptr, value ptr, and type */ 2697 int nCol = sqlite3_column_count(pStmt); 2698 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 2699 if( !pData ){ 2700 rc = SQLITE_NOMEM; 2701 }else{ 2702 char **azCols = (char **)pData; /* Names of result columns */ 2703 char **azVals = &azCols[nCol]; /* Results */ 2704 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 2705 int i, x; 2706 assert(sizeof(int) <= sizeof(char *)); 2707 /* save off ptrs to column names */ 2708 for(i=0; i<nCol; i++){ 2709 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 2710 } 2711 do{ 2712 /* extract the data and data types */ 2713 for(i=0; i<nCol; i++){ 2714 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 2715 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 2716 azVals[i] = ""; 2717 }else{ 2718 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 2719 } 2720 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 2721 rc = SQLITE_NOMEM; 2722 break; /* from for */ 2723 } 2724 } /* end for */ 2725 2726 /* if data and types extracted successfully... */ 2727 if( SQLITE_ROW == rc ){ 2728 /* call the supplied callback with the result row data */ 2729 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 2730 rc = SQLITE_ABORT; 2731 }else{ 2732 rc = sqlite3_step(pStmt); 2733 } 2734 } 2735 } while( SQLITE_ROW == rc ); 2736 sqlite3_free(pData); 2737 } 2738 } 2739} 2740 2741#ifndef SQLITE_OMIT_VIRTUALTABLE 2742/* 2743** This function is called to process SQL if the previous shell command 2744** was ".expert". It passes the SQL in the second argument directly to 2745** the sqlite3expert object. 2746** 2747** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 2748** code. In this case, (*pzErr) may be set to point to a buffer containing 2749** an English language error message. It is the responsibility of the 2750** caller to eventually free this buffer using sqlite3_free(). 2751*/ 2752static int expertHandleSQL( 2753 ShellState *pState, 2754 const char *zSql, 2755 char **pzErr 2756){ 2757 assert( pState->expert.pExpert ); 2758 assert( pzErr==0 || *pzErr==0 ); 2759 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 2760} 2761 2762/* 2763** This function is called either to silently clean up the object 2764** created by the ".expert" command (if bCancel==1), or to generate a 2765** report from it and then clean it up (if bCancel==0). 2766** 2767** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 2768** code. In this case, (*pzErr) may be set to point to a buffer containing 2769** an English language error message. It is the responsibility of the 2770** caller to eventually free this buffer using sqlite3_free(). 2771*/ 2772static int expertFinish( 2773 ShellState *pState, 2774 int bCancel, 2775 char **pzErr 2776){ 2777 int rc = SQLITE_OK; 2778 sqlite3expert *p = pState->expert.pExpert; 2779 assert( p ); 2780 assert( bCancel || pzErr==0 || *pzErr==0 ); 2781 if( bCancel==0 ){ 2782 FILE *out = pState->out; 2783 int bVerbose = pState->expert.bVerbose; 2784 2785 rc = sqlite3_expert_analyze(p, pzErr); 2786 if( rc==SQLITE_OK ){ 2787 int nQuery = sqlite3_expert_count(p); 2788 int i; 2789 2790 if( bVerbose ){ 2791 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 2792 raw_printf(out, "-- Candidates -----------------------------\n"); 2793 raw_printf(out, "%s\n", zCand); 2794 } 2795 for(i=0; i<nQuery; i++){ 2796 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 2797 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 2798 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 2799 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 2800 if( bVerbose ){ 2801 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 2802 raw_printf(out, "%s\n\n", zSql); 2803 } 2804 raw_printf(out, "%s\n", zIdx); 2805 raw_printf(out, "%s\n", zEQP); 2806 } 2807 } 2808 } 2809 sqlite3_expert_destroy(p); 2810 pState->expert.pExpert = 0; 2811 return rc; 2812} 2813 2814/* 2815** Implementation of ".expert" dot command. 2816*/ 2817static int expertDotCommand( 2818 ShellState *pState, /* Current shell tool state */ 2819 char **azArg, /* Array of arguments passed to dot command */ 2820 int nArg /* Number of entries in azArg[] */ 2821){ 2822 int rc = SQLITE_OK; 2823 char *zErr = 0; 2824 int i; 2825 int iSample = 0; 2826 2827 assert( pState->expert.pExpert==0 ); 2828 memset(&pState->expert, 0, sizeof(ExpertInfo)); 2829 2830 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 2831 char *z = azArg[i]; 2832 int n; 2833 if( z[0]=='-' && z[1]=='-' ) z++; 2834 n = strlen30(z); 2835 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 2836 pState->expert.bVerbose = 1; 2837 } 2838 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 2839 if( i==(nArg-1) ){ 2840 raw_printf(stderr, "option requires an argument: %s\n", z); 2841 rc = SQLITE_ERROR; 2842 }else{ 2843 iSample = (int)integerValue(azArg[++i]); 2844 if( iSample<0 || iSample>100 ){ 2845 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 2846 rc = SQLITE_ERROR; 2847 } 2848 } 2849 } 2850 else{ 2851 raw_printf(stderr, "unknown option: %s\n", z); 2852 rc = SQLITE_ERROR; 2853 } 2854 } 2855 2856 if( rc==SQLITE_OK ){ 2857 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 2858 if( pState->expert.pExpert==0 ){ 2859 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr); 2860 rc = SQLITE_ERROR; 2861 }else{ 2862 sqlite3_expert_config( 2863 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 2864 ); 2865 } 2866 } 2867 2868 return rc; 2869} 2870#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 2871 2872/* 2873** Execute a statement or set of statements. Print 2874** any result rows/columns depending on the current mode 2875** set via the supplied callback. 2876** 2877** This is very similar to SQLite's built-in sqlite3_exec() 2878** function except it takes a slightly different callback 2879** and callback data argument. 2880*/ 2881static int shell_exec( 2882 ShellState *pArg, /* Pointer to ShellState */ 2883 const char *zSql, /* SQL to be evaluated */ 2884 char **pzErrMsg /* Error msg written here */ 2885){ 2886 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 2887 int rc = SQLITE_OK; /* Return Code */ 2888 int rc2; 2889 const char *zLeftover; /* Tail of unprocessed SQL */ 2890 sqlite3 *db = pArg->db; 2891 2892 if( pzErrMsg ){ 2893 *pzErrMsg = NULL; 2894 } 2895 2896#ifndef SQLITE_OMIT_VIRTUALTABLE 2897 if( pArg->expert.pExpert ){ 2898 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 2899 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 2900 } 2901#endif 2902 2903 while( zSql[0] && (SQLITE_OK == rc) ){ 2904 static const char *zStmtSql; 2905 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 2906 if( SQLITE_OK != rc ){ 2907 if( pzErrMsg ){ 2908 *pzErrMsg = save_err_msg(db); 2909 } 2910 }else{ 2911 if( !pStmt ){ 2912 /* this happens for a comment or white-space */ 2913 zSql = zLeftover; 2914 while( IsSpace(zSql[0]) ) zSql++; 2915 continue; 2916 } 2917 zStmtSql = sqlite3_sql(pStmt); 2918 if( zStmtSql==0 ) zStmtSql = ""; 2919 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 2920 2921 /* save off the prepared statment handle and reset row count */ 2922 if( pArg ){ 2923 pArg->pStmt = pStmt; 2924 pArg->cnt = 0; 2925 } 2926 2927 /* echo the sql statement if echo on */ 2928 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 2929 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 2930 } 2931 2932 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 2933 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){ 2934 sqlite3_stmt *pExplain; 2935 char *zEQP; 2936 int triggerEQP = 0; 2937 disable_debug_trace_modes(); 2938 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 2939 if( pArg->autoEQP>=AUTOEQP_trigger ){ 2940 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 2941 } 2942 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 2943 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 2944 if( rc==SQLITE_OK ){ 2945 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 2946 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 2947 int iEqpId = sqlite3_column_int(pExplain, 0); 2948 int iParentId = sqlite3_column_int(pExplain, 1); 2949 if( zEQPLine[0]=='-' ) eqp_render(pArg); 2950 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 2951 } 2952 eqp_render(pArg); 2953 } 2954 sqlite3_finalize(pExplain); 2955 sqlite3_free(zEQP); 2956 if( pArg->autoEQP>=AUTOEQP_full ){ 2957 /* Also do an EXPLAIN for ".eqp full" mode */ 2958 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 2959 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 2960 if( rc==SQLITE_OK ){ 2961 pArg->cMode = MODE_Explain; 2962 explain_data_prepare(pArg, pExplain); 2963 exec_prepared_stmt(pArg, pExplain); 2964 explain_data_delete(pArg); 2965 } 2966 sqlite3_finalize(pExplain); 2967 sqlite3_free(zEQP); 2968 } 2969 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 2970 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 2971 /* Reprepare pStmt before reactiving trace modes */ 2972 sqlite3_finalize(pStmt); 2973 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 2974 if( pArg ) pArg->pStmt = pStmt; 2975 } 2976 restore_debug_trace_modes(); 2977 } 2978 2979 if( pArg ){ 2980 pArg->cMode = pArg->mode; 2981 if( pArg->autoExplain ){ 2982 if( sqlite3_column_count(pStmt)==8 2983 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0 2984 ){ 2985 pArg->cMode = MODE_Explain; 2986 } 2987 if( sqlite3_column_count(pStmt)==4 2988 && sqlite3_strlike("EXPLAIN QUERY PLAN%", zStmtSql,0)==0 ){ 2989 pArg->cMode = MODE_EQP; 2990 } 2991 } 2992 2993 /* If the shell is currently in ".explain" mode, gather the extra 2994 ** data required to add indents to the output.*/ 2995 if( pArg->cMode==MODE_Explain ){ 2996 explain_data_prepare(pArg, pStmt); 2997 } 2998 } 2999 3000 exec_prepared_stmt(pArg, pStmt); 3001 explain_data_delete(pArg); 3002 eqp_render(pArg); 3003 3004 /* print usage stats if stats on */ 3005 if( pArg && pArg->statsOn ){ 3006 display_stats(db, pArg, 0); 3007 } 3008 3009 /* print loop-counters if required */ 3010 if( pArg && pArg->scanstatsOn ){ 3011 display_scanstats(db, pArg); 3012 } 3013 3014 /* Finalize the statement just executed. If this fails, save a 3015 ** copy of the error message. Otherwise, set zSql to point to the 3016 ** next statement to execute. */ 3017 rc2 = sqlite3_finalize(pStmt); 3018 if( rc!=SQLITE_NOMEM ) rc = rc2; 3019 if( rc==SQLITE_OK ){ 3020 zSql = zLeftover; 3021 while( IsSpace(zSql[0]) ) zSql++; 3022 }else if( pzErrMsg ){ 3023 *pzErrMsg = save_err_msg(db); 3024 } 3025 3026 /* clear saved stmt handle */ 3027 if( pArg ){ 3028 pArg->pStmt = NULL; 3029 } 3030 } 3031 } /* end while */ 3032 3033 return rc; 3034} 3035 3036/* 3037** Release memory previously allocated by tableColumnList(). 3038*/ 3039static void freeColumnList(char **azCol){ 3040 int i; 3041 for(i=1; azCol[i]; i++){ 3042 sqlite3_free(azCol[i]); 3043 } 3044 /* azCol[0] is a static string */ 3045 sqlite3_free(azCol); 3046} 3047 3048/* 3049** Return a list of pointers to strings which are the names of all 3050** columns in table zTab. The memory to hold the names is dynamically 3051** allocated and must be released by the caller using a subsequent call 3052** to freeColumnList(). 3053** 3054** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 3055** value that needs to be preserved, then azCol[0] is filled in with the 3056** name of the rowid column. 3057** 3058** The first regular column in the table is azCol[1]. The list is terminated 3059** by an entry with azCol[i]==0. 3060*/ 3061static char **tableColumnList(ShellState *p, const char *zTab){ 3062 char **azCol = 0; 3063 sqlite3_stmt *pStmt; 3064 char *zSql; 3065 int nCol = 0; 3066 int nAlloc = 0; 3067 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 3068 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 3069 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 3070 int rc; 3071 3072 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 3073 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3074 sqlite3_free(zSql); 3075 if( rc ) return 0; 3076 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 3077 if( nCol>=nAlloc-2 ){ 3078 nAlloc = nAlloc*2 + nCol + 10; 3079 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 3080 if( azCol==0 ) shell_out_of_memory(); 3081 } 3082 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 3083 if( sqlite3_column_int(pStmt, 5) ){ 3084 nPK++; 3085 if( nPK==1 3086 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 3087 "INTEGER")==0 3088 ){ 3089 isIPK = 1; 3090 }else{ 3091 isIPK = 0; 3092 } 3093 } 3094 } 3095 sqlite3_finalize(pStmt); 3096 if( azCol==0 ) return 0; 3097 azCol[0] = 0; 3098 azCol[nCol+1] = 0; 3099 3100 /* The decision of whether or not a rowid really needs to be preserved 3101 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 3102 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 3103 ** rowids on tables where the rowid is inaccessible because there are other 3104 ** columns in the table named "rowid", "_rowid_", and "oid". 3105 */ 3106 if( preserveRowid && isIPK ){ 3107 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 3108 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 3109 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 3110 ** ROWID aliases. To distinguish these cases, check to see if 3111 ** there is a "pk" entry in "PRAGMA index_list". There will be 3112 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 3113 */ 3114 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 3115 " WHERE origin='pk'", zTab); 3116 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 3117 sqlite3_free(zSql); 3118 if( rc ){ 3119 freeColumnList(azCol); 3120 return 0; 3121 } 3122 rc = sqlite3_step(pStmt); 3123 sqlite3_finalize(pStmt); 3124 preserveRowid = rc==SQLITE_ROW; 3125 } 3126 if( preserveRowid ){ 3127 /* Only preserve the rowid if we can find a name to use for the 3128 ** rowid */ 3129 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 3130 int i, j; 3131 for(j=0; j<3; j++){ 3132 for(i=1; i<=nCol; i++){ 3133 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 3134 } 3135 if( i>nCol ){ 3136 /* At this point, we know that azRowid[j] is not the name of any 3137 ** ordinary column in the table. Verify that azRowid[j] is a valid 3138 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 3139 ** tables will fail this last check */ 3140 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 3141 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 3142 break; 3143 } 3144 } 3145 } 3146 return azCol; 3147} 3148 3149/* 3150** Toggle the reverse_unordered_selects setting. 3151*/ 3152static void toggleSelectOrder(sqlite3 *db){ 3153 sqlite3_stmt *pStmt = 0; 3154 int iSetting = 0; 3155 char zStmt[100]; 3156 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 3157 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 3158 iSetting = sqlite3_column_int(pStmt, 0); 3159 } 3160 sqlite3_finalize(pStmt); 3161 sqlite3_snprintf(sizeof(zStmt), zStmt, 3162 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 3163 sqlite3_exec(db, zStmt, 0, 0, 0); 3164} 3165 3166/* 3167** This is a different callback routine used for dumping the database. 3168** Each row received by this callback consists of a table name, 3169** the table type ("index" or "table") and SQL to create the table. 3170** This routine should print text sufficient to recreate the table. 3171*/ 3172static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 3173 int rc; 3174 const char *zTable; 3175 const char *zType; 3176 const char *zSql; 3177 ShellState *p = (ShellState *)pArg; 3178 3179 UNUSED_PARAMETER(azNotUsed); 3180 if( nArg!=3 || azArg==0 ) return 0; 3181 zTable = azArg[0]; 3182 zType = azArg[1]; 3183 zSql = azArg[2]; 3184 3185 if( strcmp(zTable, "sqlite_sequence")==0 ){ 3186 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 3187 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){ 3188 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 3189 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 3190 return 0; 3191 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 3192 char *zIns; 3193 if( !p->writableSchema ){ 3194 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 3195 p->writableSchema = 1; 3196 } 3197 zIns = sqlite3_mprintf( 3198 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" 3199 "VALUES('table','%q','%q',0,'%q');", 3200 zTable, zTable, zSql); 3201 utf8_printf(p->out, "%s\n", zIns); 3202 sqlite3_free(zIns); 3203 return 0; 3204 }else{ 3205 printSchemaLine(p->out, zSql, ";\n"); 3206 } 3207 3208 if( strcmp(zType, "table")==0 ){ 3209 ShellText sSelect; 3210 ShellText sTable; 3211 char **azCol; 3212 int i; 3213 char *savedDestTable; 3214 int savedMode; 3215 3216 azCol = tableColumnList(p, zTable); 3217 if( azCol==0 ){ 3218 p->nErr++; 3219 return 0; 3220 } 3221 3222 /* Always quote the table name, even if it appears to be pure ascii, 3223 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 3224 initText(&sTable); 3225 appendText(&sTable, zTable, quoteChar(zTable)); 3226 /* If preserving the rowid, add a column list after the table name. 3227 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 3228 ** instead of the usual "INSERT INTO tab VALUES(...)". 3229 */ 3230 if( azCol[0] ){ 3231 appendText(&sTable, "(", 0); 3232 appendText(&sTable, azCol[0], 0); 3233 for(i=1; azCol[i]; i++){ 3234 appendText(&sTable, ",", 0); 3235 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 3236 } 3237 appendText(&sTable, ")", 0); 3238 } 3239 3240 /* Build an appropriate SELECT statement */ 3241 initText(&sSelect); 3242 appendText(&sSelect, "SELECT ", 0); 3243 if( azCol[0] ){ 3244 appendText(&sSelect, azCol[0], 0); 3245 appendText(&sSelect, ",", 0); 3246 } 3247 for(i=1; azCol[i]; i++){ 3248 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 3249 if( azCol[i+1] ){ 3250 appendText(&sSelect, ",", 0); 3251 } 3252 } 3253 freeColumnList(azCol); 3254 appendText(&sSelect, " FROM ", 0); 3255 appendText(&sSelect, zTable, quoteChar(zTable)); 3256 3257 savedDestTable = p->zDestTable; 3258 savedMode = p->mode; 3259 p->zDestTable = sTable.z; 3260 p->mode = p->cMode = MODE_Insert; 3261 rc = shell_exec(p, sSelect.z, 0); 3262 if( (rc&0xff)==SQLITE_CORRUPT ){ 3263 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3264 toggleSelectOrder(p->db); 3265 shell_exec(p, sSelect.z, 0); 3266 toggleSelectOrder(p->db); 3267 } 3268 p->zDestTable = savedDestTable; 3269 p->mode = savedMode; 3270 freeText(&sTable); 3271 freeText(&sSelect); 3272 if( rc ) p->nErr++; 3273 } 3274 return 0; 3275} 3276 3277/* 3278** Run zQuery. Use dump_callback() as the callback routine so that 3279** the contents of the query are output as SQL statements. 3280** 3281** If we get a SQLITE_CORRUPT error, rerun the query after appending 3282** "ORDER BY rowid DESC" to the end. 3283*/ 3284static int run_schema_dump_query( 3285 ShellState *p, 3286 const char *zQuery 3287){ 3288 int rc; 3289 char *zErr = 0; 3290 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 3291 if( rc==SQLITE_CORRUPT ){ 3292 char *zQ2; 3293 int len = strlen30(zQuery); 3294 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 3295 if( zErr ){ 3296 utf8_printf(p->out, "/****** %s ******/\n", zErr); 3297 sqlite3_free(zErr); 3298 zErr = 0; 3299 } 3300 zQ2 = malloc( len+100 ); 3301 if( zQ2==0 ) return rc; 3302 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 3303 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 3304 if( rc ){ 3305 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 3306 }else{ 3307 rc = SQLITE_CORRUPT; 3308 } 3309 sqlite3_free(zErr); 3310 free(zQ2); 3311 } 3312 return rc; 3313} 3314 3315/* 3316** Text of a help message 3317*/ 3318static char zHelp[] = 3319#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 3320 ".archive ... Manage SQL archives: \".archive --help\" for details\n" 3321#endif 3322#ifndef SQLITE_OMIT_AUTHORIZATION 3323 ".auth ON|OFF Show authorizer callbacks\n" 3324#endif 3325 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" 3326 " Add \"--append\" to open using appendvfs.\n" 3327 ".bail on|off Stop after hitting an error. Default OFF\n" 3328 ".binary on|off Turn binary output on or off. Default OFF\n" 3329 ".cd DIRECTORY Change the working directory to DIRECTORY\n" 3330 ".changes on|off Show number of rows changed by SQL\n" 3331 ".check GLOB Fail if output since .testcase does not match\n" 3332 ".clone NEWDB Clone data into NEWDB from the existing database\n" 3333 ".databases List names and files of attached databases\n" 3334 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options\n" 3335 ".dbinfo ?DB? Show status information about the database\n" 3336 ".dump ?TABLE? ... Dump the database in an SQL text format\n" 3337 " If TABLE specified, only dump tables matching\n" 3338 " LIKE pattern TABLE.\n" 3339 ".echo on|off Turn command echo on or off\n" 3340 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n" 3341 ".excel Display the output of next command in a spreadsheet\n" 3342 ".exit Exit this program\n" 3343 ".expert EXPERIMENTAL. Suggest indexes for specified queries\n" 3344/* Because explain mode comes on automatically now, the ".explain" mode 3345** is removed from the help screen. It is still supported for legacy, however */ 3346/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/ 3347 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n" 3348 ".headers on|off Turn display of headers on or off\n" 3349 ".help Show this message\n" 3350 ".import FILE TABLE Import data from FILE into TABLE\n" 3351#ifndef SQLITE_OMIT_TEST_CONTROL 3352 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n" 3353#endif 3354 ".indexes ?TABLE? Show names of all indexes\n" 3355 " If TABLE specified, only show indexes for tables\n" 3356 " matching LIKE pattern TABLE.\n" 3357#ifdef SQLITE_ENABLE_IOTRACE 3358 ".iotrace FILE Enable I/O diagnostic logging to FILE\n" 3359#endif 3360 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n" 3361 ".lint OPTIONS Report potential schema issues. Options:\n" 3362 " fkey-indexes Find missing foreign key indexes\n" 3363#ifndef SQLITE_OMIT_LOAD_EXTENSION 3364 ".load FILE ?ENTRY? Load an extension library\n" 3365#endif 3366 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n" 3367 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" 3368 " ascii Columns/rows delimited by 0x1F and 0x1E\n" 3369 " csv Comma-separated values\n" 3370 " column Left-aligned columns. (See .width)\n" 3371 " html HTML <table> code\n" 3372 " insert SQL insert statements for TABLE\n" 3373 " line One value per line\n" 3374 " list Values delimited by \"|\"\n" 3375 " quote Escape answers as for SQL\n" 3376 " tabs Tab-separated values\n" 3377 " tcl TCL list elements\n" 3378 ".nullvalue STRING Use STRING in place of NULL values\n" 3379 ".once (-e|-x|FILE) Output for the next SQL command only to FILE\n" 3380 " or invoke system text editor (-e) or spreadsheet (-x)\n" 3381 " on the output.\n" 3382 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n" 3383 " The --new option starts with an empty file\n" 3384 " Other options: --readonly --append --zip\n" 3385 ".output ?FILE? Send output to FILE or stdout\n" 3386 ".print STRING... Print literal STRING\n" 3387 ".prompt MAIN CONTINUE Replace the standard prompts\n" 3388 ".quit Exit this program\n" 3389 ".read FILENAME Execute SQL in FILENAME\n" 3390 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" 3391 ".save FILE Write in-memory database into FILE\n" 3392 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n" 3393 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n" 3394 " Add --indent for pretty-printing\n" 3395 ".selftest ?--init? Run tests defined in the SELFTEST table\n" 3396 ".separator COL ?ROW? Change the column separator and optionally the row\n" 3397 " separator for both the output mode and .import\n" 3398#if defined(SQLITE_ENABLE_SESSION) 3399 ".session CMD ... Create or control sessions\n" 3400#endif 3401 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n" 3402#ifndef SQLITE_NOHAVE_SYSTEM 3403 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n" 3404#endif 3405 ".show Show the current values for various settings\n" 3406 ".stats ?on|off? Show stats or turn stats on or off\n" 3407#ifndef SQLITE_NOHAVE_SYSTEM 3408 ".system CMD ARGS... Run CMD ARGS... in a system shell\n" 3409#endif 3410 ".tables ?TABLE? List names of tables\n" 3411 " If TABLE specified, only list tables matching\n" 3412 " LIKE pattern TABLE.\n" 3413 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n" 3414 ".timeout MS Try opening locked tables for MS milliseconds\n" 3415 ".timer on|off Turn SQL timer on or off\n" 3416 ".trace FILE|off Output each SQL statement as it is run\n" 3417 ".vfsinfo ?AUX? Information about the top-level VFS\n" 3418 ".vfslist List all available VFSes\n" 3419 ".vfsname ?AUX? Print the name of the VFS stack\n" 3420 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" 3421 " Negative values right-justify\n" 3422; 3423 3424#if defined(SQLITE_ENABLE_SESSION) 3425/* 3426** Print help information for the ".sessions" command 3427*/ 3428void session_help(ShellState *p){ 3429 raw_printf(p->out, 3430 ".session ?NAME? SUBCOMMAND ?ARGS...?\n" 3431 "If ?NAME? is omitted, the first defined session is used.\n" 3432 "Subcommands:\n" 3433 " attach TABLE Attach TABLE\n" 3434 " changeset FILE Write a changeset into FILE\n" 3435 " close Close one session\n" 3436 " enable ?BOOLEAN? Set or query the enable bit\n" 3437 " filter GLOB... Reject tables matching GLOBs\n" 3438 " indirect ?BOOLEAN? Mark or query the indirect status\n" 3439 " isempty Query whether the session is empty\n" 3440 " list List currently open session names\n" 3441 " open DB NAME Open a new session on DB\n" 3442 " patchset FILE Write a patchset into FILE\n" 3443 ); 3444} 3445#endif 3446 3447 3448/* Forward reference */ 3449static int process_input(ShellState *p, FILE *in); 3450 3451/* 3452** Read the content of file zName into memory obtained from sqlite3_malloc64() 3453** and return a pointer to the buffer. The caller is responsible for freeing 3454** the memory. 3455** 3456** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 3457** read. 3458** 3459** For convenience, a nul-terminator byte is always appended to the data read 3460** from the file before the buffer is returned. This byte is not included in 3461** the final value of (*pnByte), if applicable. 3462** 3463** NULL is returned if any error is encountered. The final value of *pnByte 3464** is undefined in this case. 3465*/ 3466static char *readFile(const char *zName, int *pnByte){ 3467 FILE *in = fopen(zName, "rb"); 3468 long nIn; 3469 size_t nRead; 3470 char *pBuf; 3471 if( in==0 ) return 0; 3472 fseek(in, 0, SEEK_END); 3473 nIn = ftell(in); 3474 rewind(in); 3475 pBuf = sqlite3_malloc64( nIn+1 ); 3476 if( pBuf==0 ) return 0; 3477 nRead = fread(pBuf, nIn, 1, in); 3478 fclose(in); 3479 if( nRead!=1 ){ 3480 sqlite3_free(pBuf); 3481 return 0; 3482 } 3483 pBuf[nIn] = 0; 3484 if( pnByte ) *pnByte = nIn; 3485 return pBuf; 3486} 3487 3488#if defined(SQLITE_ENABLE_SESSION) 3489/* 3490** Close a single OpenSession object and release all of its associated 3491** resources. 3492*/ 3493static void session_close(OpenSession *pSession){ 3494 int i; 3495 sqlite3session_delete(pSession->p); 3496 sqlite3_free(pSession->zName); 3497 for(i=0; i<pSession->nFilter; i++){ 3498 sqlite3_free(pSession->azFilter[i]); 3499 } 3500 sqlite3_free(pSession->azFilter); 3501 memset(pSession, 0, sizeof(OpenSession)); 3502} 3503#endif 3504 3505/* 3506** Close all OpenSession objects and release all associated resources. 3507*/ 3508#if defined(SQLITE_ENABLE_SESSION) 3509static void session_close_all(ShellState *p){ 3510 int i; 3511 for(i=0; i<p->nSession; i++){ 3512 session_close(&p->aSession[i]); 3513 } 3514 p->nSession = 0; 3515} 3516#else 3517# define session_close_all(X) 3518#endif 3519 3520/* 3521** Implementation of the xFilter function for an open session. Omit 3522** any tables named by ".session filter" but let all other table through. 3523*/ 3524#if defined(SQLITE_ENABLE_SESSION) 3525static int session_filter(void *pCtx, const char *zTab){ 3526 OpenSession *pSession = (OpenSession*)pCtx; 3527 int i; 3528 for(i=0; i<pSession->nFilter; i++){ 3529 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 3530 } 3531 return 1; 3532} 3533#endif 3534 3535/* 3536** Try to deduce the type of file for zName based on its content. Return 3537** one of the SHELL_OPEN_* constants. 3538** 3539** If the file does not exist or is empty but its name looks like a ZIP 3540** archive and the dfltZip flag is true, then assume it is a ZIP archive. 3541** Otherwise, assume an ordinary database regardless of the filename if 3542** the type cannot be determined from content. 3543*/ 3544int deduceDatabaseType(const char *zName, int dfltZip){ 3545 FILE *f = fopen(zName, "rb"); 3546 size_t n; 3547 int rc = SHELL_OPEN_UNSPEC; 3548 char zBuf[100]; 3549 if( f==0 ){ 3550 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 3551 return SHELL_OPEN_ZIPFILE; 3552 }else{ 3553 return SHELL_OPEN_NORMAL; 3554 } 3555 } 3556 fseek(f, -25, SEEK_END); 3557 n = fread(zBuf, 25, 1, f); 3558 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 3559 rc = SHELL_OPEN_APPENDVFS; 3560 }else{ 3561 fseek(f, -22, SEEK_END); 3562 n = fread(zBuf, 22, 1, f); 3563 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 3564 && zBuf[3]==0x06 ){ 3565 rc = SHELL_OPEN_ZIPFILE; 3566 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 3567 rc = SHELL_OPEN_ZIPFILE; 3568 } 3569 } 3570 fclose(f); 3571 return rc; 3572} 3573 3574/* Flags for open_db(). 3575** 3576** The default behavior of open_db() is to exit(1) if the database fails to 3577** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 3578** but still returns without calling exit. 3579** 3580** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 3581** ZIP archive if the file does not exist or is empty and its name matches 3582** the *.zip pattern. 3583*/ 3584#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 3585#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 3586 3587/* 3588** Make sure the database is open. If it is not, then open it. If 3589** the database fails to open, print an error message and exit. 3590*/ 3591static void open_db(ShellState *p, int openFlags){ 3592 if( p->db==0 ){ 3593 if( p->openMode==SHELL_OPEN_UNSPEC ){ 3594 if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){ 3595 p->openMode = SHELL_OPEN_NORMAL; 3596 }else{ 3597 p->openMode = (u8)deduceDatabaseType(p->zDbFilename, 3598 (openFlags & OPEN_DB_ZIPFILE)!=0); 3599 } 3600 } 3601 switch( p->openMode ){ 3602 case SHELL_OPEN_APPENDVFS: { 3603 sqlite3_open_v2(p->zDbFilename, &p->db, 3604 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs"); 3605 break; 3606 } 3607 case SHELL_OPEN_ZIPFILE: { 3608 sqlite3_open(":memory:", &p->db); 3609 break; 3610 } 3611 case SHELL_OPEN_READONLY: { 3612 sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0); 3613 break; 3614 } 3615 case SHELL_OPEN_UNSPEC: 3616 case SHELL_OPEN_NORMAL: { 3617 sqlite3_open(p->zDbFilename, &p->db); 3618 break; 3619 } 3620 } 3621 globalDb = p->db; 3622 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 3623 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 3624 p->zDbFilename, sqlite3_errmsg(p->db)); 3625 if( openFlags & OPEN_DB_KEEPALIVE ) return; 3626 exit(1); 3627 } 3628#ifndef SQLITE_OMIT_LOAD_EXTENSION 3629 sqlite3_enable_load_extension(p->db, 1); 3630#endif 3631 sqlite3_fileio_init(p->db, 0, 0); 3632 sqlite3_shathree_init(p->db, 0, 0); 3633 sqlite3_completion_init(p->db, 0, 0); 3634#ifdef SQLITE_HAVE_ZLIB 3635 sqlite3_zipfile_init(p->db, 0, 0); 3636 sqlite3_sqlar_init(p->db, 0, 0); 3637#endif 3638 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 3639 shellAddSchemaName, 0, 0); 3640 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 3641 shellModuleSchema, 0, 0); 3642 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 3643 shellPutsFunc, 0, 0); 3644#ifndef SQLITE_NOHAVE_SYSTEM 3645 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 3646 editFunc, 0, 0); 3647 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 3648 editFunc, 0, 0); 3649#endif 3650 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 3651 char *zSql = sqlite3_mprintf( 3652 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); 3653 sqlite3_exec(p->db, zSql, 0, 0, 0); 3654 sqlite3_free(zSql); 3655 } 3656 } 3657} 3658 3659/* 3660** Attempt to close the databaes connection. Report errors. 3661*/ 3662void close_db(sqlite3 *db){ 3663 int rc = sqlite3_close(db); 3664 if( rc ){ 3665 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 3666 rc, sqlite3_errmsg(db)); 3667 } 3668} 3669 3670#if HAVE_READLINE || HAVE_EDITLINE 3671/* 3672** Readline completion callbacks 3673*/ 3674static char *readline_completion_generator(const char *text, int state){ 3675 static sqlite3_stmt *pStmt = 0; 3676 char *zRet; 3677 if( state==0 ){ 3678 char *zSql; 3679 sqlite3_finalize(pStmt); 3680 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 3681 " FROM completion(%Q) ORDER BY 1", text); 3682 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 3683 sqlite3_free(zSql); 3684 } 3685 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 3686 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); 3687 }else{ 3688 sqlite3_finalize(pStmt); 3689 pStmt = 0; 3690 zRet = 0; 3691 } 3692 return zRet; 3693} 3694static char **readline_completion(const char *zText, int iStart, int iEnd){ 3695 rl_attempted_completion_over = 1; 3696 return rl_completion_matches(zText, readline_completion_generator); 3697} 3698 3699#elif HAVE_LINENOISE 3700/* 3701** Linenoise completion callback 3702*/ 3703static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 3704 int nLine = strlen30(zLine); 3705 int i, iStart; 3706 sqlite3_stmt *pStmt = 0; 3707 char *zSql; 3708 char zBuf[1000]; 3709 3710 if( nLine>sizeof(zBuf)-30 ) return; 3711 if( zLine[0]=='.' || zLine[0]=='#') return; 3712 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 3713 if( i==nLine-1 ) return; 3714 iStart = i+1; 3715 memcpy(zBuf, zLine, iStart); 3716 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 3717 " FROM completion(%Q,%Q) ORDER BY 1", 3718 &zLine[iStart], zLine); 3719 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 3720 sqlite3_free(zSql); 3721 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 3722 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 3723 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 3724 int nCompletion = sqlite3_column_bytes(pStmt, 0); 3725 if( iStart+nCompletion < sizeof(zBuf)-1 ){ 3726 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 3727 linenoiseAddCompletion(lc, zBuf); 3728 } 3729 } 3730 sqlite3_finalize(pStmt); 3731} 3732#endif 3733 3734/* 3735** Do C-language style dequoting. 3736** 3737** \a -> alarm 3738** \b -> backspace 3739** \t -> tab 3740** \n -> newline 3741** \v -> vertical tab 3742** \f -> form feed 3743** \r -> carriage return 3744** \s -> space 3745** \" -> " 3746** \' -> ' 3747** \\ -> backslash 3748** \NNN -> ascii character NNN in octal 3749*/ 3750static void resolve_backslashes(char *z){ 3751 int i, j; 3752 char c; 3753 while( *z && *z!='\\' ) z++; 3754 for(i=j=0; (c = z[i])!=0; i++, j++){ 3755 if( c=='\\' && z[i+1]!=0 ){ 3756 c = z[++i]; 3757 if( c=='a' ){ 3758 c = '\a'; 3759 }else if( c=='b' ){ 3760 c = '\b'; 3761 }else if( c=='t' ){ 3762 c = '\t'; 3763 }else if( c=='n' ){ 3764 c = '\n'; 3765 }else if( c=='v' ){ 3766 c = '\v'; 3767 }else if( c=='f' ){ 3768 c = '\f'; 3769 }else if( c=='r' ){ 3770 c = '\r'; 3771 }else if( c=='"' ){ 3772 c = '"'; 3773 }else if( c=='\'' ){ 3774 c = '\''; 3775 }else if( c=='\\' ){ 3776 c = '\\'; 3777 }else if( c>='0' && c<='7' ){ 3778 c -= '0'; 3779 if( z[i+1]>='0' && z[i+1]<='7' ){ 3780 i++; 3781 c = (c<<3) + z[i] - '0'; 3782 if( z[i+1]>='0' && z[i+1]<='7' ){ 3783 i++; 3784 c = (c<<3) + z[i] - '0'; 3785 } 3786 } 3787 } 3788 } 3789 z[j] = c; 3790 } 3791 if( j<i ) z[j] = 0; 3792} 3793 3794/* 3795** Interpret zArg as either an integer or a boolean value. Return 1 or 0 3796** for TRUE and FALSE. Return the integer value if appropriate. 3797*/ 3798static int booleanValue(const char *zArg){ 3799 int i; 3800 if( zArg[0]=='0' && zArg[1]=='x' ){ 3801 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 3802 }else{ 3803 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 3804 } 3805 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 3806 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 3807 return 1; 3808 } 3809 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 3810 return 0; 3811 } 3812 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 3813 zArg); 3814 return 0; 3815} 3816 3817/* 3818** Set or clear a shell flag according to a boolean value. 3819*/ 3820static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 3821 if( booleanValue(zArg) ){ 3822 ShellSetFlag(p, mFlag); 3823 }else{ 3824 ShellClearFlag(p, mFlag); 3825 } 3826} 3827 3828/* 3829** Close an output file, assuming it is not stderr or stdout 3830*/ 3831static void output_file_close(FILE *f){ 3832 if( f && f!=stdout && f!=stderr ) fclose(f); 3833} 3834 3835/* 3836** Try to open an output file. The names "stdout" and "stderr" are 3837** recognized and do the right thing. NULL is returned if the output 3838** filename is "off". 3839*/ 3840static FILE *output_file_open(const char *zFile, int bTextMode){ 3841 FILE *f; 3842 if( strcmp(zFile,"stdout")==0 ){ 3843 f = stdout; 3844 }else if( strcmp(zFile, "stderr")==0 ){ 3845 f = stderr; 3846 }else if( strcmp(zFile, "off")==0 ){ 3847 f = 0; 3848 }else{ 3849 f = fopen(zFile, bTextMode ? "w" : "wb"); 3850 if( f==0 ){ 3851 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 3852 } 3853 } 3854 return f; 3855} 3856 3857#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) 3858/* 3859** A routine for handling output from sqlite3_trace(). 3860*/ 3861static int sql_trace_callback( 3862 unsigned mType, 3863 void *pArg, 3864 void *pP, 3865 void *pX 3866){ 3867 FILE *f = (FILE*)pArg; 3868 UNUSED_PARAMETER(mType); 3869 UNUSED_PARAMETER(pP); 3870 if( f ){ 3871 const char *z = (const char*)pX; 3872 int i = strlen30(z); 3873 while( i>0 && z[i-1]==';' ){ i--; } 3874 utf8_printf(f, "%.*s;\n", i, z); 3875 } 3876 return 0; 3877} 3878#endif 3879 3880/* 3881** A no-op routine that runs with the ".breakpoint" doc-command. This is 3882** a useful spot to set a debugger breakpoint. 3883*/ 3884static void test_breakpoint(void){ 3885 static int nCall = 0; 3886 nCall++; 3887} 3888 3889/* 3890** An object used to read a CSV and other files for import. 3891*/ 3892typedef struct ImportCtx ImportCtx; 3893struct ImportCtx { 3894 const char *zFile; /* Name of the input file */ 3895 FILE *in; /* Read the CSV text from this input stream */ 3896 char *z; /* Accumulated text for a field */ 3897 int n; /* Number of bytes in z */ 3898 int nAlloc; /* Space allocated for z[] */ 3899 int nLine; /* Current line number */ 3900 int bNotFirst; /* True if one or more bytes already read */ 3901 int cTerm; /* Character that terminated the most recent field */ 3902 int cColSep; /* The column separator character. (Usually ",") */ 3903 int cRowSep; /* The row separator character. (Usually "\n") */ 3904}; 3905 3906/* Append a single byte to z[] */ 3907static void import_append_char(ImportCtx *p, int c){ 3908 if( p->n+1>=p->nAlloc ){ 3909 p->nAlloc += p->nAlloc + 100; 3910 p->z = sqlite3_realloc64(p->z, p->nAlloc); 3911 if( p->z==0 ) shell_out_of_memory(); 3912 } 3913 p->z[p->n++] = (char)c; 3914} 3915 3916/* Read a single field of CSV text. Compatible with rfc4180 and extended 3917** with the option of having a separator other than ",". 3918** 3919** + Input comes from p->in. 3920** + Store results in p->z of length p->n. Space to hold p->z comes 3921** from sqlite3_malloc64(). 3922** + Use p->cSep as the column separator. The default is ",". 3923** + Use p->rSep as the row separator. The default is "\n". 3924** + Keep track of the line number in p->nLine. 3925** + Store the character that terminates the field in p->cTerm. Store 3926** EOF on end-of-file. 3927** + Report syntax errors on stderr 3928*/ 3929static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 3930 int c; 3931 int cSep = p->cColSep; 3932 int rSep = p->cRowSep; 3933 p->n = 0; 3934 c = fgetc(p->in); 3935 if( c==EOF || seenInterrupt ){ 3936 p->cTerm = EOF; 3937 return 0; 3938 } 3939 if( c=='"' ){ 3940 int pc, ppc; 3941 int startLine = p->nLine; 3942 int cQuote = c; 3943 pc = ppc = 0; 3944 while( 1 ){ 3945 c = fgetc(p->in); 3946 if( c==rSep ) p->nLine++; 3947 if( c==cQuote ){ 3948 if( pc==cQuote ){ 3949 pc = 0; 3950 continue; 3951 } 3952 } 3953 if( (c==cSep && pc==cQuote) 3954 || (c==rSep && pc==cQuote) 3955 || (c==rSep && pc=='\r' && ppc==cQuote) 3956 || (c==EOF && pc==cQuote) 3957 ){ 3958 do{ p->n--; }while( p->z[p->n]!=cQuote ); 3959 p->cTerm = c; 3960 break; 3961 } 3962 if( pc==cQuote && c!='\r' ){ 3963 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 3964 p->zFile, p->nLine, cQuote); 3965 } 3966 if( c==EOF ){ 3967 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 3968 p->zFile, startLine, cQuote); 3969 p->cTerm = c; 3970 break; 3971 } 3972 import_append_char(p, c); 3973 ppc = pc; 3974 pc = c; 3975 } 3976 }else{ 3977 /* If this is the first field being parsed and it begins with the 3978 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 3979 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 3980 import_append_char(p, c); 3981 c = fgetc(p->in); 3982 if( (c&0xff)==0xbb ){ 3983 import_append_char(p, c); 3984 c = fgetc(p->in); 3985 if( (c&0xff)==0xbf ){ 3986 p->bNotFirst = 1; 3987 p->n = 0; 3988 return csv_read_one_field(p); 3989 } 3990 } 3991 } 3992 while( c!=EOF && c!=cSep && c!=rSep ){ 3993 import_append_char(p, c); 3994 c = fgetc(p->in); 3995 } 3996 if( c==rSep ){ 3997 p->nLine++; 3998 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 3999 } 4000 p->cTerm = c; 4001 } 4002 if( p->z ) p->z[p->n] = 0; 4003 p->bNotFirst = 1; 4004 return p->z; 4005} 4006 4007/* Read a single field of ASCII delimited text. 4008** 4009** + Input comes from p->in. 4010** + Store results in p->z of length p->n. Space to hold p->z comes 4011** from sqlite3_malloc64(). 4012** + Use p->cSep as the column separator. The default is "\x1F". 4013** + Use p->rSep as the row separator. The default is "\x1E". 4014** + Keep track of the row number in p->nLine. 4015** + Store the character that terminates the field in p->cTerm. Store 4016** EOF on end-of-file. 4017** + Report syntax errors on stderr 4018*/ 4019static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 4020 int c; 4021 int cSep = p->cColSep; 4022 int rSep = p->cRowSep; 4023 p->n = 0; 4024 c = fgetc(p->in); 4025 if( c==EOF || seenInterrupt ){ 4026 p->cTerm = EOF; 4027 return 0; 4028 } 4029 while( c!=EOF && c!=cSep && c!=rSep ){ 4030 import_append_char(p, c); 4031 c = fgetc(p->in); 4032 } 4033 if( c==rSep ){ 4034 p->nLine++; 4035 } 4036 p->cTerm = c; 4037 if( p->z ) p->z[p->n] = 0; 4038 return p->z; 4039} 4040 4041/* 4042** Try to transfer data for table zTable. If an error is seen while 4043** moving forward, try to go backwards. The backwards movement won't 4044** work for WITHOUT ROWID tables. 4045*/ 4046static void tryToCloneData( 4047 ShellState *p, 4048 sqlite3 *newDb, 4049 const char *zTable 4050){ 4051 sqlite3_stmt *pQuery = 0; 4052 sqlite3_stmt *pInsert = 0; 4053 char *zQuery = 0; 4054 char *zInsert = 0; 4055 int rc; 4056 int i, j, n; 4057 int nTable = strlen30(zTable); 4058 int k = 0; 4059 int cnt = 0; 4060 const int spinRate = 10000; 4061 4062 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 4063 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4064 if( rc ){ 4065 utf8_printf(stderr, "Error %d: %s on [%s]\n", 4066 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 4067 zQuery); 4068 goto end_data_xfer; 4069 } 4070 n = sqlite3_column_count(pQuery); 4071 zInsert = sqlite3_malloc64(200 + nTable + n*3); 4072 if( zInsert==0 ) shell_out_of_memory(); 4073 sqlite3_snprintf(200+nTable,zInsert, 4074 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 4075 i = strlen30(zInsert); 4076 for(j=1; j<n; j++){ 4077 memcpy(zInsert+i, ",?", 2); 4078 i += 2; 4079 } 4080 memcpy(zInsert+i, ");", 3); 4081 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 4082 if( rc ){ 4083 utf8_printf(stderr, "Error %d: %s on [%s]\n", 4084 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 4085 zQuery); 4086 goto end_data_xfer; 4087 } 4088 for(k=0; k<2; k++){ 4089 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 4090 for(i=0; i<n; i++){ 4091 switch( sqlite3_column_type(pQuery, i) ){ 4092 case SQLITE_NULL: { 4093 sqlite3_bind_null(pInsert, i+1); 4094 break; 4095 } 4096 case SQLITE_INTEGER: { 4097 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 4098 break; 4099 } 4100 case SQLITE_FLOAT: { 4101 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 4102 break; 4103 } 4104 case SQLITE_TEXT: { 4105 sqlite3_bind_text(pInsert, i+1, 4106 (const char*)sqlite3_column_text(pQuery,i), 4107 -1, SQLITE_STATIC); 4108 break; 4109 } 4110 case SQLITE_BLOB: { 4111 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 4112 sqlite3_column_bytes(pQuery,i), 4113 SQLITE_STATIC); 4114 break; 4115 } 4116 } 4117 } /* End for */ 4118 rc = sqlite3_step(pInsert); 4119 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 4120 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 4121 sqlite3_errmsg(newDb)); 4122 } 4123 sqlite3_reset(pInsert); 4124 cnt++; 4125 if( (cnt%spinRate)==0 ){ 4126 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 4127 fflush(stdout); 4128 } 4129 } /* End while */ 4130 if( rc==SQLITE_DONE ) break; 4131 sqlite3_finalize(pQuery); 4132 sqlite3_free(zQuery); 4133 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 4134 zTable); 4135 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4136 if( rc ){ 4137 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 4138 break; 4139 } 4140 } /* End for(k=0...) */ 4141 4142end_data_xfer: 4143 sqlite3_finalize(pQuery); 4144 sqlite3_finalize(pInsert); 4145 sqlite3_free(zQuery); 4146 sqlite3_free(zInsert); 4147} 4148 4149 4150/* 4151** Try to transfer all rows of the schema that match zWhere. For 4152** each row, invoke xForEach() on the object defined by that row. 4153** If an error is encountered while moving forward through the 4154** sqlite_master table, try again moving backwards. 4155*/ 4156static void tryToCloneSchema( 4157 ShellState *p, 4158 sqlite3 *newDb, 4159 const char *zWhere, 4160 void (*xForEach)(ShellState*,sqlite3*,const char*) 4161){ 4162 sqlite3_stmt *pQuery = 0; 4163 char *zQuery = 0; 4164 int rc; 4165 const unsigned char *zName; 4166 const unsigned char *zSql; 4167 char *zErrMsg = 0; 4168 4169 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" 4170 " WHERE %s", zWhere); 4171 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4172 if( rc ){ 4173 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 4174 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 4175 zQuery); 4176 goto end_schema_xfer; 4177 } 4178 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 4179 zName = sqlite3_column_text(pQuery, 0); 4180 zSql = sqlite3_column_text(pQuery, 1); 4181 printf("%s... ", zName); fflush(stdout); 4182 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 4183 if( zErrMsg ){ 4184 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 4185 sqlite3_free(zErrMsg); 4186 zErrMsg = 0; 4187 } 4188 if( xForEach ){ 4189 xForEach(p, newDb, (const char*)zName); 4190 } 4191 printf("done\n"); 4192 } 4193 if( rc!=SQLITE_DONE ){ 4194 sqlite3_finalize(pQuery); 4195 sqlite3_free(zQuery); 4196 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master" 4197 " WHERE %s ORDER BY rowid DESC", zWhere); 4198 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 4199 if( rc ){ 4200 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 4201 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 4202 zQuery); 4203 goto end_schema_xfer; 4204 } 4205 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 4206 zName = sqlite3_column_text(pQuery, 0); 4207 zSql = sqlite3_column_text(pQuery, 1); 4208 printf("%s... ", zName); fflush(stdout); 4209 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 4210 if( zErrMsg ){ 4211 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 4212 sqlite3_free(zErrMsg); 4213 zErrMsg = 0; 4214 } 4215 if( xForEach ){ 4216 xForEach(p, newDb, (const char*)zName); 4217 } 4218 printf("done\n"); 4219 } 4220 } 4221end_schema_xfer: 4222 sqlite3_finalize(pQuery); 4223 sqlite3_free(zQuery); 4224} 4225 4226/* 4227** Open a new database file named "zNewDb". Try to recover as much information 4228** as possible out of the main database (which might be corrupt) and write it 4229** into zNewDb. 4230*/ 4231static void tryToClone(ShellState *p, const char *zNewDb){ 4232 int rc; 4233 sqlite3 *newDb = 0; 4234 if( access(zNewDb,0)==0 ){ 4235 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 4236 return; 4237 } 4238 rc = sqlite3_open(zNewDb, &newDb); 4239 if( rc ){ 4240 utf8_printf(stderr, "Cannot create output database: %s\n", 4241 sqlite3_errmsg(newDb)); 4242 }else{ 4243 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 4244 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 4245 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 4246 tryToCloneSchema(p, newDb, "type!='table'", 0); 4247 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 4248 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 4249 } 4250 close_db(newDb); 4251} 4252 4253/* 4254** Change the output file back to stdout. 4255** 4256** If the p->doXdgOpen flag is set, that means the output was being 4257** redirected to a temporary file named by p->zTempFile. In that case, 4258** launch start/open/xdg-open on that temporary file. 4259*/ 4260static void output_reset(ShellState *p){ 4261 if( p->outfile[0]=='|' ){ 4262#ifndef SQLITE_OMIT_POPEN 4263 pclose(p->out); 4264#endif 4265 }else{ 4266 output_file_close(p->out); 4267#ifndef SQLITE_NOHAVE_SYSTEM 4268 if( p->doXdgOpen ){ 4269 const char *zXdgOpenCmd = 4270#if defined(_WIN32) 4271 "start"; 4272#elif defined(__APPLE__) 4273 "open"; 4274#else 4275 "xdg-open"; 4276#endif 4277 char *zCmd; 4278 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 4279 if( system(zCmd) ){ 4280 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 4281 } 4282 sqlite3_free(zCmd); 4283 outputModePop(p); 4284 p->doXdgOpen = 0; 4285 } 4286#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 4287 } 4288 p->outfile[0] = 0; 4289 p->out = stdout; 4290} 4291 4292/* 4293** Run an SQL command and return the single integer result. 4294*/ 4295static int db_int(ShellState *p, const char *zSql){ 4296 sqlite3_stmt *pStmt; 4297 int res = 0; 4298 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 4299 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 4300 res = sqlite3_column_int(pStmt,0); 4301 } 4302 sqlite3_finalize(pStmt); 4303 return res; 4304} 4305 4306/* 4307** Convert a 2-byte or 4-byte big-endian integer into a native integer 4308*/ 4309static unsigned int get2byteInt(unsigned char *a){ 4310 return (a[0]<<8) + a[1]; 4311} 4312static unsigned int get4byteInt(unsigned char *a){ 4313 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 4314} 4315 4316/* 4317** Implementation of the ".info" command. 4318** 4319** Return 1 on error, 2 to exit, and 0 otherwise. 4320*/ 4321static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 4322 static const struct { const char *zName; int ofst; } aField[] = { 4323 { "file change counter:", 24 }, 4324 { "database page count:", 28 }, 4325 { "freelist page count:", 36 }, 4326 { "schema cookie:", 40 }, 4327 { "schema format:", 44 }, 4328 { "default cache size:", 48 }, 4329 { "autovacuum top root:", 52 }, 4330 { "incremental vacuum:", 64 }, 4331 { "text encoding:", 56 }, 4332 { "user version:", 60 }, 4333 { "application id:", 68 }, 4334 { "software version:", 96 }, 4335 }; 4336 static const struct { const char *zName; const char *zSql; } aQuery[] = { 4337 { "number of tables:", 4338 "SELECT count(*) FROM %s WHERE type='table'" }, 4339 { "number of indexes:", 4340 "SELECT count(*) FROM %s WHERE type='index'" }, 4341 { "number of triggers:", 4342 "SELECT count(*) FROM %s WHERE type='trigger'" }, 4343 { "number of views:", 4344 "SELECT count(*) FROM %s WHERE type='view'" }, 4345 { "schema size:", 4346 "SELECT total(length(sql)) FROM %s" }, 4347 }; 4348 int i; 4349 char *zSchemaTab; 4350 char *zDb = nArg>=2 ? azArg[1] : "main"; 4351 sqlite3_stmt *pStmt = 0; 4352 unsigned char aHdr[100]; 4353 open_db(p, 0); 4354 if( p->db==0 ) return 1; 4355 sqlite3_prepare_v2(p->db,"SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 4356 -1, &pStmt, 0); 4357 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 4358 if( sqlite3_step(pStmt)==SQLITE_ROW 4359 && sqlite3_column_bytes(pStmt,0)>100 4360 ){ 4361 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 4362 sqlite3_finalize(pStmt); 4363 }else{ 4364 raw_printf(stderr, "unable to read database header\n"); 4365 sqlite3_finalize(pStmt); 4366 return 1; 4367 } 4368 i = get2byteInt(aHdr+16); 4369 if( i==1 ) i = 65536; 4370 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 4371 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 4372 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 4373 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 4374 for(i=0; i<ArraySize(aField); i++){ 4375 int ofst = aField[i].ofst; 4376 unsigned int val = get4byteInt(aHdr + ofst); 4377 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 4378 switch( ofst ){ 4379 case 56: { 4380 if( val==1 ) raw_printf(p->out, " (utf8)"); 4381 if( val==2 ) raw_printf(p->out, " (utf16le)"); 4382 if( val==3 ) raw_printf(p->out, " (utf16be)"); 4383 } 4384 } 4385 raw_printf(p->out, "\n"); 4386 } 4387 if( zDb==0 ){ 4388 zSchemaTab = sqlite3_mprintf("main.sqlite_master"); 4389 }else if( strcmp(zDb,"temp")==0 ){ 4390 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master"); 4391 }else{ 4392 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb); 4393 } 4394 for(i=0; i<ArraySize(aQuery); i++){ 4395 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 4396 int val = db_int(p, zSql); 4397 sqlite3_free(zSql); 4398 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 4399 } 4400 sqlite3_free(zSchemaTab); 4401 return 0; 4402} 4403 4404/* 4405** Print the current sqlite3_errmsg() value to stderr and return 1. 4406*/ 4407static int shellDatabaseError(sqlite3 *db){ 4408 const char *zErr = sqlite3_errmsg(db); 4409 utf8_printf(stderr, "Error: %s\n", zErr); 4410 return 1; 4411} 4412 4413/* 4414** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 4415** if they match and FALSE (0) if they do not match. 4416** 4417** Globbing rules: 4418** 4419** '*' Matches any sequence of zero or more characters. 4420** 4421** '?' Matches exactly one character. 4422** 4423** [...] Matches one character from the enclosed list of 4424** characters. 4425** 4426** [^...] Matches one character not in the enclosed list. 4427** 4428** '#' Matches any sequence of one or more digits with an 4429** optional + or - sign in front 4430** 4431** ' ' Any span of whitespace matches any other span of 4432** whitespace. 4433** 4434** Extra whitespace at the end of z[] is ignored. 4435*/ 4436static int testcase_glob(const char *zGlob, const char *z){ 4437 int c, c2; 4438 int invert; 4439 int seen; 4440 4441 while( (c = (*(zGlob++)))!=0 ){ 4442 if( IsSpace(c) ){ 4443 if( !IsSpace(*z) ) return 0; 4444 while( IsSpace(*zGlob) ) zGlob++; 4445 while( IsSpace(*z) ) z++; 4446 }else if( c=='*' ){ 4447 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 4448 if( c=='?' && (*(z++))==0 ) return 0; 4449 } 4450 if( c==0 ){ 4451 return 1; 4452 }else if( c=='[' ){ 4453 while( *z && testcase_glob(zGlob-1,z)==0 ){ 4454 z++; 4455 } 4456 return (*z)!=0; 4457 } 4458 while( (c2 = (*(z++)))!=0 ){ 4459 while( c2!=c ){ 4460 c2 = *(z++); 4461 if( c2==0 ) return 0; 4462 } 4463 if( testcase_glob(zGlob,z) ) return 1; 4464 } 4465 return 0; 4466 }else if( c=='?' ){ 4467 if( (*(z++))==0 ) return 0; 4468 }else if( c=='[' ){ 4469 int prior_c = 0; 4470 seen = 0; 4471 invert = 0; 4472 c = *(z++); 4473 if( c==0 ) return 0; 4474 c2 = *(zGlob++); 4475 if( c2=='^' ){ 4476 invert = 1; 4477 c2 = *(zGlob++); 4478 } 4479 if( c2==']' ){ 4480 if( c==']' ) seen = 1; 4481 c2 = *(zGlob++); 4482 } 4483 while( c2 && c2!=']' ){ 4484 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 4485 c2 = *(zGlob++); 4486 if( c>=prior_c && c<=c2 ) seen = 1; 4487 prior_c = 0; 4488 }else{ 4489 if( c==c2 ){ 4490 seen = 1; 4491 } 4492 prior_c = c2; 4493 } 4494 c2 = *(zGlob++); 4495 } 4496 if( c2==0 || (seen ^ invert)==0 ) return 0; 4497 }else if( c=='#' ){ 4498 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 4499 if( !IsDigit(z[0]) ) return 0; 4500 z++; 4501 while( IsDigit(z[0]) ){ z++; } 4502 }else{ 4503 if( c!=(*(z++)) ) return 0; 4504 } 4505 } 4506 while( IsSpace(*z) ){ z++; } 4507 return *z==0; 4508} 4509 4510 4511/* 4512** Compare the string as a command-line option with either one or two 4513** initial "-" characters. 4514*/ 4515static int optionMatch(const char *zStr, const char *zOpt){ 4516 if( zStr[0]!='-' ) return 0; 4517 zStr++; 4518 if( zStr[0]=='-' ) zStr++; 4519 return strcmp(zStr, zOpt)==0; 4520} 4521 4522/* 4523** Delete a file. 4524*/ 4525int shellDeleteFile(const char *zFilename){ 4526 int rc; 4527#ifdef _WIN32 4528 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 4529 rc = _wunlink(z); 4530 sqlite3_free(z); 4531#else 4532 rc = unlink(zFilename); 4533#endif 4534 return rc; 4535} 4536 4537/* 4538** Try to delete the temporary file (if there is one) and free the 4539** memory used to hold the name of the temp file. 4540*/ 4541static void clearTempFile(ShellState *p){ 4542 if( p->zTempFile==0 ) return; 4543 if( p->doXdgOpen ) return; 4544 if( shellDeleteFile(p->zTempFile) ) return; 4545 sqlite3_free(p->zTempFile); 4546 p->zTempFile = 0; 4547} 4548 4549/* 4550** Create a new temp file name with the given suffix. 4551*/ 4552static void newTempFile(ShellState *p, const char *zSuffix){ 4553 clearTempFile(p); 4554 sqlite3_free(p->zTempFile); 4555 p->zTempFile = 0; 4556 if( p->db ){ 4557 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 4558 } 4559 if( p->zTempFile==0 ){ 4560 sqlite3_uint64 r; 4561 sqlite3_randomness(sizeof(r), &r); 4562 p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix); 4563 }else{ 4564 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 4565 } 4566 if( p->zTempFile==0 ){ 4567 raw_printf(stderr, "out of memory\n"); 4568 exit(1); 4569 } 4570} 4571 4572 4573/* 4574** The implementation of SQL scalar function fkey_collate_clause(), used 4575** by the ".lint fkey-indexes" command. This scalar function is always 4576** called with four arguments - the parent table name, the parent column name, 4577** the child table name and the child column name. 4578** 4579** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 4580** 4581** If either of the named tables or columns do not exist, this function 4582** returns an empty string. An empty string is also returned if both tables 4583** and columns exist but have the same default collation sequence. Or, 4584** if both exist but the default collation sequences are different, this 4585** function returns the string " COLLATE <parent-collation>", where 4586** <parent-collation> is the default collation sequence of the parent column. 4587*/ 4588static void shellFkeyCollateClause( 4589 sqlite3_context *pCtx, 4590 int nVal, 4591 sqlite3_value **apVal 4592){ 4593 sqlite3 *db = sqlite3_context_db_handle(pCtx); 4594 const char *zParent; 4595 const char *zParentCol; 4596 const char *zParentSeq; 4597 const char *zChild; 4598 const char *zChildCol; 4599 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 4600 int rc; 4601 4602 assert( nVal==4 ); 4603 zParent = (const char*)sqlite3_value_text(apVal[0]); 4604 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 4605 zChild = (const char*)sqlite3_value_text(apVal[2]); 4606 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 4607 4608 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 4609 rc = sqlite3_table_column_metadata( 4610 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 4611 ); 4612 if( rc==SQLITE_OK ){ 4613 rc = sqlite3_table_column_metadata( 4614 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 4615 ); 4616 } 4617 4618 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 4619 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 4620 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 4621 sqlite3_free(z); 4622 } 4623} 4624 4625 4626/* 4627** The implementation of dot-command ".lint fkey-indexes". 4628*/ 4629static int lintFkeyIndexes( 4630 ShellState *pState, /* Current shell tool state */ 4631 char **azArg, /* Array of arguments passed to dot command */ 4632 int nArg /* Number of entries in azArg[] */ 4633){ 4634 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 4635 FILE *out = pState->out; /* Stream to write non-error output to */ 4636 int bVerbose = 0; /* If -verbose is present */ 4637 int bGroupByParent = 0; /* If -groupbyparent is present */ 4638 int i; /* To iterate through azArg[] */ 4639 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 4640 int rc; /* Return code */ 4641 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 4642 4643 /* 4644 ** This SELECT statement returns one row for each foreign key constraint 4645 ** in the schema of the main database. The column values are: 4646 ** 4647 ** 0. The text of an SQL statement similar to: 4648 ** 4649 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 4650 ** 4651 ** This SELECT is similar to the one that the foreign keys implementation 4652 ** needs to run internally on child tables. If there is an index that can 4653 ** be used to optimize this query, then it can also be used by the FK 4654 ** implementation to optimize DELETE or UPDATE statements on the parent 4655 ** table. 4656 ** 4657 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 4658 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 4659 ** contains an index that can be used to optimize the query. 4660 ** 4661 ** 2. Human readable text that describes the child table and columns. e.g. 4662 ** 4663 ** "child_table(child_key1, child_key2)" 4664 ** 4665 ** 3. Human readable text that describes the parent table and columns. e.g. 4666 ** 4667 ** "parent_table(parent_key1, parent_key2)" 4668 ** 4669 ** 4. A full CREATE INDEX statement for an index that could be used to 4670 ** optimize DELETE or UPDATE statements on the parent table. e.g. 4671 ** 4672 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 4673 ** 4674 ** 5. The name of the parent table. 4675 ** 4676 ** These six values are used by the C logic below to generate the report. 4677 */ 4678 const char *zSql = 4679 "SELECT " 4680 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 4681 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 4682 " || fkey_collate_clause(" 4683 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 4684 ", " 4685 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" 4686 " || group_concat('*=?', ' AND ') || ')'" 4687 ", " 4688 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 4689 ", " 4690 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 4691 ", " 4692 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 4693 " || ' ON ' || quote(s.name) || '('" 4694 " || group_concat(quote(f.[from]) ||" 4695 " fkey_collate_clause(" 4696 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 4697 " || ');'" 4698 ", " 4699 " f.[table] " 4700 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f " 4701 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 4702 "GROUP BY s.name, f.id " 4703 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 4704 ; 4705 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)"; 4706 4707 for(i=2; i<nArg; i++){ 4708 int n = strlen30(azArg[i]); 4709 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 4710 bVerbose = 1; 4711 } 4712 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 4713 bGroupByParent = 1; 4714 zIndent = " "; 4715 } 4716 else{ 4717 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 4718 azArg[0], azArg[1] 4719 ); 4720 return SQLITE_ERROR; 4721 } 4722 } 4723 4724 /* Register the fkey_collate_clause() SQL function */ 4725 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 4726 0, shellFkeyCollateClause, 0, 0 4727 ); 4728 4729 4730 if( rc==SQLITE_OK ){ 4731 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 4732 } 4733 if( rc==SQLITE_OK ){ 4734 sqlite3_bind_int(pSql, 1, bGroupByParent); 4735 } 4736 4737 if( rc==SQLITE_OK ){ 4738 int rc2; 4739 char *zPrev = 0; 4740 while( SQLITE_ROW==sqlite3_step(pSql) ){ 4741 int res = -1; 4742 sqlite3_stmt *pExplain = 0; 4743 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 4744 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 4745 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 4746 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 4747 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 4748 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 4749 4750 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 4751 if( rc!=SQLITE_OK ) break; 4752 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 4753 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 4754 res = ( 4755 0==sqlite3_strglob(zGlob, zPlan) 4756 || 0==sqlite3_strglob(zGlobIPK, zPlan) 4757 ); 4758 } 4759 rc = sqlite3_finalize(pExplain); 4760 if( rc!=SQLITE_OK ) break; 4761 4762 if( res<0 ){ 4763 raw_printf(stderr, "Error: internal error"); 4764 break; 4765 }else{ 4766 if( bGroupByParent 4767 && (bVerbose || res==0) 4768 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 4769 ){ 4770 raw_printf(out, "-- Parent table %s\n", zParent); 4771 sqlite3_free(zPrev); 4772 zPrev = sqlite3_mprintf("%s", zParent); 4773 } 4774 4775 if( res==0 ){ 4776 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 4777 }else if( bVerbose ){ 4778 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 4779 zIndent, zFrom, zTarget 4780 ); 4781 } 4782 } 4783 } 4784 sqlite3_free(zPrev); 4785 4786 if( rc!=SQLITE_OK ){ 4787 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4788 } 4789 4790 rc2 = sqlite3_finalize(pSql); 4791 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 4792 rc = rc2; 4793 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4794 } 4795 }else{ 4796 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 4797 } 4798 4799 return rc; 4800} 4801 4802/* 4803** Implementation of ".lint" dot command. 4804*/ 4805static int lintDotCommand( 4806 ShellState *pState, /* Current shell tool state */ 4807 char **azArg, /* Array of arguments passed to dot command */ 4808 int nArg /* Number of entries in azArg[] */ 4809){ 4810 int n; 4811 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 4812 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 4813 return lintFkeyIndexes(pState, azArg, nArg); 4814 4815 usage: 4816 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 4817 raw_printf(stderr, "Where sub-commands are:\n"); 4818 raw_printf(stderr, " fkey-indexes\n"); 4819 return SQLITE_ERROR; 4820} 4821 4822#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 4823/********************************************************************************* 4824** The ".archive" or ".ar" command. 4825*/ 4826static void shellPrepare( 4827 sqlite3 *db, 4828 int *pRc, 4829 const char *zSql, 4830 sqlite3_stmt **ppStmt 4831){ 4832 *ppStmt = 0; 4833 if( *pRc==SQLITE_OK ){ 4834 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 4835 if( rc!=SQLITE_OK ){ 4836 raw_printf(stderr, "sql error: %s (%d)\n", 4837 sqlite3_errmsg(db), sqlite3_errcode(db) 4838 ); 4839 *pRc = rc; 4840 } 4841 } 4842} 4843 4844static void shellPreparePrintf( 4845 sqlite3 *db, 4846 int *pRc, 4847 sqlite3_stmt **ppStmt, 4848 const char *zFmt, 4849 ... 4850){ 4851 *ppStmt = 0; 4852 if( *pRc==SQLITE_OK ){ 4853 va_list ap; 4854 char *z; 4855 va_start(ap, zFmt); 4856 z = sqlite3_vmprintf(zFmt, ap); 4857 if( z==0 ){ 4858 *pRc = SQLITE_NOMEM; 4859 }else{ 4860 shellPrepare(db, pRc, z, ppStmt); 4861 sqlite3_free(z); 4862 } 4863 } 4864} 4865 4866static void shellFinalize( 4867 int *pRc, 4868 sqlite3_stmt *pStmt 4869){ 4870 if( pStmt ){ 4871 sqlite3 *db = sqlite3_db_handle(pStmt); 4872 int rc = sqlite3_finalize(pStmt); 4873 if( *pRc==SQLITE_OK ){ 4874 if( rc!=SQLITE_OK ){ 4875 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 4876 } 4877 *pRc = rc; 4878 } 4879 } 4880} 4881 4882static void shellReset( 4883 int *pRc, 4884 sqlite3_stmt *pStmt 4885){ 4886 int rc = sqlite3_reset(pStmt); 4887 if( *pRc==SQLITE_OK ){ 4888 if( rc!=SQLITE_OK ){ 4889 sqlite3 *db = sqlite3_db_handle(pStmt); 4890 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 4891 } 4892 *pRc = rc; 4893 } 4894} 4895/* 4896** Structure representing a single ".ar" command. 4897*/ 4898typedef struct ArCommand ArCommand; 4899struct ArCommand { 4900 u8 eCmd; /* An AR_CMD_* value */ 4901 u8 bVerbose; /* True if --verbose */ 4902 u8 bZip; /* True if the archive is a ZIP */ 4903 u8 bDryRun; /* True if --dry-run */ 4904 u8 bAppend; /* True if --append */ 4905 u8 fromCmdLine; /* Run from -A instead of .archive */ 4906 int nArg; /* Number of command arguments */ 4907 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 4908 const char *zFile; /* --file argument, or NULL */ 4909 const char *zDir; /* --directory argument, or NULL */ 4910 char **azArg; /* Array of command arguments */ 4911 ShellState *p; /* Shell state */ 4912 sqlite3 *db; /* Database containing the archive */ 4913}; 4914 4915/* 4916** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 4917*/ 4918static int arUsage(FILE *f){ 4919 raw_printf(f, 4920"\n" 4921"Usage: .ar [OPTION...] [FILE...]\n" 4922"The .ar command manages sqlar archives.\n" 4923"\n" 4924"Examples:\n" 4925" .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar\n" 4926" .ar -tf archive.sar # List members of archive.sar\n" 4927" .ar -xvf archive.sar # Verbosely extract files from archive.sar\n" 4928"\n" 4929"Each command line must feature exactly one command option:\n" 4930" -c, --create Create a new archive\n" 4931" -u, --update Update or add files to an existing archive\n" 4932" -t, --list List contents of archive\n" 4933" -x, --extract Extract files from archive\n" 4934"\n" 4935"And zero or more optional options:\n" 4936" -v, --verbose Print each filename as it is processed\n" 4937" -f FILE, --file FILE Operate on archive FILE (default is current db)\n" 4938" -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS\n" 4939" -C DIR, --directory DIR Change to directory DIR to read/extract files\n" 4940" -n, --dryrun Show the SQL that would have occurred\n" 4941"\n" 4942"See also: http://sqlite.org/cli.html#sqlar_archive_support\n" 4943"\n" 4944); 4945 return SQLITE_ERROR; 4946} 4947 4948/* 4949** Print an error message for the .ar command to stderr and return 4950** SQLITE_ERROR. 4951*/ 4952static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 4953 va_list ap; 4954 char *z; 4955 va_start(ap, zFmt); 4956 z = sqlite3_vmprintf(zFmt, ap); 4957 va_end(ap); 4958 utf8_printf(stderr, "Error: %s\n", z); 4959 if( pAr->fromCmdLine ){ 4960 utf8_printf(stderr, "Use \"-A\" for more help\n"); 4961 }else{ 4962 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 4963 } 4964 sqlite3_free(z); 4965 return SQLITE_ERROR; 4966} 4967 4968/* 4969** Values for ArCommand.eCmd. 4970*/ 4971#define AR_CMD_CREATE 1 4972#define AR_CMD_EXTRACT 2 4973#define AR_CMD_LIST 3 4974#define AR_CMD_UPDATE 4 4975#define AR_CMD_HELP 5 4976 4977/* 4978** Other (non-command) switches. 4979*/ 4980#define AR_SWITCH_VERBOSE 6 4981#define AR_SWITCH_FILE 7 4982#define AR_SWITCH_DIRECTORY 8 4983#define AR_SWITCH_APPEND 9 4984#define AR_SWITCH_DRYRUN 10 4985 4986static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 4987 switch( eSwitch ){ 4988 case AR_CMD_CREATE: 4989 case AR_CMD_EXTRACT: 4990 case AR_CMD_LIST: 4991 case AR_CMD_UPDATE: 4992 case AR_CMD_HELP: 4993 if( pAr->eCmd ){ 4994 return arErrorMsg(pAr, "multiple command options"); 4995 } 4996 pAr->eCmd = eSwitch; 4997 break; 4998 4999 case AR_SWITCH_DRYRUN: 5000 pAr->bDryRun = 1; 5001 break; 5002 case AR_SWITCH_VERBOSE: 5003 pAr->bVerbose = 1; 5004 break; 5005 case AR_SWITCH_APPEND: 5006 pAr->bAppend = 1; 5007 /* Fall thru into --file */ 5008 case AR_SWITCH_FILE: 5009 pAr->zFile = zArg; 5010 break; 5011 case AR_SWITCH_DIRECTORY: 5012 pAr->zDir = zArg; 5013 break; 5014 } 5015 5016 return SQLITE_OK; 5017} 5018 5019/* 5020** Parse the command line for an ".ar" command. The results are written into 5021** structure (*pAr). SQLITE_OK is returned if the command line is parsed 5022** successfully, otherwise an error message is written to stderr and 5023** SQLITE_ERROR returned. 5024*/ 5025static int arParseCommand( 5026 char **azArg, /* Array of arguments passed to dot command */ 5027 int nArg, /* Number of entries in azArg[] */ 5028 ArCommand *pAr /* Populate this object */ 5029){ 5030 struct ArSwitch { 5031 const char *zLong; 5032 char cShort; 5033 u8 eSwitch; 5034 u8 bArg; 5035 } aSwitch[] = { 5036 { "create", 'c', AR_CMD_CREATE, 0 }, 5037 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 5038 { "list", 't', AR_CMD_LIST, 0 }, 5039 { "update", 'u', AR_CMD_UPDATE, 0 }, 5040 { "help", 'h', AR_CMD_HELP, 0 }, 5041 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 5042 { "file", 'f', AR_SWITCH_FILE, 1 }, 5043 { "append", 'a', AR_SWITCH_APPEND, 1 }, 5044 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 5045 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 5046 }; 5047 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 5048 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 5049 5050 if( nArg<=1 ){ 5051 return arUsage(stderr); 5052 }else{ 5053 char *z = azArg[1]; 5054 if( z[0]!='-' ){ 5055 /* Traditional style [tar] invocation */ 5056 int i; 5057 int iArg = 2; 5058 for(i=0; z[i]; i++){ 5059 const char *zArg = 0; 5060 struct ArSwitch *pOpt; 5061 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 5062 if( z[i]==pOpt->cShort ) break; 5063 } 5064 if( pOpt==pEnd ){ 5065 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 5066 } 5067 if( pOpt->bArg ){ 5068 if( iArg>=nArg ){ 5069 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 5070 } 5071 zArg = azArg[iArg++]; 5072 } 5073 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 5074 } 5075 pAr->nArg = nArg-iArg; 5076 if( pAr->nArg>0 ){ 5077 pAr->azArg = &azArg[iArg]; 5078 } 5079 }else{ 5080 /* Non-traditional invocation */ 5081 int iArg; 5082 for(iArg=1; iArg<nArg; iArg++){ 5083 int n; 5084 z = azArg[iArg]; 5085 if( z[0]!='-' ){ 5086 /* All remaining command line words are command arguments. */ 5087 pAr->azArg = &azArg[iArg]; 5088 pAr->nArg = nArg-iArg; 5089 break; 5090 } 5091 n = strlen30(z); 5092 5093 if( z[1]!='-' ){ 5094 int i; 5095 /* One or more short options */ 5096 for(i=1; i<n; i++){ 5097 const char *zArg = 0; 5098 struct ArSwitch *pOpt; 5099 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 5100 if( z[i]==pOpt->cShort ) break; 5101 } 5102 if( pOpt==pEnd ){ 5103 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 5104 } 5105 if( pOpt->bArg ){ 5106 if( i<(n-1) ){ 5107 zArg = &z[i+1]; 5108 i = n; 5109 }else{ 5110 if( iArg>=(nArg-1) ){ 5111 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 5112 } 5113 zArg = azArg[++iArg]; 5114 } 5115 } 5116 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 5117 } 5118 }else if( z[2]=='\0' ){ 5119 /* A -- option, indicating that all remaining command line words 5120 ** are command arguments. */ 5121 pAr->azArg = &azArg[iArg+1]; 5122 pAr->nArg = nArg-iArg-1; 5123 break; 5124 }else{ 5125 /* A long option */ 5126 const char *zArg = 0; /* Argument for option, if any */ 5127 struct ArSwitch *pMatch = 0; /* Matching option */ 5128 struct ArSwitch *pOpt; /* Iterator */ 5129 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 5130 const char *zLong = pOpt->zLong; 5131 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 5132 if( pMatch ){ 5133 return arErrorMsg(pAr, "ambiguous option: %s",z); 5134 }else{ 5135 pMatch = pOpt; 5136 } 5137 } 5138 } 5139 5140 if( pMatch==0 ){ 5141 return arErrorMsg(pAr, "unrecognized option: %s", z); 5142 } 5143 if( pMatch->bArg ){ 5144 if( iArg>=(nArg-1) ){ 5145 return arErrorMsg(pAr, "option requires an argument: %s", z); 5146 } 5147 zArg = azArg[++iArg]; 5148 } 5149 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 5150 } 5151 } 5152 } 5153 } 5154 5155 return SQLITE_OK; 5156} 5157 5158/* 5159** This function assumes that all arguments within the ArCommand.azArg[] 5160** array refer to archive members, as for the --extract or --list commands. 5161** It checks that each of them are present. If any specified file is not 5162** present in the archive, an error is printed to stderr and an error 5163** code returned. Otherwise, if all specified arguments are present in 5164** the archive, SQLITE_OK is returned. 5165** 5166** This function strips any trailing '/' characters from each argument. 5167** This is consistent with the way the [tar] command seems to work on 5168** Linux. 5169*/ 5170static int arCheckEntries(ArCommand *pAr){ 5171 int rc = SQLITE_OK; 5172 if( pAr->nArg ){ 5173 int i, j; 5174 sqlite3_stmt *pTest = 0; 5175 5176 shellPreparePrintf(pAr->db, &rc, &pTest, 5177 "SELECT name FROM %s WHERE name=$name", 5178 pAr->zSrcTable 5179 ); 5180 j = sqlite3_bind_parameter_index(pTest, "$name"); 5181 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 5182 char *z = pAr->azArg[i]; 5183 int n = strlen30(z); 5184 int bOk = 0; 5185 while( n>0 && z[n-1]=='/' ) n--; 5186 z[n] = '\0'; 5187 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 5188 if( SQLITE_ROW==sqlite3_step(pTest) ){ 5189 bOk = 1; 5190 } 5191 shellReset(&rc, pTest); 5192 if( rc==SQLITE_OK && bOk==0 ){ 5193 utf8_printf(stderr, "not found in archive: %s\n", z); 5194 rc = SQLITE_ERROR; 5195 } 5196 } 5197 shellFinalize(&rc, pTest); 5198 } 5199 return rc; 5200} 5201 5202/* 5203** Format a WHERE clause that can be used against the "sqlar" table to 5204** identify all archive members that match the command arguments held 5205** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 5206** The caller is responsible for eventually calling sqlite3_free() on 5207** any non-NULL (*pzWhere) value. 5208*/ 5209static void arWhereClause( 5210 int *pRc, 5211 ArCommand *pAr, 5212 char **pzWhere /* OUT: New WHERE clause */ 5213){ 5214 char *zWhere = 0; 5215 if( *pRc==SQLITE_OK ){ 5216 if( pAr->nArg==0 ){ 5217 zWhere = sqlite3_mprintf("1"); 5218 }else{ 5219 int i; 5220 const char *zSep = ""; 5221 for(i=0; i<pAr->nArg; i++){ 5222 const char *z = pAr->azArg[i]; 5223 zWhere = sqlite3_mprintf( 5224 "%z%s name = '%q' OR substr(name,1,%d) = '%q/'", 5225 zWhere, zSep, z, strlen30(z)+1, z 5226 ); 5227 if( zWhere==0 ){ 5228 *pRc = SQLITE_NOMEM; 5229 break; 5230 } 5231 zSep = " OR "; 5232 } 5233 } 5234 } 5235 *pzWhere = zWhere; 5236} 5237 5238/* 5239** Implementation of .ar "lisT" command. 5240*/ 5241static int arListCommand(ArCommand *pAr){ 5242 const char *zSql = "SELECT %s FROM %s WHERE %s"; 5243 const char *azCols[] = { 5244 "name", 5245 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 5246 }; 5247 5248 char *zWhere = 0; 5249 sqlite3_stmt *pSql = 0; 5250 int rc; 5251 5252 rc = arCheckEntries(pAr); 5253 arWhereClause(&rc, pAr, &zWhere); 5254 5255 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 5256 pAr->zSrcTable, zWhere); 5257 if( pAr->bDryRun ){ 5258 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 5259 }else{ 5260 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 5261 if( pAr->bVerbose ){ 5262 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 5263 sqlite3_column_text(pSql, 0), 5264 sqlite3_column_int(pSql, 1), 5265 sqlite3_column_text(pSql, 2), 5266 sqlite3_column_text(pSql, 3) 5267 ); 5268 }else{ 5269 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 5270 } 5271 } 5272 } 5273 shellFinalize(&rc, pSql); 5274 sqlite3_free(zWhere); 5275 return rc; 5276} 5277 5278 5279/* 5280** Implementation of .ar "eXtract" command. 5281*/ 5282static int arExtractCommand(ArCommand *pAr){ 5283 const char *zSql1 = 5284 "SELECT " 5285 " ($dir || name)," 5286 " writefile(($dir || name), %s, mode, mtime) " 5287 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 5288 " AND name NOT GLOB '*..[/\\]*'"; 5289 5290 const char *azExtraArg[] = { 5291 "sqlar_uncompress(data, sz)", 5292 "data" 5293 }; 5294 5295 sqlite3_stmt *pSql = 0; 5296 int rc = SQLITE_OK; 5297 char *zDir = 0; 5298 char *zWhere = 0; 5299 int i, j; 5300 5301 /* If arguments are specified, check that they actually exist within 5302 ** the archive before proceeding. And formulate a WHERE clause to 5303 ** match them. */ 5304 rc = arCheckEntries(pAr); 5305 arWhereClause(&rc, pAr, &zWhere); 5306 5307 if( rc==SQLITE_OK ){ 5308 if( pAr->zDir ){ 5309 zDir = sqlite3_mprintf("%s/", pAr->zDir); 5310 }else{ 5311 zDir = sqlite3_mprintf(""); 5312 } 5313 if( zDir==0 ) rc = SQLITE_NOMEM; 5314 } 5315 5316 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 5317 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 5318 ); 5319 5320 if( rc==SQLITE_OK ){ 5321 j = sqlite3_bind_parameter_index(pSql, "$dir"); 5322 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 5323 5324 /* Run the SELECT statement twice. The first time, writefile() is called 5325 ** for all archive members that should be extracted. The second time, 5326 ** only for the directories. This is because the timestamps for 5327 ** extracted directories must be reset after they are populated (as 5328 ** populating them changes the timestamp). */ 5329 for(i=0; i<2; i++){ 5330 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 5331 sqlite3_bind_int(pSql, j, i); 5332 if( pAr->bDryRun ){ 5333 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 5334 }else{ 5335 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 5336 if( i==0 && pAr->bVerbose ){ 5337 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 5338 } 5339 } 5340 } 5341 shellReset(&rc, pSql); 5342 } 5343 shellFinalize(&rc, pSql); 5344 } 5345 5346 sqlite3_free(zDir); 5347 sqlite3_free(zWhere); 5348 return rc; 5349} 5350 5351/* 5352** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 5353*/ 5354static int arExecSql(ArCommand *pAr, const char *zSql){ 5355 int rc; 5356 if( pAr->bDryRun ){ 5357 utf8_printf(pAr->p->out, "%s\n", zSql); 5358 rc = SQLITE_OK; 5359 }else{ 5360 char *zErr = 0; 5361 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 5362 if( zErr ){ 5363 utf8_printf(stdout, "ERROR: %s\n", zErr); 5364 sqlite3_free(zErr); 5365 } 5366 } 5367 return rc; 5368} 5369 5370 5371/* 5372** Implementation of .ar "create" and "update" commands. 5373** 5374** Create the "sqlar" table in the database if it does not already exist. 5375** Then add each file in the azFile[] array to the archive. Directories 5376** are added recursively. If argument bVerbose is non-zero, a message is 5377** printed on stdout for each file archived. 5378** 5379** The create command is the same as update, except that it drops 5380** any existing "sqlar" table before beginning. 5381*/ 5382static int arCreateOrUpdateCommand( 5383 ArCommand *pAr, /* Command arguments and options */ 5384 int bUpdate /* true for a --create. false for --update */ 5385){ 5386 const char *zCreate = 5387 "CREATE TABLE IF NOT EXISTS sqlar(\n" 5388 " name TEXT PRIMARY KEY, -- name of the file\n" 5389 " mode INT, -- access permissions\n" 5390 " mtime INT, -- last modification time\n" 5391 " sz INT, -- original file size\n" 5392 " data BLOB -- compressed content\n" 5393 ")"; 5394 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 5395 const char *zInsertFmt[2] = { 5396 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 5397 " SELECT\n" 5398 " %s,\n" 5399 " mode,\n" 5400 " mtime,\n" 5401 " CASE substr(lsmode(mode),1,1)\n" 5402 " WHEN '-' THEN length(data)\n" 5403 " WHEN 'd' THEN 0\n" 5404 " ELSE -1 END,\n" 5405 " sqlar_compress(data)\n" 5406 " FROM fsdir(%Q,%Q)\n" 5407 " WHERE lsmode(mode) NOT LIKE '?%%';", 5408 "REPLACE INTO %s(name,mode,mtime,data)\n" 5409 " SELECT\n" 5410 " %s,\n" 5411 " mode,\n" 5412 " mtime,\n" 5413 " data\n" 5414 " FROM fsdir(%Q,%Q)\n" 5415 " WHERE lsmode(mode) NOT LIKE '?%%';" 5416 }; 5417 int i; /* For iterating through azFile[] */ 5418 int rc; /* Return code */ 5419 const char *zTab = 0; /* SQL table into which to insert */ 5420 char *zSql; 5421 char zTemp[50]; 5422 5423 arExecSql(pAr, "PRAGMA page_size=512"); 5424 rc = arExecSql(pAr, "SAVEPOINT ar;"); 5425 if( rc!=SQLITE_OK ) return rc; 5426 zTemp[0] = 0; 5427 if( pAr->bZip ){ 5428 /* Initialize the zipfile virtual table, if necessary */ 5429 if( pAr->zFile ){ 5430 sqlite3_uint64 r; 5431 sqlite3_randomness(sizeof(r),&r); 5432 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 5433 zTab = zTemp; 5434 zSql = sqlite3_mprintf( 5435 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 5436 zTab, pAr->zFile 5437 ); 5438 rc = arExecSql(pAr, zSql); 5439 sqlite3_free(zSql); 5440 }else{ 5441 zTab = "zip"; 5442 } 5443 }else{ 5444 /* Initialize the table for an SQLAR */ 5445 zTab = "sqlar"; 5446 if( bUpdate==0 ){ 5447 rc = arExecSql(pAr, zDrop); 5448 if( rc!=SQLITE_OK ) goto end_ar_transaction; 5449 } 5450 rc = arExecSql(pAr, zCreate); 5451 } 5452 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 5453 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 5454 pAr->bVerbose ? "shell_putsnl(name)" : "name", 5455 pAr->azArg[i], pAr->zDir); 5456 rc = arExecSql(pAr, zSql2); 5457 sqlite3_free(zSql2); 5458 } 5459end_ar_transaction: 5460 if( rc!=SQLITE_OK ){ 5461 arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;"); 5462 }else{ 5463 rc = arExecSql(pAr, "RELEASE ar;"); 5464 if( pAr->bZip && pAr->zFile ){ 5465 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 5466 arExecSql(pAr, zSql); 5467 sqlite3_free(zSql); 5468 } 5469 } 5470 return rc; 5471} 5472 5473/* 5474** Implementation of ".ar" dot command. 5475*/ 5476static int arDotCommand( 5477 ShellState *pState, /* Current shell tool state */ 5478 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 5479 char **azArg, /* Array of arguments passed to dot command */ 5480 int nArg /* Number of entries in azArg[] */ 5481){ 5482 ArCommand cmd; 5483 int rc; 5484 memset(&cmd, 0, sizeof(cmd)); 5485 cmd.fromCmdLine = fromCmdLine; 5486 rc = arParseCommand(azArg, nArg, &cmd); 5487 if( rc==SQLITE_OK ){ 5488 int eDbType = SHELL_OPEN_UNSPEC; 5489 cmd.p = pState; 5490 cmd.db = pState->db; 5491 if( cmd.zFile ){ 5492 eDbType = deduceDatabaseType(cmd.zFile, 1); 5493 }else{ 5494 eDbType = pState->openMode; 5495 } 5496 if( eDbType==SHELL_OPEN_ZIPFILE ){ 5497 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 5498 if( cmd.zFile==0 ){ 5499 cmd.zSrcTable = sqlite3_mprintf("zip"); 5500 }else{ 5501 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 5502 } 5503 } 5504 cmd.bZip = 1; 5505 }else if( cmd.zFile ){ 5506 int flags; 5507 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 5508 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_UPDATE ){ 5509 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 5510 }else{ 5511 flags = SQLITE_OPEN_READONLY; 5512 } 5513 cmd.db = 0; 5514 if( cmd.bDryRun ){ 5515 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 5516 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 5517 } 5518 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 5519 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 5520 if( rc!=SQLITE_OK ){ 5521 utf8_printf(stderr, "cannot open file: %s (%s)\n", 5522 cmd.zFile, sqlite3_errmsg(cmd.db) 5523 ); 5524 goto end_ar_command; 5525 } 5526 sqlite3_fileio_init(cmd.db, 0, 0); 5527 sqlite3_sqlar_init(cmd.db, 0, 0); 5528 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 5529 shellPutsFunc, 0, 0); 5530 5531 } 5532 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 5533 if( cmd.eCmd!=AR_CMD_CREATE 5534 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 5535 ){ 5536 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 5537 rc = SQLITE_ERROR; 5538 goto end_ar_command; 5539 } 5540 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 5541 } 5542 5543 switch( cmd.eCmd ){ 5544 case AR_CMD_CREATE: 5545 rc = arCreateOrUpdateCommand(&cmd, 0); 5546 break; 5547 5548 case AR_CMD_EXTRACT: 5549 rc = arExtractCommand(&cmd); 5550 break; 5551 5552 case AR_CMD_LIST: 5553 rc = arListCommand(&cmd); 5554 break; 5555 5556 case AR_CMD_HELP: 5557 arUsage(pState->out); 5558 break; 5559 5560 default: 5561 assert( cmd.eCmd==AR_CMD_UPDATE ); 5562 rc = arCreateOrUpdateCommand(&cmd, 1); 5563 break; 5564 } 5565 } 5566end_ar_command: 5567 if( cmd.db!=pState->db ){ 5568 close_db(cmd.db); 5569 } 5570 sqlite3_free(cmd.zSrcTable); 5571 5572 return rc; 5573} 5574/* End of the ".archive" or ".ar" command logic 5575**********************************************************************************/ 5576#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 5577 5578 5579/* 5580** If an input line begins with "." then invoke this routine to 5581** process that line. 5582** 5583** Return 1 on error, 2 to exit, and 0 otherwise. 5584*/ 5585static int do_meta_command(char *zLine, ShellState *p){ 5586 int h = 1; 5587 int nArg = 0; 5588 int n, c; 5589 int rc = 0; 5590 char *azArg[50]; 5591 5592#ifndef SQLITE_OMIT_VIRTUALTABLE 5593 if( p->expert.pExpert ){ 5594 expertFinish(p, 1, 0); 5595 } 5596#endif 5597 5598 /* Parse the input line into tokens. 5599 */ 5600 while( zLine[h] && nArg<ArraySize(azArg) ){ 5601 while( IsSpace(zLine[h]) ){ h++; } 5602 if( zLine[h]==0 ) break; 5603 if( zLine[h]=='\'' || zLine[h]=='"' ){ 5604 int delim = zLine[h++]; 5605 azArg[nArg++] = &zLine[h]; 5606 while( zLine[h] && zLine[h]!=delim ){ 5607 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 5608 h++; 5609 } 5610 if( zLine[h]==delim ){ 5611 zLine[h++] = 0; 5612 } 5613 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 5614 }else{ 5615 azArg[nArg++] = &zLine[h]; 5616 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 5617 if( zLine[h] ) zLine[h++] = 0; 5618 resolve_backslashes(azArg[nArg-1]); 5619 } 5620 } 5621 5622 /* Process the input line. 5623 */ 5624 if( nArg==0 ) return 0; /* no tokens, no error */ 5625 n = strlen30(azArg[0]); 5626 c = azArg[0][0]; 5627 clearTempFile(p); 5628 5629#ifndef SQLITE_OMIT_AUTHORIZATION 5630 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 5631 if( nArg!=2 ){ 5632 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 5633 rc = 1; 5634 goto meta_command_exit; 5635 } 5636 open_db(p, 0); 5637 if( booleanValue(azArg[1]) ){ 5638 sqlite3_set_authorizer(p->db, shellAuth, p); 5639 }else{ 5640 sqlite3_set_authorizer(p->db, 0, 0); 5641 } 5642 }else 5643#endif 5644 5645#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 5646 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 5647 open_db(p, 0); 5648 rc = arDotCommand(p, 0, azArg, nArg); 5649 }else 5650#endif 5651 5652 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 5653 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 5654 ){ 5655 const char *zDestFile = 0; 5656 const char *zDb = 0; 5657 sqlite3 *pDest; 5658 sqlite3_backup *pBackup; 5659 int j; 5660 const char *zVfs = 0; 5661 for(j=1; j<nArg; j++){ 5662 const char *z = azArg[j]; 5663 if( z[0]=='-' ){ 5664 if( z[1]=='-' ) z++; 5665 if( strcmp(z, "-append")==0 ){ 5666 zVfs = "apndvfs"; 5667 }else 5668 { 5669 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 5670 return 1; 5671 } 5672 }else if( zDestFile==0 ){ 5673 zDestFile = azArg[j]; 5674 }else if( zDb==0 ){ 5675 zDb = zDestFile; 5676 zDestFile = azArg[j]; 5677 }else{ 5678 raw_printf(stderr, "Usage: .backup ?DB? ?--append? FILENAME\n"); 5679 return 1; 5680 } 5681 } 5682 if( zDestFile==0 ){ 5683 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 5684 return 1; 5685 } 5686 if( zDb==0 ) zDb = "main"; 5687 rc = sqlite3_open_v2(zDestFile, &pDest, 5688 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 5689 if( rc!=SQLITE_OK ){ 5690 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 5691 close_db(pDest); 5692 return 1; 5693 } 5694 open_db(p, 0); 5695 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 5696 if( pBackup==0 ){ 5697 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 5698 close_db(pDest); 5699 return 1; 5700 } 5701 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 5702 sqlite3_backup_finish(pBackup); 5703 if( rc==SQLITE_DONE ){ 5704 rc = 0; 5705 }else{ 5706 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 5707 rc = 1; 5708 } 5709 close_db(pDest); 5710 }else 5711 5712 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 5713 if( nArg==2 ){ 5714 bail_on_error = booleanValue(azArg[1]); 5715 }else{ 5716 raw_printf(stderr, "Usage: .bail on|off\n"); 5717 rc = 1; 5718 } 5719 }else 5720 5721 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 5722 if( nArg==2 ){ 5723 if( booleanValue(azArg[1]) ){ 5724 setBinaryMode(p->out, 1); 5725 }else{ 5726 setTextMode(p->out, 1); 5727 } 5728 }else{ 5729 raw_printf(stderr, "Usage: .binary on|off\n"); 5730 rc = 1; 5731 } 5732 }else 5733 5734 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 5735 if( nArg==2 ){ 5736#if defined(_WIN32) || defined(WIN32) 5737 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 5738 rc = !SetCurrentDirectoryW(z); 5739 sqlite3_free(z); 5740#else 5741 rc = chdir(azArg[1]); 5742#endif 5743 if( rc ){ 5744 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 5745 rc = 1; 5746 } 5747 }else{ 5748 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 5749 rc = 1; 5750 } 5751 }else 5752 5753 /* The undocumented ".breakpoint" command causes a call to the no-op 5754 ** routine named test_breakpoint(). 5755 */ 5756 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 5757 test_breakpoint(); 5758 }else 5759 5760 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 5761 if( nArg==2 ){ 5762 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 5763 }else{ 5764 raw_printf(stderr, "Usage: .changes on|off\n"); 5765 rc = 1; 5766 } 5767 }else 5768 5769 /* Cancel output redirection, if it is currently set (by .testcase) 5770 ** Then read the content of the testcase-out.txt file and compare against 5771 ** azArg[1]. If there are differences, report an error and exit. 5772 */ 5773 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 5774 char *zRes = 0; 5775 output_reset(p); 5776 if( nArg!=2 ){ 5777 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 5778 rc = 2; 5779 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 5780 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 5781 rc = 2; 5782 }else if( testcase_glob(azArg[1],zRes)==0 ){ 5783 utf8_printf(stderr, 5784 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 5785 p->zTestcase, azArg[1], zRes); 5786 rc = 1; 5787 }else{ 5788 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 5789 p->nCheck++; 5790 } 5791 sqlite3_free(zRes); 5792 }else 5793 5794 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 5795 if( nArg==2 ){ 5796 tryToClone(p, azArg[1]); 5797 }else{ 5798 raw_printf(stderr, "Usage: .clone FILENAME\n"); 5799 rc = 1; 5800 } 5801 }else 5802 5803 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 5804 ShellState data; 5805 char *zErrMsg = 0; 5806 open_db(p, 0); 5807 memcpy(&data, p, sizeof(data)); 5808 data.showHeader = 0; 5809 data.cMode = data.mode = MODE_List; 5810 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": "); 5811 data.cnt = 0; 5812 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list", 5813 callback, &data, &zErrMsg); 5814 if( zErrMsg ){ 5815 utf8_printf(stderr,"Error: %s\n", zErrMsg); 5816 sqlite3_free(zErrMsg); 5817 rc = 1; 5818 } 5819 }else 5820 5821 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 5822 static const struct DbConfigChoices {const char *zName; int op;} aDbConfig[] = { 5823 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 5824 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 5825 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 5826 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 5827 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 5828 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 5829 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 5830 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 5831 }; 5832 int ii, v; 5833 open_db(p, 0); 5834 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 5835 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 5836 if( nArg>=3 ){ 5837 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 5838 } 5839 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 5840 utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 5841 if( nArg>1 ) break; 5842 } 5843 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 5844 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 5845 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 5846 } 5847 }else 5848 5849 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 5850 rc = shell_dbinfo_command(p, nArg, azArg); 5851 }else 5852 5853 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 5854 const char *zLike = 0; 5855 int i; 5856 int savedShowHeader = p->showHeader; 5857 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines); 5858 for(i=1; i<nArg; i++){ 5859 if( azArg[i][0]=='-' ){ 5860 const char *z = azArg[i]+1; 5861 if( z[0]=='-' ) z++; 5862 if( strcmp(z,"preserve-rowids")==0 ){ 5863#ifdef SQLITE_OMIT_VIRTUALTABLE 5864 raw_printf(stderr, "The --preserve-rowids option is not compatible" 5865 " with SQLITE_OMIT_VIRTUALTABLE\n"); 5866 rc = 1; 5867 goto meta_command_exit; 5868#else 5869 ShellSetFlag(p, SHFLG_PreserveRowid); 5870#endif 5871 }else 5872 if( strcmp(z,"newlines")==0 ){ 5873 ShellSetFlag(p, SHFLG_Newlines); 5874 }else 5875 { 5876 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 5877 rc = 1; 5878 goto meta_command_exit; 5879 } 5880 }else if( zLike ){ 5881 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? " 5882 "?--newlines? ?LIKE-PATTERN?\n"); 5883 rc = 1; 5884 goto meta_command_exit; 5885 }else{ 5886 zLike = azArg[i]; 5887 } 5888 } 5889 open_db(p, 0); 5890 /* When playing back a "dump", the content might appear in an order 5891 ** which causes immediate foreign key constraints to be violated. 5892 ** So disable foreign-key constraint enforcement to prevent problems. */ 5893 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 5894 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 5895 p->writableSchema = 0; 5896 p->showHeader = 0; 5897 /* Set writable_schema=ON since doing so forces SQLite to initialize 5898 ** as much of the schema as it can even if the sqlite_master table is 5899 ** corrupt. */ 5900 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 5901 p->nErr = 0; 5902 if( zLike==0 ){ 5903 run_schema_dump_query(p, 5904 "SELECT name, type, sql FROM sqlite_master " 5905 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'" 5906 ); 5907 run_schema_dump_query(p, 5908 "SELECT name, type, sql FROM sqlite_master " 5909 "WHERE name=='sqlite_sequence'" 5910 ); 5911 run_table_dump_query(p, 5912 "SELECT sql FROM sqlite_master " 5913 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0 5914 ); 5915 }else{ 5916 char *zSql; 5917 zSql = sqlite3_mprintf( 5918 "SELECT name, type, sql FROM sqlite_master " 5919 "WHERE tbl_name LIKE %Q AND type=='table'" 5920 " AND sql NOT NULL", zLike); 5921 run_schema_dump_query(p,zSql); 5922 sqlite3_free(zSql); 5923 zSql = sqlite3_mprintf( 5924 "SELECT sql FROM sqlite_master " 5925 "WHERE sql NOT NULL" 5926 " AND type IN ('index','trigger','view')" 5927 " AND tbl_name LIKE %Q", zLike); 5928 run_table_dump_query(p, zSql, 0); 5929 sqlite3_free(zSql); 5930 } 5931 if( p->writableSchema ){ 5932 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 5933 p->writableSchema = 0; 5934 } 5935 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 5936 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 5937 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n"); 5938 p->showHeader = savedShowHeader; 5939 }else 5940 5941 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 5942 if( nArg==2 ){ 5943 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 5944 }else{ 5945 raw_printf(stderr, "Usage: .echo on|off\n"); 5946 rc = 1; 5947 } 5948 }else 5949 5950 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 5951 if( nArg==2 ){ 5952 p->autoEQPtest = 0; 5953 if( strcmp(azArg[1],"full")==0 ){ 5954 p->autoEQP = AUTOEQP_full; 5955 }else if( strcmp(azArg[1],"trigger")==0 ){ 5956 p->autoEQP = AUTOEQP_trigger; 5957 }else if( strcmp(azArg[1],"test")==0 ){ 5958 p->autoEQP = AUTOEQP_on; 5959 p->autoEQPtest = 1; 5960 }else{ 5961 p->autoEQP = (u8)booleanValue(azArg[1]); 5962 } 5963 }else{ 5964 raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n"); 5965 rc = 1; 5966 } 5967 }else 5968 5969 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 5970 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 5971 rc = 2; 5972 }else 5973 5974 /* The ".explain" command is automatic now. It is largely pointless. It 5975 ** retained purely for backwards compatibility */ 5976 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 5977 int val = 1; 5978 if( nArg>=2 ){ 5979 if( strcmp(azArg[1],"auto")==0 ){ 5980 val = 99; 5981 }else{ 5982 val = booleanValue(azArg[1]); 5983 } 5984 } 5985 if( val==1 && p->mode!=MODE_Explain ){ 5986 p->normalMode = p->mode; 5987 p->mode = MODE_Explain; 5988 p->autoExplain = 0; 5989 }else if( val==0 ){ 5990 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 5991 p->autoExplain = 0; 5992 }else if( val==99 ){ 5993 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 5994 p->autoExplain = 1; 5995 } 5996 }else 5997 5998#ifndef SQLITE_OMIT_VIRTUALTABLE 5999 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 6000 open_db(p, 0); 6001 expertDotCommand(p, azArg, nArg); 6002 }else 6003#endif 6004 6005 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 6006 ShellState data; 6007 char *zErrMsg = 0; 6008 int doStats = 0; 6009 memcpy(&data, p, sizeof(data)); 6010 data.showHeader = 0; 6011 data.cMode = data.mode = MODE_Semi; 6012 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 6013 data.cMode = data.mode = MODE_Pretty; 6014 nArg = 1; 6015 } 6016 if( nArg!=1 ){ 6017 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 6018 rc = 1; 6019 goto meta_command_exit; 6020 } 6021 open_db(p, 0); 6022 rc = sqlite3_exec(p->db, 6023 "SELECT sql FROM" 6024 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 6025 " FROM sqlite_master UNION ALL" 6026 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) " 6027 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 6028 "ORDER BY rowid", 6029 callback, &data, &zErrMsg 6030 ); 6031 if( rc==SQLITE_OK ){ 6032 sqlite3_stmt *pStmt; 6033 rc = sqlite3_prepare_v2(p->db, 6034 "SELECT rowid FROM sqlite_master" 6035 " WHERE name GLOB 'sqlite_stat[134]'", 6036 -1, &pStmt, 0); 6037 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 6038 sqlite3_finalize(pStmt); 6039 } 6040 if( doStats==0 ){ 6041 raw_printf(p->out, "/* No STAT tables available */\n"); 6042 }else{ 6043 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 6044 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'", 6045 callback, &data, &zErrMsg); 6046 data.cMode = data.mode = MODE_Insert; 6047 data.zDestTable = "sqlite_stat1"; 6048 shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg); 6049 data.zDestTable = "sqlite_stat3"; 6050 shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg); 6051 data.zDestTable = "sqlite_stat4"; 6052 shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg); 6053 raw_printf(p->out, "ANALYZE sqlite_master;\n"); 6054 } 6055 }else 6056 6057 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 6058 if( nArg==2 ){ 6059 p->showHeader = booleanValue(azArg[1]); 6060 }else{ 6061 raw_printf(stderr, "Usage: .headers on|off\n"); 6062 rc = 1; 6063 } 6064 }else 6065 6066 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 6067 utf8_printf(p->out, "%s", zHelp); 6068 }else 6069 6070 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 6071 char *zTable; /* Insert data into this table */ 6072 char *zFile; /* Name of file to extra content from */ 6073 sqlite3_stmt *pStmt = NULL; /* A statement */ 6074 int nCol; /* Number of columns in the table */ 6075 int nByte; /* Number of bytes in an SQL string */ 6076 int i, j; /* Loop counters */ 6077 int needCommit; /* True to COMMIT or ROLLBACK at end */ 6078 int nSep; /* Number of bytes in p->colSeparator[] */ 6079 char *zSql; /* An SQL statement */ 6080 ImportCtx sCtx; /* Reader context */ 6081 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 6082 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */ 6083 6084 if( nArg!=3 ){ 6085 raw_printf(stderr, "Usage: .import FILE TABLE\n"); 6086 goto meta_command_exit; 6087 } 6088 zFile = azArg[1]; 6089 zTable = azArg[2]; 6090 seenInterrupt = 0; 6091 memset(&sCtx, 0, sizeof(sCtx)); 6092 open_db(p, 0); 6093 nSep = strlen30(p->colSeparator); 6094 if( nSep==0 ){ 6095 raw_printf(stderr, 6096 "Error: non-null column separator required for import\n"); 6097 return 1; 6098 } 6099 if( nSep>1 ){ 6100 raw_printf(stderr, "Error: multi-character column separators not allowed" 6101 " for import\n"); 6102 return 1; 6103 } 6104 nSep = strlen30(p->rowSeparator); 6105 if( nSep==0 ){ 6106 raw_printf(stderr, "Error: non-null row separator required for import\n"); 6107 return 1; 6108 } 6109 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){ 6110 /* When importing CSV (only), if the row separator is set to the 6111 ** default output row separator, change it to the default input 6112 ** row separator. This avoids having to maintain different input 6113 ** and output row separators. */ 6114 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 6115 nSep = strlen30(p->rowSeparator); 6116 } 6117 if( nSep>1 ){ 6118 raw_printf(stderr, "Error: multi-character row separators not allowed" 6119 " for import\n"); 6120 return 1; 6121 } 6122 sCtx.zFile = zFile; 6123 sCtx.nLine = 1; 6124 if( sCtx.zFile[0]=='|' ){ 6125#ifdef SQLITE_OMIT_POPEN 6126 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 6127 return 1; 6128#else 6129 sCtx.in = popen(sCtx.zFile+1, "r"); 6130 sCtx.zFile = "<pipe>"; 6131 xCloser = pclose; 6132#endif 6133 }else{ 6134 sCtx.in = fopen(sCtx.zFile, "rb"); 6135 xCloser = fclose; 6136 } 6137 if( p->mode==MODE_Ascii ){ 6138 xRead = ascii_read_one_field; 6139 }else{ 6140 xRead = csv_read_one_field; 6141 } 6142 if( sCtx.in==0 ){ 6143 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 6144 return 1; 6145 } 6146 sCtx.cColSep = p->colSeparator[0]; 6147 sCtx.cRowSep = p->rowSeparator[0]; 6148 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); 6149 if( zSql==0 ){ 6150 xCloser(sCtx.in); 6151 shell_out_of_memory(); 6152 } 6153 nByte = strlen30(zSql); 6154 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6155 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 6156 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 6157 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); 6158 char cSep = '('; 6159 while( xRead(&sCtx) ){ 6160 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 6161 cSep = ','; 6162 if( sCtx.cTerm!=sCtx.cColSep ) break; 6163 } 6164 if( cSep=='(' ){ 6165 sqlite3_free(zCreate); 6166 sqlite3_free(sCtx.z); 6167 xCloser(sCtx.in); 6168 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 6169 return 1; 6170 } 6171 zCreate = sqlite3_mprintf("%z\n)", zCreate); 6172 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 6173 sqlite3_free(zCreate); 6174 if( rc ){ 6175 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, 6176 sqlite3_errmsg(p->db)); 6177 sqlite3_free(sCtx.z); 6178 xCloser(sCtx.in); 6179 return 1; 6180 } 6181 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6182 } 6183 sqlite3_free(zSql); 6184 if( rc ){ 6185 if (pStmt) sqlite3_finalize(pStmt); 6186 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 6187 xCloser(sCtx.in); 6188 return 1; 6189 } 6190 nCol = sqlite3_column_count(pStmt); 6191 sqlite3_finalize(pStmt); 6192 pStmt = 0; 6193 if( nCol==0 ) return 0; /* no columns, no error */ 6194 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 6195 if( zSql==0 ){ 6196 xCloser(sCtx.in); 6197 shell_out_of_memory(); 6198 } 6199 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 6200 j = strlen30(zSql); 6201 for(i=1; i<nCol; i++){ 6202 zSql[j++] = ','; 6203 zSql[j++] = '?'; 6204 } 6205 zSql[j++] = ')'; 6206 zSql[j] = 0; 6207 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6208 sqlite3_free(zSql); 6209 if( rc ){ 6210 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 6211 if (pStmt) sqlite3_finalize(pStmt); 6212 xCloser(sCtx.in); 6213 return 1; 6214 } 6215 needCommit = sqlite3_get_autocommit(p->db); 6216 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 6217 do{ 6218 int startLine = sCtx.nLine; 6219 for(i=0; i<nCol; i++){ 6220 char *z = xRead(&sCtx); 6221 /* 6222 ** Did we reach end-of-file before finding any columns? 6223 ** If so, stop instead of NULL filling the remaining columns. 6224 */ 6225 if( z==0 && i==0 ) break; 6226 /* 6227 ** Did we reach end-of-file OR end-of-line before finding any 6228 ** columns in ASCII mode? If so, stop instead of NULL filling 6229 ** the remaining columns. 6230 */ 6231 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 6232 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 6233 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 6234 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 6235 "filling the rest with NULL\n", 6236 sCtx.zFile, startLine, nCol, i+1); 6237 i += 2; 6238 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 6239 } 6240 } 6241 if( sCtx.cTerm==sCtx.cColSep ){ 6242 do{ 6243 xRead(&sCtx); 6244 i++; 6245 }while( sCtx.cTerm==sCtx.cColSep ); 6246 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 6247 "extras ignored\n", 6248 sCtx.zFile, startLine, nCol, i); 6249 } 6250 if( i>=nCol ){ 6251 sqlite3_step(pStmt); 6252 rc = sqlite3_reset(pStmt); 6253 if( rc!=SQLITE_OK ){ 6254 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 6255 startLine, sqlite3_errmsg(p->db)); 6256 } 6257 } 6258 }while( sCtx.cTerm!=EOF ); 6259 6260 xCloser(sCtx.in); 6261 sqlite3_free(sCtx.z); 6262 sqlite3_finalize(pStmt); 6263 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 6264 }else 6265 6266#ifndef SQLITE_UNTESTABLE 6267 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 6268 char *zSql; 6269 char *zCollist = 0; 6270 sqlite3_stmt *pStmt; 6271 int tnum = 0; 6272 int i; 6273 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 6274 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 6275 " .imposter off\n"); 6276 rc = 1; 6277 goto meta_command_exit; 6278 } 6279 open_db(p, 0); 6280 if( nArg==2 ){ 6281 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 6282 goto meta_command_exit; 6283 } 6284 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master" 6285 " WHERE name='%q' AND type='index'", azArg[1]); 6286 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6287 sqlite3_free(zSql); 6288 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 6289 tnum = sqlite3_column_int(pStmt, 0); 6290 } 6291 sqlite3_finalize(pStmt); 6292 if( tnum==0 ){ 6293 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 6294 rc = 1; 6295 goto meta_command_exit; 6296 } 6297 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 6298 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 6299 sqlite3_free(zSql); 6300 i = 0; 6301 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 6302 char zLabel[20]; 6303 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 6304 i++; 6305 if( zCol==0 ){ 6306 if( sqlite3_column_int(pStmt,1)==-1 ){ 6307 zCol = "_ROWID_"; 6308 }else{ 6309 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 6310 zCol = zLabel; 6311 } 6312 } 6313 if( zCollist==0 ){ 6314 zCollist = sqlite3_mprintf("\"%w\"", zCol); 6315 }else{ 6316 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 6317 } 6318 } 6319 sqlite3_finalize(pStmt); 6320 zSql = sqlite3_mprintf( 6321 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID", 6322 azArg[2], zCollist, zCollist); 6323 sqlite3_free(zCollist); 6324 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 6325 if( rc==SQLITE_OK ){ 6326 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 6327 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 6328 if( rc ){ 6329 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 6330 }else{ 6331 utf8_printf(stdout, "%s;\n", zSql); 6332 raw_printf(stdout, 6333 "WARNING: writing to an imposter table will corrupt the index!\n" 6334 ); 6335 } 6336 }else{ 6337 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 6338 rc = 1; 6339 } 6340 sqlite3_free(zSql); 6341 }else 6342#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 6343 6344#ifdef SQLITE_ENABLE_IOTRACE 6345 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 6346 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 6347 if( iotrace && iotrace!=stdout ) fclose(iotrace); 6348 iotrace = 0; 6349 if( nArg<2 ){ 6350 sqlite3IoTrace = 0; 6351 }else if( strcmp(azArg[1], "-")==0 ){ 6352 sqlite3IoTrace = iotracePrintf; 6353 iotrace = stdout; 6354 }else{ 6355 iotrace = fopen(azArg[1], "w"); 6356 if( iotrace==0 ){ 6357 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 6358 sqlite3IoTrace = 0; 6359 rc = 1; 6360 }else{ 6361 sqlite3IoTrace = iotracePrintf; 6362 } 6363 } 6364 }else 6365#endif 6366 6367 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 6368 static const struct { 6369 const char *zLimitName; /* Name of a limit */ 6370 int limitCode; /* Integer code for that limit */ 6371 } aLimit[] = { 6372 { "length", SQLITE_LIMIT_LENGTH }, 6373 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 6374 { "column", SQLITE_LIMIT_COLUMN }, 6375 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 6376 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 6377 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 6378 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 6379 { "attached", SQLITE_LIMIT_ATTACHED }, 6380 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 6381 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 6382 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 6383 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 6384 }; 6385 int i, n2; 6386 open_db(p, 0); 6387 if( nArg==1 ){ 6388 for(i=0; i<ArraySize(aLimit); i++){ 6389 printf("%20s %d\n", aLimit[i].zLimitName, 6390 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 6391 } 6392 }else if( nArg>3 ){ 6393 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 6394 rc = 1; 6395 goto meta_command_exit; 6396 }else{ 6397 int iLimit = -1; 6398 n2 = strlen30(azArg[1]); 6399 for(i=0; i<ArraySize(aLimit); i++){ 6400 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 6401 if( iLimit<0 ){ 6402 iLimit = i; 6403 }else{ 6404 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 6405 rc = 1; 6406 goto meta_command_exit; 6407 } 6408 } 6409 } 6410 if( iLimit<0 ){ 6411 utf8_printf(stderr, "unknown limit: \"%s\"\n" 6412 "enter \".limits\" with no arguments for a list.\n", 6413 azArg[1]); 6414 rc = 1; 6415 goto meta_command_exit; 6416 } 6417 if( nArg==3 ){ 6418 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 6419 (int)integerValue(azArg[2])); 6420 } 6421 printf("%20s %d\n", aLimit[iLimit].zLimitName, 6422 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 6423 } 6424 }else 6425 6426 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 6427 open_db(p, 0); 6428 lintDotCommand(p, azArg, nArg); 6429 }else 6430 6431#ifndef SQLITE_OMIT_LOAD_EXTENSION 6432 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 6433 const char *zFile, *zProc; 6434 char *zErrMsg = 0; 6435 if( nArg<2 ){ 6436 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 6437 rc = 1; 6438 goto meta_command_exit; 6439 } 6440 zFile = azArg[1]; 6441 zProc = nArg>=3 ? azArg[2] : 0; 6442 open_db(p, 0); 6443 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 6444 if( rc!=SQLITE_OK ){ 6445 utf8_printf(stderr, "Error: %s\n", zErrMsg); 6446 sqlite3_free(zErrMsg); 6447 rc = 1; 6448 } 6449 }else 6450#endif 6451 6452 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 6453 if( nArg!=2 ){ 6454 raw_printf(stderr, "Usage: .log FILENAME\n"); 6455 rc = 1; 6456 }else{ 6457 const char *zFile = azArg[1]; 6458 output_file_close(p->pLog); 6459 p->pLog = output_file_open(zFile, 0); 6460 } 6461 }else 6462 6463 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 6464 const char *zMode = nArg>=2 ? azArg[1] : ""; 6465 int n2 = strlen30(zMode); 6466 int c2 = zMode[0]; 6467 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 6468 p->mode = MODE_Line; 6469 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 6470 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 6471 p->mode = MODE_Column; 6472 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 6473 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 6474 p->mode = MODE_List; 6475 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 6476 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 6477 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 6478 p->mode = MODE_Html; 6479 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 6480 p->mode = MODE_Tcl; 6481 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 6482 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 6483 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 6484 p->mode = MODE_Csv; 6485 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 6486 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 6487 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 6488 p->mode = MODE_List; 6489 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 6490 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 6491 p->mode = MODE_Insert; 6492 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 6493 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 6494 p->mode = MODE_Quote; 6495 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 6496 p->mode = MODE_Ascii; 6497 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 6498 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 6499 }else if( nArg==1 ){ 6500 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 6501 }else{ 6502 raw_printf(stderr, "Error: mode should be one of: " 6503 "ascii column csv html insert line list quote tabs tcl\n"); 6504 rc = 1; 6505 } 6506 p->cMode = p->mode; 6507 }else 6508 6509 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 6510 if( nArg==2 ){ 6511 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 6512 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 6513 }else{ 6514 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 6515 rc = 1; 6516 } 6517 }else 6518 6519 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 6520 char *zNewFilename; /* Name of the database file to open */ 6521 int iName = 1; /* Index in azArg[] of the filename */ 6522 int newFlag = 0; /* True to delete file before opening */ 6523 /* Close the existing database */ 6524 session_close_all(p); 6525 close_db(p->db); 6526 p->db = 0; 6527 p->zDbFilename = 0; 6528 sqlite3_free(p->zFreeOnClose); 6529 p->zFreeOnClose = 0; 6530 p->openMode = SHELL_OPEN_UNSPEC; 6531 /* Check for command-line arguments */ 6532 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){ 6533 const char *z = azArg[iName]; 6534 if( optionMatch(z,"new") ){ 6535 newFlag = 1; 6536#ifdef SQLITE_HAVE_ZLIB 6537 }else if( optionMatch(z, "zip") ){ 6538 p->openMode = SHELL_OPEN_ZIPFILE; 6539#endif 6540 }else if( optionMatch(z, "append") ){ 6541 p->openMode = SHELL_OPEN_APPENDVFS; 6542 }else if( optionMatch(z, "readonly") ){ 6543 p->openMode = SHELL_OPEN_READONLY; 6544 }else if( z[0]=='-' ){ 6545 utf8_printf(stderr, "unknown option: %s\n", z); 6546 rc = 1; 6547 goto meta_command_exit; 6548 } 6549 } 6550 /* If a filename is specified, try to open it first */ 6551 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; 6552 if( zNewFilename ){ 6553 if( newFlag ) shellDeleteFile(zNewFilename); 6554 p->zDbFilename = zNewFilename; 6555 open_db(p, OPEN_DB_KEEPALIVE); 6556 if( p->db==0 ){ 6557 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 6558 sqlite3_free(zNewFilename); 6559 }else{ 6560 p->zFreeOnClose = zNewFilename; 6561 } 6562 } 6563 if( p->db==0 ){ 6564 /* As a fall-back open a TEMP database */ 6565 p->zDbFilename = 0; 6566 open_db(p, 0); 6567 } 6568 }else 6569 6570 if( (c=='o' 6571 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 6572 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 6573 ){ 6574 const char *zFile = nArg>=2 ? azArg[1] : "stdout"; 6575 int bTxtMode = 0; 6576 if( azArg[0][0]=='e' ){ 6577 /* Transform the ".excel" command into ".once -x" */ 6578 nArg = 2; 6579 azArg[0] = "once"; 6580 zFile = azArg[1] = "-x"; 6581 n = 4; 6582 } 6583 if( nArg>2 ){ 6584 utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]); 6585 rc = 1; 6586 goto meta_command_exit; 6587 } 6588 if( n>1 && strncmp(azArg[0], "once", n)==0 ){ 6589 if( nArg<2 ){ 6590 raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n"); 6591 rc = 1; 6592 goto meta_command_exit; 6593 } 6594 p->outCount = 2; 6595 }else{ 6596 p->outCount = 0; 6597 } 6598 output_reset(p); 6599 if( zFile[0]=='-' && zFile[1]=='-' ) zFile++; 6600#ifndef SQLITE_NOHAVE_SYSTEM 6601 if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){ 6602 p->doXdgOpen = 1; 6603 outputModePush(p); 6604 if( zFile[1]=='x' ){ 6605 newTempFile(p, "csv"); 6606 p->mode = MODE_Csv; 6607 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 6608 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 6609 }else{ 6610 newTempFile(p, "txt"); 6611 bTxtMode = 1; 6612 } 6613 zFile = p->zTempFile; 6614 } 6615#endif /* SQLITE_NOHAVE_SYSTEM */ 6616 if( zFile[0]=='|' ){ 6617#ifdef SQLITE_OMIT_POPEN 6618 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 6619 rc = 1; 6620 p->out = stdout; 6621#else 6622 p->out = popen(zFile + 1, "w"); 6623 if( p->out==0 ){ 6624 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 6625 p->out = stdout; 6626 rc = 1; 6627 }else{ 6628 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 6629 } 6630#endif 6631 }else{ 6632 p->out = output_file_open(zFile, bTxtMode); 6633 if( p->out==0 ){ 6634 if( strcmp(zFile,"off")!=0 ){ 6635 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 6636 } 6637 p->out = stdout; 6638 rc = 1; 6639 } else { 6640 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 6641 } 6642 } 6643 }else 6644 6645 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 6646 int i; 6647 for(i=1; i<nArg; i++){ 6648 if( i>1 ) raw_printf(p->out, " "); 6649 utf8_printf(p->out, "%s", azArg[i]); 6650 } 6651 raw_printf(p->out, "\n"); 6652 }else 6653 6654 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 6655 if( nArg >= 2) { 6656 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 6657 } 6658 if( nArg >= 3) { 6659 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 6660 } 6661 }else 6662 6663 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 6664 rc = 2; 6665 }else 6666 6667 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 6668 FILE *alt; 6669 if( nArg!=2 ){ 6670 raw_printf(stderr, "Usage: .read FILE\n"); 6671 rc = 1; 6672 goto meta_command_exit; 6673 } 6674 alt = fopen(azArg[1], "rb"); 6675 if( alt==0 ){ 6676 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 6677 rc = 1; 6678 }else{ 6679 rc = process_input(p, alt); 6680 fclose(alt); 6681 } 6682 }else 6683 6684 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 6685 const char *zSrcFile; 6686 const char *zDb; 6687 sqlite3 *pSrc; 6688 sqlite3_backup *pBackup; 6689 int nTimeout = 0; 6690 6691 if( nArg==2 ){ 6692 zSrcFile = azArg[1]; 6693 zDb = "main"; 6694 }else if( nArg==3 ){ 6695 zSrcFile = azArg[2]; 6696 zDb = azArg[1]; 6697 }else{ 6698 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 6699 rc = 1; 6700 goto meta_command_exit; 6701 } 6702 rc = sqlite3_open(zSrcFile, &pSrc); 6703 if( rc!=SQLITE_OK ){ 6704 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 6705 close_db(pSrc); 6706 return 1; 6707 } 6708 open_db(p, 0); 6709 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 6710 if( pBackup==0 ){ 6711 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 6712 close_db(pSrc); 6713 return 1; 6714 } 6715 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 6716 || rc==SQLITE_BUSY ){ 6717 if( rc==SQLITE_BUSY ){ 6718 if( nTimeout++ >= 3 ) break; 6719 sqlite3_sleep(100); 6720 } 6721 } 6722 sqlite3_backup_finish(pBackup); 6723 if( rc==SQLITE_DONE ){ 6724 rc = 0; 6725 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 6726 raw_printf(stderr, "Error: source database is busy\n"); 6727 rc = 1; 6728 }else{ 6729 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 6730 rc = 1; 6731 } 6732 close_db(pSrc); 6733 }else 6734 6735 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 6736 if( nArg==2 ){ 6737 p->scanstatsOn = (u8)booleanValue(azArg[1]); 6738#ifndef SQLITE_ENABLE_STMT_SCANSTATUS 6739 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 6740#endif 6741 }else{ 6742 raw_printf(stderr, "Usage: .scanstats on|off\n"); 6743 rc = 1; 6744 } 6745 }else 6746 6747 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 6748 ShellText sSelect; 6749 ShellState data; 6750 char *zErrMsg = 0; 6751 const char *zDiv = "("; 6752 const char *zName = 0; 6753 int iSchema = 0; 6754 int bDebug = 0; 6755 int ii; 6756 6757 open_db(p, 0); 6758 memcpy(&data, p, sizeof(data)); 6759 data.showHeader = 0; 6760 data.cMode = data.mode = MODE_Semi; 6761 initText(&sSelect); 6762 for(ii=1; ii<nArg; ii++){ 6763 if( optionMatch(azArg[ii],"indent") ){ 6764 data.cMode = data.mode = MODE_Pretty; 6765 }else if( optionMatch(azArg[ii],"debug") ){ 6766 bDebug = 1; 6767 }else if( zName==0 ){ 6768 zName = azArg[ii]; 6769 }else{ 6770 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n"); 6771 rc = 1; 6772 goto meta_command_exit; 6773 } 6774 } 6775 if( zName!=0 ){ 6776 int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0; 6777 if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){ 6778 char *new_argv[2], *new_colv[2]; 6779 new_argv[0] = sqlite3_mprintf( 6780 "CREATE TABLE %s (\n" 6781 " type text,\n" 6782 " name text,\n" 6783 " tbl_name text,\n" 6784 " rootpage integer,\n" 6785 " sql text\n" 6786 ")", isMaster ? "sqlite_master" : "sqlite_temp_master"); 6787 new_argv[1] = 0; 6788 new_colv[0] = "sql"; 6789 new_colv[1] = 0; 6790 callback(&data, 1, new_argv, new_colv); 6791 sqlite3_free(new_argv[0]); 6792 } 6793 } 6794 if( zDiv ){ 6795 sqlite3_stmt *pStmt = 0; 6796 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 6797 -1, &pStmt, 0); 6798 if( rc ){ 6799 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 6800 sqlite3_finalize(pStmt); 6801 rc = 1; 6802 goto meta_command_exit; 6803 } 6804 appendText(&sSelect, "SELECT sql FROM", 0); 6805 iSchema = 0; 6806 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 6807 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 6808 char zScNum[30]; 6809 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 6810 appendText(&sSelect, zDiv, 0); 6811 zDiv = " UNION ALL "; 6812 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 6813 if( sqlite3_stricmp(zDb, "main")!=0 ){ 6814 appendText(&sSelect, zDb, '"'); 6815 }else{ 6816 appendText(&sSelect, "NULL", 0); 6817 } 6818 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 6819 appendText(&sSelect, zScNum, 0); 6820 appendText(&sSelect, " AS snum, ", 0); 6821 appendText(&sSelect, zDb, '\''); 6822 appendText(&sSelect, " AS sname FROM ", 0); 6823 appendText(&sSelect, zDb, '"'); 6824 appendText(&sSelect, ".sqlite_master", 0); 6825 } 6826 sqlite3_finalize(pStmt); 6827#ifdef SQLITE_INTROSPECTION_PRAGMAS 6828 if( zName ){ 6829 appendText(&sSelect, 6830 " UNION ALL SELECT shell_module_schema(name)," 6831 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 0); 6832 } 6833#endif 6834 appendText(&sSelect, ") WHERE ", 0); 6835 if( zName ){ 6836 char *zQarg = sqlite3_mprintf("%Q", zName); 6837 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 6838 strchr(zName, '[') != 0; 6839 if( strchr(zName, '.') ){ 6840 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 6841 }else{ 6842 appendText(&sSelect, "lower(tbl_name)", 0); 6843 } 6844 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 6845 appendText(&sSelect, zQarg, 0); 6846 if( !bGlob ){ 6847 appendText(&sSelect, " ESCAPE '\\' ", 0); 6848 } 6849 appendText(&sSelect, " AND ", 0); 6850 sqlite3_free(zQarg); 6851 } 6852 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL" 6853 " ORDER BY snum, rowid", 0); 6854 if( bDebug ){ 6855 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 6856 }else{ 6857 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 6858 } 6859 freeText(&sSelect); 6860 } 6861 if( zErrMsg ){ 6862 utf8_printf(stderr,"Error: %s\n", zErrMsg); 6863 sqlite3_free(zErrMsg); 6864 rc = 1; 6865 }else if( rc != SQLITE_OK ){ 6866 raw_printf(stderr,"Error: querying schema information\n"); 6867 rc = 1; 6868 }else{ 6869 rc = 0; 6870 } 6871 }else 6872 6873#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 6874 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 6875 sqlite3SelectTrace = (int)integerValue(azArg[1]); 6876 }else 6877#endif 6878 6879#if defined(SQLITE_ENABLE_SESSION) 6880 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 6881 OpenSession *pSession = &p->aSession[0]; 6882 char **azCmd = &azArg[1]; 6883 int iSes = 0; 6884 int nCmd = nArg - 1; 6885 int i; 6886 if( nArg<=1 ) goto session_syntax_error; 6887 open_db(p, 0); 6888 if( nArg>=3 ){ 6889 for(iSes=0; iSes<p->nSession; iSes++){ 6890 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; 6891 } 6892 if( iSes<p->nSession ){ 6893 pSession = &p->aSession[iSes]; 6894 azCmd++; 6895 nCmd--; 6896 }else{ 6897 pSession = &p->aSession[0]; 6898 iSes = 0; 6899 } 6900 } 6901 6902 /* .session attach TABLE 6903 ** Invoke the sqlite3session_attach() interface to attach a particular 6904 ** table so that it is never filtered. 6905 */ 6906 if( strcmp(azCmd[0],"attach")==0 ){ 6907 if( nCmd!=2 ) goto session_syntax_error; 6908 if( pSession->p==0 ){ 6909 session_not_open: 6910 raw_printf(stderr, "ERROR: No sessions are open\n"); 6911 }else{ 6912 rc = sqlite3session_attach(pSession->p, azCmd[1]); 6913 if( rc ){ 6914 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 6915 rc = 0; 6916 } 6917 } 6918 }else 6919 6920 /* .session changeset FILE 6921 ** .session patchset FILE 6922 ** Write a changeset or patchset into a file. The file is overwritten. 6923 */ 6924 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 6925 FILE *out = 0; 6926 if( nCmd!=2 ) goto session_syntax_error; 6927 if( pSession->p==0 ) goto session_not_open; 6928 out = fopen(azCmd[1], "wb"); 6929 if( out==0 ){ 6930 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]); 6931 }else{ 6932 int szChng; 6933 void *pChng; 6934 if( azCmd[0][0]=='c' ){ 6935 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 6936 }else{ 6937 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 6938 } 6939 if( rc ){ 6940 printf("Error: error code %d\n", rc); 6941 rc = 0; 6942 } 6943 if( pChng 6944 && fwrite(pChng, szChng, 1, out)!=1 ){ 6945 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 6946 szChng); 6947 } 6948 sqlite3_free(pChng); 6949 fclose(out); 6950 } 6951 }else 6952 6953 /* .session close 6954 ** Close the identified session 6955 */ 6956 if( strcmp(azCmd[0], "close")==0 ){ 6957 if( nCmd!=1 ) goto session_syntax_error; 6958 if( p->nSession ){ 6959 session_close(pSession); 6960 p->aSession[iSes] = p->aSession[--p->nSession]; 6961 } 6962 }else 6963 6964 /* .session enable ?BOOLEAN? 6965 ** Query or set the enable flag 6966 */ 6967 if( strcmp(azCmd[0], "enable")==0 ){ 6968 int ii; 6969 if( nCmd>2 ) goto session_syntax_error; 6970 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 6971 if( p->nSession ){ 6972 ii = sqlite3session_enable(pSession->p, ii); 6973 utf8_printf(p->out, "session %s enable flag = %d\n", 6974 pSession->zName, ii); 6975 } 6976 }else 6977 6978 /* .session filter GLOB .... 6979 ** Set a list of GLOB patterns of table names to be excluded. 6980 */ 6981 if( strcmp(azCmd[0], "filter")==0 ){ 6982 int ii, nByte; 6983 if( nCmd<2 ) goto session_syntax_error; 6984 if( p->nSession ){ 6985 for(ii=0; ii<pSession->nFilter; ii++){ 6986 sqlite3_free(pSession->azFilter[ii]); 6987 } 6988 sqlite3_free(pSession->azFilter); 6989 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 6990 pSession->azFilter = sqlite3_malloc( nByte ); 6991 if( pSession->azFilter==0 ){ 6992 raw_printf(stderr, "Error: out or memory\n"); 6993 exit(1); 6994 } 6995 for(ii=1; ii<nCmd; ii++){ 6996 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 6997 } 6998 pSession->nFilter = ii-1; 6999 } 7000 }else 7001 7002 /* .session indirect ?BOOLEAN? 7003 ** Query or set the indirect flag 7004 */ 7005 if( strcmp(azCmd[0], "indirect")==0 ){ 7006 int ii; 7007 if( nCmd>2 ) goto session_syntax_error; 7008 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 7009 if( p->nSession ){ 7010 ii = sqlite3session_indirect(pSession->p, ii); 7011 utf8_printf(p->out, "session %s indirect flag = %d\n", 7012 pSession->zName, ii); 7013 } 7014 }else 7015 7016 /* .session isempty 7017 ** Determine if the session is empty 7018 */ 7019 if( strcmp(azCmd[0], "isempty")==0 ){ 7020 int ii; 7021 if( nCmd!=1 ) goto session_syntax_error; 7022 if( p->nSession ){ 7023 ii = sqlite3session_isempty(pSession->p); 7024 utf8_printf(p->out, "session %s isempty flag = %d\n", 7025 pSession->zName, ii); 7026 } 7027 }else 7028 7029 /* .session list 7030 ** List all currently open sessions 7031 */ 7032 if( strcmp(azCmd[0],"list")==0 ){ 7033 for(i=0; i<p->nSession; i++){ 7034 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); 7035 } 7036 }else 7037 7038 /* .session open DB NAME 7039 ** Open a new session called NAME on the attached database DB. 7040 ** DB is normally "main". 7041 */ 7042 if( strcmp(azCmd[0],"open")==0 ){ 7043 char *zName; 7044 if( nCmd!=3 ) goto session_syntax_error; 7045 zName = azCmd[2]; 7046 if( zName[0]==0 ) goto session_syntax_error; 7047 for(i=0; i<p->nSession; i++){ 7048 if( strcmp(p->aSession[i].zName,zName)==0 ){ 7049 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 7050 goto meta_command_exit; 7051 } 7052 } 7053 if( p->nSession>=ArraySize(p->aSession) ){ 7054 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); 7055 goto meta_command_exit; 7056 } 7057 pSession = &p->aSession[p->nSession]; 7058 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 7059 if( rc ){ 7060 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 7061 rc = 0; 7062 goto meta_command_exit; 7063 } 7064 pSession->nFilter = 0; 7065 sqlite3session_table_filter(pSession->p, session_filter, pSession); 7066 p->nSession++; 7067 pSession->zName = sqlite3_mprintf("%s", zName); 7068 }else 7069 /* If no command name matches, show a syntax error */ 7070 session_syntax_error: 7071 session_help(p); 7072 }else 7073#endif 7074 7075#ifdef SQLITE_DEBUG 7076 /* Undocumented commands for internal testing. Subject to change 7077 ** without notice. */ 7078 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 7079 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 7080 int i, v; 7081 for(i=1; i<nArg; i++){ 7082 v = booleanValue(azArg[i]); 7083 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 7084 } 7085 } 7086 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 7087 int i; sqlite3_int64 v; 7088 for(i=1; i<nArg; i++){ 7089 char zBuf[200]; 7090 v = integerValue(azArg[i]); 7091 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 7092 utf8_printf(p->out, "%s", zBuf); 7093 } 7094 } 7095 }else 7096#endif 7097 7098 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 7099 int bIsInit = 0; /* True to initialize the SELFTEST table */ 7100 int bVerbose = 0; /* Verbose output */ 7101 int bSelftestExists; /* True if SELFTEST already exists */ 7102 int i, k; /* Loop counters */ 7103 int nTest = 0; /* Number of tests runs */ 7104 int nErr = 0; /* Number of errors seen */ 7105 ShellText str; /* Answer for a query */ 7106 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 7107 7108 open_db(p,0); 7109 for(i=1; i<nArg; i++){ 7110 const char *z = azArg[i]; 7111 if( z[0]=='-' && z[1]=='-' ) z++; 7112 if( strcmp(z,"-init")==0 ){ 7113 bIsInit = 1; 7114 }else 7115 if( strcmp(z,"-v")==0 ){ 7116 bVerbose++; 7117 }else 7118 { 7119 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 7120 azArg[i], azArg[0]); 7121 raw_printf(stderr, "Should be one of: --init -v\n"); 7122 rc = 1; 7123 goto meta_command_exit; 7124 } 7125 } 7126 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 7127 != SQLITE_OK ){ 7128 bSelftestExists = 0; 7129 }else{ 7130 bSelftestExists = 1; 7131 } 7132 if( bIsInit ){ 7133 createSelftestTable(p); 7134 bSelftestExists = 1; 7135 } 7136 initText(&str); 7137 appendText(&str, "x", 0); 7138 for(k=bSelftestExists; k>=0; k--){ 7139 if( k==1 ){ 7140 rc = sqlite3_prepare_v2(p->db, 7141 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 7142 -1, &pStmt, 0); 7143 }else{ 7144 rc = sqlite3_prepare_v2(p->db, 7145 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 7146 " (1,'run','PRAGMA integrity_check','ok')", 7147 -1, &pStmt, 0); 7148 } 7149 if( rc ){ 7150 raw_printf(stderr, "Error querying the selftest table\n"); 7151 rc = 1; 7152 sqlite3_finalize(pStmt); 7153 goto meta_command_exit; 7154 } 7155 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 7156 int tno = sqlite3_column_int(pStmt, 0); 7157 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 7158 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 7159 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 7160 7161 k = 0; 7162 if( bVerbose>0 ){ 7163 char *zQuote = sqlite3_mprintf("%q", zSql); 7164 printf("%d: %s %s\n", tno, zOp, zSql); 7165 sqlite3_free(zQuote); 7166 } 7167 if( strcmp(zOp,"memo")==0 ){ 7168 utf8_printf(p->out, "%s\n", zSql); 7169 }else 7170 if( strcmp(zOp,"run")==0 ){ 7171 char *zErrMsg = 0; 7172 str.n = 0; 7173 str.z[0] = 0; 7174 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 7175 nTest++; 7176 if( bVerbose ){ 7177 utf8_printf(p->out, "Result: %s\n", str.z); 7178 } 7179 if( rc || zErrMsg ){ 7180 nErr++; 7181 rc = 1; 7182 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 7183 sqlite3_free(zErrMsg); 7184 }else if( strcmp(zAns,str.z)!=0 ){ 7185 nErr++; 7186 rc = 1; 7187 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 7188 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 7189 } 7190 }else 7191 { 7192 utf8_printf(stderr, 7193 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 7194 rc = 1; 7195 break; 7196 } 7197 } /* End loop over rows of content from SELFTEST */ 7198 sqlite3_finalize(pStmt); 7199 } /* End loop over k */ 7200 freeText(&str); 7201 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 7202 }else 7203 7204 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 7205 if( nArg<2 || nArg>3 ){ 7206 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 7207 rc = 1; 7208 } 7209 if( nArg>=2 ){ 7210 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 7211 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 7212 } 7213 if( nArg>=3 ){ 7214 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 7215 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 7216 } 7217 }else 7218 7219 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 7220 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 7221 int i; /* Loop counter */ 7222 int bSchema = 0; /* Also hash the schema */ 7223 int bSeparate = 0; /* Hash each table separately */ 7224 int iSize = 224; /* Hash algorithm to use */ 7225 int bDebug = 0; /* Only show the query that would have run */ 7226 sqlite3_stmt *pStmt; /* For querying tables names */ 7227 char *zSql; /* SQL to be run */ 7228 char *zSep; /* Separator */ 7229 ShellText sSql; /* Complete SQL for the query to run the hash */ 7230 ShellText sQuery; /* Set of queries used to read all content */ 7231 open_db(p, 0); 7232 for(i=1; i<nArg; i++){ 7233 const char *z = azArg[i]; 7234 if( z[0]=='-' ){ 7235 z++; 7236 if( z[0]=='-' ) z++; 7237 if( strcmp(z,"schema")==0 ){ 7238 bSchema = 1; 7239 }else 7240 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 7241 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 7242 ){ 7243 iSize = atoi(&z[5]); 7244 }else 7245 if( strcmp(z,"debug")==0 ){ 7246 bDebug = 1; 7247 }else 7248 { 7249 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 7250 azArg[i], azArg[0]); 7251 raw_printf(stderr, "Should be one of: --schema" 7252 " --sha3-224 --sha3-256 --sha3-384 --sha3-512\n"); 7253 rc = 1; 7254 goto meta_command_exit; 7255 } 7256 }else if( zLike ){ 7257 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 7258 rc = 1; 7259 goto meta_command_exit; 7260 }else{ 7261 zLike = z; 7262 bSeparate = 1; 7263 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 7264 } 7265 } 7266 if( bSchema ){ 7267 zSql = "SELECT lower(name) FROM sqlite_master" 7268 " WHERE type='table' AND coalesce(rootpage,0)>1" 7269 " UNION ALL SELECT 'sqlite_master'" 7270 " ORDER BY 1 collate nocase"; 7271 }else{ 7272 zSql = "SELECT lower(name) FROM sqlite_master" 7273 " WHERE type='table' AND coalesce(rootpage,0)>1" 7274 " AND name NOT LIKE 'sqlite_%'" 7275 " ORDER BY 1 collate nocase"; 7276 } 7277 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 7278 initText(&sQuery); 7279 initText(&sSql); 7280 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 7281 zSep = "VALUES("; 7282 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 7283 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 7284 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 7285 if( strncmp(zTab, "sqlite_",7)!=0 ){ 7286 appendText(&sQuery,"SELECT * FROM ", 0); 7287 appendText(&sQuery,zTab,'"'); 7288 appendText(&sQuery," NOT INDEXED;", 0); 7289 }else if( strcmp(zTab, "sqlite_master")==0 ){ 7290 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master" 7291 " ORDER BY name;", 0); 7292 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 7293 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 7294 " ORDER BY name;", 0); 7295 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 7296 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 7297 " ORDER BY tbl,idx;", 0); 7298 }else if( strcmp(zTab, "sqlite_stat3")==0 7299 || strcmp(zTab, "sqlite_stat4")==0 ){ 7300 appendText(&sQuery, "SELECT * FROM ", 0); 7301 appendText(&sQuery, zTab, 0); 7302 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 7303 } 7304 appendText(&sSql, zSep, 0); 7305 appendText(&sSql, sQuery.z, '\''); 7306 sQuery.n = 0; 7307 appendText(&sSql, ",", 0); 7308 appendText(&sSql, zTab, '\''); 7309 zSep = "),("; 7310 } 7311 sqlite3_finalize(pStmt); 7312 if( bSeparate ){ 7313 zSql = sqlite3_mprintf( 7314 "%s))" 7315 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 7316 " FROM [sha3sum$query]", 7317 sSql.z, iSize); 7318 }else{ 7319 zSql = sqlite3_mprintf( 7320 "%s))" 7321 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 7322 " FROM [sha3sum$query]", 7323 sSql.z, iSize); 7324 } 7325 freeText(&sQuery); 7326 freeText(&sSql); 7327 if( bDebug ){ 7328 utf8_printf(p->out, "%s\n", zSql); 7329 }else{ 7330 shell_exec(p, zSql, 0); 7331 } 7332 sqlite3_free(zSql); 7333 }else 7334 7335#ifndef SQLITE_NOHAVE_SYSTEM 7336 if( c=='s' 7337 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 7338 ){ 7339 char *zCmd; 7340 int i, x; 7341 if( nArg<2 ){ 7342 raw_printf(stderr, "Usage: .system COMMAND\n"); 7343 rc = 1; 7344 goto meta_command_exit; 7345 } 7346 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 7347 for(i=2; i<nArg; i++){ 7348 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 7349 zCmd, azArg[i]); 7350 } 7351 x = system(zCmd); 7352 sqlite3_free(zCmd); 7353 if( x ) raw_printf(stderr, "System command returns %d\n", x); 7354 }else 7355#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 7356 7357 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 7358 static const char *azBool[] = { "off", "on", "trigger", "full"}; 7359 int i; 7360 if( nArg!=1 ){ 7361 raw_printf(stderr, "Usage: .show\n"); 7362 rc = 1; 7363 goto meta_command_exit; 7364 } 7365 utf8_printf(p->out, "%12.12s: %s\n","echo", 7366 azBool[ShellHasFlag(p, SHFLG_Echo)]); 7367 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 7368 utf8_printf(p->out, "%12.12s: %s\n","explain", 7369 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 7370 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 7371 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 7372 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 7373 output_c_string(p->out, p->nullValue); 7374 raw_printf(p->out, "\n"); 7375 utf8_printf(p->out,"%12.12s: %s\n","output", 7376 strlen30(p->outfile) ? p->outfile : "stdout"); 7377 utf8_printf(p->out,"%12.12s: ", "colseparator"); 7378 output_c_string(p->out, p->colSeparator); 7379 raw_printf(p->out, "\n"); 7380 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 7381 output_c_string(p->out, p->rowSeparator); 7382 raw_printf(p->out, "\n"); 7383 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); 7384 utf8_printf(p->out, "%12.12s: ", "width"); 7385 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { 7386 raw_printf(p->out, "%d ", p->colWidth[i]); 7387 } 7388 raw_printf(p->out, "\n"); 7389 utf8_printf(p->out, "%12.12s: %s\n", "filename", 7390 p->zDbFilename ? p->zDbFilename : ""); 7391 }else 7392 7393 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 7394 if( nArg==2 ){ 7395 p->statsOn = (u8)booleanValue(azArg[1]); 7396 }else if( nArg==1 ){ 7397 display_stats(p->db, p, 0); 7398 }else{ 7399 raw_printf(stderr, "Usage: .stats ?on|off?\n"); 7400 rc = 1; 7401 } 7402 }else 7403 7404 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 7405 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 7406 || strncmp(azArg[0], "indexes", n)==0) ) 7407 ){ 7408 sqlite3_stmt *pStmt; 7409 char **azResult; 7410 int nRow, nAlloc; 7411 int ii; 7412 ShellText s; 7413 initText(&s); 7414 open_db(p, 0); 7415 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 7416 if( rc ){ 7417 sqlite3_finalize(pStmt); 7418 return shellDatabaseError(p->db); 7419 } 7420 7421 if( nArg>2 && c=='i' ){ 7422 /* It is an historical accident that the .indexes command shows an error 7423 ** when called with the wrong number of arguments whereas the .tables 7424 ** command does not. */ 7425 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 7426 rc = 1; 7427 sqlite3_finalize(pStmt); 7428 goto meta_command_exit; 7429 } 7430 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 7431 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 7432 if( zDbName==0 ) continue; 7433 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 7434 if( sqlite3_stricmp(zDbName, "main")==0 ){ 7435 appendText(&s, "SELECT name FROM ", 0); 7436 }else{ 7437 appendText(&s, "SELECT ", 0); 7438 appendText(&s, zDbName, '\''); 7439 appendText(&s, "||'.'||name FROM ", 0); 7440 } 7441 appendText(&s, zDbName, '"'); 7442 appendText(&s, ".sqlite_master ", 0); 7443 if( c=='t' ){ 7444 appendText(&s," WHERE type IN ('table','view')" 7445 " AND name NOT LIKE 'sqlite_%'" 7446 " AND name LIKE ?1", 0); 7447 }else{ 7448 appendText(&s," WHERE type='index'" 7449 " AND tbl_name LIKE ?1", 0); 7450 } 7451 } 7452 rc = sqlite3_finalize(pStmt); 7453 appendText(&s, " ORDER BY 1", 0); 7454 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 7455 freeText(&s); 7456 if( rc ) return shellDatabaseError(p->db); 7457 7458 /* Run the SQL statement prepared by the above block. Store the results 7459 ** as an array of nul-terminated strings in azResult[]. */ 7460 nRow = nAlloc = 0; 7461 azResult = 0; 7462 if( nArg>1 ){ 7463 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 7464 }else{ 7465 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 7466 } 7467 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 7468 if( nRow>=nAlloc ){ 7469 char **azNew; 7470 int n2 = nAlloc*2 + 10; 7471 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 7472 if( azNew==0 ) shell_out_of_memory(); 7473 nAlloc = n2; 7474 azResult = azNew; 7475 } 7476 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 7477 if( 0==azResult[nRow] ) shell_out_of_memory(); 7478 nRow++; 7479 } 7480 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 7481 rc = shellDatabaseError(p->db); 7482 } 7483 7484 /* Pretty-print the contents of array azResult[] to the output */ 7485 if( rc==0 && nRow>0 ){ 7486 int len, maxlen = 0; 7487 int i, j; 7488 int nPrintCol, nPrintRow; 7489 for(i=0; i<nRow; i++){ 7490 len = strlen30(azResult[i]); 7491 if( len>maxlen ) maxlen = len; 7492 } 7493 nPrintCol = 80/(maxlen+2); 7494 if( nPrintCol<1 ) nPrintCol = 1; 7495 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 7496 for(i=0; i<nPrintRow; i++){ 7497 for(j=i; j<nRow; j+=nPrintRow){ 7498 char *zSp = j<nPrintRow ? "" : " "; 7499 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 7500 azResult[j] ? azResult[j]:""); 7501 } 7502 raw_printf(p->out, "\n"); 7503 } 7504 } 7505 7506 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 7507 sqlite3_free(azResult); 7508 }else 7509 7510 /* Begin redirecting output to the file "testcase-out.txt" */ 7511 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 7512 output_reset(p); 7513 p->out = output_file_open("testcase-out.txt", 0); 7514 if( p->out==0 ){ 7515 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 7516 } 7517 if( nArg>=2 ){ 7518 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 7519 }else{ 7520 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 7521 } 7522 }else 7523 7524#ifndef SQLITE_UNTESTABLE 7525 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 7526 static const struct { 7527 const char *zCtrlName; /* Name of a test-control option */ 7528 int ctrlCode; /* Integer code for that option */ 7529 const char *zUsage; /* Usage notes */ 7530 } aCtrl[] = { 7531 { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, 7532 { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, 7533 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ 7534 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ 7535 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, 7536 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */ 7537 { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, 7538 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, 7539 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, 7540 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, 7541#ifdef YYCOVERAGE 7542 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, 7543#endif 7544 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, 7545 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET, "" }, 7546 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, 7547 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, 7548 { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" }, 7549 }; 7550 int testctrl = -1; 7551 int iCtrl = -1; 7552 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 7553 int isOk = 0; 7554 int i, n2; 7555 const char *zCmd = 0; 7556 7557 open_db(p, 0); 7558 zCmd = nArg>=2 ? azArg[1] : "help"; 7559 7560 /* The argument can optionally begin with "-" or "--" */ 7561 if( zCmd[0]=='-' && zCmd[1] ){ 7562 zCmd++; 7563 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 7564 } 7565 7566 /* --help lists all test-controls */ 7567 if( strcmp(zCmd,"help")==0 ){ 7568 utf8_printf(p->out, "Available test-controls:\n"); 7569 for(i=0; i<ArraySize(aCtrl); i++){ 7570 utf8_printf(p->out, " .testctrl %s %s\n", 7571 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 7572 } 7573 rc = 1; 7574 goto meta_command_exit; 7575 } 7576 7577 /* convert testctrl text option to value. allow any unique prefix 7578 ** of the option name, or a numerical value. */ 7579 n2 = strlen30(zCmd); 7580 for(i=0; i<ArraySize(aCtrl); i++){ 7581 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 7582 if( testctrl<0 ){ 7583 testctrl = aCtrl[i].ctrlCode; 7584 iCtrl = i; 7585 }else{ 7586 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 7587 "Use \".testctrl --help\" for help\n", zCmd); 7588 rc = 1; 7589 goto meta_command_exit; 7590 } 7591 } 7592 } 7593 if( testctrl<0 ){ 7594 utf8_printf(stderr,"Error: unknown test-control: %s\n" 7595 "Use \".testctrl --help\" for help\n", zCmd); 7596 }else{ 7597 switch(testctrl){ 7598 7599 /* sqlite3_test_control(int, db, int) */ 7600 case SQLITE_TESTCTRL_OPTIMIZATIONS: 7601 case SQLITE_TESTCTRL_RESERVE: 7602 if( nArg==3 ){ 7603 int opt = (int)strtol(azArg[2], 0, 0); 7604 rc2 = sqlite3_test_control(testctrl, p->db, opt); 7605 isOk = 3; 7606 } 7607 break; 7608 7609 /* sqlite3_test_control(int) */ 7610 case SQLITE_TESTCTRL_PRNG_SAVE: 7611 case SQLITE_TESTCTRL_PRNG_RESTORE: 7612 case SQLITE_TESTCTRL_PRNG_RESET: 7613 case SQLITE_TESTCTRL_BYTEORDER: 7614 if( nArg==2 ){ 7615 rc2 = sqlite3_test_control(testctrl); 7616 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 7617 } 7618 break; 7619 7620 /* sqlite3_test_control(int, uint) */ 7621 case SQLITE_TESTCTRL_PENDING_BYTE: 7622 if( nArg==3 ){ 7623 unsigned int opt = (unsigned int)integerValue(azArg[2]); 7624 rc2 = sqlite3_test_control(testctrl, opt); 7625 isOk = 3; 7626 } 7627 break; 7628 7629 /* sqlite3_test_control(int, int) */ 7630 case SQLITE_TESTCTRL_ASSERT: 7631 case SQLITE_TESTCTRL_ALWAYS: 7632 if( nArg==3 ){ 7633 int opt = booleanValue(azArg[2]); 7634 rc2 = sqlite3_test_control(testctrl, opt); 7635 isOk = 1; 7636 } 7637 break; 7638 7639 /* sqlite3_test_control(int, int) */ 7640 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 7641 case SQLITE_TESTCTRL_NEVER_CORRUPT: 7642 if( nArg==3 ){ 7643 int opt = booleanValue(azArg[2]); 7644 rc2 = sqlite3_test_control(testctrl, opt); 7645 isOk = 3; 7646 } 7647 break; 7648 7649 case SQLITE_TESTCTRL_IMPOSTER: 7650 if( nArg==5 ){ 7651 rc2 = sqlite3_test_control(testctrl, p->db, 7652 azArg[2], 7653 integerValue(azArg[3]), 7654 integerValue(azArg[4])); 7655 isOk = 3; 7656 } 7657 break; 7658 7659#ifdef YYCOVERAGE 7660 case SQLITE_TESTCTRL_PARSER_COVERAGE: 7661 if( nArg==2 ){ 7662 sqlite3_test_control(testctrl, p->out); 7663 isOk = 3; 7664 } 7665#endif 7666 } 7667 } 7668 if( isOk==0 && iCtrl>=0 ){ 7669 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd, aCtrl[iCtrl].zUsage); 7670 rc = 1; 7671 }else if( isOk==1 ){ 7672 raw_printf(p->out, "%d\n", rc2); 7673 }else if( isOk==2 ){ 7674 raw_printf(p->out, "0x%08x\n", rc2); 7675 } 7676 }else 7677#endif /* !defined(SQLITE_UNTESTABLE) */ 7678 7679 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 7680 open_db(p, 0); 7681 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 7682 }else 7683 7684 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 7685 if( nArg==2 ){ 7686 enableTimer = booleanValue(azArg[1]); 7687 if( enableTimer && !HAS_TIMER ){ 7688 raw_printf(stderr, "Error: timer not available on this system.\n"); 7689 enableTimer = 0; 7690 } 7691 }else{ 7692 raw_printf(stderr, "Usage: .timer on|off\n"); 7693 rc = 1; 7694 } 7695 }else 7696 7697 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 7698 open_db(p, 0); 7699 if( nArg!=2 ){ 7700 raw_printf(stderr, "Usage: .trace FILE|off\n"); 7701 rc = 1; 7702 goto meta_command_exit; 7703 } 7704 output_file_close(p->traceOut); 7705 p->traceOut = output_file_open(azArg[1], 0); 7706#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) 7707 if( p->traceOut==0 ){ 7708 sqlite3_trace_v2(p->db, 0, 0, 0); 7709 }else{ 7710 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut); 7711 } 7712#endif 7713 }else 7714 7715#if SQLITE_USER_AUTHENTICATION 7716 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 7717 if( nArg<2 ){ 7718 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 7719 rc = 1; 7720 goto meta_command_exit; 7721 } 7722 open_db(p, 0); 7723 if( strcmp(azArg[1],"login")==0 ){ 7724 if( nArg!=4 ){ 7725 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 7726 rc = 1; 7727 goto meta_command_exit; 7728 } 7729 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], strlen30(azArg[3])); 7730 if( rc ){ 7731 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 7732 rc = 1; 7733 } 7734 }else if( strcmp(azArg[1],"add")==0 ){ 7735 if( nArg!=5 ){ 7736 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 7737 rc = 1; 7738 goto meta_command_exit; 7739 } 7740 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 7741 booleanValue(azArg[4])); 7742 if( rc ){ 7743 raw_printf(stderr, "User-Add failed: %d\n", rc); 7744 rc = 1; 7745 } 7746 }else if( strcmp(azArg[1],"edit")==0 ){ 7747 if( nArg!=5 ){ 7748 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 7749 rc = 1; 7750 goto meta_command_exit; 7751 } 7752 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 7753 booleanValue(azArg[4])); 7754 if( rc ){ 7755 raw_printf(stderr, "User-Edit failed: %d\n", rc); 7756 rc = 1; 7757 } 7758 }else if( strcmp(azArg[1],"delete")==0 ){ 7759 if( nArg!=3 ){ 7760 raw_printf(stderr, "Usage: .user delete USER\n"); 7761 rc = 1; 7762 goto meta_command_exit; 7763 } 7764 rc = sqlite3_user_delete(p->db, azArg[2]); 7765 if( rc ){ 7766 raw_printf(stderr, "User-Delete failed: %d\n", rc); 7767 rc = 1; 7768 } 7769 }else{ 7770 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 7771 rc = 1; 7772 goto meta_command_exit; 7773 } 7774 }else 7775#endif /* SQLITE_USER_AUTHENTICATION */ 7776 7777 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 7778 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 7779 sqlite3_libversion(), sqlite3_sourceid()); 7780#if SQLITE_HAVE_ZLIB 7781 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 7782#endif 7783#define CTIMEOPT_VAL_(opt) #opt 7784#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 7785#if defined(__clang__) && defined(__clang_major__) 7786 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 7787 CTIMEOPT_VAL(__clang_minor__) "." 7788 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 7789#elif defined(_MSC_VER) 7790 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 7791#elif defined(__GNUC__) && defined(__VERSION__) 7792 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 7793#endif 7794 }else 7795 7796 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 7797 const char *zDbName = nArg==2 ? azArg[1] : "main"; 7798 sqlite3_vfs *pVfs = 0; 7799 if( p->db ){ 7800 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 7801 if( pVfs ){ 7802 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 7803 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 7804 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 7805 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 7806 } 7807 } 7808 }else 7809 7810 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 7811 sqlite3_vfs *pVfs; 7812 sqlite3_vfs *pCurrent = 0; 7813 if( p->db ){ 7814 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 7815 } 7816 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 7817 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 7818 pVfs==pCurrent ? " <--- CURRENT" : ""); 7819 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 7820 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 7821 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 7822 if( pVfs->pNext ){ 7823 raw_printf(p->out, "-----------------------------------\n"); 7824 } 7825 } 7826 }else 7827 7828 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 7829 const char *zDbName = nArg==2 ? azArg[1] : "main"; 7830 char *zVfsName = 0; 7831 if( p->db ){ 7832 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 7833 if( zVfsName ){ 7834 utf8_printf(p->out, "%s\n", zVfsName); 7835 sqlite3_free(zVfsName); 7836 } 7837 } 7838 }else 7839 7840#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 7841 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 7842 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; 7843 }else 7844#endif 7845 7846 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 7847 int j; 7848 assert( nArg<=ArraySize(azArg) ); 7849 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){ 7850 p->colWidth[j-1] = (int)integerValue(azArg[j]); 7851 } 7852 }else 7853 7854 { 7855 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 7856 " \"%s\". Enter \".help\" for help\n", azArg[0]); 7857 rc = 1; 7858 } 7859 7860meta_command_exit: 7861 if( p->outCount ){ 7862 p->outCount--; 7863 if( p->outCount==0 ) output_reset(p); 7864 } 7865 return rc; 7866} 7867 7868/* 7869** Return TRUE if a semicolon occurs anywhere in the first N characters 7870** of string z[]. 7871*/ 7872static int line_contains_semicolon(const char *z, int N){ 7873 int i; 7874 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; } 7875 return 0; 7876} 7877 7878/* 7879** Test to see if a line consists entirely of whitespace. 7880*/ 7881static int _all_whitespace(const char *z){ 7882 for(; *z; z++){ 7883 if( IsSpace(z[0]) ) continue; 7884 if( *z=='/' && z[1]=='*' ){ 7885 z += 2; 7886 while( *z && (*z!='*' || z[1]!='/') ){ z++; } 7887 if( *z==0 ) return 0; 7888 z++; 7889 continue; 7890 } 7891 if( *z=='-' && z[1]=='-' ){ 7892 z += 2; 7893 while( *z && *z!='\n' ){ z++; } 7894 if( *z==0 ) return 1; 7895 continue; 7896 } 7897 return 0; 7898 } 7899 return 1; 7900} 7901 7902/* 7903** Return TRUE if the line typed in is an SQL command terminator other 7904** than a semi-colon. The SQL Server style "go" command is understood 7905** as is the Oracle "/". 7906*/ 7907static int line_is_command_terminator(const char *zLine){ 7908 while( IsSpace(zLine[0]) ){ zLine++; }; 7909 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){ 7910 return 1; /* Oracle */ 7911 } 7912 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' 7913 && _all_whitespace(&zLine[2]) ){ 7914 return 1; /* SQL Server */ 7915 } 7916 return 0; 7917} 7918 7919/* 7920** We need a default sqlite3_complete() implementation to use in case 7921** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 7922** any arbitrary text is a complete SQL statement. This is not very 7923** user-friendly, but it does seem to work. 7924*/ 7925#ifdef SQLITE_OMIT_COMPLETE 7926int sqlite3_complete(const char *zSql){ return 1; } 7927#endif 7928 7929/* 7930** Return true if zSql is a complete SQL statement. Return false if it 7931** ends in the middle of a string literal or C-style comment. 7932*/ 7933static int line_is_complete(char *zSql, int nSql){ 7934 int rc; 7935 if( zSql==0 ) return 1; 7936 zSql[nSql] = ';'; 7937 zSql[nSql+1] = 0; 7938 rc = sqlite3_complete(zSql); 7939 zSql[nSql] = 0; 7940 return rc; 7941} 7942 7943/* 7944** Run a single line of SQL. Return the number of errors. 7945*/ 7946static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 7947 int rc; 7948 char *zErrMsg = 0; 7949 7950 open_db(p, 0); 7951 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 7952 BEGIN_TIMER; 7953 rc = shell_exec(p, zSql, &zErrMsg); 7954 END_TIMER; 7955 if( rc || zErrMsg ){ 7956 char zPrefix[100]; 7957 if( in!=0 || !stdin_is_interactive ){ 7958 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 7959 "Error: near line %d:", startline); 7960 }else{ 7961 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 7962 } 7963 if( zErrMsg!=0 ){ 7964 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 7965 sqlite3_free(zErrMsg); 7966 zErrMsg = 0; 7967 }else{ 7968 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 7969 } 7970 return 1; 7971 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 7972 raw_printf(p->out, "changes: %3d total_changes: %d\n", 7973 sqlite3_changes(p->db), sqlite3_total_changes(p->db)); 7974 } 7975 return 0; 7976} 7977 7978 7979/* 7980** Read input from *in and process it. If *in==0 then input 7981** is interactive - the user is typing it it. Otherwise, input 7982** is coming from a file or device. A prompt is issued and history 7983** is saved only if input is interactive. An interrupt signal will 7984** cause this routine to exit immediately, unless input is interactive. 7985** 7986** Return the number of errors. 7987*/ 7988static int process_input(ShellState *p, FILE *in){ 7989 char *zLine = 0; /* A single input line */ 7990 char *zSql = 0; /* Accumulated SQL text */ 7991 int nLine; /* Length of current line */ 7992 int nSql = 0; /* Bytes of zSql[] used */ 7993 int nAlloc = 0; /* Allocated zSql[] space */ 7994 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ 7995 int rc; /* Error code */ 7996 int errCnt = 0; /* Number of errors seen */ 7997 int lineno = 0; /* Current line number */ 7998 int startline = 0; /* Line number for start of current input */ 7999 8000 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){ 8001 fflush(p->out); 8002 zLine = one_input_line(in, zLine, nSql>0); 8003 if( zLine==0 ){ 8004 /* End of input */ 8005 if( in==0 && stdin_is_interactive ) printf("\n"); 8006 break; 8007 } 8008 if( seenInterrupt ){ 8009 if( in!=0 ) break; 8010 seenInterrupt = 0; 8011 } 8012 lineno++; 8013 if( nSql==0 && _all_whitespace(zLine) ){ 8014 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 8015 continue; 8016 } 8017 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 8018 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 8019 if( zLine[0]=='.' ){ 8020 rc = do_meta_command(zLine, p); 8021 if( rc==2 ){ /* exit requested */ 8022 break; 8023 }else if( rc ){ 8024 errCnt++; 8025 } 8026 } 8027 continue; 8028 } 8029 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ 8030 memcpy(zLine,";",2); 8031 } 8032 nLine = strlen30(zLine); 8033 if( nSql+nLine+2>=nAlloc ){ 8034 nAlloc = nSql+nLine+100; 8035 zSql = realloc(zSql, nAlloc); 8036 if( zSql==0 ) shell_out_of_memory(); 8037 } 8038 nSqlPrior = nSql; 8039 if( nSql==0 ){ 8040 int i; 8041 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 8042 assert( nAlloc>0 && zSql!=0 ); 8043 memcpy(zSql, zLine+i, nLine+1-i); 8044 startline = lineno; 8045 nSql = nLine-i; 8046 }else{ 8047 zSql[nSql++] = '\n'; 8048 memcpy(zSql+nSql, zLine, nLine+1); 8049 nSql += nLine; 8050 } 8051 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 8052 && sqlite3_complete(zSql) ){ 8053 errCnt += runOneSqlLine(p, zSql, in, startline); 8054 nSql = 0; 8055 if( p->outCount ){ 8056 output_reset(p); 8057 p->outCount = 0; 8058 }else{ 8059 clearTempFile(p); 8060 } 8061 }else if( nSql && _all_whitespace(zSql) ){ 8062 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 8063 nSql = 0; 8064 } 8065 } 8066 if( nSql && !_all_whitespace(zSql) ){ 8067 errCnt += runOneSqlLine(p, zSql, in, startline); 8068 } 8069 free(zSql); 8070 free(zLine); 8071 return errCnt>0; 8072} 8073 8074/* 8075** Return a pathname which is the user's home directory. A 8076** 0 return indicates an error of some kind. 8077*/ 8078static char *find_home_dir(int clearFlag){ 8079 static char *home_dir = NULL; 8080 if( clearFlag ){ 8081 free(home_dir); 8082 home_dir = 0; 8083 return 0; 8084 } 8085 if( home_dir ) return home_dir; 8086 8087#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 8088 && !defined(__RTP__) && !defined(_WRS_KERNEL) 8089 { 8090 struct passwd *pwent; 8091 uid_t uid = getuid(); 8092 if( (pwent=getpwuid(uid)) != NULL) { 8093 home_dir = pwent->pw_dir; 8094 } 8095 } 8096#endif 8097 8098#if defined(_WIN32_WCE) 8099 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 8100 */ 8101 home_dir = "/"; 8102#else 8103 8104#if defined(_WIN32) || defined(WIN32) 8105 if (!home_dir) { 8106 home_dir = getenv("USERPROFILE"); 8107 } 8108#endif 8109 8110 if (!home_dir) { 8111 home_dir = getenv("HOME"); 8112 } 8113 8114#if defined(_WIN32) || defined(WIN32) 8115 if (!home_dir) { 8116 char *zDrive, *zPath; 8117 int n; 8118 zDrive = getenv("HOMEDRIVE"); 8119 zPath = getenv("HOMEPATH"); 8120 if( zDrive && zPath ){ 8121 n = strlen30(zDrive) + strlen30(zPath) + 1; 8122 home_dir = malloc( n ); 8123 if( home_dir==0 ) return 0; 8124 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 8125 return home_dir; 8126 } 8127 home_dir = "c:\\"; 8128 } 8129#endif 8130 8131#endif /* !_WIN32_WCE */ 8132 8133 if( home_dir ){ 8134 int n = strlen30(home_dir) + 1; 8135 char *z = malloc( n ); 8136 if( z ) memcpy(z, home_dir, n); 8137 home_dir = z; 8138 } 8139 8140 return home_dir; 8141} 8142 8143/* 8144** Read input from the file given by sqliterc_override. Or if that 8145** parameter is NULL, take input from ~/.sqliterc 8146** 8147** Returns the number of errors. 8148*/ 8149static void process_sqliterc( 8150 ShellState *p, /* Configuration data */ 8151 const char *sqliterc_override /* Name of config file. NULL to use default */ 8152){ 8153 char *home_dir = NULL; 8154 const char *sqliterc = sqliterc_override; 8155 char *zBuf = 0; 8156 FILE *in = NULL; 8157 8158 if (sqliterc == NULL) { 8159 home_dir = find_home_dir(0); 8160 if( home_dir==0 ){ 8161 raw_printf(stderr, "-- warning: cannot find home directory;" 8162 " cannot read ~/.sqliterc\n"); 8163 return; 8164 } 8165 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 8166 sqliterc = zBuf; 8167 } 8168 in = fopen(sqliterc,"rb"); 8169 if( in ){ 8170 if( stdin_is_interactive ){ 8171 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 8172 } 8173 process_input(p,in); 8174 fclose(in); 8175 } 8176 sqlite3_free(zBuf); 8177} 8178 8179/* 8180** Show available command line options 8181*/ 8182static const char zOptions[] = 8183#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 8184 " -A ARGS... run \".archive ARGS\" and exit\n" 8185#endif 8186 " -append append the database to the end of the file\n" 8187 " -ascii set output mode to 'ascii'\n" 8188 " -bail stop after hitting an error\n" 8189 " -batch force batch I/O\n" 8190 " -column set output mode to 'column'\n" 8191 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 8192 " -csv set output mode to 'csv'\n" 8193 " -echo print commands before execution\n" 8194 " -init FILENAME read/process named file\n" 8195 " -[no]header turn headers on or off\n" 8196#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 8197 " -heap SIZE Size of heap for memsys3 or memsys5\n" 8198#endif 8199 " -help show this message\n" 8200 " -html set output mode to HTML\n" 8201 " -interactive force interactive I/O\n" 8202 " -line set output mode to 'line'\n" 8203 " -list set output mode to 'list'\n" 8204 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 8205 " -mmap N default mmap size set to N\n" 8206#ifdef SQLITE_ENABLE_MULTIPLEX 8207 " -multiplex enable the multiplexor VFS\n" 8208#endif 8209 " -newline SEP set output row separator. Default: '\\n'\n" 8210 " -nullvalue TEXT set text string for NULL values. Default ''\n" 8211 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 8212 " -quote set output mode to 'quote'\n" 8213 " -readonly open the database read-only\n" 8214 " -separator SEP set output column separator. Default: '|'\n" 8215#ifdef SQLITE_ENABLE_SORTER_REFERENCES 8216 " -sorterref SIZE sorter references threshold size\n" 8217#endif 8218 " -stats print memory stats before each finalize\n" 8219 " -version show SQLite version\n" 8220 " -vfs NAME use NAME as the default VFS\n" 8221#ifdef SQLITE_ENABLE_VFSTRACE 8222 " -vfstrace enable tracing of all VFS calls\n" 8223#endif 8224#ifdef SQLITE_HAVE_ZLIB 8225 " -zip open the file as a ZIP Archive\n" 8226#endif 8227; 8228static void usage(int showDetail){ 8229 utf8_printf(stderr, 8230 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 8231 "FILENAME is the name of an SQLite database. A new database is created\n" 8232 "if the file does not previously exist.\n", Argv0); 8233 if( showDetail ){ 8234 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 8235 }else{ 8236 raw_printf(stderr, "Use the -help option for additional information\n"); 8237 } 8238 exit(1); 8239} 8240 8241/* 8242** Internal check: Verify that the SQLite is uninitialized. Print a 8243** error message if it is initialized. 8244*/ 8245static void verify_uninitialized(void){ 8246 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 8247 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 8248 " initialization.\n"); 8249 } 8250} 8251 8252/* 8253** Initialize the state information in data 8254*/ 8255static void main_init(ShellState *data) { 8256 memset(data, 0, sizeof(*data)); 8257 data->normalMode = data->cMode = data->mode = MODE_List; 8258 data->autoExplain = 1; 8259 memcpy(data->colSeparator,SEP_Column, 2); 8260 memcpy(data->rowSeparator,SEP_Row, 2); 8261 data->showHeader = 0; 8262 data->shellFlgs = SHFLG_Lookaside; 8263 verify_uninitialized(); 8264 sqlite3_config(SQLITE_CONFIG_URI, 1); 8265 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 8266 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 8267 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 8268 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 8269} 8270 8271/* 8272** Output text to the console in a font that attracts extra attention. 8273*/ 8274#ifdef _WIN32 8275static void printBold(const char *zText){ 8276 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 8277 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 8278 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 8279 SetConsoleTextAttribute(out, 8280 FOREGROUND_RED|FOREGROUND_INTENSITY 8281 ); 8282 printf("%s", zText); 8283 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 8284} 8285#else 8286static void printBold(const char *zText){ 8287 printf("\033[1m%s\033[0m", zText); 8288} 8289#endif 8290 8291/* 8292** Get the argument to an --option. Throw an error and die if no argument 8293** is available. 8294*/ 8295static char *cmdline_option_value(int argc, char **argv, int i){ 8296 if( i==argc ){ 8297 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 8298 argv[0], argv[argc-1]); 8299 exit(1); 8300 } 8301 return argv[i]; 8302} 8303 8304#ifndef SQLITE_SHELL_IS_UTF8 8305# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) 8306# define SQLITE_SHELL_IS_UTF8 (0) 8307# else 8308# define SQLITE_SHELL_IS_UTF8 (1) 8309# endif 8310#endif 8311 8312#if SQLITE_SHELL_IS_UTF8 8313int SQLITE_CDECL main(int argc, char **argv){ 8314#else 8315int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 8316 char **argv; 8317#endif 8318 char *zErrMsg = 0; 8319 ShellState data; 8320 const char *zInitFile = 0; 8321 int i; 8322 int rc = 0; 8323 int warnInmemoryDb = 0; 8324 int readStdin = 1; 8325 int nCmd = 0; 8326 char **azCmd = 0; 8327 const char *zVfs = 0; /* Value of -vfs command-line option */ 8328#if !SQLITE_SHELL_IS_UTF8 8329 char **argvToFree = 0; 8330 int argcToFree = 0; 8331#endif 8332 8333 setBinaryMode(stdin, 0); 8334 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 8335 stdin_is_interactive = isatty(0); 8336 stdout_is_console = isatty(1); 8337 8338#if USE_SYSTEM_SQLITE+0!=1 8339 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 8340 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 8341 sqlite3_sourceid(), SQLITE_SOURCE_ID); 8342 exit(1); 8343 } 8344#endif 8345 main_init(&data); 8346 8347 /* On Windows, we must translate command-line arguments into UTF-8. 8348 ** The SQLite memory allocator subsystem has to be enabled in order to 8349 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 8350 ** subsequent sqlite3_config() calls will work. So copy all results into 8351 ** memory that does not come from the SQLite memory allocator. 8352 */ 8353#if !SQLITE_SHELL_IS_UTF8 8354 sqlite3_initialize(); 8355 argvToFree = malloc(sizeof(argv[0])*argc*2); 8356 argcToFree = argc; 8357 argv = argvToFree + argc; 8358 if( argv==0 ) shell_out_of_memory(); 8359 for(i=0; i<argc; i++){ 8360 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 8361 int n; 8362 if( z==0 ) shell_out_of_memory(); 8363 n = (int)strlen(z); 8364 argv[i] = malloc( n+1 ); 8365 if( argv[i]==0 ) shell_out_of_memory(); 8366 memcpy(argv[i], z, n+1); 8367 argvToFree[i] = argv[i]; 8368 sqlite3_free(z); 8369 } 8370 sqlite3_shutdown(); 8371#endif 8372 8373 assert( argc>=1 && argv && argv[0] ); 8374 Argv0 = argv[0]; 8375 8376 /* Make sure we have a valid signal handler early, before anything 8377 ** else is done. 8378 */ 8379#ifdef SIGINT 8380 signal(SIGINT, interrupt_handler); 8381#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 8382 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 8383#endif 8384 8385#ifdef SQLITE_SHELL_DBNAME_PROC 8386 { 8387 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 8388 ** of a C-function that will provide the name of the database file. Use 8389 ** this compile-time option to embed this shell program in larger 8390 ** applications. */ 8391 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 8392 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); 8393 warnInmemoryDb = 0; 8394 } 8395#endif 8396 8397 /* Do an initial pass through the command-line argument to locate 8398 ** the name of the database file, the name of the initialization file, 8399 ** the size of the alternative malloc heap, 8400 ** and the first command to execute. 8401 */ 8402 verify_uninitialized(); 8403 for(i=1; i<argc; i++){ 8404 char *z; 8405 z = argv[i]; 8406 if( z[0]!='-' ){ 8407 if( data.zDbFilename==0 ){ 8408 data.zDbFilename = z; 8409 }else{ 8410 /* Excesss arguments are interpreted as SQL (or dot-commands) and 8411 ** mean that nothing is read from stdin */ 8412 readStdin = 0; 8413 nCmd++; 8414 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 8415 if( azCmd==0 ) shell_out_of_memory(); 8416 azCmd[nCmd-1] = z; 8417 } 8418 } 8419 if( z[1]=='-' ) z++; 8420 if( strcmp(z,"-separator")==0 8421 || strcmp(z,"-nullvalue")==0 8422 || strcmp(z,"-newline")==0 8423 || strcmp(z,"-cmd")==0 8424 ){ 8425 (void)cmdline_option_value(argc, argv, ++i); 8426 }else if( strcmp(z,"-init")==0 ){ 8427 zInitFile = cmdline_option_value(argc, argv, ++i); 8428 }else if( strcmp(z,"-batch")==0 ){ 8429 /* Need to check for batch mode here to so we can avoid printing 8430 ** informational messages (like from process_sqliterc) before 8431 ** we do the actual processing of arguments later in a second pass. 8432 */ 8433 stdin_is_interactive = 0; 8434 }else if( strcmp(z,"-heap")==0 ){ 8435#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 8436 const char *zSize; 8437 sqlite3_int64 szHeap; 8438 8439 zSize = cmdline_option_value(argc, argv, ++i); 8440 szHeap = integerValue(zSize); 8441 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 8442 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 8443#else 8444 (void)cmdline_option_value(argc, argv, ++i); 8445#endif 8446 }else if( strcmp(z,"-pagecache")==0 ){ 8447 int n, sz; 8448 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 8449 if( sz>70000 ) sz = 70000; 8450 if( sz<0 ) sz = 0; 8451 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 8452 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 8453 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 8454 data.shellFlgs |= SHFLG_Pagecache; 8455 }else if( strcmp(z,"-lookaside")==0 ){ 8456 int n, sz; 8457 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 8458 if( sz<0 ) sz = 0; 8459 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 8460 if( n<0 ) n = 0; 8461 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 8462 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 8463#ifdef SQLITE_ENABLE_VFSTRACE 8464 }else if( strcmp(z,"-vfstrace")==0 ){ 8465 extern int vfstrace_register( 8466 const char *zTraceName, 8467 const char *zOldVfsName, 8468 int (*xOut)(const char*,void*), 8469 void *pOutArg, 8470 int makeDefault 8471 ); 8472 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 8473#endif 8474#ifdef SQLITE_ENABLE_MULTIPLEX 8475 }else if( strcmp(z,"-multiplex")==0 ){ 8476 extern int sqlite3_multiple_initialize(const char*,int); 8477 sqlite3_multiplex_initialize(0, 1); 8478#endif 8479 }else if( strcmp(z,"-mmap")==0 ){ 8480 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 8481 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 8482#ifdef SQLITE_ENABLE_SORTER_REFERENCES 8483 }else if( strcmp(z,"-sorterref")==0 ){ 8484 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 8485 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 8486#endif 8487 }else if( strcmp(z,"-vfs")==0 ){ 8488 zVfs = cmdline_option_value(argc, argv, ++i); 8489#ifdef SQLITE_HAVE_ZLIB 8490 }else if( strcmp(z,"-zip")==0 ){ 8491 data.openMode = SHELL_OPEN_ZIPFILE; 8492#endif 8493 }else if( strcmp(z,"-append")==0 ){ 8494 data.openMode = SHELL_OPEN_APPENDVFS; 8495 }else if( strcmp(z,"-readonly")==0 ){ 8496 data.openMode = SHELL_OPEN_READONLY; 8497#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 8498 }else if( strncmp(z, "-A",2)==0 ){ 8499 /* All remaining command-line arguments are passed to the ".archive" 8500 ** command, so ignore them */ 8501 break; 8502#endif 8503 } 8504 } 8505 verify_uninitialized(); 8506 8507 8508#ifdef SQLITE_SHELL_INIT_PROC 8509 { 8510 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 8511 ** of a C-function that will perform initialization actions on SQLite that 8512 ** occur just before or after sqlite3_initialize(). Use this compile-time 8513 ** option to embed this shell program in larger applications. */ 8514 extern void SQLITE_SHELL_INIT_PROC(void); 8515 SQLITE_SHELL_INIT_PROC(); 8516 } 8517#else 8518 /* All the sqlite3_config() calls have now been made. So it is safe 8519 ** to call sqlite3_initialize() and process any command line -vfs option. */ 8520 sqlite3_initialize(); 8521#endif 8522 8523 if( zVfs ){ 8524 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 8525 if( pVfs ){ 8526 sqlite3_vfs_register(pVfs, 1); 8527 }else{ 8528 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 8529 exit(1); 8530 } 8531 } 8532 8533 if( data.zDbFilename==0 ){ 8534#ifndef SQLITE_OMIT_MEMORYDB 8535 data.zDbFilename = ":memory:"; 8536 warnInmemoryDb = argc==1; 8537#else 8538 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 8539 return 1; 8540#endif 8541 } 8542 data.out = stdout; 8543 sqlite3_appendvfs_init(0,0,0); 8544 8545 /* Go ahead and open the database file if it already exists. If the 8546 ** file does not exist, delay opening it. This prevents empty database 8547 ** files from being created if a user mistypes the database name argument 8548 ** to the sqlite command-line tool. 8549 */ 8550 if( access(data.zDbFilename, 0)==0 ){ 8551 open_db(&data, 0); 8552 } 8553 8554 /* Process the initialization file if there is one. If no -init option 8555 ** is given on the command line, look for a file named ~/.sqliterc and 8556 ** try to process it. 8557 */ 8558 process_sqliterc(&data,zInitFile); 8559 8560 /* Make a second pass through the command-line argument and set 8561 ** options. This second pass is delayed until after the initialization 8562 ** file is processed so that the command-line arguments will override 8563 ** settings in the initialization file. 8564 */ 8565 for(i=1; i<argc; i++){ 8566 char *z = argv[i]; 8567 if( z[0]!='-' ) continue; 8568 if( z[1]=='-' ){ z++; } 8569 if( strcmp(z,"-init")==0 ){ 8570 i++; 8571 }else if( strcmp(z,"-html")==0 ){ 8572 data.mode = MODE_Html; 8573 }else if( strcmp(z,"-list")==0 ){ 8574 data.mode = MODE_List; 8575 }else if( strcmp(z,"-quote")==0 ){ 8576 data.mode = MODE_Quote; 8577 }else if( strcmp(z,"-line")==0 ){ 8578 data.mode = MODE_Line; 8579 }else if( strcmp(z,"-column")==0 ){ 8580 data.mode = MODE_Column; 8581 }else if( strcmp(z,"-csv")==0 ){ 8582 data.mode = MODE_Csv; 8583 memcpy(data.colSeparator,",",2); 8584#ifdef SQLITE_HAVE_ZLIB 8585 }else if( strcmp(z,"-zip")==0 ){ 8586 data.openMode = SHELL_OPEN_ZIPFILE; 8587#endif 8588 }else if( strcmp(z,"-append")==0 ){ 8589 data.openMode = SHELL_OPEN_APPENDVFS; 8590 }else if( strcmp(z,"-readonly")==0 ){ 8591 data.openMode = SHELL_OPEN_READONLY; 8592 }else if( strcmp(z,"-ascii")==0 ){ 8593 data.mode = MODE_Ascii; 8594 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 8595 SEP_Unit); 8596 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 8597 SEP_Record); 8598 }else if( strcmp(z,"-separator")==0 ){ 8599 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 8600 "%s",cmdline_option_value(argc,argv,++i)); 8601 }else if( strcmp(z,"-newline")==0 ){ 8602 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 8603 "%s",cmdline_option_value(argc,argv,++i)); 8604 }else if( strcmp(z,"-nullvalue")==0 ){ 8605 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 8606 "%s",cmdline_option_value(argc,argv,++i)); 8607 }else if( strcmp(z,"-header")==0 ){ 8608 data.showHeader = 1; 8609 }else if( strcmp(z,"-noheader")==0 ){ 8610 data.showHeader = 0; 8611 }else if( strcmp(z,"-echo")==0 ){ 8612 ShellSetFlag(&data, SHFLG_Echo); 8613 }else if( strcmp(z,"-eqp")==0 ){ 8614 data.autoEQP = AUTOEQP_on; 8615 }else if( strcmp(z,"-eqpfull")==0 ){ 8616 data.autoEQP = AUTOEQP_full; 8617 }else if( strcmp(z,"-stats")==0 ){ 8618 data.statsOn = 1; 8619 }else if( strcmp(z,"-scanstats")==0 ){ 8620 data.scanstatsOn = 1; 8621 }else if( strcmp(z,"-backslash")==0 ){ 8622 /* Undocumented command-line option: -backslash 8623 ** Causes C-style backslash escapes to be evaluated in SQL statements 8624 ** prior to sending the SQL into SQLite. Useful for injecting 8625 ** crazy bytes in the middle of SQL statements for testing and debugging. 8626 */ 8627 ShellSetFlag(&data, SHFLG_Backslash); 8628 }else if( strcmp(z,"-bail")==0 ){ 8629 bail_on_error = 1; 8630 }else if( strcmp(z,"-version")==0 ){ 8631 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 8632 return 0; 8633 }else if( strcmp(z,"-interactive")==0 ){ 8634 stdin_is_interactive = 1; 8635 }else if( strcmp(z,"-batch")==0 ){ 8636 stdin_is_interactive = 0; 8637 }else if( strcmp(z,"-heap")==0 ){ 8638 i++; 8639 }else if( strcmp(z,"-pagecache")==0 ){ 8640 i+=2; 8641 }else if( strcmp(z,"-lookaside")==0 ){ 8642 i+=2; 8643 }else if( strcmp(z,"-mmap")==0 ){ 8644 i++; 8645#ifdef SQLITE_ENABLE_SORTER_REFERENCES 8646 }else if( strcmp(z,"-sorterref")==0 ){ 8647 i++; 8648#endif 8649 }else if( strcmp(z,"-vfs")==0 ){ 8650 i++; 8651#ifdef SQLITE_ENABLE_VFSTRACE 8652 }else if( strcmp(z,"-vfstrace")==0 ){ 8653 i++; 8654#endif 8655#ifdef SQLITE_ENABLE_MULTIPLEX 8656 }else if( strcmp(z,"-multiplex")==0 ){ 8657 i++; 8658#endif 8659 }else if( strcmp(z,"-help")==0 ){ 8660 usage(1); 8661 }else if( strcmp(z,"-cmd")==0 ){ 8662 /* Run commands that follow -cmd first and separately from commands 8663 ** that simply appear on the command-line. This seems goofy. It would 8664 ** be better if all commands ran in the order that they appear. But 8665 ** we retain the goofy behavior for historical compatibility. */ 8666 if( i==argc-1 ) break; 8667 z = cmdline_option_value(argc,argv,++i); 8668 if( z[0]=='.' ){ 8669 rc = do_meta_command(z, &data); 8670 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 8671 }else{ 8672 open_db(&data, 0); 8673 rc = shell_exec(&data, z, &zErrMsg); 8674 if( zErrMsg!=0 ){ 8675 utf8_printf(stderr,"Error: %s\n", zErrMsg); 8676 if( bail_on_error ) return rc!=0 ? rc : 1; 8677 }else if( rc!=0 ){ 8678 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 8679 if( bail_on_error ) return rc; 8680 } 8681 } 8682#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 8683 }else if( strncmp(z, "-A", 2)==0 ){ 8684 if( nCmd>0 ){ 8685 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 8686 " with \"%s\"\n", z); 8687 return 1; 8688 } 8689 open_db(&data, OPEN_DB_ZIPFILE); 8690 if( z[2] ){ 8691 argv[i] = &z[2]; 8692 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 8693 }else{ 8694 arDotCommand(&data, 1, argv+i, argc-i); 8695 } 8696 readStdin = 0; 8697 break; 8698#endif 8699 }else{ 8700 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 8701 raw_printf(stderr,"Use -help for a list of options.\n"); 8702 return 1; 8703 } 8704 data.cMode = data.mode; 8705 } 8706 8707 if( !readStdin ){ 8708 /* Run all arguments that do not begin with '-' as if they were separate 8709 ** command-line inputs, except for the argToSkip argument which contains 8710 ** the database filename. 8711 */ 8712 for(i=0; i<nCmd; i++){ 8713 if( azCmd[i][0]=='.' ){ 8714 rc = do_meta_command(azCmd[i], &data); 8715 if( rc ) return rc==2 ? 0 : rc; 8716 }else{ 8717 open_db(&data, 0); 8718 rc = shell_exec(&data, azCmd[i], &zErrMsg); 8719 if( zErrMsg!=0 ){ 8720 utf8_printf(stderr,"Error: %s\n", zErrMsg); 8721 return rc!=0 ? rc : 1; 8722 }else if( rc!=0 ){ 8723 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 8724 return rc; 8725 } 8726 } 8727 } 8728 free(azCmd); 8729 }else{ 8730 /* Run commands received from standard input 8731 */ 8732 if( stdin_is_interactive ){ 8733 char *zHome; 8734 char *zHistory = 0; 8735 int nHistory; 8736 printf( 8737 "SQLite version %s %.19s\n" /*extra-version-info*/ 8738 "Enter \".help\" for usage hints.\n", 8739 sqlite3_libversion(), sqlite3_sourceid() 8740 ); 8741 if( warnInmemoryDb ){ 8742 printf("Connected to a "); 8743 printBold("transient in-memory database"); 8744 printf(".\nUse \".open FILENAME\" to reopen on a " 8745 "persistent database.\n"); 8746 } 8747 zHome = find_home_dir(0); 8748 if( zHome ){ 8749 nHistory = strlen30(zHome) + 20; 8750 if( (zHistory = malloc(nHistory))!=0 ){ 8751 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 8752 } 8753 } 8754 if( zHistory ){ shell_read_history(zHistory); } 8755#if HAVE_READLINE || HAVE_EDITLINE 8756 rl_attempted_completion_function = readline_completion; 8757#elif HAVE_LINENOISE 8758 linenoiseSetCompletionCallback(linenoise_completion); 8759#endif 8760 rc = process_input(&data, 0); 8761 if( zHistory ){ 8762 shell_stifle_history(2000); 8763 shell_write_history(zHistory); 8764 free(zHistory); 8765 } 8766 }else{ 8767 rc = process_input(&data, stdin); 8768 } 8769 } 8770 set_table_name(&data, 0); 8771 if( data.db ){ 8772 session_close_all(&data); 8773 close_db(data.db); 8774 } 8775 sqlite3_free(data.zFreeOnClose); 8776 find_home_dir(1); 8777 output_reset(&data); 8778 data.doXdgOpen = 0; 8779 clearTempFile(&data); 8780#if !SQLITE_SHELL_IS_UTF8 8781 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 8782 free(argvToFree); 8783#endif 8784 /* Clear the global data structure so that valgrind will detect memory 8785 ** leaks */ 8786 memset(&data, 0, sizeof(data)); 8787 return rc; 8788} 8789